From 167dd2d389ceaabef95fba6f9dc6a80fe4796791 Mon Sep 17 00:00:00 2001 From: Chandragupt Singh Date: Wed, 22 Oct 2025 16:35:04 +0530 Subject: [PATCH] Fix Android Build and Update Dependencies --- .gitignore | 2 + .vscode/settings.json | 3 +- android/app/build.gradle | 38 +- android/app/google-services.json | 26 +- android/build.gradle | 30 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 32 +- .../data/providers/firestore_provider.dart | 18 +- .../providers/google_cloud_api_provider.dart | 184 +- .../add_or_update_alarm_controller.dart | 4 +- .../views/location_activity_tile.dart | 12 +- .../alarm_challenge_controller.dart | 41 +- .../controllers/alarm_ring_controller.dart | 43 +- .../home/controllers/home_controller.dart | 172 +- .../modules/home/views/notification_icon.dart | 132 +- .../settings/views/google_sign_in.dart | 20 +- .../controllers/timer_ring_controller.dart | 7 +- lib/main.dart | 2 +- macos/Podfile | 2 +- macos/Podfile.lock | 1600 +++++++++++++++++ macos/Runner.xcodeproj/project.pbxproj | 86 +- .../xcshareddata/xcschemes/Runner.xcscheme | 1 + .../contents.xcworkspacedata | 3 + macos/Runner/AppDelegate.swift | 6 +- pubspec.yaml | 58 +- 25 files changed, 2272 insertions(+), 252 deletions(-) create mode 100644 macos/Podfile.lock diff --git a/.gitignore b/.gitignore index 0de4d0a16..704f342bb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related diff --git a/.vscode/settings.json b/.vscode/settings.json index 396571378..56c552db3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "cmake.sourceDirectory": "E:/ultimate_alarm_clock/linux" + "cmake.sourceDirectory": "E:/ultimate_alarm_clock/linux", + "dart.flutterSdkPath": ".fvm/versions/stable" } \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 3da777f22..3f8ea418c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,10 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" + id "com.google.gms.google-services" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +13,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new Exception("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '4' @@ -21,11 +23,6 @@ if (flutterVersionName == null) { flutterVersionName = '0.2.1' } -apply plugin: 'com.android.application' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -33,30 +30,26 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 34 + namespace "com.ccextractor.ultimate_alarm_clock" + compileSdkVersion 36 ndkVersion flutter.ndkVersion defaultConfig { - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - applicationId "com.ccextractor.ultimate_alarm_clock" minSdkVersion 24 - targetSdkVersion 34 // Updated to latest targetSdkVersion + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 // Updated to Java 17 + sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '17' // Updated to Java 17 + jvmTarget = '17' } sourceSets { @@ -93,12 +86,9 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.10" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" - implementation platform('com.google.firebase:firebase-bom:32.0.0') // Updated Firebase BOM to latest + implementation platform('com.google.firebase:firebase-bom:32.0.0') implementation 'com.google.firebase:protolite-well-known-types:18.0.0' implementation("com.android.volley:volley:1.2.1") implementation("com.google.code.gson:gson:2.10.1") implementation("androidx.multidex:multidex:2.0.1") -} \ No newline at end of file +} diff --git a/android/app/google-services.json b/android/app/google-services.json index c4b99b50f..a1426322d 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -1,49 +1,41 @@ { "project_info": { - "project_number": "127901953489", - "project_id": "uac2-7d0f9", - "storage_bucket": "uac2-7d0f9.appspot.com" + "project_number": "328022847331", + "project_id": "ultimatealarmclock-347b3", + "storage_bucket": "ultimatealarmclock-347b3.firebasestorage.app" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:127901953489:android:1c0dea09b93c2b573fc4f0", + "mobilesdk_app_id": "1:328022847331:android:f6e78e62da91ec02e1ad56", "android_client_info": { "package_name": "com.ccextractor.ultimate_alarm_clock" } }, "oauth_client": [ { - "client_id": "127901953489-132kstrs7vl5j5jnubjktu0qodgcn9ml.apps.googleusercontent.com", + "client_id": "328022847331-rs7m47c1tbvnnqfm5hujiulcrkodcjhi.apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "com.ccextractor.ultimate_alarm_clock", - "certificate_hash": "30bf4033c248d9a3ecccbe3615c8baec5f4ed31a" + "certificate_hash": "c52855838a9c765ae85423232a4e6814b711b676" } }, { - "client_id": "127901953489-hgjdtpa0jo2gdrh5vl3s0km66g81v66o.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.ccextractor.ultimate_alarm_clock", - "certificate_hash": "5463a1d268da62e33b869a41760d31cd5ffc1e5d" - } - }, - { - "client_id": "127901953489-lnsmj324f5eutudkjvaidotj99bq1l47.apps.googleusercontent.com", + "client_id": "328022847331-47c00hrduomdh7iukssa0ddf43r2k6h6.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyCEaWUdYF_PnGFu0uJL8Zl_BlT8knDVeHg" + "current_key": "AIzaSyAF6lUiZIrBYS7knK5gH5cqHpj_cHuv_Jw" } ], "services": { "appinvite_service": { "other_platform_oauth_client": [ { - "client_id": "127901953489-lnsmj324f5eutudkjvaidotj99bq1l47.apps.googleusercontent.com", + "client_id": "328022847331-47c00hrduomdh7iukssa0ddf43r2k6h6.apps.googleusercontent.com", "client_type": 3 } ] diff --git a/android/build.gradle b/android/build.gradle index 5dc5d980d..e930c0127 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,36 +1,32 @@ -buildscript { - ext.kotlin_version = '1.7.10' - ext { - compileSdkVersion = 34 - targetSdkVersion = 34 - appCompatVersion = "1.6.1" - } +allprojects { repositories { google() mavenCentral() } - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.15' - } } -allprojects { - repositories { - google() - mavenCentral() +subprojects { + afterEvaluate { project -> + if (project.hasProperty('android')) { + project.android { + if (namespace == null) { + namespace project.group + } + } + } } } rootProject.buildDir = '../build' + subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } + subprojects { project.evaluationDependsOn(':app') } tasks.register("clean", Delete) { delete rootProject.buildDir -} \ No newline at end of file +} diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 532677ec6..5fff187ed 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bcf0..a0f1373b1 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,27 @@ -include ':app' +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 + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -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" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.7.2" apply false + id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.google.gms.google-services" version "4.3.15" apply false +} + + +include ":app" diff --git a/lib/app/data/providers/firestore_provider.dart b/lib/app/data/providers/firestore_provider.dart index e27bd7288..4d9897548 100644 --- a/lib/app/data/providers/firestore_provider.dart +++ b/lib/app/data/providers/firestore_provider.dart @@ -108,11 +108,25 @@ class FirestoreDb { } } - static Future addUser(UserModel userModel) async { +static Future addUser(UserModel userModel) async { + try { + // Use email as document ID instead of Google ID final DocumentReference docRef = _usersCollection.doc(userModel.email); final user = await docRef.get(); - if (!user.exists) await docRef.set(userModel.toJson()); + + if (!user.exists) { + await docRef.set(userModel.toJson()); + print('User added to Firestore: ${userModel.email}'); + } else { + // Update existing user data + await docRef.update(userModel.toJson()); + print('User updated in Firestore: ${userModel.email}'); + } + } catch (e) { + print('Error adding user to Firestore: $e'); + rethrow; // Important: let the caller handle the error } +} static addAlarm(UserModel? user, AlarmModel alarmRecord) async { final sql = await FirestoreDb().getSQLiteDatabase(); diff --git a/lib/app/data/providers/google_cloud_api_provider.dart b/lib/app/data/providers/google_cloud_api_provider.dart index 18b8ea618..fc1150a09 100644 --- a/lib/app/data/providers/google_cloud_api_provider.dart +++ b/lib/app/data/providers/google_cloud_api_provider.dart @@ -1,7 +1,8 @@ import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; -import 'package:googleapis/calendar/v3.dart'; +import 'package:googleapis/calendar/v3.dart' hide Colors; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; import 'package:ultimate_alarm_clock/app/modules/home/controllers/home_controller.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; @@ -11,68 +12,110 @@ import '../models/user_model.dart'; import 'firestore_provider.dart'; class GoogleCloudProvider { - static final GoogleSignIn _googleSignIn = GoogleSignIn( - scopes: [ - CalendarApi.calendarScope, - ], - ); static final _firebaseAuthInstance = FirebaseAuth.instance; + static GoogleSignInAccount? _currentGoogleUser; + + // Scopes for calendar access + static const List scopes = [ + CalendarApi.calendarScope, + ]; static getInstance() async { HomeController homeController = Get.find(); Get.put(SettingsController()); SettingsController settingsController = Get.find(); - if (await _firebaseAuthInstance.currentUser == null) { - var googleSignInAccount = await _googleSignIn.signIn(); - final GoogleSignInAuthentication? googleAuth = - await googleSignInAccount?.authentication; - if (googleAuth != null) - { - final credential = GoogleAuthProvider.credential( - accessToken: googleAuth?.accessToken, - idToken: googleAuth?.idToken, - ); - await _firebaseAuthInstance.signInWithCredential(credential); - } + // NOTE: Replace and + // Initialize GoogleSignIn + await GoogleSignIn.instance.initialize( + clientId: '', + serverClientId: '', + ); + + if (_firebaseAuthInstance.currentUser == null) { + // Authenticate the user + try { + GoogleSignInAccount? googleSignInAccount; + + // Use authenticate() for v7 + if (GoogleSignIn.instance.supportsAuthenticate()) { + googleSignInAccount = await GoogleSignIn.instance.authenticate(); + } + + if (googleSignInAccount != null) { + _currentGoogleUser = googleSignInAccount; + + // Get the authentication object which contains idToken + final GoogleSignInAuthentication googleAuth = + googleSignInAccount.authentication; + + // Create Firebase credential with idToken + final credential = GoogleAuthProvider.credential( + idToken: googleAuth.idToken, + ); + await _firebaseAuthInstance.signInWithCredential(credential); - if (googleSignInAccount != null) { - // Process successful sign-in - String fullName = googleSignInAccount.displayName.toString(); - List parts = fullName.split(' '); - String lastName = ' '; - if (parts.length == 3) { - if (parts[parts.length - 1].length == 1) { - lastName = parts[1].toLowerCase().capitalizeFirst.toString(); - } else { + // Request calendar scopes authorization using authorizationClient + await googleSignInAccount.authorizationClient.authorizeScopes(scopes); + + // Process successful sign-in + String fullName = googleSignInAccount.displayName.toString(); + List parts = fullName.split(' '); + String lastName = ' '; + if (parts.length == 3) { + if (parts[parts.length - 1].length == 1) { + lastName = parts[1].toLowerCase().capitalizeFirst.toString(); + } else { + lastName = parts[parts.length - 1] + .toLowerCase() + .capitalizeFirst + .toString(); + } + } else if (parts.length > 1) { lastName = parts[parts.length - 1] .toLowerCase() .capitalizeFirst .toString(); } + String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); + + var userModel = UserModel( + id: googleSignInAccount.id, + fullName: fullName, + firstName: firstName, + lastName: lastName, + email: googleSignInAccount.email, + ); + // Add user to Firestore with error handling + try { + await FirestoreDb.addUser(userModel); + print('✅ User synced to Firestore successfully'); + } catch (firestoreError) { + print('⚠️ Firestore sync failed: $firestoreError'); + // Show user-friendly message but continue with local storage + Get.snackbar( + 'Warning', + 'Cloud sync unavailable. You can still use local alarms.', + snackPosition: SnackPosition.BOTTOM, + duration: Duration(seconds: 3), + backgroundColor: Colors.orange, + colorText: Colors.white, + ); + } + await SecureStorageProvider().storeUserModel(userModel); + + settingsController.isUserLoggedIn.value = true; + homeController.isUserSignedIn.value = true; + homeController.userModel.value = userModel; + settingsController.userModel.value = userModel; + + return googleSignInAccount; } else { - lastName = - parts[parts.length - 1].toLowerCase().capitalizeFirst.toString(); + return null; } - String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); - - var userModel = UserModel( - id: googleSignInAccount.id, - fullName: fullName, - firstName: firstName, - lastName: lastName, - email: googleSignInAccount.email, - ); - await FirestoreDb.addUser(userModel); - await SecureStorageProvider().storeUserModel(userModel); - - settingsController.isUserLoggedIn.value = true; - homeController.isUserSignedIn.value = true; - homeController.userModel.value = userModel; - settingsController.userModel.value = userModel; - return googleSignInAccount; - } else { + } catch (e) { + print('Error signing in: $e'); return null; } } else { @@ -80,16 +123,28 @@ class GoogleCloudProvider { } } - static isUserLoggedin() { - return _firebaseAuthInstance.currentUser != null; + static bool isUserLoggedin() { + return _firebaseAuthInstance.currentUser != null; } static Future?> getCalenders() async { - if (_googleSignIn.currentUser == null) { + if (_currentGoogleUser == null) { await _firebaseAuthInstance.signOut(); await getInstance(); } - final authHeaders = await _googleSignIn.currentUser!.authHeaders; + + if (_currentGoogleUser == null) { + return null; + } + + // Get authorization headers with calendar scopes + final authHeaders = await _currentGoogleUser!.authorizationClient + .authorizationHeaders(scopes); + + if (authHeaders == null) { + return null; + } + final httpClient = GoogleHttpClient(authHeaders); var dataList = await CalendarApi(httpClient).calendarList.list(); @@ -101,8 +156,22 @@ class GoogleCloudProvider { } static Future?> getEvents(String calenderId) async { - await getInstance(); - final authHeaders = await _googleSignIn.currentUser!.authHeaders; + if (_currentGoogleUser == null) { + await getInstance(); + } + + if (_currentGoogleUser == null) { + return null; + } + + // Get authorization headers with calendar scopes + final authHeaders = await _currentGoogleUser!.authorizationClient + .authorizationHeaders(scopes); + + if (authHeaders == null) { + return null; + } + final httpClient = GoogleHttpClient(authHeaders); var dataList = await CalendarApi(httpClient).events.list(calenderId); if (dataList.items != null) { @@ -117,7 +186,7 @@ class GoogleCloudProvider { Get.put(SettingsController()); SettingsController settingsController = Get.find(); - await _googleSignIn.signOut(); + await GoogleSignIn.instance.disconnect(); _firebaseAuthInstance.signOut(); await SecureStorageProvider().deleteUserModel(); settingsController.isUserLoggedIn.value = false; @@ -125,5 +194,12 @@ class GoogleCloudProvider { homeController.userModel.value = null; homeController.Calendars.value = []; homeController.calendarFetchStatus.value = "Loading"; + _currentGoogleUser = null; + + // Re-initialize for next sign-in + await GoogleSignIn.instance.initialize( + clientId: '', + serverClientId: '', + ); } } diff --git a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart index 86c450c36..2fe623db2 100644 --- a/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart +++ b/lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart @@ -775,7 +775,7 @@ class AddOrUpdateAlarmController extends GetxController { markersList.add( Marker( point: selectedPoint.value, - builder: (ctx) => const Icon( + child: const Icon( Icons.location_on, size: 35, color: Colors.black, @@ -963,7 +963,7 @@ class AddOrUpdateAlarmController extends GetxController { markersList.add( Marker( point: selectedPoint.value, - builder: (ctx) => const Icon( + child: const Icon( Icons.location_on, size: 35, color: Colors.black, diff --git a/lib/app/modules/addOrUpdateAlarm/views/location_activity_tile.dart b/lib/app/modules/addOrUpdateAlarm/views/location_activity_tile.dart index 414dafb39..718ee3cd3 100644 --- a/lib/app/modules/addOrUpdateAlarm/views/location_activity_tile.dart +++ b/lib/app/modules/addOrUpdateAlarm/views/location_activity_tile.dart @@ -6,6 +6,7 @@ import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_cont import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + class LocationTile extends StatelessWidget { const LocationTile({ super.key, @@ -15,11 +16,13 @@ class LocationTile extends StatelessWidget { required this.themeController, }); + final AddOrUpdateAlarmController controller; final ThemeController themeController; final double height; final double width; + @override Widget build(BuildContext context) { return Obx( @@ -29,6 +32,7 @@ class LocationTile extends StatelessWidget { final RenderBox overlay = Overlay.of(context).context.findRenderObject() as RenderBox; + final RelativeRect position = RelativeRect.fromRect( Rect.fromPoints( details.globalPosition, @@ -37,6 +41,7 @@ class LocationTile extends StatelessWidget { Offset.zero & overlay.size, ); + await showMenu( color: themeController.secondaryBackgroundColor.value, context: context, @@ -114,13 +119,13 @@ class LocationTile extends StatelessWidget { controller.selectedPoint.value = point; }, // screenSize: Size(width * 0.3, height * 0.8), - center: controller.selectedPoint.value, - zoom: 15, + initialCenter: controller.selectedPoint.value, + initialZoom: 15, ), children: [ TileLayer( urlTemplate: - 'https://{s}tile.openstreetmap.org/{z}/{x}/{y}.png', + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', ), Obx(() => MarkerLayer( markers: @@ -149,6 +154,7 @@ class LocationTile extends StatelessWidget { ), ); + if (controller.isLocationEnabled.value == false) { await controller.getLocation(); controller.mapController.move(controller.selectedPoint.value, 15); diff --git a/lib/app/modules/alarmChallenge/controllers/alarm_challenge_controller.dart b/lib/app/modules/alarmChallenge/controllers/alarm_challenge_controller.dart index 9bc6e0de5..8875e59d7 100644 --- a/lib/app/modules/alarmChallenge/controllers/alarm_challenge_controller.dart +++ b/lib/app/modules/alarmChallenge/controllers/alarm_challenge_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; @@ -11,42 +12,53 @@ import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + class AlarmChallengeController extends GetxController { AlarmModel alarmRecord = Get.arguments; + final RxDouble progress = 1.0.obs; + final RxInt shakedCount = 0.obs; final isShakeOngoing = Status.initialized.obs; ShakeDetector? _shakeDetector; MobileScannerController? qrController; + final qrValue = ''.obs; final isQrOngoing = Status.initialized.obs; + final isMathsOngoing = Status.initialized.obs; + final RxInt numMathsQuestions = 0.obs; final RxString displayValue = ''.obs; final RxString questionText = '0'.obs; final RxBool correctAnswer = false.obs; int mathsAnswer = 0; + bool isTimerEnabled = true; bool isNumMathQuestionsSet = false; + final RxInt stepsCount = 0.obs; final isPedometerOngoing = Status.initialized.obs; late int numberOfSteps; int initialSteps = 0; bool shouldProcessStepCount = false; + late Stream _stepCountStream; + void onButtonPressed(String buttonText) { displayValue.value += buttonText; } + restartQRCodeController() { qrController = MobileScannerController( autoStart: true, @@ -56,6 +68,7 @@ class AlarmChallengeController extends GetxController { ); } + newMathsQuestion() { if (!isNumMathQuestionsSet) { numMathsQuestions.value = alarmRecord.numMathsQuestions; @@ -69,6 +82,7 @@ class AlarmChallengeController extends GetxController { mathsAnswer = mathsProblemDetails[1]; } + void onStepCount(StepCount event) { if (shouldProcessStepCount) { if (initialSteps == 0) { @@ -79,6 +93,7 @@ class AlarmChallengeController extends GetxController { } } + void onStepCountError(error) { if (shouldProcessStepCount) { debugPrint('onStepCountError: $error'); @@ -86,19 +101,22 @@ class AlarmChallengeController extends GetxController { } } + @override void onInit() async { super.onInit(); _startTimer(); + String ringtoneName = alarmRecord.ringtoneName; + AudioUtils.stopAlarm(ringtoneName: ringtoneName); if (alarmRecord.isShakeEnabled) { isShakeOngoing.listen((value) { if (value == Status.ongoing) { _shakeDetector = ShakeDetector.autoStart( - onPhoneShake: () { + onPhoneShake: (ShakeEvent event) { shakedCount.value -= 1; restartTimer(); }, @@ -106,6 +124,7 @@ class AlarmChallengeController extends GetxController { } }); + shakedCount.listen((value) { if (value == 0) { isShakeOngoing.value = Status.completed; @@ -117,6 +136,7 @@ class AlarmChallengeController extends GetxController { }); } + if (alarmRecord.isQrEnabled) { qrController = MobileScannerController( autoStart: true, @@ -125,6 +145,7 @@ class AlarmChallengeController extends GetxController { torchEnabled: false, ); + qrValue.listen((value) { restartTimer(); if (value == alarmRecord.qrValue) { @@ -137,9 +158,11 @@ class AlarmChallengeController extends GetxController { }); } + if (alarmRecord.isMathsEnabled) { newMathsQuestion(); + numMathsQuestions.listen((value) { if (value <= 0) { isMathsOngoing.value = Status.completed; @@ -151,6 +174,7 @@ class AlarmChallengeController extends GetxController { } }); + isMathsOngoing.listen((value) { if (value == Status.initialized) { Future.delayed(const Duration(seconds: 1), () { @@ -160,23 +184,29 @@ class AlarmChallengeController extends GetxController { }); } + if (alarmRecord.isPedometerEnabled) { final PermissionStatus status = await Permission.activityRecognition.request(); + if (status == PermissionStatus.granted) { numberOfSteps = alarmRecord.numberOfSteps; + shouldProcessStepCount = true; + _stepCountStream = Pedometer.stepCountStream; + isPedometerOngoing.listen((value) { if (value == Status.ongoing) { _stepCountStream.listen(onStepCount).onError(onStepCountError); } }); + stepsCount.listen((value) { if (numberOfSteps - value <= 0) { isPedometerOngoing.value = Status.completed; @@ -199,11 +229,13 @@ class AlarmChallengeController extends GetxController { } } + void _startTimer() async { const duration = Duration(seconds: 15); const totalIterations = 1500000; const decrement = 0.000001; + for (var i = totalIterations; i > 0; i--) { if (!isTimerEnabled) { debugPrint('THIS IS THE BUG'); @@ -219,11 +251,13 @@ class AlarmChallengeController extends GetxController { } } + restartTimer() { progress.value = 1.0; // Reset the progress to its initial value _startTimer(); // Start a new timer } + isChallengesComplete() { if (!Utils.isChallengeEnabled(alarmRecord)) { isNumMathQuestionsSet = false; @@ -232,14 +266,18 @@ class AlarmChallengeController extends GetxController { } } + @override void onClose() async { super.onClose(); + shouldProcessStepCount = false; + String ringtoneName = alarmRecord.ringtoneName; + if (!Utils.isChallengeEnabled(alarmRecord)) { AudioUtils.stopAlarm(ringtoneName: ringtoneName); } else { @@ -255,4 +293,3 @@ class AlarmChallengeController extends GetxController { } } } - diff --git a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart index 01b319d97..aaca9fcff 100644 --- a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart +++ b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart @@ -1,18 +1,23 @@ import 'dart:async'; import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; + import 'package:flutter_fgbg/flutter_fgbg.dart'; import 'package:flutter_volume_controller/flutter_volume_controller.dart'; + import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/models/alarm_model.dart'; import 'package:ultimate_alarm_clock/app/data/models/quote_model.dart'; + import 'package:ultimate_alarm_clock/app/data/models/user_model.dart'; + import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; import 'package:ultimate_alarm_clock/app/data/providers/secure_storage_provider.dart'; @@ -21,12 +26,15 @@ import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_cont import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/constants.dart'; + import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:vibration/vibration.dart'; import 'package:sensors_plus/sensors_plus.dart'; + import '../../home/controllers/home_controller.dart'; + class AlarmControlController extends GetxController { MethodChannel alarmChannel = MethodChannel('ulticlock'); RxString note = ''.obs; @@ -55,6 +63,7 @@ class AlarmControlController extends GetxController { RxInt guardianCoundown = 120.obs; RxBool isPreviewMode = false.obs; + getNextAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); AlarmModel _alarmRecord = homeController.genFakeAlarmModel(); @@ -66,13 +75,16 @@ class AlarmControlController extends GetxController { Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); debugPrint('LATEST : ${latestAlarm.alarmTime}'); + return latestAlarm; } + void addMinutes(int incrementMinutes) { minutes.value += incrementMinutes; } + void startSnooze() async { int actualMaxSnoozeCount = currentlyRingingAlarm.value.maxSnoozeCount; @@ -102,10 +114,12 @@ class AlarmControlController extends GetxController { String ringtoneName = currentlyRingingAlarm.value.ringtoneName; AudioUtils.stopAlarm(ringtoneName: ringtoneName); + if (_currentTimeTimer!.isActive) { _currentTimeTimer?.cancel(); } + _currentTimeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { if (minutes.value == 0 && seconds.value == 0) { timer.cancel(); @@ -114,8 +128,10 @@ class AlarmControlController extends GetxController { Vibration.vibrate(pattern: [500, 3000]); }); + AudioUtils.playAlarm(alarmRecord: currentlyRingingAlarm.value); + startTimer(); } else if (seconds.value == 0) { minutes.value--; @@ -126,6 +142,7 @@ class AlarmControlController extends GetxController { }); } + void startTimer() { minutes.value = currentlyRingingAlarm.value.snoozeDuration; isSnoozing.value = false; @@ -142,6 +159,7 @@ class AlarmControlController extends GetxController { }); } + Future _fadeInAlarmVolume() async { await FlutterVolumeController.setVolume( currentlyRingingAlarm.value.volMin / 10.0, @@ -149,6 +167,7 @@ class AlarmControlController extends GetxController { ); await Future.delayed(const Duration(milliseconds: 2000)); + double vol = currentlyRingingAlarm.value.volMin / 10.0; double diff = (currentlyRingingAlarm.value.volMax - currentlyRingingAlarm.value.volMin) / @@ -158,26 +177,31 @@ class AlarmControlController extends GetxController { int stepLen = max(4, (steps > 0) ? len ~/ steps : len); int lastTick = DateTime.now().millisecondsSinceEpoch; + Timer.periodic(Duration(milliseconds: stepLen), (Timer t) { if (!isAlarmActive) { t.cancel(); return; } + var now = DateTime.now().millisecondsSinceEpoch; var tick = (now - lastTick) / len; lastTick = now; vol += diff * tick; + vol = max(currentlyRingingAlarm.value.volMin / 10.0, vol); vol = min(currentlyRingingAlarm.value.volMax / 10.0, vol); vol = (vol * 100).round() / 100; + FlutterVolumeController.setVolume( vol, stream: AudioStream.alarm, ); + if (vol >= currentlyRingingAlarm.value.volMax / 10.0) { t.cancel(); } @@ -193,6 +217,7 @@ class AlarmControlController extends GetxController { }); } + void showQuotePopup(Quote quote) { Get.defaultDialog( title: 'Motivational Quote', @@ -255,6 +280,7 @@ class AlarmControlController extends GetxController { ); } + @override void onInit() async { super.onInit(); @@ -270,6 +296,7 @@ class AlarmControlController extends GetxController { isPreviewMode.value = false; } + if (currentlyRingingAlarm.value.isarId > 0) { final dbAlarm = await IsarDb.getAlarm(currentlyRingingAlarm.value.isarId); if (dbAlarm != null && dbAlarm.maxSnoozeCount != currentlyRingingAlarm.value.maxSnoozeCount) { @@ -291,27 +318,33 @@ class AlarmControlController extends GetxController { }); } + showButton.value = true; initialVolume = await FlutterVolumeController.getVolume( stream: AudioStream.alarm, ) as double; + FlutterVolumeController.updateShowSystemUI(false); + // _fadeInAlarmVolume(); TODO fix volume fade-in + vibrationTimer = Timer.periodic(const Duration(milliseconds: 3500), (Timer timer) { Vibration.vibrate(pattern: [500, 3000]); }); + // Preventing app from being minimized! - _subscription = FGBGEvents.stream.listen((event) { + _subscription = FGBGEvents.instance.stream.listen((event) { if (event == FGBGType.background) { alarmChannel.invokeMethod('bringAppToForeground'); } }); + startTimer(); // if (Get.arguments == null) { // currentlyRingingAlarm.value = await getCurrentlyRingingAlarm(); @@ -356,17 +389,21 @@ class AlarmControlController extends GetxController { // showButton.value = true; // } + AudioUtils.playAlarm(alarmRecord: currentlyRingingAlarm.value); + if(currentlyRingingAlarm.value.showMotivationalQuote) { Quote quote = Utils.getRandomQuote(); showQuotePopup(quote); } + // Setting snooze duration minutes.value = currentlyRingingAlarm.value.snoozeDuration; + // Scheduling next alarm if it's not in preview mode if (Get.arguments == null) { // Finding the next alarm to ring @@ -374,6 +411,7 @@ class AlarmControlController extends GetxController { TimeOfDay latestAlarmTimeOfDay = Utils.stringToTimeOfDay(latestAlarm.alarmTime); + // } // This condition will never satisfy because this will only // occur if fake model is returned as latest alarm @@ -384,6 +422,7 @@ class AlarmControlController extends GetxController { 'current = ${currentTime.toString()}', ); + await alarmChannel.invokeMethod('cancelAllScheduledAlarms'); } else { int intervaltoAlarm = Utils.getMillisecondsToAlarm( @@ -391,6 +430,7 @@ class AlarmControlController extends GetxController { Utils.timeOfDayToDateTime(latestAlarmTimeOfDay), ); + try { await alarmChannel.invokeMethod('scheduleAlarm', { 'milliSeconds': intervaltoAlarm, @@ -404,6 +444,7 @@ class AlarmControlController extends GetxController { } } + @override void onClose() async { super.onClose(); diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index 449ca94fa..1e58e272a 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -20,19 +20,24 @@ import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_cont import 'package:ultimate_alarm_clock/app/utils/constants.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; + import '../../../data/models/profile_model.dart'; import '../../../data/providers/google_cloud_api_provider.dart'; + class Pair { final T first; final U second; + Pair(this.first, this.second); } + class HomeController extends GetxController { MethodChannel alarmChannel = const MethodChannel('ulticlock'); + Stream? firestoreStreamAlarms; Stream? sharedAlarmsStream; Stream? isarStreamAlarms; @@ -48,23 +53,23 @@ class HomeController extends GetxController { List alarms = [].obs; List notifications = [].obs; + int lastRefreshTime = DateTime.now().millisecondsSinceEpoch; Timer? delayToSchedule; - final GoogleSignIn _googleSignIn = GoogleSignIn( - scopes: [ - CalendarApi.CalendarApi.calendarScope, - ], - ); - final Rx userModel = Rx(null); + final RxBool isUserSignedIn = false.obs; + final Rx userModel = Rx(null); final floatingButtonKey = GlobalKey(); final floatingButtonKeyLoggedOut = GlobalKey(); + final alarmIdController = TextEditingController(); + ScrollController scrollController = ScrollController(); RxDouble scalingFactor = 1.0.obs; + RxBool isSortedAlarmListEnabled = true.obs; RxBool inMultipleSelectMode = false.obs; RxBool isAnyAlarmHolded = false.obs; @@ -72,11 +77,14 @@ class HomeController extends GetxController { RxInt numberOfAlarmsSelected = 0.obs; Pair, List> alarmListPairs = Pair([], []); + Set> selectedAlarmSet = {}; + final RxInt duration = 3.obs; final RxDouble selecteddurationDouble = 0.0.obs; + ThemeController themeController = Get.find(); RxList Calendars = [].obs; RxList Events = [].obs; @@ -85,51 +93,76 @@ class HomeController extends GetxController { RxBool isCalender = true.obs; RxBool expandProfile = false.obs; + RxBool isProfile = false.obs; RxString selectedProfile = ''.obs; Rx profileModel = Utils.genDefaultProfileModel().obs; + final storage = Get.find(); + RxBool isProfileUpdate = false.obs; + loginWithGoogle() async { - // Logging in again to ensure right details if User has linked account - if (await SecureStorageProvider().retrieveUserModel() != null) { - if (await _googleSignIn.isSignedIn()) { - GoogleSignInAccount? googleSignInAccount = - await _googleSignIn.signInSilently(); - String fullName = googleSignInAccount!.displayName.toString(); - List parts = fullName.split(' '); - String lastName = ' '; - if (parts.length == 3) { - if (parts[parts.length - 1].length == 1) { - lastName = parts[1].toLowerCase().capitalizeFirst.toString(); - } else { - lastName = parts[parts.length - 1] - .toLowerCase() - .capitalizeFirst - .toString(); + try { + // Initialize GoogleSignIn first (without scopes parameter) + await GoogleSignIn.instance.initialize(); + + // Check if user model exists in secure storage + if (await SecureStorageProvider().retrieveUserModel() != null) { + // Listen to authentication events + GoogleSignIn.instance.authenticationEvents.listen((event) { + if (event is GoogleSignInAuthenticationEventSignIn) { + GoogleSignInAccount googleSignInAccount = event.user; + String fullName = googleSignInAccount.displayName ?? ''; + List parts = fullName.split(' '); + String lastName = ' '; + + if (parts.length == 3) { + if (parts[parts.length - 1].length == 1) { + lastName = parts[1].toLowerCase().capitalizeFirst.toString(); + } else { + lastName = parts[parts.length - 1] + .toLowerCase() + .capitalizeFirst + .toString(); + } + } else if (parts.length > 1) { + lastName = parts[parts.length - 1] + .toLowerCase() + .capitalizeFirst + .toString(); + } + + String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); + + userModel.value = UserModel( + id: googleSignInAccount.id, + fullName: fullName, + firstName: firstName, + lastName: lastName, + email: googleSignInAccount.email, + ); + + SecureStorageProvider().storeUserModel(userModel.value!); + isUserSignedIn.value = true; + } else if (event is GoogleSignInAuthenticationEventSignOut) { + isUserSignedIn.value = false; } - } else { - lastName = - parts[parts.length - 1].toLowerCase().capitalizeFirst.toString(); - } - String firstName = parts[0].toLowerCase().capitalizeFirst.toString(); - - userModel.value = UserModel( - id: googleSignInAccount.id, - fullName: fullName, - firstName: firstName, - lastName: lastName, - email: googleSignInAccount.email, - ); - await SecureStorageProvider().storeUserModel(userModel.value!); - isUserSignedIn.value = true; + }); + + // Attempt lightweight authentication (silent sign-in) + await GoogleSignIn.instance.attemptLightweightAuthentication(); } + } catch (e) { + debugPrint('Error during Google Sign-In: $e'); + isUserSignedIn.value = false; } } + initStream(UserModel? user) async { firestoreStreamAlarms = FirestoreDb.getAlarms(userModel.value); isarStreamAlarms = IsarDb.getAlarms(selectedProfile.value); @@ -146,22 +179,27 @@ class HomeController extends GetxController { ); }).toList(); + latestIsarAlarms = isarData as List; + List alarms = [ ...latestFirestoreAlarms, ...latestIsarAlarms, ]; + if (isSortedAlarmListEnabled.value) { alarms.sort((a, b) { final String timeA = a.alarmTime; final String timeB = b.alarmTime; + // Convert the alarm time strings to DateTime objects for comparison DateTime dateTimeA = DateFormat('HH:mm').parse(timeA); DateTime dateTimeB = DateFormat('HH:mm').parse(timeB); + // Compare the DateTime objects to sort in ascending order return dateTimeA.compareTo(dateTimeB); }); @@ -172,15 +210,18 @@ class HomeController extends GetxController { return a.isEnabled ? -1 : 1; } + // Then sort by upcoming time int aUpcomingTime = a.minutesSinceMidnight; int bUpcomingTime = b.minutesSinceMidnight; + // Check if alarm repeats on any day bool aRepeats = a.days.any((day) => day); bool bRepeats = b.days.any((day) => day); - // If alarm repeats on any day, find the next up+coming day + + // If alarm repeats on any day, find the next upcoming day if (aRepeats) { int currentDay = DateTime.now().weekday - 1; for (int i = 0; i < a.days.length; i++) { @@ -199,6 +240,7 @@ class HomeController extends GetxController { } } + if (bRepeats) { int currentDay = DateTime.now().weekday - 1; for (int i = 0; i < b.days.length; i++) { @@ -217,17 +259,21 @@ class HomeController extends GetxController { } } + return aUpcomingTime.compareTo(bUpcomingTime); }); } + return alarms; }, ); + return streamAlarms; } + void readProfileName() async { String profileName = await storage.readProfile(); selectedProfile.value = profileName; @@ -239,6 +285,7 @@ class HomeController extends GetxController { } + void writeProfileName(String name) async { await storage.writeProfile(name); selectedProfile.value = name; @@ -249,6 +296,7 @@ class HomeController extends GetxController { } } + @override void onInit() async { super.onInit(); @@ -260,6 +308,9 @@ class HomeController extends GetxController { } readProfileName(); + // Initialize Google Sign-In (without scopes - they're requested during authorization) + await GoogleSignIn.instance.initialize(); + userModel.value = await SecureStorageProvider().retrieveUserModel(); if (userModel.value == null){ FirebaseAuth.instance.authStateChanges().listen((user) { @@ -272,36 +323,46 @@ class HomeController extends GetxController { } else { isUserSignedIn.value = true; + // Attempt silent sign-in if user model exists + await loginWithGoogle(); } + isSortedAlarmListEnabled.value = await SecureStorageProvider() .readSortedAlarmListValue(key: 'sorted_alarm_list'); + scrollController.addListener(() { final offset = scrollController.offset; const maxOffset = 100.0; const minFactor = 0.8; const maxFactor = 1.0; + final newFactor = 1.0 - (offset / maxOffset).clamp(0.0, 1.0); scalingFactor.value = (minFactor + (maxFactor - minFactor) * newFactor); }); + } + refreshUpcomingAlarms() async { // Check if 2 seconds have passed since the last call final currentTime = DateTime.now().millisecondsSinceEpoch; + if (currentTime - lastRefreshTime < 2000) { delayToSchedule?.cancel(); } + if (delayToSchedule != null && delayToSchedule!.isActive) { return; } + delayToSchedule = Timer(const Duration(seconds: 1), () async { lastRefreshTime = DateTime.now().millisecondsSinceEpoch; // Cancel timer if we have to refresh @@ -311,19 +372,23 @@ class HomeController extends GetxController { refreshTimer = false; } + // Fake object to get latest alarm AlarmModel alarmRecord = genFakeAlarmModel(); AlarmModel isarLatestAlarm = await IsarDb.getLatestAlarm(alarmRecord, true); + AlarmModel firestoreLatestAlarm = await FirestoreDb.getLatestAlarm(userModel.value, alarmRecord, true); AlarmModel latestAlarm = Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); + debugPrint('ISAR: ${isarLatestAlarm.alarmTime}'); debugPrint('Fire: ${firestoreLatestAlarm.alarmTime}'); + String timeToAlarm = Utils.timeUntilAlarm( Utils.stringToTimeOfDay(latestAlarm.alarmTime), latestAlarm.days, @@ -337,6 +402,7 @@ class HomeController extends GetxController { latestAlarm, ); + if (latestAlarm.minutesSinceMidnight > -1) { // To account for difference between seconds upto the next minute DateTime now = DateTime.now(); @@ -346,6 +412,7 @@ class HomeController extends GetxController { ? nextMinute.difference(now) : Duration.zero; + // Adding a delay till that difference between seconds up to the next // minute _delayTimer = Timer(delay, () { @@ -365,6 +432,7 @@ class HomeController extends GetxController { ); alarmTime.value = 'Rings in $timeToAlarm'; + // Running a timer of periodic one minute as it is now in sync with // the current time _timer = Timer.periodic( @@ -387,6 +455,7 @@ class HomeController extends GetxController { }); } + scheduleNextAlarm( AlarmModel alarmRecord, AlarmModel isarLatestAlarm, @@ -417,15 +486,18 @@ class HomeController extends GetxController { } } + @override void onClose() { super.onClose(); + if (delayToSchedule != null) { delayToSchedule!.cancel(); } } + Future fetchGoogleCalendars() async { Calendars.value = (await GoogleCloudProvider.getCalenders()) ?? []; if (Calendars.value == []) { @@ -435,6 +507,7 @@ class HomeController extends GetxController { } } + Future fetchEvents(String calenderId) async { Events.value = await GoogleCloudProvider.getEvents(calenderId) ?? []; if (Events.value == []) { @@ -447,6 +520,7 @@ class HomeController extends GetxController { print(Events.value); } + Future setAlarmFromEvent(CalendarApi.Event event, String date) async { AlarmModel alarmModel = genFakeAlarmModel(); alarmModel.alarmTime = Utils.formatDateTimeToHHMMSS( @@ -458,6 +532,7 @@ class HomeController extends GetxController { ); alarmModel.ringOn = true; + alarmModel.label = event.summary!; alarmModel.isOneTime = true; isProfile.value = false; @@ -467,7 +542,8 @@ class HomeController extends GetxController { ); } - // Add all alarms to seleted alarm set + + // Add all alarms to selected alarm set void addAllAlarmsToSelectedAlarmSet() { for (int index = 0; index < alarmListPairs.first.length; index++) { AlarmModel alarm = alarmListPairs.first[index]; @@ -486,6 +562,7 @@ class HomeController extends GetxController { } } + // Remove all alarms from the selected alarm set void removeAllAlarmsFromSelectedAlarmSet() { for (int index = 0; index < alarmListPairs.first.length; index++) { @@ -494,6 +571,7 @@ class HomeController extends GetxController { } } + // Delete alarms mentioned in the selected alarm set Future deleteAlarms() async { try { @@ -508,13 +586,16 @@ class HomeController extends GetxController { return; } + int successCount = 0; List deletedAlarms = []; + for (var alarm in selectedAlarmSet) { var alarmId = alarm.first; var isSharedAlarmEnabled = alarm.second; + try { if (isSharedAlarmEnabled) { @@ -539,11 +620,13 @@ class HomeController extends GetxController { } } + if (successCount > 0) { if (Get.isSnackbarOpen) { Get.closeAllSnackbars(); } + Get.snackbar( 'Success', '$successCount ${successCount == 1 ? 'alarm' : 'alarms'} deleted', @@ -576,6 +659,7 @@ class HomeController extends GetxController { ), ); + selectedAlarmSet.clear(); numberOfAlarmsSelected.value = 0; @@ -600,9 +684,11 @@ class HomeController extends GetxController { } } + Future swipeToDeleteAlarm(UserModel? user, AlarmModel alarm) async { AlarmModel? alarmToDelete; + if (alarm.isSharedAlarmEnabled == true) { alarmToDelete = await FirestoreDb.getAlarm(user, alarm.firestoreId!); await FirestoreDb.deleteAlarm(user, alarm.firestoreId!); @@ -611,10 +697,12 @@ class HomeController extends GetxController { await IsarDb.deleteAlarm(alarm.isarId); } + if (Get.isSnackbarOpen) { Get.closeAllSnackbars(); } + Get.snackbar( 'Alarm deleted', 'The alarm has been deleted.', @@ -637,6 +725,7 @@ class HomeController extends GetxController { ); } + void showDeleteConfirmationDialog(BuildContext context) async { Get.defaultDialog( titlePadding: const EdgeInsets.symmetric( @@ -679,17 +768,20 @@ class HomeController extends GetxController { onPressed: () async { await deleteAlarms(); + // Closing the multiple select mode inMultipleSelectMode.value = false; isAnyAlarmHolded.value = false; isAllAlarmsSelected.value = false; + numberOfAlarmsSelected.value = 0; selectedAlarmSet.clear(); // After deleting alarms, refreshing to schedule latest one refreshTimer = true; refreshUpcomingAlarms(); + Get.offNamedUntil( '/bottom-navigation-bar', (route) => route.settings.name == '/splash-screen', @@ -717,10 +809,12 @@ class HomeController extends GetxController { ); } + getCurrentProfileModel() async { profileModel.value = (await IsarDb.getProfile(selectedProfile.value))!; } + AlarmModel genFakeAlarmModel() { return AlarmModel( volMax: profileModel.value.volMax, diff --git a/lib/app/modules/home/views/notification_icon.dart b/lib/app/modules/home/views/notification_icon.dart index feb82ce04..3574d4558 100644 --- a/lib/app/modules/home/views/notification_icon.dart +++ b/lib/app/modules/home/views/notification_icon.dart @@ -1,3 +1,5 @@ +// You will need to add this import for the explicit snapshot types +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/providers/firestore_provider.dart'; @@ -11,52 +13,96 @@ Widget notificationIcon(HomeController controller) { padding: const EdgeInsets.all(8.0), child: Obx( () => controller.isUserSignedIn.value - ? StreamBuilder( + ? StreamBuilder>>( stream: FirestoreDb.getNotifications(), - builder: (context, snapshot) { - if (snapshot.hasData) { - final List notif = snapshot.data!['receivedItems']; - controller.notifications = notif; - return notif.isEmpty - ? InkWell( - onTap: () { - Get.snackbar('Notifications', 'No Notifications'); - }, - child: const Icon(Icons.notifications), - ) - : InkWell( - onTap: () { - Get.toNamed( - Routes.NOTIFICATIONS, - ); - }, - child: Stack( - children: [ - const Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0), - child: Icon( - Icons.notifications, - ), + // Be explicit with the snapshot type for better safety + builder: (context, + AsyncSnapshot>> + snapshot) { + // 1. Handle errors (like the SecurityException) + if (snapshot.hasError) { + print("Error in notification stream: ${snapshot.error}"); + // Return the disabled icon as per your original 'else' block + return const Icon( + Icons.notifications_none, + color: kprimaryDisabledTextColor, + ); + } + + // 2. Handle loading state + if (snapshot.connectionState == ConnectionState.waiting) { + // Return the disabled icon as per your original 'else' block + return const Icon( + Icons.notifications_none, + color: kprimaryDisabledTextColor, + ); + } + + // 3. Handle document not existing + if (!snapshot.hasData || !snapshot.data!.exists) { + // Use your "no notifications" UI from the original `notif.isEmpty` block + return InkWell( + onTap: () { + Get.snackbar('Notifications', 'No Notifications'); + }, + // We use the non-disabled icon, as this is a valid (empty) state + child: const Icon(Icons.notifications), + ); + } + + // 4. Handle field not existing (extra safe) + var data = snapshot.data!.data(); + if (data == null || !data.containsKey('receivedItems')) { + // Use your "no notifications" UI + return InkWell( + onTap: () { + Get.snackbar('Notifications', 'No Notifications'); + }, + child: const Icon(Icons.notifications), + ); + } + + // 5. SUCCESS! Data is valid and the field exists. + // We can now safely access the data. + final List notif = data['receivedItems'] as List; + controller.notifications = notif; + + // Return your original logic, which is now 100% safe to run + return notif.isEmpty + ? InkWell( + onTap: () { + Get.snackbar('Notifications', 'No Notifications'); + }, + child: const Icon(Icons.notifications), + ) + : InkWell( + onTap: () { + Get.toNamed( + Routes.NOTIFICATIONS, + ); + }, + child: Stack( + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Icon( + Icons.notifications, ), - Positioned( - left: 28, - top: -3, - child: Text( - '${notif.length}', - style: const TextStyle( - color: kprimaryColor, - fontWeight: FontWeight.w700, - ), + ), + Positioned( + left: 28, + top: -3, + child: Text( + '${notif.length}', + style: const TextStyle( + color: kprimaryColor, + fontWeight: FontWeight.w700, ), ), - ], - ), - ); - } - return const Icon( - Icons.notifications_none, - color: kprimaryDisabledTextColor, - ); + ), + ], + ), + ); }, ) : const Icon( @@ -65,4 +111,4 @@ Widget notificationIcon(HomeController controller) { ), ), ); -} +} \ No newline at end of file diff --git a/lib/app/modules/settings/views/google_sign_in.dart b/lib/app/modules/settings/views/google_sign_in.dart index 38b14855b..d72be1fbf 100644 --- a/lib/app/modules/settings/views/google_sign_in.dart +++ b/lib/app/modules/settings/views/google_sign_in.dart @@ -31,8 +31,26 @@ class GoogleSignIn extends StatelessWidget { onTap: () async { Utils.hapticFeedback(); if (controller.isUserLoggedIn.value == false) { + // Show loading dialog - THIS IS THE ONLY ADDITION + Get.dialog( + WillPopScope( + onWillPop: () async => false, + child: Center( + child: CircularProgressIndicator( + color: kprimaryColor, + ), + ), + ), + barrierDismissible: false, + ); + var isSuccessfulLogin = await GoogleCloudProvider.getInstance(); + // Close loading dialog - THIS IS THE ONLY ADDITION + if (Get.isDialogOpen ?? false) { + Get.back(); + } + if (isSuccessfulLogin != null) { Get.defaultDialog( titlePadding: const EdgeInsets.symmetric(vertical: 20), @@ -300,4 +318,4 @@ class GoogleSignIn extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/lib/app/modules/timerRing/controllers/timer_ring_controller.dart b/lib/app/modules/timerRing/controllers/timer_ring_controller.dart index 045220c26..d0aaf0832 100644 --- a/lib/app/modules/timerRing/controllers/timer_ring_controller.dart +++ b/lib/app/modules/timerRing/controllers/timer_ring_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; + import 'package:flutter/services.dart'; import 'package:flutter_fgbg/flutter_fgbg.dart'; import 'package:get/get.dart'; @@ -8,6 +9,7 @@ import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:vibration/vibration.dart'; + class TimerRingController extends GetxController { MethodChannel timerChannel = const MethodChannel('timer'); Timer? vibrationTimer; @@ -20,8 +22,9 @@ class TimerRingController extends GetxController { void onInit() async { super.onInit(); + // Preventing app from being minimized! - _subscription = FGBGEvents.stream.listen((event) { + _subscription = FGBGEvents.instance.stream.listen((event) { if (event == FGBGType.background) { timerChannel.invokeMethod('bringAppToForeground'); } @@ -32,9 +35,11 @@ class TimerRingController extends GetxController { }); AudioUtils.playTimer(alarmRecord: await getFakeTimerModel().value); + await timerChannel.invokeMethod('cancelTimer'); } + @override onClose() async { Vibration.cancel(); diff --git a/lib/main.dart b/lib/main.dart index 000c71573..b1d2eba7d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -32,7 +32,7 @@ void main() async { final ThemeController themeController = Get.put(ThemeController()); AudioPlayer.global.setAudioContext( - const AudioContext( + AudioContext( android: AudioContextAndroid( audioMode: AndroidAudioMode.ringtone, contentType: AndroidContentType.music, diff --git a/macos/Podfile b/macos/Podfile index 049abe295..9ec46f8cd 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 000000000..6c73d2d1d --- /dev/null +++ b/macos/Podfile.lock @@ -0,0 +1,1600 @@ +PODS: + - abseil/algorithm (1.20240722.0): + - abseil/algorithm/algorithm (= 1.20240722.0) + - abseil/algorithm/container (= 1.20240722.0) + - abseil/algorithm/algorithm (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/algorithm/container (1.20240722.0): + - abseil/algorithm/algorithm + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base (1.20240722.0): + - abseil/base/atomic_hook (= 1.20240722.0) + - abseil/base/base (= 1.20240722.0) + - abseil/base/base_internal (= 1.20240722.0) + - abseil/base/config (= 1.20240722.0) + - abseil/base/core_headers (= 1.20240722.0) + - abseil/base/cycleclock_internal (= 1.20240722.0) + - abseil/base/dynamic_annotations (= 1.20240722.0) + - abseil/base/endian (= 1.20240722.0) + - abseil/base/errno_saver (= 1.20240722.0) + - abseil/base/fast_type_id (= 1.20240722.0) + - abseil/base/log_severity (= 1.20240722.0) + - abseil/base/malloc_internal (= 1.20240722.0) + - abseil/base/no_destructor (= 1.20240722.0) + - abseil/base/nullability (= 1.20240722.0) + - abseil/base/poison (= 1.20240722.0) + - abseil/base/prefetch (= 1.20240722.0) + - abseil/base/pretty_function (= 1.20240722.0) + - abseil/base/raw_logging_internal (= 1.20240722.0) + - abseil/base/spinlock_wait (= 1.20240722.0) + - abseil/base/strerror (= 1.20240722.0) + - abseil/base/throw_delegate (= 1.20240722.0) + - abseil/base/atomic_hook (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/base (1.20240722.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/cycleclock_internal + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/base_internal (1.20240722.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/config (1.20240722.0): + - abseil/xcprivacy + - abseil/base/core_headers (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/cycleclock_internal (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/xcprivacy + - abseil/base/dynamic_annotations (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/endian (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/xcprivacy + - abseil/base/errno_saver (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/fast_type_id (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/log_severity (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/malloc_internal (1.20240722.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/base/no_destructor (1.20240722.0): + - abseil/base/config + - abseil/base/nullability + - abseil/xcprivacy + - abseil/base/nullability (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/poison (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal + - abseil/xcprivacy + - abseil/base/prefetch (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/pretty_function (1.20240722.0): + - abseil/xcprivacy + - abseil/base/raw_logging_internal (1.20240722.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/log_severity + - abseil/xcprivacy + - abseil/base/spinlock_wait (1.20240722.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/xcprivacy + - abseil/base/strerror (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/xcprivacy + - abseil/base/throw_delegate (1.20240722.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/cleanup/cleanup (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/cleanup/cleanup_internal + - abseil/xcprivacy + - abseil/cleanup/cleanup_internal (1.20240722.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/common (1.20240722.0): + - abseil/meta/type_traits + - abseil/types/optional + - abseil/xcprivacy + - abseil/container/common_policy_traits (1.20240722.0): + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/compressed_tuple (1.20240722.0): + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/container_memory (1.20240722.0): + - abseil/base/config + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/fixed_array (1.20240722.0): + - abseil/algorithm/algorithm + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/xcprivacy + - abseil/container/flat_hash_map (1.20240722.0): + - abseil/algorithm/container + - abseil/base/core_headers + - abseil/container/container_memory + - abseil/container/hash_container_defaults + - abseil/container/raw_hash_map + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/flat_hash_set (1.20240722.0): + - abseil/algorithm/container + - abseil/base/core_headers + - abseil/container/container_memory + - abseil/container/hash_container_defaults + - abseil/container/raw_hash_set + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/hash_container_defaults (1.20240722.0): + - abseil/base/config + - abseil/container/hash_function_defaults + - abseil/xcprivacy + - abseil/container/hash_function_defaults (1.20240722.0): + - abseil/base/config + - abseil/container/common + - abseil/hash/hash + - abseil/meta/type_traits + - abseil/strings/cord + - abseil/strings/strings + - abseil/xcprivacy + - abseil/container/hash_policy_traits (1.20240722.0): + - abseil/container/common_policy_traits + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/hashtable_debug_hooks (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/container/hashtablez_sampler (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/memory/memory + - abseil/profiling/exponential_biased + - abseil/profiling/sample_recorder + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/inlined_vector (1.20240722.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/inlined_vector_internal (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/xcprivacy + - abseil/container/layout (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/debugging/demangle_internal + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/raw_hash_map (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/container_memory + - abseil/container/raw_hash_set + - abseil/xcprivacy + - abseil/container/raw_hash_set (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/endian + - abseil/base/prefetch + - abseil/base/raw_logging_internal + - abseil/container/common + - abseil/container/compressed_tuple + - abseil/container/container_memory + - abseil/container/hash_policy_traits + - abseil/container/hashtable_debug_hooks + - abseil/container/hashtablez_sampler + - abseil/hash/hash + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/crc/cpu_detect (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/crc32c (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/crc/cpu_detect + - abseil/crc/crc_internal + - abseil/crc/non_temporal_memcpy + - abseil/strings/str_format + - abseil/strings/strings + - abseil/xcprivacy + - abseil/crc/crc_cord_state (1.20240722.0): + - abseil/base/config + - abseil/base/no_destructor + - abseil/crc/crc32c + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/crc/crc_internal (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/base/raw_logging_internal + - abseil/crc/cpu_detect + - abseil/memory/memory + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/crc/non_temporal_arm_intrinsics (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/non_temporal_memcpy (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/crc/non_temporal_arm_intrinsics + - abseil/xcprivacy + - abseil/debugging/bounded_utf8_length_sequence (1.20240722.0): + - abseil/base/config + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/debugging/debugging_internal (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/errno_saver + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/debugging/decode_rust_punycode (1.20240722.0): + - abseil/base/config + - abseil/base/nullability + - abseil/debugging/bounded_utf8_length_sequence + - abseil/debugging/utf8_for_code_point + - abseil/xcprivacy + - abseil/debugging/demangle_internal (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/debugging/demangle_rust + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/debugging/demangle_rust (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/debugging/decode_rust_punycode + - abseil/xcprivacy + - abseil/debugging/examine_stack (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/xcprivacy + - abseil/debugging/stacktrace (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/debugging/debugging_internal + - abseil/xcprivacy + - abseil/debugging/symbolize (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/debugging_internal + - abseil/debugging/demangle_internal + - abseil/strings/strings + - abseil/xcprivacy + - abseil/debugging/utf8_for_code_point (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/flags/commandlineflag (1.20240722.0): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/commandlineflag_internal (1.20240722.0): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/xcprivacy + - abseil/flags/config (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/flags/program_name + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/flag (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/commandlineflag + - abseil/flags/config + - abseil/flags/flag_internal + - abseil/flags/reflection + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/flag_internal (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/marshalling + - abseil/flags/reflection + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/utility/utility + - abseil/xcprivacy + - abseil/flags/marshalling (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/numeric/int128 + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/path_util (1.20240722.0): + - abseil/base/config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/private_handle_accessor (1.20240722.0): + - abseil/base/config + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/program_name (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/reflection (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/container/flat_hash_map + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/private_handle_accessor + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/functional/any_invocable (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/functional/bind_front (1.20240722.0): + - abseil/base/base_internal + - abseil/container/compressed_tuple + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/functional/function_ref (1.20240722.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/functional/any_invocable + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/hash/city (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/xcprivacy + - abseil/hash/hash (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/container/fixed_array + - abseil/functional/function_ref + - abseil/hash/city + - abseil/hash/low_level_hash + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/optional + - abseil/types/variant + - abseil/utility/utility + - abseil/xcprivacy + - abseil/hash/low_level_hash (1.20240722.0): + - abseil/base/config + - abseil/base/endian + - abseil/base/prefetch + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/log/absl_check (1.20240722.0): + - abseil/log/internal/check_impl + - abseil/xcprivacy + - abseil/log/absl_log (1.20240722.0): + - abseil/log/internal/log_impl + - abseil/xcprivacy + - abseil/log/absl_vlog_is_on (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/vlog_config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/check (1.20240722.0): + - abseil/log/internal/check_impl + - abseil/log/internal/check_op + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/globals (1.20240722.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/hash/hash + - abseil/log/internal/vlog_config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/append_truncated (1.20240722.0): + - abseil/base/config + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/check_impl (1.20240722.0): + - abseil/base/core_headers + - abseil/log/internal/check_op + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/internal/check_op (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/nullguard + - abseil/log/internal/nullstream + - abseil/log/internal/strip + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/conditions (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/voidify + - abseil/xcprivacy + - abseil/log/internal/config (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/log/internal/fnmatch (1.20240722.0): + - abseil/base/config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/format (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/log/internal/append_truncated + - abseil/log/internal/config + - abseil/log/internal/globals + - abseil/strings/str_format + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/globals (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/strings/strings + - abseil/time/time + - abseil/xcprivacy + - abseil/log/internal/log_impl (1.20240722.0): + - abseil/log/absl_vlog_is_on + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/internal/log_message (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/strerror + - abseil/container/inlined_vector + - abseil/debugging/examine_stack + - abseil/log/globals + - abseil/log/internal/append_truncated + - abseil/log/internal/format + - abseil/log/internal/globals + - abseil/log/internal/log_sink_set + - abseil/log/internal/nullguard + - abseil/log/internal/proto + - abseil/log/log_entry + - abseil/log/log_sink + - abseil/log/log_sink_registry + - abseil/memory/memory + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/log_sink_set (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/no_destructor + - abseil/base/raw_logging_internal + - abseil/cleanup/cleanup + - abseil/log/globals + - abseil/log/internal/config + - abseil/log/internal/globals + - abseil/log/log_entry + - abseil/log/log_sink + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/nullguard (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/log/internal/nullstream (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/proto (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/strip (1.20240722.0): + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/log/internal/log_message + - abseil/log/internal/nullstream + - abseil/xcprivacy + - abseil/log/internal/vlog_config (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/log/internal/fnmatch + - abseil/memory/memory + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/types/optional + - abseil/xcprivacy + - abseil/log/internal/voidify (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/log/log (1.20240722.0): + - abseil/log/internal/log_impl + - abseil/log/vlog_is_on + - abseil/xcprivacy + - abseil/log/log_entry (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/log/internal/config + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/log_sink (1.20240722.0): + - abseil/base/config + - abseil/log/log_entry + - abseil/xcprivacy + - abseil/log/log_sink_registry (1.20240722.0): + - abseil/base/config + - abseil/log/internal/log_sink_set + - abseil/log/log_sink + - abseil/xcprivacy + - abseil/log/vlog_is_on (1.20240722.0): + - abseil/log/absl_vlog_is_on + - abseil/xcprivacy + - abseil/memory (1.20240722.0): + - abseil/memory/memory (= 1.20240722.0) + - abseil/memory/memory (1.20240722.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/meta (1.20240722.0): + - abseil/meta/type_traits (= 1.20240722.0) + - abseil/meta/type_traits (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/numeric/bits (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/numeric/int128 (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/bits + - abseil/types/compare + - abseil/xcprivacy + - abseil/numeric/representation (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/profiling/exponential_biased (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/profiling/sample_recorder (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/xcprivacy + - abseil/random/bit_gen_ref (1.20240722.0): + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/random + - abseil/xcprivacy + - abseil/random/distributions (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/internal/fastmath + - abseil/random/internal/generate_real + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/traits + - abseil/random/internal/uniform_helper + - abseil/random/internal/wide_multiply + - abseil/strings/strings + - abseil/xcprivacy + - abseil/random/internal/distribution_caller (1.20240722.0): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/utility/utility + - abseil/xcprivacy + - abseil/random/internal/fast_uniform_bits (1.20240722.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/fastmath (1.20240722.0): + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/random/internal/generate_real (1.20240722.0): + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/fastmath + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/iostream_state_saver (1.20240722.0): + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/random/internal/nonsecure_base (1.20240722.0): + - abseil/base/core_headers + - abseil/container/inlined_vector + - abseil/meta/type_traits + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/pcg_engine (1.20240722.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/fastmath + - abseil/random/internal/iostream_state_saver + - abseil/xcprivacy + - abseil/random/internal/platform (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/random/internal/pool_urbg (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/random/internal/randen + - abseil/random/internal/seed_material + - abseil/random/internal/traits + - abseil/random/seed_gen_exception + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/randen (1.20240722.0): + - abseil/base/raw_logging_internal + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes + - abseil/random/internal/randen_slow + - abseil/xcprivacy + - abseil/random/internal/randen_engine (1.20240722.0): + - abseil/base/endian + - abseil/meta/type_traits + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/randen + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes (1.20240722.0): + - abseil/base/config + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes_impl + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes_impl (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/xcprivacy + - abseil/random/internal/randen_slow (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/xcprivacy + - abseil/random/internal/salted_seed_seq (1.20240722.0): + - abseil/container/inlined_vector + - abseil/meta/type_traits + - abseil/random/internal/seed_material + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/seed_material (1.20240722.0): + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/random/internal/fast_uniform_bits + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/traits (1.20240722.0): + - abseil/base/config + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/random/internal/uniform_helper (1.20240722.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/wide_multiply (1.20240722.0): + - abseil/base/config + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/random (1.20240722.0): + - abseil/random/distributions + - abseil/random/internal/nonsecure_base + - abseil/random/internal/pcg_engine + - abseil/random/internal/pool_urbg + - abseil/random/internal/randen_engine + - abseil/random/seed_sequences + - abseil/xcprivacy + - abseil/random/seed_gen_exception (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/random/seed_sequences (1.20240722.0): + - abseil/base/config + - abseil/base/nullability + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/random/seed_gen_exception + - abseil/strings/string_view + - abseil/types/span + - abseil/xcprivacy + - abseil/status/status (1.20240722.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/strerror + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/functional/function_ref + - abseil/memory/memory + - abseil/strings/cord + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/status/statusor (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/status/status + - abseil/strings/has_ostream_operator + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/variant + - abseil/utility/utility + - abseil/xcprivacy + - abseil/strings/charset (1.20240722.0): + - abseil/base/core_headers + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/strings/cord (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/crc/crc32c + - abseil/crc/crc_cord_state + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_info + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_scope + - abseil/strings/cordz_update_tracker + - abseil/strings/internal + - abseil/strings/strings + - abseil/types/compare + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cord_internal (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/container/container_memory + - abseil/container/inlined_vector + - abseil/container/layout + - abseil/crc/crc_cord_state + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cordz_functions (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/profiling/exponential_biased + - abseil/xcprivacy + - abseil/strings/cordz_handle (1.20240722.0): + - abseil/base/config + - abseil/base/no_destructor + - abseil/base/raw_logging_internal + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/strings/cordz_info (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_handle + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_tracker + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cordz_statistics (1.20240722.0): + - abseil/base/config + - abseil/strings/cordz_update_tracker + - abseil/xcprivacy + - abseil/strings/cordz_update_scope (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/cord_internal + - abseil/strings/cordz_info + - abseil/strings/cordz_update_tracker + - abseil/xcprivacy + - abseil/strings/cordz_update_tracker (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/strings/has_ostream_operator (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/strings/internal (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/strings/str_format (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/strings/str_format_internal + - abseil/strings/string_view + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/str_format_internal (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/container/fixed_array + - abseil/container/inlined_vector + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/numeric/representation + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/utility/utility + - abseil/xcprivacy + - abseil/strings/string_view (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/throw_delegate + - abseil/xcprivacy + - abseil/strings/strings (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/strings/charset + - abseil/strings/internal + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/synchronization/graphcycles_internal (1.20240722.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/synchronization/kernel_timeout_internal (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/time/time + - abseil/xcprivacy + - abseil/synchronization/synchronization (1.20240722.0): + - abseil/base/atomic_hook + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/synchronization/graphcycles_internal + - abseil/synchronization/kernel_timeout_internal + - abseil/time/time + - abseil/xcprivacy + - abseil/time (1.20240722.0): + - abseil/time/internal (= 1.20240722.0) + - abseil/time/time (= 1.20240722.0) + - abseil/time/internal (1.20240722.0): + - abseil/time/internal/cctz (= 1.20240722.0) + - abseil/time/internal/cctz (1.20240722.0): + - abseil/time/internal/cctz/civil_time (= 1.20240722.0) + - abseil/time/internal/cctz/time_zone (= 1.20240722.0) + - abseil/time/internal/cctz/civil_time (1.20240722.0): + - abseil/base/config + - abseil/xcprivacy + - abseil/time/internal/cctz/time_zone (1.20240722.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/xcprivacy + - abseil/time/time (1.20240722.0): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types/optional + - abseil/xcprivacy + - abseil/types (1.20240722.0): + - abseil/types/any (= 1.20240722.0) + - abseil/types/bad_any_cast (= 1.20240722.0) + - abseil/types/bad_any_cast_impl (= 1.20240722.0) + - abseil/types/bad_optional_access (= 1.20240722.0) + - abseil/types/bad_variant_access (= 1.20240722.0) + - abseil/types/compare (= 1.20240722.0) + - abseil/types/optional (= 1.20240722.0) + - abseil/types/span (= 1.20240722.0) + - abseil/types/variant (= 1.20240722.0) + - abseil/types/any (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/xcprivacy + - abseil/types/bad_any_cast (1.20240722.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/xcprivacy + - abseil/types/bad_any_cast_impl (1.20240722.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/bad_optional_access (1.20240722.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/bad_variant_access (1.20240722.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/compare (1.20240722.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/types/optional (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/xcprivacy + - abseil/types/span (1.20240722.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/types/variant (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/xcprivacy + - abseil/utility/utility (1.20240722.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/xcprivacy (1.20240722.0) + - 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): + - FlutterMacOS + - audioplayers_darwin (0.0.1): + - Flutter + - FlutterMacOS + - BoringSSL-GRPC (0.0.37): + - BoringSSL-GRPC/Implementation (= 0.0.37) + - BoringSSL-GRPC/Interface (= 0.0.37) + - BoringSSL-GRPC/Implementation (0.0.37): + - BoringSSL-GRPC/Interface (= 0.0.37) + - BoringSSL-GRPC/Interface (0.0.37) + - cloud_firestore (6.0.2): + - Firebase/CoreOnly (~> 12.2.0) + - Firebase/Firestore (~> 12.2.0) + - firebase_core + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - file_picker (0.0.1): + - FlutterMacOS + - Firebase/Auth (12.2.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 12.2.0) + - Firebase/CoreOnly (12.2.0): + - FirebaseCore (~> 12.2.0) + - Firebase/Firestore (12.2.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 12.2.0) + - Firebase/Messaging (12.2.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.2.0) + - firebase_auth (6.1.0): + - Firebase/Auth (~> 12.2.0) + - Firebase/CoreOnly (~> 12.2.0) + - firebase_core + - FlutterMacOS + - firebase_core (4.1.1): + - Firebase/CoreOnly (~> 12.2.0) + - FlutterMacOS + - firebase_messaging (16.0.2): + - Firebase/CoreOnly (~> 12.2.0) + - Firebase/Messaging (~> 12.2.0) + - firebase_core + - FlutterMacOS + - FirebaseAppCheckInterop (12.2.0) + - FirebaseAuth (12.2.0): + - FirebaseAppCheckInterop (~> 12.2.0) + - FirebaseAuthInterop (~> 12.2.0) + - FirebaseCore (~> 12.2.0) + - FirebaseCoreExtension (~> 12.2.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GTMSessionFetcher/Core (< 6.0, >= 3.4) + - RecaptchaInterop (~> 101.0) + - FirebaseAuthInterop (12.2.0) + - FirebaseCore (12.2.0): + - FirebaseCoreInternal (~> 12.2.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.2.0): + - FirebaseCore (~> 12.2.0) + - FirebaseCoreInternal (12.2.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseFirestore (12.2.0): + - FirebaseCore (~> 12.2.0) + - FirebaseCoreExtension (~> 12.2.0) + - FirebaseFirestoreInternal (~> 12.2.0) + - FirebaseSharedSwift (~> 12.2.0) + - FirebaseFirestoreInternal (12.2.0): + - abseil/algorithm (~> 1.20240722.0) + - abseil/base (~> 1.20240722.0) + - abseil/container/flat_hash_map (~> 1.20240722.0) + - abseil/memory (~> 1.20240722.0) + - abseil/meta (~> 1.20240722.0) + - abseil/strings/strings (~> 1.20240722.0) + - abseil/time (~> 1.20240722.0) + - abseil/types (~> 1.20240722.0) + - FirebaseAppCheckInterop (~> 12.2.0) + - FirebaseCore (~> 12.2.0) + - "gRPC-C++ (~> 1.69.0)" + - gRPC-Core (~> 1.69.0) + - leveldb-library (~> 1.22) + - nanopb (~> 3.30910.0) + - FirebaseInstallations (12.2.0): + - FirebaseCore (~> 12.2.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.2.0): + - FirebaseCore (~> 12.2.0) + - FirebaseInstallations (~> 12.2.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - FirebaseSharedSwift (12.2.0) + - flutter_secure_storage_macos (6.1.3): + - FlutterMacOS + - flutter_volume_controller (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - 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 + - "gRPC-C++ (1.69.0)": + - "gRPC-C++/Implementation (= 1.69.0)" + - "gRPC-C++/Interface (= 1.69.0)" + - "gRPC-C++/Implementation (1.69.0)": + - abseil/algorithm/container (~> 1.20240722.0) + - abseil/base/base (~> 1.20240722.0) + - abseil/base/config (~> 1.20240722.0) + - abseil/base/core_headers (~> 1.20240722.0) + - abseil/base/log_severity (~> 1.20240722.0) + - abseil/base/no_destructor (~> 1.20240722.0) + - abseil/cleanup/cleanup (~> 1.20240722.0) + - abseil/container/flat_hash_map (~> 1.20240722.0) + - abseil/container/flat_hash_set (~> 1.20240722.0) + - abseil/container/inlined_vector (~> 1.20240722.0) + - abseil/flags/flag (~> 1.20240722.0) + - abseil/flags/marshalling (~> 1.20240722.0) + - abseil/functional/any_invocable (~> 1.20240722.0) + - abseil/functional/bind_front (~> 1.20240722.0) + - abseil/functional/function_ref (~> 1.20240722.0) + - abseil/hash/hash (~> 1.20240722.0) + - abseil/log/absl_check (~> 1.20240722.0) + - abseil/log/absl_log (~> 1.20240722.0) + - abseil/log/check (~> 1.20240722.0) + - abseil/log/globals (~> 1.20240722.0) + - abseil/log/log (~> 1.20240722.0) + - abseil/memory/memory (~> 1.20240722.0) + - abseil/meta/type_traits (~> 1.20240722.0) + - abseil/numeric/bits (~> 1.20240722.0) + - abseil/random/bit_gen_ref (~> 1.20240722.0) + - abseil/random/distributions (~> 1.20240722.0) + - abseil/random/random (~> 1.20240722.0) + - abseil/status/status (~> 1.20240722.0) + - abseil/status/statusor (~> 1.20240722.0) + - abseil/strings/cord (~> 1.20240722.0) + - abseil/strings/str_format (~> 1.20240722.0) + - abseil/strings/strings (~> 1.20240722.0) + - abseil/synchronization/synchronization (~> 1.20240722.0) + - abseil/time/time (~> 1.20240722.0) + - abseil/types/optional (~> 1.20240722.0) + - abseil/types/span (~> 1.20240722.0) + - abseil/types/variant (~> 1.20240722.0) + - abseil/utility/utility (~> 1.20240722.0) + - "gRPC-C++/Interface (= 1.69.0)" + - "gRPC-C++/Privacy (= 1.69.0)" + - gRPC-Core (= 1.69.0) + - "gRPC-C++/Interface (1.69.0)" + - "gRPC-C++/Privacy (1.69.0)" + - gRPC-Core (1.69.0): + - gRPC-Core/Implementation (= 1.69.0) + - gRPC-Core/Interface (= 1.69.0) + - gRPC-Core/Implementation (1.69.0): + - abseil/algorithm/container (~> 1.20240722.0) + - abseil/base/base (~> 1.20240722.0) + - abseil/base/config (~> 1.20240722.0) + - abseil/base/core_headers (~> 1.20240722.0) + - abseil/base/log_severity (~> 1.20240722.0) + - abseil/base/no_destructor (~> 1.20240722.0) + - abseil/cleanup/cleanup (~> 1.20240722.0) + - abseil/container/flat_hash_map (~> 1.20240722.0) + - abseil/container/flat_hash_set (~> 1.20240722.0) + - abseil/container/inlined_vector (~> 1.20240722.0) + - abseil/flags/flag (~> 1.20240722.0) + - abseil/flags/marshalling (~> 1.20240722.0) + - abseil/functional/any_invocable (~> 1.20240722.0) + - abseil/functional/bind_front (~> 1.20240722.0) + - abseil/functional/function_ref (~> 1.20240722.0) + - abseil/hash/hash (~> 1.20240722.0) + - abseil/log/check (~> 1.20240722.0) + - abseil/log/globals (~> 1.20240722.0) + - abseil/log/log (~> 1.20240722.0) + - abseil/memory/memory (~> 1.20240722.0) + - abseil/meta/type_traits (~> 1.20240722.0) + - abseil/numeric/bits (~> 1.20240722.0) + - abseil/random/bit_gen_ref (~> 1.20240722.0) + - abseil/random/distributions (~> 1.20240722.0) + - abseil/random/random (~> 1.20240722.0) + - abseil/status/status (~> 1.20240722.0) + - abseil/status/statusor (~> 1.20240722.0) + - abseil/strings/cord (~> 1.20240722.0) + - abseil/strings/str_format (~> 1.20240722.0) + - abseil/strings/strings (~> 1.20240722.0) + - abseil/synchronization/synchronization (~> 1.20240722.0) + - abseil/time/time (~> 1.20240722.0) + - abseil/types/optional (~> 1.20240722.0) + - abseil/types/span (~> 1.20240722.0) + - abseil/types/variant (~> 1.20240722.0) + - abseil/utility/utility (~> 1.20240722.0) + - BoringSSL-GRPC (= 0.0.37) + - gRPC-Core/Interface (= 1.69.0) + - gRPC-Core/Privacy (= 1.69.0) + - gRPC-Core/Interface (1.69.0) + - gRPC-Core/Privacy (1.69.0) + - 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 + - isar_flutter_libs (1.0.0): + - FlutterMacOS + - leveldb-library (1.22.6) + - mobile_scanner (7.0.0): + - 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) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) + - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/darwin`) + - cloud_firestore (from `Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/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_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) + - flutter_volume_controller (from `Flutter/ephemeral/.symlinks/plugins/flutter_volume_controller/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - google_sign_in_ios (from `Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin`) + - isar_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos`) + - mobile_scanner (from `Flutter/ephemeral/.symlinks/plugins/mobile_scanner/darwin`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/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: + - abseil + - AppAuth + - AppCheckCore + - BoringSSL-GRPC + - Firebase + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseFirestore + - FirebaseFirestoreInternal + - FirebaseInstallations + - FirebaseMessaging + - FirebaseSharedSwift + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMAppAuth + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + audio_session: + :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos + audioplayers_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/darwin + cloud_firestore: + :path: Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/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_secure_storage_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos + flutter_volume_controller: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_volume_controller/macos + FlutterMacOS: + :path: Flutter/ephemeral + google_sign_in_ios: + :path: Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin + isar_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos + mobile_scanner: + :path: Flutter/ephemeral/.symlinks/plugins/mobile_scanner/darwin + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/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: + abseil: a05cc83bf02079535e17169a73c5be5ba47f714b + AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + audio_session: 728ae3823d914f809c485d390274861a24b0904e + audioplayers_darwin: 4027b33a8f471d996c13f71cb77f0b1583b5d923 + BoringSSL-GRPC: dded2a44897e45f28f08ae87a55ee4bcd19bc508 + cloud_firestore: 53b1f4dd39678e46f570cfe00c569433cc68b3e1 + device_info_plus: 1b14eed9bf95428983aed283a8d51cce3d8c4215 + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af + Firebase: 26f6f8d460603af3df970ad505b16b15f5e2e9a1 + firebase_auth: e570c182e1c67348de84baf1ec04636bebbe8752 + firebase_core: 1e928aafca18da77e33d90869f86472310b03485 + firebase_messaging: 859a738654ac03ba1343361c62316e9f86892ba6 + FirebaseAppCheckInterop: a1b2598c64c5a8c42fd6f6a1c3d0938ae4324678 + FirebaseAuth: 059c11702bdb759bb49b6c7ec6ff67abf21f39c4 + FirebaseAuthInterop: 217702acd4cc6baa98ba9d6c054532e0de0b8a16 + FirebaseCore: 311c48a147ad4a0ab7febbaed89e8025c67510cd + FirebaseCoreExtension: 73af080c22a2f7b44cefa391dc08f7e4ee162cb5 + FirebaseCoreInternal: 56ea29f3dad2894f81b060f706f9d53509b6ed3b + FirebaseFirestore: 2baa1360623e942007726627653d43a5bc618ba8 + FirebaseFirestoreInternal: 6506aef21ac270bf137c34cd7283723d930eddb0 + FirebaseInstallations: 3e884b01feabdf67582a80f3250425a00979b4ed + FirebaseMessaging: 43ec73bbfedd0c385a849bb91593ab4ad4b9e48e + FirebaseSharedSwift: 52d868d4c269fcb4e4e1310c548435a9c1f46e25 + flutter_secure_storage_macos: c2754d3483d20bb207bb9e5a14f1b8e771abcdb9 + flutter_volume_controller: 25d09126b0d695560f11c80b1311d5063fed882f + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + google_sign_in_ios: 4bb0e529b167cadc6ac785b6ed943c0a0a4cc1c9 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + "gRPC-C++": cc207623316fb041a7a3e774c252cf68a058b9e8 + gRPC-Core: 860978b7db482de8b4f5e10677216309b5ff6330 + GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + isar_flutter_libs: 43385c99864c168fadba7c9adeddc5d38838ca6a + leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 + mobile_scanner: 77265f3dc8d580810e91849d4a0811a90467ed5e + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + +PODFILE CHECKSUM: 0d3963a09fc94f580682bd88480486da345dc3f0 + +COCOAPODS: 1.16.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index a2f8127b4..24d412669 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 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 */; }; + EC9E39CAD8DB9FFC510009E5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF0463DADAD4F3E14724AB1C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -54,7 +55,7 @@ /* 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 /* ultimate_alarm_clock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ultimate_alarm_clock.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* ultimate_alarm_clock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ultimate_alarm_clock.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 = ""; }; @@ -66,8 +67,12 @@ 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 = ""; }; + 42DCD6C537484AB8B4DE1399 /* 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 = ""; }; + 4A1E2FAD95EC0CE01C4178A6 /* 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 = ""; }; 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 = ""; }; + F436A2703BE380B1D03D9AD3 /* 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 = ""; }; + FF0463DADAD4F3E14724AB1C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,6 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + EC9E39CAD8DB9FFC510009E5 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -99,6 +105,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 4EB41EA7D60178E63B7316FF /* Pods */, ); sourceTree = ""; }; @@ -145,9 +152,21 @@ path = Runner; sourceTree = ""; }; + 4EB41EA7D60178E63B7316FF /* Pods */ = { + isa = PBXGroup; + children = ( + 4A1E2FAD95EC0CE01C4178A6 /* Pods-Runner.debug.xcconfig */, + 42DCD6C537484AB8B4DE1399 /* Pods-Runner.release.xcconfig */, + F436A2703BE380B1D03D9AD3 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + FF0463DADAD4F3E14724AB1C /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -159,11 +178,14 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 084D6BA4819BE34073F0D294 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 57BDFA5E40180C2D232FAB6D /* [CP] Embed Pods Frameworks */, + 4803D8A1D216C59FB7074A34 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -233,6 +255,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 084D6BA4819BE34073F0D294 /* [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; + }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -271,6 +315,40 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 4803D8A1D216C59FB7074A34 /* [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; + }; + 57BDFA5E40180C2D232FAB6D /* [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; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -345,7 +423,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; @@ -424,7 +502,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; @@ -471,7 +549,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.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 02fbb945a..45a39c36a 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16e..21a3cc14c 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef6437..b3c176141 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/pubspec.yaml b/pubspec.yaml index ea1939f07..ea18e16bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,60 +7,60 @@ environment: flutter: 3.22.2 dependencies: - firebase_core: ^2.27.0 + firebase_core: ^4.1.1 screen_state: ^4.0.0 cupertino_icons: ^1.0.2 win32: ^5.2.0 - get: 4.6.6 + get: ^4.7.2 get_storage: ^2.1.1 flutter_time_picker_spinner: ^2.0.0 - cloud_firestore: ^4.4.5 - intl: ^0.18.0 - latlong2: ^0.8.1 - flutter_map: ^4.0.0 - fl_location: ^2.0.0+1 - flutter_fgbg: ^0.3.0 + cloud_firestore: ^6.0.2 + intl: ^0.20.2 + latlong2: ^0.9.1 + flutter_map: ^8.2.2 + fl_location: ^5.0.0 + flutter_fgbg: ^0.7.1 flutter_svg: ^2.0.4 isar: ^3.1.0+1 isar_flutter_libs: ^3.1.0+1 async: ^2.10.0 - flutter_secure_storage: ^8.0.0 - weather: ^2.0.1 - shake: ^2.2.0 + flutter_secure_storage: ^9.2.4 + weather: ^3.2.1 + shake: ^3.0.0 numberpicker: ^2.1.2 - mobile_scanner: 3.5.5 - permission_handler: ^11.0.1 - google_sign_in: ^6.2.1 + mobile_scanner: ^7.1.2 + permission_handler: ^12.0.1 + google_sign_in: ^7.2.0 url_launcher: ^6.3.0 - flutter_expandable_fab: ^1.8.1 - vibration: ^1.8.1 - file_picker: ^6.1.1 - audioplayers: ^5.2.1 - sensors_plus: ^1.4.1 - rxdart: ^0.27.7 + flutter_expandable_fab: ^2.5.2 + vibration: ^3.1.4 + file_picker: ^10.3.3 + audioplayers: ^6.5.1 + sensors_plus: ^6.1.2 + rxdart: ^0.28.0 flutter: sdk: flutter flutter_native_splash: ^2.3.8 - fluttertoast: ^8.2.5 + fluttertoast: ^9.0.0 path_provider: ^2.1.1 - audio_session: ^0.1.18 + audio_session: ^0.2.2 uuid: ^4.3.3 pedometer: ^4.0.1 flutter_volume_controller: ^1.3.1 sqflite: ^2.3.2 - googleapis: ^13.1.0 - googleapis_auth: ^1.4.1 - firebase_auth: ^4.17.8 - extension_google_sign_in_as_googleapis_auth: ^2.0.12 - android_intent_plus: ^5.0.2 + googleapis: ^15.0.0 + googleapis_auth: ^2.0.0 + firebase_auth: ^6.1.0 + extension_google_sign_in_as_googleapis_auth: ^3.0.0 + android_intent_plus: ^6.0.0 telephony: ^0.2.0 intl_phone_number_input: ^0.7.4 - firebase_messaging: ^14.7.19 + firebase_messaging: ^16.0.2 shared_preferences: ^2.2.3 dev_dependencies: - flutter_lints: ^4.0.0 + flutter_lints: ^6.0.0 isar_generator: ^3.1.0+1 build_runner: ^2.0.0 flutter_test: