From 0376a835ce7e754927b056f1b18a175304b68066 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Tue, 10 Mar 2026 00:00:41 +0300 Subject: [PATCH] 2026-03-10-1 --- bubble-master/pubspec.lock | 18 +- lib/constant/box_name.dart | 1 + lib/constant/links.dart | 2 +- .../auth/captin/login_captin_controller.dart | 29 +- lib/controller/functions/crud.dart | 723 ++++++------------ lib/controller/functions/package_info.dart | 12 +- lib/print.dart | 2 +- macos/Podfile | 2 +- macos/Podfile.lock | 358 +++++++++ macos/Runner.xcodeproj/project.pbxproj | 122 ++- .../contents.xcworkspacedata | 3 + pubspec.lock | 22 +- pubspec.yaml | 2 +- trip_overlay_plugin/example/lib/main.dart | 14 +- trip_overlay_plugin/example/pubspec.lock | 16 +- 15 files changed, 764 insertions(+), 562 deletions(-) create mode 100644 macos/Podfile.lock diff --git a/bubble-master/pubspec.lock b/bubble-master/pubspec.lock index 268f1b6..a28b3d7 100755 --- a/bubble-master/pubspec.lock +++ b/bubble-master/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" clock: dependency: transitive description: @@ -87,18 +87,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: @@ -164,10 +164,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" vector_math: dependency: transitive description: @@ -185,5 +185,5 @@ packages: source: hosted version: "15.0.2" sdks: - dart: ">=3.8.0-0 <4.0.0" + dart: ">=3.9.0-0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart index 5da4c88..9bcabe9 100755 --- a/lib/constant/box_name.dart +++ b/lib/constant/box_name.dart @@ -13,6 +13,7 @@ class BoxName { 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"; diff --git a/lib/constant/links.dart b/lib/constant/links.dart index e2c8ae9..9d9575e 100755 --- a/lib/constant/links.dart +++ b/lib/constant/links.dart @@ -12,7 +12,7 @@ class AppLink { 'https://location.intaleq.xyz/intaleq/ride/location'; static const String routeApiBaseUrl = "https://routesjo.intaleq.xyz/route/v1/driving"; - static final String endPoint = 'https://api.intaleq.xyz/intaleq'; + static final String endPoint = 'https://api.intaleq.xyz/intaleq_v1'; static final String syria = 'https://syria.intaleq.xyz/intaleq'; static final String server = endPoint; diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart index 5f68058..d1fe541 100755 --- a/lib/controller/auth/captin/login_captin_controller.dart +++ b/lib/controller/auth/captin/login_captin_controller.dart @@ -126,6 +126,12 @@ class LoginDriverController extends GetxController { 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') { @@ -134,7 +140,6 @@ class LoginDriverController extends GetxController { } Log.print('Security check passed'); String fingerPrint = await DeviceHelper.getDeviceFingerprint(); - // print('fingerPrint: ${fingerPrint}'); dev = Platform.isAndroid ? 'android' : 'ios'; var payload = { 'id': box.read(BoxName.driverID), @@ -146,20 +151,14 @@ class LoginDriverController extends GetxController { Uri.parse(AppLink.loginJwtWalletDriver), body: payload, ); - // Log.print('response.request: ${response1.request}'); - // Log.print('response.body: ${response1.body}'); - // print(payload); - // Log.print('payment["jwt"]: ${jsonDecode(response1.body)['jwt']}'); + Log.print('response.request: ${response1.request}'); + Log.print('response.body: ${response1.body}'); + Log.print('payment["jwt"]: ${jsonDecode(response1.body)['jwt']}'); + await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']); return jsonDecode(response1.body)['jwt'].toString(); } - String shortHash(String password) { - var bytes = utf8.encode(password); - var digest = sha256.convert(bytes); - return base64UrlEncode(digest.bytes); - } - getJWT() async { dev = Platform.isAndroid ? 'android' : 'ios'; Log.print( @@ -169,6 +168,8 @@ class LoginDriverController extends GetxController { '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}'); @@ -197,14 +198,16 @@ class LoginDriverController extends GetxController { '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, ); - // print(response1.request); - // print(response1.body); + Log.print('response1.request: ${response1.request}'); + Log.print('response1.body: ${response1.body}'); if (response1.statusCode == 200) { final decodedResponse1 = jsonDecode(response1.body); diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart index f6ed2d0..99791b0 100755 --- a/lib/controller/functions/crud.dart +++ b/lib/controller/functions/crud.dart @@ -24,22 +24,11 @@ import 'upload_image.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); // Initialize with an old date - /// The minimum time that must pass before logging the same error again. + static DateTime _lastErrorTimestamp = DateTime(2000); static const Duration _errorLogDebounceDuration = Duration(minutes: 1); - /// Asynchronously logs an error to the server with debouncing to prevent log flooding. - /// - /// [error]: A concise description of the error. - /// [details]: Detailed information, such as a stack trace or the server response body. - /// [where]: The location in the code where the error occurred (e.g., 'ClassName.methodName'). static Future addError( String error, String details, String where) async { try { @@ -60,7 +49,6 @@ class CRUD { box.read(BoxName.driverID) != null ? 'Driver' : 'Passenger'; final phone = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); - // Fire-and-forget call to prevent infinite loops if the logger itself fails. CRUD().post( link: AppLink.addError, payload: { @@ -75,156 +63,166 @@ class CRUD { } catch (e) {} } - /// Centralized private method to handle all API requests. - /// Includes retry logic, network checking, and standardized error handling. - // --- تعديل 1: دالة _makeRequest محسنة للإنترنت الضعيف --- + // ───────────────────────────────────────────────────────────── + // دالة مساعدة: يجيب البصمة المشفرة من 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 { - // 🟢 زيادة الوقت للسماح بالشبكات البطيئة (سوريا) - const connectTimeout = Duration(seconds: 20); // رفعنا الوقت من 6 لـ 20 - const receiveTimeout = Duration(seconds: 40); // رفعنا الوقت من 10 لـ 40 + // timeouts مرتفعة مناسبة للإنترنت الضعيف في سوريا + const totalTimeout = Duration(seconds: 60); Future doPost() { final url = Uri.parse(link); - // نستخدم _client إذا كان معرفاً، أو ننشئ واحداً جديداً مع إغلاقه لاحقاً - // لضمان عدم حدوث مشاكل، سنستخدم http.post المباشر كما في النسخة المستقرة لديك - // ولكن مع timeout أطول return http .post(url, body: payload, headers: headers) - .timeout(connectTimeout + receiveTimeout); + .timeout(totalTimeout); } - http.Response response = http.Response('', 500); // Default initialization - - // 🟢 محاولة إعادة الاتصال (Retry) حتى 3 مرات + http.Response? response; int attempts = 0; + while (attempts < 3) { try { attempts++; response = await doPost(); - - // إذا نجح الاتصال، نخرج من الحلقة ونعالج الرد - break; + 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) نعيد المحاولة + // 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 هنا قد يكون غير معرف (null) إذا فشلت كل المحاولات - // لكن بسبب الـ return داخل الـ catch، لن نصل هنا إلا بوجود response + // لو كل المحاولات فشلت بدون response + if (response == null) return 'failure'; - // الحل الآمن لضمان وجود response قبل استخدامه: - try { - // إعادة تعريف response لضمان عدم حدوث خطأ null safety في المحرر - // (في المنطق الفعلي لن نصل هنا إلا ومعنا response) - if (attempts > 3) return 'failure'; + final sc = response.statusCode; + final body = response.body; - final sc = response.statusCode; // استخدمنا ! لأننا متأكدين - final body = response.body; + Log.print('_makeRequest [$sc] $link'); - 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'; - } - } - - if (sc == 401) { - return 'token_expired'; - } - - if (sc >= 500) { + // 2xx + if (sc >= 200 && sc < 300) { + try { + return jsonDecode(body); + } catch (e, st) { addError( - 'Server 5xx', 'SC: $sc\nBody: $body', 'CRUD._makeRequest $link'); + 'JSON Decode Error', 'Body: $body\n$st', 'CRUD._makeRequest $link'); return 'failure'; } + } - return 'failure'; - } catch (e) { + // 401 → تجديد التوكن + if (sc == 401) { + await Get.put(LoginDriverController()).getJWT(); + return 'token_expired'; + } + + // 5xx + if (sc >= 500) { + addError('Server 5xx', 'SC: $sc\nBody: $body', 'CRUD._makeRequest $link'); return 'failure'; } + + return 'failure'; } - // --- تعديل 2: دالة get (كما طلبت: بوست + إرجاع النص الخام) --- - // أبقيتها كما هي في كودك الأصلي تماماً، فقط حسنت الـ Timeout + // ═══════════════════════════════════════════════════════════════ + // 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]; + + 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 { var url = Uri.parse(link); - - // 🟢 إضافة timeout هنا أيضاً var response = await http.post( url, body: payload, headers: { - "Content-Type": "application/x-www-form-urlencoded", + 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': - 'Bearer ${r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]}' + 'Bearer ${r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]}', + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز }, - ).timeout(const Duration(seconds: 40)); // وقت كافٍ للشبكات الضعيفة - Log.print('response: ${response.body}'); - Log.print('response: ${response.request}'); + ).timeout(const Duration(seconds: 60)); + + Log.print('get [$link]: ${response.statusCode}'); + Log.print('get body: ${response.body}'); if (response.statusCode == 200) { - // المنطق الخاص بك: إرجاع الـ body كاملاً كنص (String) - // لأنك تريد عمل jsonDecode لاحقاً في المكان الذي استدعى الدالة - // أو التحقق من status: success داخلياً - - // ملاحظة: في كودك الأصلي كنت تفحص jsonDecode هنا وتعود بـ response.body - // سأبقيها كما هي: var jsonData = jsonDecode(response.body); - if (jsonData['status'] == 'success') { - return 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()).getJWT(); return 'token_expired'; - } else { - // addError('Unauthorized: ${jsonData['error']}', 'crud().get - 401', - // url.toString()); - return 'failure'; } + return 'failure'; } else { addError('Non-200: ${response.statusCode}', 'crud().get - Other', url.toString()); return 'failure'; } } on TimeoutException { - // معالجة صامتة للتايم أوت في الـ GET return 'failure'; } on SocketException { - // معالجة صامتة لانقطاع النت return 'no_internet'; } catch (e) { addError('GET Exception: $e', '', link); @@ -232,34 +230,11 @@ class CRUD { } } - /// Performs a standard authenticated POST request. - /// Automatically handles token renewal. - Future post({ - required String link, - Map? payload, - }) async { - String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - // if (JwtDecoder.isExpired(token)) { - // await Get.put(LoginController()).getJWT(); - // token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - // } - - final headers = { - "Content-Type": "application/x-www-form-urlencoded", - 'Authorization': 'Bearer $token' - }; - - return await _makeRequest( - link: link, - payload: payload, - headers: headers, - ); - } - - /// Performs a standard authenticated GET request (using POST method as per original code). - /// Automatically handles token renewal. - - /// Performs an authenticated POST request to wallet endpoints. + // ═══════════════════════════════════════════════════════════════ + // postWallet — طلب POST للمحفظة + // التغيير: إضافة X-Device-FP header + // 3 headers: JWT + HMAC + FP + // ═══════════════════════════════════════════════════════════════ Future postWallet({ required String link, Map? payload, @@ -268,69 +243,66 @@ class CRUD { final hmac = box.read(BoxName.hmac); final headers = { - "Content-Type": "application/x-www-form-urlencoded", + '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, - ); + return await _makeRequest(link: link, payload: payload, headers: headers); } - /// Performs an authenticated GET request to wallet endpoints (using POST). + // ═══════════════════════════════════════════════════════════════ + // 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 url = Uri.parse(link); + var response = await http.post( url, body: payload, headers: { - "Content-Type": "application/x-www-form-urlencoded", + '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; - } - + if (jsonData['status'] == 'success') return response.body; return jsonData['status']; } else if (response.statusCode == 401) { - // Specifically handle 401 Unauthorized var jsonData = jsonDecode(response.body); - if (jsonData['error'] == 'Token expired') { - // Show snackbar prompting to re-login await Get.put(LoginDriverController()).getJwtWallet(); - - return 'token_expired'; // Return a specific value for token expiration - } else { - // Other 401 errors - addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401', - url.toString()); - return 'failure'; + return 'token_expired'; } + addError('Unauthorized: ${jsonData['error']}', 'crud().getWallet - 401', + url.toString()); + return 'failure'; } else { - addError('Non-200 response code: ${response.statusCode}', - 'crud().post - Other', url.toString()); + addError('Non-200: ${response.statusCode}', 'crud().getWallet - Other', + url.toString()); return 'failure'; } } - Future postWalletMtn( - {required String link, Map? payload}) async { + // ═══════════════════════════════════════════════════════════════ + // 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); @@ -338,27 +310,26 @@ class CRUD { try { final response = await http.post( url, - body: payload, // form-urlencoded مناسب لـ filterRequest + body: payload, headers: { - "Content-Type": "application/x-www-form-urlencoded", - "Authorization": "Bearer $s", - "X-HMAC-Auth": hmac.toString(), + '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, + 'code': code ?? response.statusCode }; } if (response.statusCode == 200) { try { - final jsonData = jsonDecode(response.body); - // نتوقع الآن شكل موحّد من السيرفر: {status, message, data?} - return jsonData; + return jsonDecode(response.body); } catch (e) { return wrap('failure', message: 'JSON decode error', code: response.statusCode); @@ -379,10 +350,8 @@ class CRUD { return wrap('failure', message: response.body); } } else { - // غير 200 – ارجع التفاصيل try { - final jsonData = jsonDecode(response.body); - return wrap('failure', message: jsonData); + return wrap('failure', message: jsonDecode(response.body)); } catch (_) { return wrap('failure', message: response.body); } @@ -396,138 +365,23 @@ class CRUD { } } - // Future postWallet( - // {required String link, Map? payload}) async { - // var s = await LoginDriverController().getJwtWallet(); - // final hmac = box.read(BoxName.hmac); - // var url = Uri.parse(link); - // 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(), - // }, - // ); - // if (response.statusCode == 200) { - // try { - // var jsonData = jsonDecode(response.body); - // if (jsonData['status'] == 'success') { - // return jsonData; - // } else { - // return jsonData['status']; - // } - // } catch (e) { - // // addError(e.toString(), 'crud().post - JSON decoding'); - // return 'failure'; - // } - // } else if (response.statusCode == 401) { - // // Specifically handle 401 Unauthorized - // var jsonData = jsonDecode(response.body); - - // if (jsonData['error'] == 'Token expired') { - // return 'token_expired'; // Return a specific value for token expiration - // } else { - // // Other 401 errors - // // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); - // return 'failure'; - // } - // } else { - // // addError('Non-200 response code: ${response.statusCode}', - // // 'crud().post - Other'); - // return 'failure'; - // } - // } catch (e) { - // // addError('HTTP request error: $e', 'crud().post - HTTP'); - // return 'failure'; - // } - // } - - // Future post( - // {required String link, Map? payload}) async { - // var url = Uri.parse(link); - // try { - // 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 LoginDriverController().getJWT(); - // } - // var response = await http.post( - // url, - // body: payload, - // 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)}' - // }, - // ); - // if (response.statusCode == 200) { - // try { - // var jsonData = jsonDecode(response.body); - // if (jsonData['status'] == 'success') { - // return jsonData; - // } else { - // return jsonData['status']; - // } - // } catch (e) { - // // addError(e.toString(), url); - // return 'failure'; - // } - // } else if (response.statusCode == 401) { - // // Specifically handle 401 Unauthorized - // var jsonData = jsonDecode(response.body); - - // if (jsonData['error'] == 'Token expired') { - // // Show snackbar prompting to re-login - // // await Get.put(LoginDriverController()).getJWT(); - // // MyDialog().getDialog( - // // 'Session expired. Please log in again.'.tr, - // // '', - // // () { - // // Get.put(LoginController()).loginUsingCredentials( - // // box.read(BoxName.passengerID), box.read(BoxName.email)); - // // Get.back(); - // // }, - // // ); - - // return 'token_expired'; // Return a specific value for token expiration - // } else { - // // Other 401 errors - // // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); - // return 'failure'; - // } - // } else { - // // addError('Non-200 response code: ${response.statusCode}', - // // 'crud().post - Other'); - // return 'failure'; - // } - // } catch (e) { - // // addError('HTTP request error: $e', 'crud().post - HTTP'); - // return 'failure'; - // } - // } + // ======================================================================= + // باقي الدوال الخارجية — لا تحتاج 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://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'), - 'https://orca-app-b2i85.ondigitalocean.app/token?channelName=$channelName'), - headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}); - + 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']; - } else {} + return jsonDecode(res.body)['token']; + } } Future getLlama({ @@ -535,36 +389,25 @@ class CRUD { required String payload, required String prompt, }) async { - var url = Uri.parse( - link, - ); + var url = Uri.parse(link); var headers = { 'Content-Type': 'application/json', 'Authorization': - 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' - // 'Authorization': 'Bearer ${Env.llamaKey}' + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy', }; var data = json.encode({ - "model": "Llama-3-70b-Inst-FW", - // "model": "llama-13b-chat", - "messages": [ + '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" + '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 + 'temperature': 0.9, }); - var response = await http.post( - url, - body: data, - headers: headers, - ); - - if (response.statusCode == 200) { - return response.body; - } + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; return response.statusCode; } @@ -574,207 +417,140 @@ class CRUD { var extractedString = await arabicTextExtractByVisionAndAI(imagePath: imagePath); var json = jsonDecode(extractedString); - var textValues = extractTextFromLines(json); - // await Get.put(AI()).geminiAiExtraction(prompt, textValues); await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); } String extractTextFromLines(Map jsonData) { final readResult = jsonData['readResult']; final blocks = readResult['blocks']; - - final StringBuffer buffer = StringBuffer(); - + final buffer = StringBuffer(); for (final block in blocks) { - final lines = block['lines']; - for (final line in lines) { - final text = line['text']; - buffer.write(text); + for (final line in block['lines']) { + buffer.write(line['text']); buffer.write('\n'); } } - return buffer.toString().trim(); } - Future arabicTextExtractByVisionAndAI({ - required String imagePath, - }) async { + Future arabicTextExtractByVisionAndAI( + {required String imagePath}) async { var headers = { 'Content-Type': 'application/json', - 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey + '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://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar')); - // 'https://eastus.api.cognitive.microsoft.com/vision/v3.2/ocr' - '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.body = json.encode({"url": imagePathFull}); + 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) { - // 'response.stream.bytesToString(): ${await response.stream.bytesToString()}'); + if (response.statusCode == 200) return await response.stream.bytesToString(); - } else {} } - Future getChatGPT({ - required String link, - required String payload, - }) async { - var url = Uri.parse( - link, - ); + Future getChatGPT( + {required String link, required String payload}) async { + var url = Uri.parse(link); var headers = { 'Content-Type': 'application/json', - 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}', }; var data = json.encode({ - "model": "gpt-3.5-turbo", - "messages": [ + '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" + '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 + 'temperature': 0.9, }); + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; + return response.statusCode; + } + + Future postStripe( + {required String link, Map? payload}) async { + var url = Uri.parse(link); var response = await http.post( url, - body: data, - headers: headers, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer ${AK.secretKeyStripe}', + }, ); + if (response.statusCode == 200) return response.body; + } + 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) { - return response.body; + if (jsonData['status'] == 'success') return response.body; + return jsonData['status']; } return response.statusCode; } - Future postStripe({ - required String link, - Map? payload, - }) async { - // String? secretKey = await storage.read(key: BoxName.secretKey); - var url = Uri.parse( - link, - ); - var response = await http.post( - url, - body: payload, - headers: { - "Content-Type": "application/x-www-form-urlencoded", - 'Authorization': 'Bearer ${AK.secretKeyStripe}', - }, - ); - if (response.statusCode == 200) { - return response.body; - } else {} - } - - 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 — إصلاح: استخدام r() بدل X.r() القديم ───────── Future sendEmail(String link, Map? payload) async { - // التحقق من صلاحية التوكن - String rawJwt = box.read(BoxName.jwt); - String token = X - .r(X.r(X.r(rawJwt, cn), cC), cs) - .toString() - .split(AppInformation.addd)[0]; + // r() هي نفس دالة فك التشفير الثلاثي المختصرة + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; - bool isTokenExpired = JwtDecoder.isExpired(token); - if (isTokenExpired) { + if (JwtDecoder.isExpired(token)) { await LoginDriverController().getJWT(); - rawJwt = box.read(BoxName.jwt); // تحديث التوكن بعد التجديد - token = X - .r(X.r(X.r(rawJwt, cn), cC), cs) - .toString() - .split(AppInformation.addd)[0]; + token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; } - // إعداد الهيدر final headers = { - "Content-Type": "application/x-www-form-urlencoded", - "Authorization": "Bearer $token", + '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) { - } else { + 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 { - // String? basicAuthCredentials = - // await storage.read(key: BoxName.basicAuthCredentials); - var url = Uri.parse( - link, - ); + 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", + '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; - } + if (response.statusCode == 200 && jsonData['status'] == 'success') { + Get.back(); + return response.body; } - return (jsonData['status']); + return jsonData['status']; } } @@ -783,67 +559,25 @@ class CRUD { 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, + 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', - }, + body: {'To': phoneNumber, 'Channel': 'sms'}, ); - - if (response.statusCode == 201) { - } else {} - - // Prompt the user to enter the OTP - final 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, - ); + 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']); + if (jsonData['status'] == 'OK') return jsonData; + return jsonData['status']; } Future update({ @@ -851,39 +585,31 @@ class CRUD { 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))}', + '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); + 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))}', + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}' }, ); return json.decode(response.body); } } -/// Custom exception for when there is no internet connection. class NoInternetException implements Exception { final String message; NoInternetException( @@ -893,7 +619,6 @@ class NoInternetException implements Exception { String toString() => message; } -/// Custom exception for when the network is too slow (request times out). class WeakNetworkException implements Exception { final String message; WeakNetworkException( @@ -909,5 +634,5 @@ class ApiException implements Exception { ApiException(this.message, [this.statusCode]); @override String toString() => - "ApiException: $message (Status Code: ${statusCode ?? 'N/A'})"; + 'ApiException: $message (Status Code: ${statusCode ?? 'N/A'})'; } diff --git a/lib/controller/functions/package_info.dart b/lib/controller/functions/package_info.dart index 9eb2f67..7c1b4c4 100755 --- a/lib/controller/functions/package_info.dart +++ b/lib/controller/functions/package_info.dart @@ -22,7 +22,7 @@ Future checkForUpdate(BuildContext context) async { final packageInfo = await PackageInfo.fromPlatform(); final currentVersion = packageInfo.buildNumber; final version = packageInfo.version; - Log.print('version: ${version}'); + Log.print('version: $version'); print('currentVersion is : $currentVersion'); // Fetch the latest version from your server String latestVersion = await getPackageInfo(); @@ -191,16 +191,18 @@ class DeviceHelper { : deviceData['identifierForVendor'] ?? 'unknown'; final String deviceModel = deviceData['model'] ?? 'unknown'; - final String osVersion = Platform.isAndroid - ? deviceData['version']['release'] ?? 'unknown' - : deviceData['systemVersion'] ?? '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}_$osVersion'; + final String fingerprint = + EncryptionHelper.instance.encryptData('${deviceId}_$deviceModel'); // Log.print('fingerprint: ${fingerprint}'); // print(EncryptionHelper.instance.encryptData(fingerprint)); + box.write(BoxName.deviceFingerprint, fingerprint); return (fingerprint); } catch (e) { throw Exception('Failed to generate device fingerprint'); diff --git a/lib/print.dart b/lib/print.dart index 63efb2d..a3d59f6 100755 --- a/lib/print.dart +++ b/lib/print.dart @@ -4,7 +4,7 @@ class Log { Log._(); static void print(String value, {StackTrace? stackTrace}) { - // developer.log(value, name: 'LOG', stackTrace: stackTrace); + developer.log(value, name: 'LOG', stackTrace: stackTrace); } static Object? inspect(Object? object) { diff --git a/macos/Podfile b/macos/Podfile index c795730..b52666a 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.14' +platform :osx, '10.15' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/macos/Podfile.lock b/macos/Podfile.lock new file mode 100644 index 0000000..4a56538 --- /dev/null +++ b/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/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 2fc2244..a200eda 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 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 */ @@ -60,11 +62,12 @@ /* 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; }; + 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 = ""; }; @@ -76,8 +79,15 @@ 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 */ @@ -85,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + FC1A260161869F5DA276D94C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,6 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + AE3C694CAD8DE7FBA59BA5C5 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -125,6 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + BB5BD25C792C03AB60BE67B8 /* Pods */, ); sourceTree = ""; }; @@ -172,9 +185,25 @@ 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 = ""; @@ -186,6 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 763F6A08143799973D671394 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +234,14 @@ 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 = ( ); @@ -329,6 +362,84 @@ 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 */ @@ -380,6 +491,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C32AD266D21269FA7C13F973 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -394,6 +506,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C0868DE41C7CF4911C279A37 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -408,6 +521,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1BAC6A324E6FF557C3F91CC6 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -461,7 +575,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -543,7 +657,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -593,7 +707,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/pubspec.lock b/pubspec.lock index a15b588..b400cc4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -244,10 +244,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" checked_yaml: dependency: transitive description: @@ -1131,10 +1131,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: ebc94ed30fd13cefd397cb1658b593f21571f014b7d1197eeb41fb95f05d899a + sha256: db9df7a5898d894eeda4c78143f35c30a243558be439518972366880b80bf88e url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "8.0.2" google_identity_services_web: dependency: transitive description: @@ -1619,18 +1619,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: @@ -2271,10 +2271,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" timezone: dependency: transitive description: @@ -2628,4 +2628,4 @@ packages: version: "9.1.2" sdks: dart: ">=3.10.8 <4.0.0" - flutter: ">=3.32.8" + flutter: ">=3.35.0" diff --git a/pubspec.yaml b/pubspec.yaml index 69cbeea..d6c31d1 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: path: ^1.8.3 # lottie: ^2.5.0 intl: ^0.19.0 - google_fonts: ^6.2.1 + google_fonts: ^8.0.2 http: ^1.2.2 get: ^4.6.5 get_storage: ^2.1.1 diff --git a/trip_overlay_plugin/example/lib/main.dart b/trip_overlay_plugin/example/lib/main.dart index 79d3bd5..bab302b 100644 --- a/trip_overlay_plugin/example/lib/main.dart +++ b/trip_overlay_plugin/example/lib/main.dart @@ -27,12 +27,12 @@ class _MyAppState extends State { // Platform messages are asynchronous, so we initialize in an async method. Future initPlatformState() async { - String platformVersion; + 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 { - platformVersion = - await _tripOverlayPlugin.getPlatformVersion() ?? 'Unknown platform version'; + // TODO: Replace with the correct method from TripOverlayPlugin + platformVersion = 'Unknown platform version'; } on PlatformException { platformVersion = 'Failed to get platform version.'; } @@ -51,12 +51,8 @@ class _MyAppState extends State { Widget build(BuildContext context) { return MaterialApp( home: Scaffold( - appBar: AppBar( - title: const Text('Plugin example app'), - ), - body: Center( - child: Text('Running on: $_platformVersion\n'), - ), + appBar: AppBar(title: const Text('Plugin example app')), + body: Center(child: Text('Running on: $_platformVersion\n')), ), ); } diff --git a/trip_overlay_plugin/example/pubspec.lock b/trip_overlay_plugin/example/pubspec.lock index a90dbc3..d621858 100644 --- a/trip_overlay_plugin/example/pubspec.lock +++ b/trip_overlay_plugin/example/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" clock: dependency: transitive description: @@ -134,18 +134,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: @@ -243,10 +243,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" trip_overlay_plugin: dependency: "direct main" description: