From fd003b010032fd98d132a15555d1cc3f98825dfa Mon Sep 17 00:00:00 2001 From: yaso Date: Mon, 22 Jun 2026 10:58:59 +0200 Subject: [PATCH 01/14] Fix blank screen before first load --- mih_ui/android/gradle.properties | 4 ++++ mih_ui/lib/main_dev.dart | 1 - mih_ui/lib/main_prod.dart | 3 +-- mih_ui/lib/mih_config/mih_go_router.dart | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mih_ui/android/gradle.properties b/mih_ui/android/gradle.properties index f018a618..475a6280 100644 --- a/mih_ui/android/gradle.properties +++ b/mih_ui/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 437c62b9..0776a77f 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -42,7 +42,6 @@ void main() async { debugPrint('APP INSTALLED!'); }); final GoRouter appRouter = MihGoRouter().mihRouter; - FlutterNativeSplash.remove(); runApp(MzansiInnovationHub( router: appRouter, )); diff --git a/mih_ui/lib/main_prod.dart b/mih_ui/lib/main_prod.dart index c8ce2935..8c1c5e74 100644 --- a/mih_ui/lib/main_prod.dart +++ b/mih_ui/lib/main_prod.dart @@ -33,8 +33,7 @@ void main() async { debugPrint('APP INSTALLED!'); }); final GoRouter appRouter = MihGoRouter().mihRouter; - FlutterNativeSplash.remove(); - runApp(MzansiInnovationHub( + (MzansiInnovationHub( router: appRouter, )); } diff --git a/mih_ui/lib/mih_config/mih_go_router.dart b/mih_ui/lib/mih_config/mih_go_router.dart index 2d5db6b4..36b7a22f 100644 --- a/mih_ui/lib/mih_config/mih_go_router.dart +++ b/mih_ui/lib/mih_config/mih_go_router.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_file_viewer/components/mih_print_prevew.dart'; import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; @@ -85,6 +86,7 @@ class MihGoRouter { ]; KenLogger.success( "Redirect Check: ${state.fullPath}, isUserSignedIn: $isUserSignedIn"); + FlutterNativeSplash.remove(); if (!isUserSignedIn && !unauthenticatedPaths.contains(state.fullPath)) { return MihGoRouterPaths.mihAuthentication; } From 3d5fdde322800117794aceaf110236f91ad60126 Mon Sep 17 00:00:00 2001 From: yaso Date: Mon, 22 Jun 2026 11:19:15 +0200 Subject: [PATCH 02/14] copy link button on profile QR screens --- .../package_tools/mih_business_qr_code.dart | 25 ++++++++++++++++++ .../package_tools/mih_personal_qr_code.dart | 26 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart index e4a445e2..f03873a4 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart @@ -5,6 +5,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:file_saver/file_saver.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; @@ -403,6 +404,30 @@ class _MihBusinessQrCodeState extends State { ); }, ), + SpeedDialChild( + child: Icon( + Icons.copy_rounded, + color: MihColors.primary(), + ), + label: "Copy Link", + labelBackgroundColor: MihColors.green(), + labelStyle: TextStyle( + color: MihColors.primary(), + fontWeight: FontWeight.bold, + ), + backgroundColor: MihColors.green(), + onTap: () async { + await Clipboard.setData( + ClipboardData(text: "$qrCodedata${business.business_id}"), + ); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Link Copied!"), + ), + ); + }, + ), ]), ) ], diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart index 232c399a..b9f86d4f 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart @@ -4,6 +4,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:file_saver/file_saver.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; @@ -402,6 +403,31 @@ class _MihPersonalQrCodeState extends State { ); }, ), + SpeedDialChild( + child: Icon( + Icons.copy_rounded, + color: MihColors.primary(), + ), + label: "Copy Link", + labelBackgroundColor: MihColors.green(), + labelStyle: TextStyle( + color: MihColors.primary(), + fontWeight: FontWeight.bold, + ), + backgroundColor: MihColors.green(), + onTap: () async { + await Clipboard.setData( + ClipboardData( + text: "$_qrCodedata${user.username.toLowerCase()}"), + ); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Link Copied!"), + ), + ); + }, + ), ]), ) ], From f19a316be86aa3157612d3d5a81c6a49a827b489 Mon Sep 17 00:00:00 2001 From: yaso Date: Wed, 24 Jun 2026 11:52:53 +0200 Subject: [PATCH 03/14] initial offline mode, hive setup, home display, mzansi rofile display completed --- mih_ui/lib/main.dart | 4 +- mih_ui/lib/main_dev.dart | 16 + mih_ui/lib/mih_hive/hive_adapters.dart | 16 + mih_ui/lib/mih_hive/hive_adapters.g.dart | 285 ++++++++++++++++++ mih_ui/lib/mih_hive/hive_adapters.g.yaml | 107 +++++++ mih_ui/lib/mih_hive/hive_registrar.g.dart | 26 ++ .../mih_hive/mzansi_profile_hive_data.dart | 116 +++++++ .../mih_yt_video_player.dart | 46 --- .../components/mih_user_consent_window.dart | 199 ++++++++++++ .../lib/mih_packages/mih_home/mih_home.dart | 251 ++------------- .../package_tools/mih_personal_home.dart | 5 +- .../personal_profile/mzansi_profile.dart | 18 +- .../mzansi_profile_provider.dart | 37 ++- .../mih_business_details_services.dart | 18 ++ .../mih_my_business_user_services.dart | 18 ++ .../mih_profile_links_service.dart | 15 + .../mih_user_consent_services.dart | 13 + .../lib/mih_services/mih_user_services.dart | 17 ++ mih_ui/pubspec.lock | 66 +++- mih_ui/pubspec.yaml | 12 +- 20 files changed, 981 insertions(+), 304 deletions(-) create mode 100644 mih_ui/lib/mih_hive/hive_adapters.dart create mode 100644 mih_ui/lib/mih_hive/hive_adapters.g.dart create mode 100644 mih_ui/lib/mih_hive/hive_adapters.g.yaml create mode 100644 mih_ui/lib/mih_hive/hive_registrar.g.dart create mode 100644 mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart delete mode 100644 mih_ui/lib/mih_package_components/mih_yt_video_player.dart create mode 100644 mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart diff --git a/mih_ui/lib/main.dart b/mih_ui/lib/main.dart index edf94144..b9c221fd 100644 --- a/mih_ui/lib/main.dart +++ b/mih_ui/lib/main.dart @@ -4,6 +4,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_hive/mzansi_profile_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_access_controlls_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_authentication_provider.dart'; @@ -121,7 +123,7 @@ class _MzansiInnovationHubState extends State { create: (context) => MihAuthenticationProvider(), ), ChangeNotifierProvider( - create: (context) => MzansiProfileProvider(), + create: (context) => MzansiProfileProvider(MzansiProfileHiveData()), ), ChangeNotifierProvider( create: (context) => MzansiWalletProvider(), diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 0776a77f..fd7a07c0 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -9,9 +9,16 @@ import 'package:go_router/go_router.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_go_router.dart'; +import 'package:mzansi_innovation_hub/mih_hive/hive_registrar.g.dart'; +import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; +import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:pwa_install/pwa_install.dart'; import 'mih_config/mih_env.dart'; import 'package:supertokens_flutter/supertokens.dart'; +import 'package:hive_ce_flutter/hive_ce_flutter.dart'; void main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); @@ -21,6 +28,15 @@ void main() async { apiDomain: AppEnviroment.baseApiUrl, apiBasePath: "/auth", ); + await Hive.initFlutter('mih_offline_storage'); + Hive.registerAdapters(); + await Hive.openBox('user_box'); + await Hive.openBox('business_box'); + await Hive.openBox('business_user_box'); + await Hive.openBox('user_consent_box'); + await Hive.openBox('image_urls_box'); + await Hive.openBox('personal_profile_links_box'); + // await Firebase.initializeApp( // // options: DefaultFirebaseOptions.currentPlatform, // options: (Platform.isLinux) diff --git a/mih_ui/lib/mih_hive/hive_adapters.dart b/mih_ui/lib/mih_hive/hive_adapters.dart new file mode 100644 index 00000000..5fc537d3 --- /dev/null +++ b/mih_ui/lib/mih_hive/hive_adapters.dart @@ -0,0 +1,16 @@ +// hive_adapters.dart +import 'package:hive_ce/hive_ce.dart'; +import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; +import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; + +@GenerateAdapters([ + AdapterSpec(), + AdapterSpec(), + AdapterSpec(), + AdapterSpec(), + AdapterSpec(), +]) +part 'hive_adapters.g.dart'; diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.dart b/mih_ui/lib/mih_hive/hive_adapters.g.dart new file mode 100644 index 00000000..2b2abeac --- /dev/null +++ b/mih_ui/lib/mih_hive/hive_adapters.g.dart @@ -0,0 +1,285 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hive_adapters.dart'; + +// ************************************************************************** +// AdaptersGenerator +// ************************************************************************** + +class AppUserAdapter extends TypeAdapter { + @override + final typeId = 0; + + @override + AppUser read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return AppUser( + (fields[0] as num).toInt(), + fields[1] as String, + fields[2] as String, + fields[3] as String, + fields[4] as String, + fields[5] as String, + fields[6] as String, + fields[7] as String, + fields[8] as String, + ); + } + + @override + void write(BinaryWriter writer, AppUser obj) { + writer + ..writeByte(9) + ..writeByte(0) + ..write(obj.idUser) + ..writeByte(1) + ..write(obj.email) + ..writeByte(2) + ..write(obj.fname) + ..writeByte(3) + ..write(obj.lname) + ..writeByte(4) + ..write(obj.type) + ..writeByte(5) + ..write(obj.app_id) + ..writeByte(6) + ..write(obj.username) + ..writeByte(7) + ..write(obj.pro_pic_path) + ..writeByte(8) + ..write(obj.purpose); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AppUserAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class BusinessAdapter extends TypeAdapter { + @override + final typeId = 1; + + @override + Business read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Business( + fields[0] as String, + fields[1] as String, + fields[2] as String, + fields[3] as String, + fields[4] as String, + fields[5] as String, + fields[6] as String, + fields[7] as String, + fields[8] as String, + fields[9] as String, + fields[10] as String, + fields[11] as String, + fields[12] as String, + fields[13] as String, + fields[14] as String, + ); + } + + @override + void write(BinaryWriter writer, Business obj) { + writer + ..writeByte(15) + ..writeByte(0) + ..write(obj.business_id) + ..writeByte(1) + ..write(obj.Name) + ..writeByte(2) + ..write(obj.type) + ..writeByte(3) + ..write(obj.registration_no) + ..writeByte(4) + ..write(obj.logo_name) + ..writeByte(5) + ..write(obj.logo_path) + ..writeByte(6) + ..write(obj.contact_no) + ..writeByte(7) + ..write(obj.bus_email) + ..writeByte(8) + ..write(obj.app_id) + ..writeByte(9) + ..write(obj.gps_location) + ..writeByte(10) + ..write(obj.practice_no) + ..writeByte(11) + ..write(obj.vat_no) + ..writeByte(12) + ..write(obj.website) + ..writeByte(13) + ..write(obj.rating) + ..writeByte(14) + ..write(obj.mission_vision); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BusinessAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class BusinessUserAdapter extends TypeAdapter { + @override + final typeId = 2; + + @override + BusinessUser read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return BusinessUser( + (fields[0] as num).toInt(), + fields[1] as String, + fields[2] as String, + fields[3] as String, + fields[4] as String, + fields[5] as String, + fields[6] as String, + ); + } + + @override + void write(BinaryWriter writer, BusinessUser obj) { + writer + ..writeByte(7) + ..writeByte(0) + ..write(obj.idbusiness_users) + ..writeByte(1) + ..write(obj.business_id) + ..writeByte(2) + ..write(obj.app_id) + ..writeByte(3) + ..write(obj.signature) + ..writeByte(4) + ..write(obj.sig_path) + ..writeByte(5) + ..write(obj.title) + ..writeByte(6) + ..write(obj.access); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BusinessUserAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class UserConsentAdapter extends TypeAdapter { + @override + final typeId = 3; + + @override + UserConsent read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return UserConsent( + app_id: fields[0] as String, + privacy_policy_accepted: fields[1] as DateTime, + terms_of_services_accepted: fields[2] as DateTime, + ); + } + + @override + void write(BinaryWriter writer, UserConsent obj) { + writer + ..writeByte(3) + ..writeByte(0) + ..write(obj.app_id) + ..writeByte(1) + ..write(obj.privacy_policy_accepted) + ..writeByte(2) + ..write(obj.terms_of_services_accepted); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserConsentAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class ProfileLinkAdapter extends TypeAdapter { + @override + final typeId = 4; + + @override + ProfileLink read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return ProfileLink( + idprofile_links: (fields[0] as num).toInt(), + app_id: fields[1] as String, + business_id: fields[2] as String, + site_name: fields[3] as String, + custom_name: fields[4] as String, + destination: fields[5] as String, + order: (fields[6] as num).toInt(), + ); + } + + @override + void write(BinaryWriter writer, ProfileLink obj) { + writer + ..writeByte(7) + ..writeByte(0) + ..write(obj.idprofile_links) + ..writeByte(1) + ..write(obj.app_id) + ..writeByte(2) + ..write(obj.business_id) + ..writeByte(3) + ..write(obj.site_name) + ..writeByte(4) + ..write(obj.custom_name) + ..writeByte(5) + ..write(obj.destination) + ..writeByte(6) + ..write(obj.order); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ProfileLinkAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.yaml b/mih_ui/lib/mih_hive/hive_adapters.g.yaml new file mode 100644 index 00000000..1dbf08fc --- /dev/null +++ b/mih_ui/lib/mih_hive/hive_adapters.g.yaml @@ -0,0 +1,107 @@ +# Generated by Hive CE +# Manual modifications may be necessary for certain migrations +# Check in to version control +nextTypeId: 5 +types: + AppUser: + typeId: 0 + nextIndex: 9 + fields: + idUser: + index: 0 + email: + index: 1 + fname: + index: 2 + lname: + index: 3 + type: + index: 4 + app_id: + index: 5 + username: + index: 6 + pro_pic_path: + index: 7 + purpose: + index: 8 + Business: + typeId: 1 + nextIndex: 15 + fields: + business_id: + index: 0 + Name: + index: 1 + type: + index: 2 + registration_no: + index: 3 + logo_name: + index: 4 + logo_path: + index: 5 + contact_no: + index: 6 + bus_email: + index: 7 + app_id: + index: 8 + gps_location: + index: 9 + practice_no: + index: 10 + vat_no: + index: 11 + website: + index: 12 + rating: + index: 13 + mission_vision: + index: 14 + BusinessUser: + typeId: 2 + nextIndex: 7 + fields: + idbusiness_users: + index: 0 + business_id: + index: 1 + app_id: + index: 2 + signature: + index: 3 + sig_path: + index: 4 + title: + index: 5 + access: + index: 6 + UserConsent: + typeId: 3 + nextIndex: 3 + fields: + app_id: + index: 0 + privacy_policy_accepted: + index: 1 + terms_of_services_accepted: + index: 2 + ProfileLink: + typeId: 4 + nextIndex: 7 + fields: + idprofile_links: + index: 0 + app_id: + index: 1 + business_id: + index: 2 + site_name: + index: 3 + custom_name: + index: 4 + destination: + index: 5 + order: + index: 6 diff --git a/mih_ui/lib/mih_hive/hive_registrar.g.dart b/mih_ui/lib/mih_hive/hive_registrar.g.dart new file mode 100644 index 00000000..46afbf71 --- /dev/null +++ b/mih_ui/lib/mih_hive/hive_registrar.g.dart @@ -0,0 +1,26 @@ +// Generated by Hive CE +// Do not modify +// Check in to version control + +import 'package:hive_ce/hive.dart'; +import 'package:mzansi_innovation_hub/mih_hive/hive_adapters.dart'; + +extension HiveRegistrar on HiveInterface { + void registerAdapters() { + registerAdapter(AppUserAdapter()); + registerAdapter(BusinessAdapter()); + registerAdapter(BusinessUserAdapter()); + registerAdapter(ProfileLinkAdapter()); + registerAdapter(UserConsentAdapter()); + } +} + +extension IsolatedHiveRegistrar on IsolatedHiveInterface { + void registerAdapters() { + registerAdapter(AppUserAdapter()); + registerAdapter(BusinessAdapter()); + registerAdapter(BusinessUserAdapter()); + registerAdapter(ProfileLinkAdapter()); + registerAdapter(UserConsentAdapter()); + } +} diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart new file mode 100644 index 00000000..51439e8c --- /dev/null +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -0,0 +1,116 @@ +import 'package:hive_ce_flutter/hive_ce_flutter.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; +import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_my_business_user_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_profile_links_service.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; + +class MzansiProfileHiveData { + final Box _userBox = Hive.box('user_box'); + final Box _businessBox = Hive.box('business_box'); + final Box _businessUserBox = + Hive.box('business_user_box'); + final Box _userConsentBox = + Hive.box('user_consent_box'); + final Box _personalProfileLinksBox = + Hive.box('personal_profile_links_box'); + + final Box _resolvedUrlsBox = Hive.box('image_urls_box'); + + static const String kUserKey = 'current_user'; + static const String kBusinessKey = 'current_business'; + static const String kBusinessUserKey = 'current_business_user'; + static const String kConsentKey = 'current_consent'; + static const String kUserPicUrlKey = 'user_pic_url'; + static const String kBusinessPicUrlKey = 'business_pic_url'; + static const String kSignatureUrlKey = 'signature_url'; + + AppUser? getCachedUser() => _userBox.get(kUserKey); + Business? getCachedBusiness() => _businessBox.get(kBusinessKey); + BusinessUser? getCachedBusinessUser() => + _businessUserBox.get(kBusinessUserKey); + UserConsent? getCachedConsent() => _userConsentBox.get(kConsentKey); + String? getCachedUserPicUrl() => _resolvedUrlsBox.get(kUserPicUrlKey); + String? getCachedBusinessPicUrl() => _resolvedUrlsBox.get(kBusinessPicUrlKey); + String? getCachedSignatureUrl() => _resolvedUrlsBox.get(kSignatureUrlKey); + List getCachedPersonalProfileLinks() { + final links = _personalProfileLinksBox.values.toList(); + links.sort((a, b) => a.order.compareTo(b.order)); + return links; + } + + Future cacheUserData(AppUser remoteUser) async { + await _userBox.put(kUserKey, remoteUser); + if (remoteUser.pro_pic_path.isNotEmpty) { + String userPicUrl = + await MihFileApi.getMinioFileUrl(remoteUser.pro_pic_path); + await _resolvedUrlsBox.put(kUserPicUrlKey, userPicUrl); + } + } + + Future cacheUserConsentData(UserConsent remoteConsent) async { + await _userConsentBox.put(kConsentKey, remoteConsent); + } + + Future cacheBusinessData(Business remoteBusiness) async { + await _businessBox.put(kBusinessKey, remoteBusiness); + if (remoteBusiness.logo_path.isNotEmpty) { + String logoUrl = + await MihFileApi.getMinioFileUrl(remoteBusiness.logo_path); + await _resolvedUrlsBox.put(kBusinessPicUrlKey, logoUrl); + } + BusinessUser? remoteBizUser = + await MihMyBusinessUserServices().getBusinessUserV2(); + if (remoteBizUser != null) { + cacheBusinessUserData(remoteBizUser); + } + } + + Future cacheBusinessUserData(BusinessUser remoteBizUser) async { + await _businessUserBox.put(kBusinessUserKey, remoteBizUser); + if (remoteBizUser.sig_path.isNotEmpty) { + String signatureUrl = + await MihFileApi.getMinioFileUrl(remoteBizUser.sig_path); + await _resolvedUrlsBox.put(kSignatureUrlKey, signatureUrl); + } + } + + Future cachePersonalProfileLinksData( + List remoteLinks) async { + await _personalProfileLinksBox.clear(); + await _personalProfileLinksBox.addAll(remoteLinks); + } + + Future syncProfileDataWithServer() async { + try { + AppUser? remoteUser = await MihUserServices().getMyUserDetailsV2(); + if (remoteUser != null) { + cacheUserData(remoteUser); + + UserConsent? remoteConsent = + await MihUserConsentServices().getUserConsentStatusV2(); + if (remoteConsent != null) { + cacheUserConsentData(remoteConsent); + } + final remoteLinks = await MihProfileLinksServices.getUserProfileLinksV2( + remoteUser.app_id); + await cachePersonalProfileLinksData(remoteLinks); + } + Business? remoteBusiness = + await MihBusinessDetailsServices().getBusinessDetailsByUserV2(); + if (remoteBusiness != null) { + cacheBusinessData(remoteBusiness); + } + } catch (error) { + KenLogger.warning("App operating offline mode. Sync paused"); + // KenLogger.warning("App operating offline mode. Sync paused: $error"); + } + } +} diff --git a/mih_ui/lib/mih_package_components/mih_yt_video_player.dart b/mih_ui/lib/mih_package_components/mih_yt_video_player.dart deleted file mode 100644 index a9d3d381..00000000 --- a/mih_ui/lib/mih_package_components/mih_yt_video_player.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:youtube_player_iframe/youtube_player_iframe.dart'; - -class MIHYTVideoPlayer extends StatefulWidget { - final String videoYTLink; - const MIHYTVideoPlayer({ - super.key, - required this.videoYTLink, - }); - - @override - State createState() => _MIHYTVideoPlayerState(); -} - -class _MIHYTVideoPlayerState extends State { - late YoutubePlayerController _controller; - - @override - void dispose() { - _controller.close(); - super.dispose(); - } - - @override - void initState() { - _controller = YoutubePlayerController( - params: const YoutubePlayerParams( - enableCaption: false, - showControls: true, - mute: false, - showFullscreenButton: false, - loop: false, - ), - ); - _controller.loadVideoById(videoId: widget.videoYTLink); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return YoutubePlayer( - controller: _controller, - aspectRatio: 16 / 9, - ); - } -} diff --git a/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart b/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart new file mode 100644 index 00000000..97901e63 --- /dev/null +++ b/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; +import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart'; +import 'package:provider/provider.dart'; + +class MihUserConsentWindow extends StatefulWidget { + const MihUserConsentWindow({super.key}); + + @override + State createState() => _MihUserConsentWindowState(); +} + +class _MihUserConsentWindowState extends State { + void createOrUpdateAccpetance(MzansiProfileProvider mzansiProfileProvider) { + UserConsent? userConsent = mzansiProfileProvider.userConsent; + userConsent != null + ? MihUserConsentServices() + .updateUserConsentStatus( + DateTime.now().toIso8601String(), + DateTime.now().toIso8601String(), + mzansiProfileProvider, + context, + ) + .then((value) { + if (!mounted) return; + if (value == 200) { + context.goNamed("mihHome"); + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Thank you for accepting our Policies"), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("There was an error, please try again later"), + ), + ); + } + }) + : MihUserConsentServices() + .insertUserConsentStatus( + DateTime.now().toIso8601String(), + DateTime.now().toIso8601String(), + mzansiProfileProvider, + context, + ) + .then((value) { + if (value == 201) { + context.goNamed("mihHome"); + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Thank you for accepting our Policies"), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("There was an error, please try again later"), + ), + ); + } + }); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (BuildContext context, + MzansiProfileProvider mzansiProfileProvider, Widget? child) { + return Container( + color: Colors.black.withValues(alpha: 0.5), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + MihPackageWindow( + fullscreen: false, + windowTitle: null, + onWindowTapClose: null, + windowBody: Column( + children: [ + Icon( + Icons.policy, + size: 150, + color: MihColors.secondary(), + ), + const SizedBox(height: 10), + Text( + "Welcome to the MIH App", + textAlign: TextAlign.center, + style: TextStyle( + color: MihColors.secondary(), + fontSize: 30, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10), + Text( + "To keep using the MIH app, please take a moment to review and accept our Policies. Our agreements helps us keep things running smoothly and securely.", + textAlign: TextAlign.center, + style: TextStyle( + color: MihColors.secondary(), + fontSize: 18, + fontWeight: FontWeight.normal, + ), + ), + const SizedBox(height: 20), + Center( + child: Wrap( + runAlignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + alignment: WrapAlignment.center, + spacing: 10, + runSpacing: 10, + children: [ + MihButton( + onPressed: () { + WidgetsBinding.instance + .addPostFrameCallback((_) async { + context + .read() + .setToolIndex(1); + }); + context.goNamed("aboutMih", + extra: mzansiProfileProvider.personalHome); + }, + buttonColor: MihColors.orange(), + elevation: 10, + width: 300, + child: Text( + "Privacy Policy", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + MihButton( + onPressed: () { + WidgetsBinding.instance + .addPostFrameCallback((_) async { + context + .read() + .setToolIndex(2); + }); + context.goNamed("aboutMih", + extra: mzansiProfileProvider.personalHome); + }, + buttonColor: MihColors.yellow(), + elevation: 10, + width: 300, + child: Text( + "Terms of Service", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + MihButton( + onPressed: () { + DateTime now = DateTime.now(); + KenLogger.success("Date Time Now: $now"); + createOrUpdateAccpetance(mzansiProfileProvider); + }, + buttonColor: MihColors.green(), + elevation: 10, + width: 300, + child: Text( + "Accept", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 10), + ], + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/mih_ui/lib/mih_packages/mih_home/mih_home.dart b/mih_ui/lib/mih_packages/mih_home/mih_home.dart index 0641ddf3..dc81c343 100644 --- a/mih_ui/lib/mih_packages/mih_home/mih_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/mih_home.dart @@ -1,16 +1,12 @@ -import 'package:go_router/go_router.dart'; -import 'package:ken_logger/ken_logger.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; -import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; +import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_user_consent_window.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_business_home.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart'; import 'package:flutter/material.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart'; import 'package:provider/provider.dart'; class MihHome extends StatefulWidget { @@ -25,32 +21,6 @@ class MihHome extends StatefulWidget { class _MihHomeState extends State { DateTime latestPrivacyPolicyDate = DateTime.parse("2024-12-01"); DateTime latestTermOfServiceDate = DateTime.parse("2024-12-01"); - bool _isLoadingInitialData = true; - late final MihPersonalHome _personalHome; - late final MihBusinessHome? _businessHome; - - Future _loadInitialData() async { - setState(() { - _isLoadingInitialData = true; - }); - MzansiProfileProvider mzansiProfileProvider = - context.read(); - - if (mzansiProfileProvider.user == null) { - await MihDataHelperServices().loadUserDataWithBusinessesData( - mzansiProfileProvider, - ); - } - _personalHome = const MihPersonalHome(); - _businessHome = mzansiProfileProvider.business != null - ? MihBusinessHome(isLoading: _isLoadingInitialData) - : null; - if (mounted) { - setState(() { - _isLoadingInitialData = false; - }); - } - } bool showPolicyWindow(UserConsent? userConsent) { if (userConsent == null) { @@ -67,176 +37,14 @@ class _MihHomeState extends State { } } - void createOrUpdateAccpetance(MzansiProfileProvider mzansiProfileProvider) { - UserConsent? userConsent = mzansiProfileProvider.userConsent; - userConsent != null - ? MihUserConsentServices() - .updateUserConsentStatus( - DateTime.now().toIso8601String(), - DateTime.now().toIso8601String(), - mzansiProfileProvider, - context, - ) - .then((value) { - if (!mounted) return; - if (value == 200) { - context.goNamed("mihHome"); - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("Thank you for accepting our Policies"), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("There was an error, please try again later"), - ), - ); - } - }) - : MihUserConsentServices() - .insertUserConsentStatus( - DateTime.now().toIso8601String(), - DateTime.now().toIso8601String(), - mzansiProfileProvider, - context, - ) - .then((value) { - if (value == 201) { - context.goNamed("mihHome"); - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("Thank you for accepting our Policies"), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("There was an error, please try again later"), - ), - ); - } - }); - } - - Widget displayConsentWindow(MzansiProfileProvider mzansiProfileProvider) { - return Container( - color: Colors.black.withValues(alpha: 0.5), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - MihPackageWindow( - fullscreen: false, - windowTitle: null, - onWindowTapClose: null, - windowBody: Column( - children: [ - Icon( - Icons.policy, - size: 150, - color: MihColors.secondary(), - ), - const SizedBox(height: 10), - Text( - "Welcome to the MIH App", - textAlign: TextAlign.center, - style: TextStyle( - color: MihColors.secondary(), - fontSize: 30, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10), - Text( - "To keep using the MIH app, please take a moment to review and accept our Policies. Our agreements helps us keep things running smoothly and securely.", - textAlign: TextAlign.center, - style: TextStyle( - color: MihColors.secondary(), - fontSize: 18, - fontWeight: FontWeight.normal, - ), - ), - const SizedBox(height: 20), - Center( - child: Wrap( - runAlignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - alignment: WrapAlignment.center, - spacing: 10, - runSpacing: 10, - children: [ - MihButton( - onPressed: () { - WidgetsBinding.instance - .addPostFrameCallback((_) async { - context.read().setToolIndex(1); - }); - context.goNamed("aboutMih", - extra: mzansiProfileProvider.personalHome); - }, - buttonColor: MihColors.orange(), - elevation: 10, - width: 300, - child: Text( - "Privacy Policy", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - MihButton( - onPressed: () { - WidgetsBinding.instance - .addPostFrameCallback((_) async { - context.read().setToolIndex(2); - }); - context.goNamed("aboutMih", - extra: mzansiProfileProvider.personalHome); - }, - buttonColor: MihColors.yellow(), - elevation: 10, - width: 300, - child: Text( - "Terms of Service", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - MihButton( - onPressed: () { - DateTime now = DateTime.now(); - KenLogger.success("Date Time Now: $now"); - createOrUpdateAccpetance(mzansiProfileProvider); - }, - buttonColor: MihColors.green(), - elevation: 10, - width: 300, - child: Text( - "Accept", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - ), - const SizedBox(height: 10), - ], - ), - ), - ], - ), - ); - } + Future _syncProfileData() async { + MzansiProfileProvider mzansiProfileProvider = + context.read(); + mzansiProfileProvider.loadCachedProfileState(); + if (mzansiProfileProvider.user == null) { + await mzansiProfileProvider.syncWithCloudPipeline(); + } + } @override void dispose() { @@ -246,7 +54,11 @@ class _MihHomeState extends State { @override void initState() { super.initState(); - _loadInitialData(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _syncProfileData(); + } + }); } List getToolTitle() { @@ -262,20 +74,18 @@ class _MihHomeState extends State { return Consumer( builder: (BuildContext context, MzansiProfileProvider mzansiProfileProvider, Widget? child) { - if (_isLoadingInitialData) { - return Scaffold( - body: Center( - child: Mihloadingcircle(), - ), - ); - } - // bool showConsentWindow = - // showPolicyWindow(mzansiProfileProvider.userConsent); + if (mzansiProfileProvider.user == null) { + return Scaffold( + body: Center( + child: Mihloadingcircle(), + ), + ); + } return Stack( children: [ RefreshIndicator( onRefresh: () async { - await _loadInitialData(); + await mzansiProfileProvider.syncWithCloudPipeline(); }, child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), @@ -298,7 +108,7 @@ class _MihHomeState extends State { ), ), if (showPolicyWindow(mzansiProfileProvider.userConsent)) - displayConsentWindow(mzansiProfileProvider), + MihUserConsentWindow(), ], ); }, @@ -373,15 +183,10 @@ class _MihHomeState extends State { } List getToolBody(MzansiProfileProvider mzansiProfileProvider) { - if (mzansiProfileProvider.business == null) { - return [ - _personalHome, - ]; - } else { - return [ - _personalHome, - _businessHome!, - ]; - } + return [ + const MihPersonalHome(), + if (mzansiProfileProvider.business != null) + const MihBusinessHome(isLoading: false) + ]; } } diff --git a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index aaa93522..f1ed0494 100644 --- a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -204,7 +204,7 @@ class _MihPersonalHomeState extends State searchController.addListener(searchPackage); MzansiProfileProvider profileProvider = context.read(); - if (profileProvider.user!.username == "") { + if (profileProvider.user == null || profileProvider.user?.username == "") { personalPackagesMap = setNerUserPersonalPackage(); autoNavToProfile(); } else { @@ -233,7 +233,8 @@ class _MihPersonalHomeState extends State return Column( children: [ Visibility( - visible: profileProvider.user!.username != "", + visible: profileProvider.user != null && + profileProvider.user?.username != "", child: Padding( padding: EdgeInsets.symmetric(horizontal: width / 20), child: MihSearchBar( diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart index b399391d..df45d03e 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart @@ -5,8 +5,6 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_settings.dart'; import 'package:flutter/material.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_profile_links_service.dart'; import 'package:provider/provider.dart'; class MzansiProfile extends StatefulWidget { @@ -25,20 +23,12 @@ class _MzansiProfileState extends State { late final MihPersonalSettings _personalSettings; Future _loadInitialData() async { - setState(() { - _isLoadingInitialData = true; - }); MzansiProfileProvider mzansiProfileProvider = context.read(); + mzansiProfileProvider.loadCachedProfileState(); if (mzansiProfileProvider.user == null) { - await MihDataHelperServices().loadUserDataWithBusinessesData( - mzansiProfileProvider, - ); + mzansiProfileProvider.syncWithCloudPipeline(); } - await MihProfileLinksServices.getUserProfileLinks( - mzansiProfileProvider, - mzansiProfileProvider.user!.app_id, - ); setState(() { _isLoadingInitialData = false; }); @@ -50,7 +40,9 @@ class _MzansiProfileState extends State { _personalProfile = const MihPersonalProfile(); _personalQrCode = const MihPersonalQrCode(user: null); _personalSettings = const MihPersonalSettings(); - _loadInitialData(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _loadInitialData(); + }); } @override diff --git a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart index 8c4afc50..312b60b0 100644 --- a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_hive/mzansi_profile_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; @@ -8,6 +9,8 @@ import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; class MzansiProfileProvider extends ChangeNotifier { + final MzansiProfileHiveData _hiveData; + bool personalHome; int personalIndex; int businessIndex; @@ -27,13 +30,45 @@ class MzansiProfileProvider extends ChangeNotifier { List personalLinks = []; List businessLinks = []; - MzansiProfileProvider({ + MzansiProfileProvider( + this._hiveData, { this.personalHome = true, this.personalIndex = 0, this.businessIndex = 0, this.hideBusinessUserDetails = true, }); + void loadCachedProfileState() { + user = _hiveData.getCachedUser(); + userConsent = _hiveData.getCachedConsent(); + business = _hiveData.getCachedBusiness(); + businessUser = _hiveData.getCachedBusinessUser(); + String? cachedUserUrl = _hiveData.getCachedUserPicUrl(); + if (cachedUserUrl != null && cachedUserUrl.isNotEmpty) { + userProfilePicUrl = cachedUserUrl; + userProfilePicture = CachedNetworkImageProvider(cachedUserUrl); + } + String? cachedBizUrl = _hiveData.getCachedBusinessPicUrl(); + if (cachedBizUrl != null && cachedBizUrl.isNotEmpty) { + businessProfilePicUrl = cachedBizUrl; + businessProfilePicture = CachedNetworkImageProvider(cachedBizUrl); + } + String? cachedSigUrl = _hiveData.getCachedSignatureUrl(); + if (cachedSigUrl != null && cachedSigUrl.isNotEmpty) { + businessUserSignatureUrl = cachedSigUrl; + businessUserSignature = CachedNetworkImageProvider(cachedSigUrl); + } + + personalLinks = _hiveData.getCachedPersonalProfileLinks(); + + notifyListeners(); + } + + Future syncWithCloudPipeline() async { + await _hiveData.syncProfileDataWithServer(); + loadCachedProfileState(); + } + void reset() { personalHome = true; personalIndex = 0; diff --git a/mih_ui/lib/mih_services/mih_business_details_services.dart b/mih_ui/lib/mih_services/mih_business_details_services.dart index 4fae7dc1..f8777d17 100644 --- a/mih_ui/lib/mih_services/mih_business_details_services.dart +++ b/mih_ui/lib/mih_services/mih_business_details_services.dart @@ -98,6 +98,24 @@ class MihBusinessDetailsServices { } } + Future getBusinessDetailsByUserV2() async { + String app_id = await SuperTokens.getUserId(); + var response = await http.get( + Uri.parse("${AppEnviroment.baseApiUrl}/business/app_id/$app_id"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + ); + if (response.statusCode == 200) { + String body = response.body; + var jsonBody = jsonDecode(body); + Business? business = Business.fromJson(jsonBody); + return business; + } else { + return null; + } + } + Future getBusinessDetailsByBusinessId( String business_id, ) async { diff --git a/mih_ui/lib/mih_services/mih_my_business_user_services.dart b/mih_ui/lib/mih_services/mih_my_business_user_services.dart index b7eee4e8..9ee05b89 100644 --- a/mih_ui/lib/mih_services/mih_my_business_user_services.dart +++ b/mih_ui/lib/mih_services/mih_my_business_user_services.dart @@ -32,6 +32,24 @@ class MihMyBusinessUserServices { } } + Future getBusinessUserV2() async { + String app_id = await SuperTokens.getUserId(); + var response = await http.get( + Uri.parse("${AppEnviroment.baseApiUrl}/business-user/$app_id"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + ); + if (response.statusCode == 200) { + // KenLogger.success(response.body); + BusinessUser? businessUser = + BusinessUser.fromJson(jsonDecode(response.body)); + return businessUser; + } else { + return null; + } + } + Future createBusinessUser( String business_id, String app_id, diff --git a/mih_ui/lib/mih_services/mih_profile_links_service.dart b/mih_ui/lib/mih_services/mih_profile_links_service.dart index 51fff852..6823a7c7 100644 --- a/mih_ui/lib/mih_services/mih_profile_links_service.dart +++ b/mih_ui/lib/mih_services/mih_profile_links_service.dart @@ -43,6 +43,21 @@ class MihProfileLinksServices { } } + static Future> getUserProfileLinksV2( + String app_id, + ) async { + final response = await http.get( + Uri.parse("${AppEnviroment.baseApiUrl}/profile-links/user/$app_id")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List myLinks = + List.from(l.map((model) => ProfileLink.fromJson(model))); + return myLinks; + } else { + throw Exception('failed to fecth user profile links'); + } + } + static Future> getBusinessProfileLinksMD( String business_id, ) async { diff --git a/mih_ui/lib/mih_services/mih_user_consent_services.dart b/mih_ui/lib/mih_services/mih_user_consent_services.dart index d8104a49..3a1ca03a 100644 --- a/mih_ui/lib/mih_services/mih_user_consent_services.dart +++ b/mih_ui/lib/mih_services/mih_user_consent_services.dart @@ -21,6 +21,19 @@ class MihUserConsentServices { } } + Future getUserConsentStatusV2() async { + var app_id = await SuperTokens.getUserId(); + final response = await http.get( + Uri.parse("${AppEnviroment.baseApiUrl}/user-consent/user/$app_id")); + if (response.statusCode == 200) { + Map userMap = jsonDecode(response.body); + UserConsent userConsent = UserConsent.fromJson(userMap); + return userConsent; + } else { + return null; + } + } + Future insertUserConsentStatus( String latestPrivacyPolicyDate, String latestTermOfServiceDate, diff --git a/mih_ui/lib/mih_services/mih_user_services.dart b/mih_ui/lib/mih_services/mih_user_services.dart index 666805fd..3d909ed3 100644 --- a/mih_ui/lib/mih_services/mih_user_services.dart +++ b/mih_ui/lib/mih_services/mih_user_services.dart @@ -154,6 +154,23 @@ class MihUserServices { } } + Future getMyUserDetailsV2() async { + String app_id = await SuperTokens.getUserId(); + var response = await http.get( + Uri.parse("${AppEnviroment.baseApiUrl}/user/$app_id"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + ); + if (response.statusCode == 200) { + String body = response.body; + var jsonBody = jsonDecode(body); + return AppUser.fromJson(jsonBody); + } else { + return null; + } + } + Future updateUserV2( AppUser signedInUser, String firstName, diff --git a/mih_ui/pubspec.lock b/mih_ui/pubspec.lock index 56090626..1eff8ae4 100644 --- a/mih_ui/pubspec.lock +++ b/mih_ui/pubspec.lock @@ -50,7 +50,7 @@ packages: source: hosted version: "4.0.7" args: - dependency: "direct main" + dependency: transitive description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 @@ -928,6 +928,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.8" + hive_ce: + dependency: "direct main" + description: + name: hive_ce + sha256: "8e9980e68643afb1e765d3af32b47996552a64e190d03faf622cea07c1294418" + url: "https://pub.dev" + source: hosted + version: "2.19.3" + hive_ce_flutter: + dependency: "direct main" + description: + name: hive_ce_flutter + sha256: "2677e95a333ff15af43ccd06af7eb7abbf1a4f154ea071997f3de4346cae913a" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + hive_ce_generator: + dependency: "direct dev" + description: + name: hive_ce_generator + sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" + url: "https://pub.dev" + source: hosted + version: "1.9.2" html: dependency: transitive description: @@ -1048,6 +1072,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: a9d3d620695bc984244dafae00b95e4319d6974b2d77f4b9e1eb4f2efe099094 + url: "https://pub.dev" + source: hosted + version: "0.6.1" js: dependency: transitive description: @@ -1773,6 +1805,22 @@ packages: description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: a447acb083d3a5ef17f983dd36201aeea33fedadb3228fa831f2f0c92f0f3aca + url: "https://pub.dev" + source: hosted + version: "1.3.7" source_maps: dependency: transitive description: @@ -2269,22 +2317,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.3" - youtube_player_iframe: - dependency: "direct main" - description: - name: youtube_player_iframe - sha256: "66020f7756accfb22b3297565d845f9bef14249c730dd51e1ec648fa155fb24a" - url: "https://pub.dev" - source: hosted - version: "5.2.1" - youtube_player_iframe_web: + yaml_writer: dependency: transitive description: - name: youtube_player_iframe_web - sha256: "05222a228937932e7ee7a6171e8020fee4cd23d1c7bf6b4128c569484338c593" + name: yaml_writer + sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "2.1.0" sdks: dart: ">=3.10.0-0 <3.13.0-z" flutter: ">=3.29.0" diff --git a/mih_ui/pubspec.yaml b/mih_ui/pubspec.yaml index ce0786e6..b90b2080 100644 --- a/mih_ui/pubspec.yaml +++ b/mih_ui/pubspec.yaml @@ -1,7 +1,7 @@ name: mzansi_innovation_hub description: "" publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 1.3.0+133 +version: 1.4.0+134 environment: sdk: ">=3.5.3 <4.0.0" @@ -22,14 +22,13 @@ dependencies: file_picker: ^10.1.9 supertokens_flutter: ^0.6.3 http: ^1.2.1 - args: ^2.7.0 + # args: ^2.7.0 intl: ^0.20.2 flutter_native_splash: ^2.4.6 printing: ^5.14.2 geolocator: ^14.0.1 geolocator_linux: ^0.2.4 table_calendar: ^3.1.2 - youtube_player_iframe: ^5.2.0 mobile_scanner: ^7.0.1 flutter_launcher_icons: ^0.14.4 barcode_widget: ^2.0.4 #Generate Barcodes @@ -63,6 +62,8 @@ dependencies: flutter_markdown_plus: ^1.0.5 cross_file: ^0.3.5+1 quick_actions: ^1.1.0 + hive_ce: + hive_ce_flutter: dependency_overrides: supertokens_flutter: any @@ -71,11 +72,12 @@ dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.4.8 - build_web_compilers: ^4.1.5 flutter_lints: ^6.0.0 + hive_ce_generator: + build_runner: + flutter: uses-material-design: true assets: From d42337fc6ca8ba301c946e0d34db92b35d180dda Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 25 Jun 2026 11:58:10 +0200 Subject: [PATCH 04/14] fix home screen data syncing and caching and add manual sync data button --- mih_ui/lib/mih_config/mih_go_router.dart | 4 +- .../lib/mih_packages/mih_home/mih_home.dart | 30 +++++++---- .../package_tile/mih_home_refresh_tile.dart | 51 +++++++++++++++++++ 3 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart diff --git a/mih_ui/lib/mih_config/mih_go_router.dart b/mih_ui/lib/mih_config/mih_go_router.dart index 36b7a22f..d1756d98 100644 --- a/mih_ui/lib/mih_config/mih_go_router.dart +++ b/mih_ui/lib/mih_config/mih_go_router.dart @@ -171,9 +171,7 @@ class MihGoRouter { path: MihGoRouterPaths.mihHome, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mihHome"); - return MihHome( - key: UniqueKey(), - ); + return MihHome(); }, routes: [ // ========================== About MIH ================================== diff --git a/mih_ui/lib/mih_packages/mih_home/mih_home.dart b/mih_ui/lib/mih_packages/mih_home/mih_home.dart index dc81c343..ebc2478b 100644 --- a/mih_ui/lib/mih_packages/mih_home/mih_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/mih_home.dart @@ -42,9 +42,11 @@ class _MihHomeState extends State { context.read(); mzansiProfileProvider.loadCachedProfileState(); if (mzansiProfileProvider.user == null) { - await mzansiProfileProvider.syncWithCloudPipeline(); + await mzansiProfileProvider.syncWithMihServerData(); + } else { + mzansiProfileProvider.syncWithMihServerData(); } - } + } @override void dispose() { @@ -74,18 +76,26 @@ class _MihHomeState extends State { return Consumer( builder: (BuildContext context, MzansiProfileProvider mzansiProfileProvider, Widget? child) { - if (mzansiProfileProvider.user == null) { - return Scaffold( - body: Center( - child: Mihloadingcircle(), - ), - ); - } + if (mzansiProfileProvider.user == null) { + return Scaffold( + body: Center( + child: Mihloadingcircle(), + ), + ); + } return Stack( children: [ RefreshIndicator( + key: mzansiProfileProvider.refreshIndicatorKey, onRefresh: () async { - await mzansiProfileProvider.syncWithCloudPipeline(); + await mzansiProfileProvider.syncWithMihServerData(); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Data Synced with MIH Server."), + ), + ); + } }, child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), diff --git a/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart b/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart new file mode 100644 index 00000000..8e7c7d1b --- /dev/null +++ b/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; +import 'package:provider/provider.dart'; + +class MihHomeRefreshTile extends StatefulWidget { + final double packageSize; + const MihHomeRefreshTile({ + super.key, + required this.packageSize, + }); + + @override + State createState() => _MihHomeRefreshTileState(); +} + +class _MihHomeRefreshTileState extends State { + @override + Widget build(BuildContext context) { + return Consumer( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + Widget? child) { + return MihPackageTile( + onTap: profileProvider.triggerRefresh, + packageName: "Sync Data", + packageIcon: Stack( + alignment: Alignment.center, + children: [ + Icon( + MihIcons.mihRing, + color: MihColors.secondary(), + ), + Center( + child: Transform.scale( + scale: 0.75, + origin: Offset(-4, 0), + child: Icon( + Icons.cloud_sync_rounded, + color: MihColors.secondary(), + ), + ), + ), + ], + ), + iconSize: widget.packageSize, + textColor: MihColors.secondary(), + ); + }, + ); + } +} From 8d78fb63579dc9b7533341b570564a80390daa75 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 25 Jun 2026 11:59:21 +0200 Subject: [PATCH 05/14] complete mzansi personal and business profile get & store data offline mode --- mih_ui/lib/main_dev.dart | 3 + mih_ui/lib/mih_hive/hive_adapters.dart | 2 + mih_ui/lib/mih_hive/hive_adapters.g.dart | 55 ++++++++++++++++ mih_ui/lib/mih_hive/hive_adapters.g.yaml | 22 ++++++- mih_ui/lib/mih_hive/hive_registrar.g.dart | 2 + .../mih_hive/mzansi_profile_hive_data.dart | 65 +++++++++++++++++-- .../package_tools/mih_business_home.dart | 7 ++ .../package_tools/mih_personal_home.dart | 7 ++ .../business_profile/busines_profile.dart | 50 ++++++-------- .../personal_profile/mzansi_profile.dart | 46 ++++++------- .../mzansi_profile_provider.dart | 14 +++- .../mih_business_employee_services.dart | 13 ++++ .../mih_profile_links_service.dart | 15 +++++ 13 files changed, 240 insertions(+), 61 deletions(-) diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index fd7a07c0..645315c3 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -12,6 +12,7 @@ import 'package:mzansi_innovation_hub/mih_config/mih_go_router.dart'; import 'package:mzansi_innovation_hub/mih_hive/hive_registrar.g.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; @@ -36,6 +37,8 @@ void main() async { await Hive.openBox('user_consent_box'); await Hive.openBox('image_urls_box'); await Hive.openBox('personal_profile_links_box'); + await Hive.openBox('business_profile_links_box'); + await Hive.openBox('business_employees_box'); // await Firebase.initializeApp( // // options: DefaultFirebaseOptions.currentPlatform, diff --git a/mih_ui/lib/mih_hive/hive_adapters.dart b/mih_ui/lib/mih_hive/hive_adapters.dart index 5fc537d3..40db3c0e 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.dart @@ -2,6 +2,7 @@ import 'package:hive_ce/hive_ce.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; @@ -12,5 +13,6 @@ import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; AdapterSpec(), AdapterSpec(), AdapterSpec(), + AdapterSpec(), ]) part 'hive_adapters.g.dart'; diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.dart b/mih_ui/lib/mih_hive/hive_adapters.g.dart index 2b2abeac..0431eab4 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.g.dart @@ -283,3 +283,58 @@ class ProfileLinkAdapter extends TypeAdapter { runtimeType == other.runtimeType && typeId == other.typeId; } + +class BusinessEmployeeAdapter extends TypeAdapter { + @override + final typeId = 5; + + @override + BusinessEmployee read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return BusinessEmployee( + fields[0] as String, + fields[1] as String, + fields[2] as String, + fields[3] as String, + fields[4] as String, + fields[5] as String, + fields[6] as String, + fields[7] as String, + ); + } + + @override + void write(BinaryWriter writer, BusinessEmployee obj) { + writer + ..writeByte(8) + ..writeByte(0) + ..write(obj.business_id) + ..writeByte(1) + ..write(obj.app_id) + ..writeByte(2) + ..write(obj.title) + ..writeByte(3) + ..write(obj.access) + ..writeByte(4) + ..write(obj.fname) + ..writeByte(5) + ..write(obj.lname) + ..writeByte(6) + ..write(obj.email) + ..writeByte(7) + ..write(obj.username); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BusinessEmployeeAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.yaml b/mih_ui/lib/mih_hive/hive_adapters.g.yaml index 1dbf08fc..c8fb856c 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.yaml +++ b/mih_ui/lib/mih_hive/hive_adapters.g.yaml @@ -1,7 +1,7 @@ # Generated by Hive CE # Manual modifications may be necessary for certain migrations # Check in to version control -nextTypeId: 5 +nextTypeId: 6 types: AppUser: typeId: 0 @@ -105,3 +105,23 @@ types: index: 5 order: index: 6 + BusinessEmployee: + typeId: 5 + nextIndex: 8 + fields: + business_id: + index: 0 + app_id: + index: 1 + title: + index: 2 + access: + index: 3 + fname: + index: 4 + lname: + index: 5 + email: + index: 6 + username: + index: 7 diff --git a/mih_ui/lib/mih_hive/hive_registrar.g.dart b/mih_ui/lib/mih_hive/hive_registrar.g.dart index 46afbf71..641002d4 100644 --- a/mih_ui/lib/mih_hive/hive_registrar.g.dart +++ b/mih_ui/lib/mih_hive/hive_registrar.g.dart @@ -9,6 +9,7 @@ extension HiveRegistrar on HiveInterface { void registerAdapters() { registerAdapter(AppUserAdapter()); registerAdapter(BusinessAdapter()); + registerAdapter(BusinessEmployeeAdapter()); registerAdapter(BusinessUserAdapter()); registerAdapter(ProfileLinkAdapter()); registerAdapter(UserConsentAdapter()); @@ -19,6 +20,7 @@ extension IsolatedHiveRegistrar on IsolatedHiveInterface { void registerAdapters() { registerAdapter(AppUserAdapter()); registerAdapter(BusinessAdapter()); + registerAdapter(BusinessEmployeeAdapter()); registerAdapter(BusinessUserAdapter()); registerAdapter(ProfileLinkAdapter()); registerAdapter(UserConsentAdapter()); diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index 51439e8c..8ecccf12 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -1,11 +1,15 @@ +import 'dart:math'; + import 'package:hive_ce_flutter/hive_ce_flutter.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_business_employee_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_my_business_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_profile_links_service.dart'; @@ -21,7 +25,10 @@ class MzansiProfileHiveData { Hive.box('user_consent_box'); final Box _personalProfileLinksBox = Hive.box('personal_profile_links_box'); - + final Box _businessProfileLinksBox = + Hive.box('business_profile_links_box'); + final Box _businessEmployeesBox = + Hive.box('business_Employees_box'); final Box _resolvedUrlsBox = Hive.box('image_urls_box'); static const String kUserKey = 'current_user'; @@ -32,6 +39,7 @@ class MzansiProfileHiveData { static const String kBusinessPicUrlKey = 'business_pic_url'; static const String kSignatureUrlKey = 'signature_url'; + // Get Data from local storage AppUser? getCachedUser() => _userBox.get(kUserKey); Business? getCachedBusiness() => _businessBox.get(kBusinessKey); BusinessUser? getCachedBusinessUser() => @@ -40,12 +48,26 @@ class MzansiProfileHiveData { String? getCachedUserPicUrl() => _resolvedUrlsBox.get(kUserPicUrlKey); String? getCachedBusinessPicUrl() => _resolvedUrlsBox.get(kBusinessPicUrlKey); String? getCachedSignatureUrl() => _resolvedUrlsBox.get(kSignatureUrlKey); + List getCachedPersonalProfileLinks() { final links = _personalProfileLinksBox.values.toList(); links.sort((a, b) => a.order.compareTo(b.order)); return links; } + List getCachedBusinessProfileLinks() { + final links = _businessProfileLinksBox.values.toList(); + links.sort((a, b) => a.order.compareTo(b.order)); + return links; + } + + List getCachedBusinessEmployees() { + final employees = _businessEmployeesBox.values.toList(); + employees.sort((a, b) => a.fname.compareTo(b.fname)); + return employees; + } + + // Caching Data to local storage Future cacheUserData(AppUser remoteUser) async { await _userBox.put(kUserKey, remoteUser); if (remoteUser.pro_pic_path.isNotEmpty) { @@ -53,10 +75,12 @@ class MzansiProfileHiveData { await MihFileApi.getMinioFileUrl(remoteUser.pro_pic_path); await _resolvedUrlsBox.put(kUserPicUrlKey, userPicUrl); } + KenLogger.success("User Profile Cached"); } Future cacheUserConsentData(UserConsent remoteConsent) async { await _userConsentBox.put(kConsentKey, remoteConsent); + KenLogger.success("User Consent Cached"); } Future cacheBusinessData(Business remoteBusiness) async { @@ -71,6 +95,7 @@ class MzansiProfileHiveData { if (remoteBizUser != null) { cacheBusinessUserData(remoteBizUser); } + KenLogger.success("Busines Profile Cached"); } Future cacheBusinessUserData(BusinessUser remoteBizUser) async { @@ -80,33 +105,59 @@ class MzansiProfileHiveData { await MihFileApi.getMinioFileUrl(remoteBizUser.sig_path); await _resolvedUrlsBox.put(kSignatureUrlKey, signatureUrl); } + KenLogger.success("Busines User Profile Cached"); + } + + Future cacheBusinessEmployeesData( + List remoteBusinessEmployeeList) async { + await _businessEmployeesBox.clear(); + await _businessEmployeesBox.addAll(remoteBusinessEmployeeList); + KenLogger.success("Business Employees Cached"); } Future cachePersonalProfileLinksData( - List remoteLinks) async { + List remotePersonalLinks) async { await _personalProfileLinksBox.clear(); - await _personalProfileLinksBox.addAll(remoteLinks); + await _personalProfileLinksBox.addAll(remotePersonalLinks); + KenLogger.success("Personal Profile Links Cached"); } + Future cacheBusinessProfileLinksData( + List remoteBusinessLinks) async { + await _businessProfileLinksBox.clear(); + await _businessProfileLinksBox.addAll(remoteBusinessLinks); + KenLogger.success("Personal Profile Links Cached"); + } + + // Sync Local Data from data from MIH Server Future syncProfileDataWithServer() async { try { AppUser? remoteUser = await MihUserServices().getMyUserDetailsV2(); if (remoteUser != null) { cacheUserData(remoteUser); - UserConsent? remoteConsent = await MihUserConsentServices().getUserConsentStatusV2(); if (remoteConsent != null) { cacheUserConsentData(remoteConsent); } - final remoteLinks = await MihProfileLinksServices.getUserProfileLinksV2( - remoteUser.app_id); - await cachePersonalProfileLinksData(remoteLinks); + final remotePersonalLinks = + await MihProfileLinksServices.getUserProfileLinksV2( + remoteUser.app_id); + cachePersonalProfileLinksData(remotePersonalLinks); } Business? remoteBusiness = await MihBusinessDetailsServices().getBusinessDetailsByUserV2(); if (remoteBusiness != null) { cacheBusinessData(remoteBusiness); + + final remoteBusinessEmployeeList = await MihBusinessEmployeeServices() + .fetchEmployeesV2(remoteBusiness.business_id); + cacheBusinessEmployeesData(remoteBusinessEmployeeList); + + final remoteBusinessLinks = + await MihProfileLinksServices.getBusinessProfileLinksV2( + remoteBusiness.business_id); + cacheBusinessProfileLinksData(remoteBusinessLinks); } } catch (error) { KenLogger.warning("App operating offline mode. Sync paused"); diff --git a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index 2e8dda43..ffb82b93 100644 --- a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -2,6 +2,7 @@ import 'package:go_router/go_router.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; +import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_mih_tile.dart'; @@ -129,6 +130,12 @@ class _MihBusinessHomeState extends State packageSize: packageSize, ) }); + //=============== About MIH =============== + temp.add({ + "Sync Data": MihHomeRefreshTile( + packageSize: packageSize, + ) + }); return temp; } diff --git a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index f1ed0494..a2c989a1 100644 --- a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -3,6 +3,7 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_package_components/Example/package_tiles/test_package_tile.dart'; +import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tiles/mzansi_setup_business_profile_tile.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_mih_tile.dart'; @@ -138,6 +139,12 @@ class _MihPersonalHomeState extends State packageSize: packageSize, ) }); + //=============== About MIH =============== + temp.add({ + "Sync Data": MihHomeRefreshTile( + packageSize: packageSize, + ) + }); //=============== Dev =============== if (AppEnviroment.getEnv() == "Dev") { temp.add({ diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/busines_profile.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/busines_profile.dart index c13e079c..556f7a55 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/busines_profile.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/busines_profile.dart @@ -22,7 +22,7 @@ class BusinesProfile extends StatefulWidget { } class _BusinesProfileState extends State { - bool _isLoadingInitialData = true; + // bool _isLoadingInitialData = true; late final MihBusinessDetails _businessDetails; late final MihMyBusinessUser _businessUser; late final MihMyBusinessTeam _businessTeam; @@ -31,26 +31,18 @@ class _BusinesProfileState extends State { late final MihBusinessQrCode _businessQrCode; late final MihBusinessLinks _businessLinks; - Future _loadInitialData() async { - setState(() { - _isLoadingInitialData = true; - }); - MzansiProfileProvider mzansiProfileProvider = - context.read(); - if (mzansiProfileProvider.user == null) { - await MihDataHelperServices().loadUserDataWithBusinessesData( - mzansiProfileProvider, - ); - } - await MihProfileLinksServices.getBusinessProfileLinks( - mzansiProfileProvider, mzansiProfileProvider.business!.business_id); - await MihBusinessEmployeeServices() - .fetchEmployees(mzansiProfileProvider, context); - setState(() { - _isLoadingInitialData = false; - }); - } - + // Future _loadInitialData() async { + // MzansiProfileProvider mzansiProfileProvider = + // context.read(); + // mzansiProfileProvider.loadCachedProfileState(); + // if (mzansiProfileProvider.user == null) { + // mzansiProfileProvider.syncWithMihServerData(); + // } + // setState(() { + // _isLoadingInitialData = false; + // }); + // } + // @override void initState() { super.initState(); @@ -61,7 +53,7 @@ class _BusinesProfileState extends State { _businessReviews = MihBusinessReviews(business: null); _businessLinks = MihBusinessLinks(viewMode: false); _businessQrCode = MihBusinessQrCode(business: null); - _loadInitialData(); + // _loadInitialData(); } @override @@ -69,13 +61,13 @@ class _BusinesProfileState extends State { return Consumer( builder: (BuildContext context, MzansiProfileProvider mzansiProfileProvider, Widget? child) { - if (_isLoadingInitialData) { - return Scaffold( - body: Center( - child: Mihloadingcircle(), - ), - ); - } + // if (_isLoadingInitialData) { + // return Scaffold( + // body: Center( + // child: Mihloadingcircle(), + // ), + // ); + // } return MihPackage( packageActionButton: getAction(), packageTools: getTools(), diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart index df45d03e..79f5dfc2 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart @@ -17,32 +17,32 @@ class MzansiProfile extends StatefulWidget { } class _MzansiProfileState extends State { - bool _isLoadingInitialData = true; + // bool _isLoadingInitialData = true; late final MihPersonalProfile _personalProfile; late final MihPersonalQrCode _personalQrCode; late final MihPersonalSettings _personalSettings; - Future _loadInitialData() async { - MzansiProfileProvider mzansiProfileProvider = - context.read(); - mzansiProfileProvider.loadCachedProfileState(); - if (mzansiProfileProvider.user == null) { - mzansiProfileProvider.syncWithCloudPipeline(); - } - setState(() { - _isLoadingInitialData = false; - }); - } - + // Future _loadInitialData() async { + // MzansiProfileProvider mzansiProfileProvider = + // context.read(); + // if (mzansiProfileProvider.user == null) { + // mzansiProfileProvider.loadCachedProfileState(); + // mzansiProfileProvider.syncWithMihServerData(); + // } + // setState(() { + // _isLoadingInitialData = false; + // }); + // } + // @override void initState() { super.initState(); _personalProfile = const MihPersonalProfile(); _personalQrCode = const MihPersonalQrCode(user: null); _personalSettings = const MihPersonalSettings(); - WidgetsBinding.instance.addPostFrameCallback((_) { - _loadInitialData(); - }); + // WidgetsBinding.instance.addPostFrameCallback((_) { + // _loadInitialData(); + // }); } @override @@ -50,13 +50,13 @@ class _MzansiProfileState extends State { return Consumer( builder: (BuildContext context, MzansiProfileProvider profileProvider, Widget? child) { - if (_isLoadingInitialData) { - return Scaffold( - body: Center( - child: Mihloadingcircle(), - ), - ); - } + // if (_isLoadingInitialData) { + // return Scaffold( + // body: Center( + // child: Mihloadingcircle(), + // ), + // ); + // } return MihPackage( packageActionButton: getAction(), packageTools: getTools(), diff --git a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart index 312b60b0..81ff4977 100644 --- a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/mih_hive/mzansi_profile_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; @@ -29,6 +30,8 @@ class MzansiProfileProvider extends ChangeNotifier { bool hideBusinessUserDetails; List personalLinks = []; List businessLinks = []; + final GlobalKey refreshIndicatorKey = + GlobalKey(); MzansiProfileProvider( this._hiveData, { @@ -59,16 +62,25 @@ class MzansiProfileProvider extends ChangeNotifier { businessUserSignature = CachedNetworkImageProvider(cachedSigUrl); } + employeeList = _hiveData.getCachedBusinessEmployees(); + personalLinks = _hiveData.getCachedPersonalProfileLinks(); + businessLinks = _hiveData.getCachedBusinessProfileLinks(); + + KenLogger.success("Mzansi Profile Loaded from Cache"); notifyListeners(); } - Future syncWithCloudPipeline() async { + Future syncWithMihServerData() async { await _hiveData.syncProfileDataWithServer(); loadCachedProfileState(); } + void triggerRefresh() { + refreshIndicatorKey.currentState?.show(); + } + void reset() { personalHome = true; personalIndex = 0; diff --git a/mih_ui/lib/mih_services/mih_business_employee_services.dart b/mih_ui/lib/mih_services/mih_business_employee_services.dart index 2895e0c0..682e5ad6 100644 --- a/mih_ui/lib/mih_services/mih_business_employee_services.dart +++ b/mih_ui/lib/mih_services/mih_business_employee_services.dart @@ -25,6 +25,19 @@ class MihBusinessEmployeeServices { return response.statusCode; } + Future> fetchEmployeesV2(String business_id) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/business-user/employees/${business_id}")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List employeeList = List.from( + l.map((model) => BusinessEmployee.fromJson(model))); + return employeeList; + } else { + throw Exception('failed to load employees'); + } + } + Future addEmployee( MzansiProfileProvider provider, AppUser newEmployee, diff --git a/mih_ui/lib/mih_services/mih_profile_links_service.dart b/mih_ui/lib/mih_services/mih_profile_links_service.dart index 6823a7c7..0402646f 100644 --- a/mih_ui/lib/mih_services/mih_profile_links_service.dart +++ b/mih_ui/lib/mih_services/mih_profile_links_service.dart @@ -89,6 +89,21 @@ class MihProfileLinksServices { } } + static Future> getBusinessProfileLinksV2( + String business_id, + ) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/profile-links/business/$business_id")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List myLinks = + List.from(l.map((model) => ProfileLink.fromJson(model))); + return myLinks; + } else { + throw Exception('failed to fecth user profile links'); + } + } + static Future deleteProfileLink( MzansiProfileProvider profileProvider, int idprofile_links, From d722251d50840427a211fec89187cc6870133a82 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 25 Jun 2026 12:24:30 +0200 Subject: [PATCH 06/14] Sync data message when in Offline Mode --- mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart | 8 ++++---- mih_ui/lib/mih_packages/mih_home/mih_home.dart | 10 ++++++++-- mih_ui/lib/mih_providers/mzansi_profile_provider.dart | 5 +++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index 8ecccf12..cd818fff 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:hive_ce_flutter/hive_ce_flutter.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; @@ -130,7 +128,7 @@ class MzansiProfileHiveData { } // Sync Local Data from data from MIH Server - Future syncProfileDataWithServer() async { + Future syncProfileDataWithServer() async { try { AppUser? remoteUser = await MihUserServices().getMyUserDetailsV2(); if (remoteUser != null) { @@ -159,8 +157,10 @@ class MzansiProfileHiveData { remoteBusiness.business_id); cacheBusinessProfileLinksData(remoteBusinessLinks); } + return true; } catch (error) { - KenLogger.warning("App operating offline mode. Sync paused"); + KenLogger.warning("App Operating in Offline Mode. Sync Paused"); + return false; // KenLogger.warning("App operating offline mode. Sync paused: $error"); } } diff --git a/mih_ui/lib/mih_packages/mih_home/mih_home.dart b/mih_ui/lib/mih_packages/mih_home/mih_home.dart index ebc2478b..cd29c124 100644 --- a/mih_ui/lib/mih_packages/mih_home/mih_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/mih_home.dart @@ -88,11 +88,17 @@ class _MihHomeState extends State { RefreshIndicator( key: mzansiProfileProvider.refreshIndicatorKey, onRefresh: () async { - await mzansiProfileProvider.syncWithMihServerData(); + bool success = + await mzansiProfileProvider.syncWithMihServerData(); if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( MihSnackBar( - child: Text("Data Synced with MIH Server."), + child: Text( + success + ? "Data Synced with MIH Server." + : "MIH App operation in Offline Mode", + ), + // backgroundColor: success ? null : MihColors.red(), ), ); } diff --git a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart index 81ff4977..9e2c7455 100644 --- a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart @@ -72,9 +72,10 @@ class MzansiProfileProvider extends ChangeNotifier { notifyListeners(); } - Future syncWithMihServerData() async { - await _hiveData.syncProfileDataWithServer(); + Future syncWithMihServerData() async { + bool success = await _hiveData.syncProfileDataWithServer(); loadCachedProfileState(); + return success; } void triggerRefresh() { From 003c8b7c0d7e9450d17a5d1e6121fef9c1e3c703 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 25 Jun 2026 12:25:01 +0200 Subject: [PATCH 07/14] fix Mzansi profiles QR code in offline mode --- .../package_tools/mih_business_qr_code.dart | 86 +++++++++++-------- .../package_tools/mih_business_reviews.dart | 2 +- .../package_tools/mih_personal_qr_code.dart | 86 +++++++++++-------- 3 files changed, 101 insertions(+), 73 deletions(-) diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart index f03873a4..f2939170 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart @@ -175,6 +175,8 @@ class _MihBusinessQrCodeState extends State { } Widget displayBusinessQRCode(double profilePictureWidth) { + MzansiProfileProvider profileprovider = + context.read(); return Screenshot( controller: screenshotController, child: Material( @@ -193,42 +195,54 @@ class _MihBusinessQrCodeState extends State { mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "" || - asyncSnapshot.requireData.isNotEmpty) { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.primary(), - backgroundColor: MihColors.secondary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - }, - ), + widget.business == null + ? MihCircleAvatar( + imageFile: profileprovider.businessProfilePicture, + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, + ) + : FutureBuilder( + future: futureImageUrl, + builder: (context, asyncSnapshot) { + if (asyncSnapshot.connectionState == + ConnectionState.done && + asyncSnapshot.hasData) { + if (asyncSnapshot.requireData != "" || + asyncSnapshot.requireData.isNotEmpty) { + return MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + asyncSnapshot.requireData), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, + ); + } else { + return Icon( + MihIcons.mihIDontKnow, + size: profilePictureWidth, + color: MihColors.primary(), + ); + } + } else { + return Icon( + MihIcons.mihRing, + size: profilePictureWidth, + color: MihColors.primary(), + ); + } + }, + ), FittedBox( child: Text( business.Name, diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart index 222f8296..618b6e0b 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart @@ -231,7 +231,7 @@ class _MihBusinessReviewsState extends State { ); } } else { - return Center(child: Text('Error')); + return Center(child: Text('Error: MIH in Offline Mode')); } }); } diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart index b9f86d4f..c01110ef 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart @@ -174,6 +174,8 @@ class _MihPersonalQrCodeState extends State { } Widget displayPersonalQRCode(double profilePictureWidth) { + MzansiProfileProvider profileProvider = + context.read(); return Screenshot( controller: screenshotController, child: Material( @@ -192,42 +194,54 @@ class _MihPersonalQrCodeState extends State { mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "" || - asyncSnapshot.requireData.isNotEmpty) { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.primary(), - backgroundColor: MihColors.secondary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - }, - ), + widget.user == null + ? MihCircleAvatar( + imageFile: profileProvider.userProfilePicture, + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, + ) + : FutureBuilder( + future: futureImageUrl, + builder: (context, asyncSnapshot) { + if (asyncSnapshot.connectionState == + ConnectionState.done && + asyncSnapshot.hasData) { + if (asyncSnapshot.requireData != "" || + asyncSnapshot.requireData.isNotEmpty) { + return MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + asyncSnapshot.requireData), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, + ); + } else { + return Icon( + MihIcons.mihIDontKnow, + size: profilePictureWidth, + color: MihColors.primary(), + ); + } + } else { + return Icon( + MihIcons.mihRing, + size: profilePictureWidth, + color: MihColors.primary(), + ); + } + }, + ), FittedBox( child: Text( user.username, From f588e9f7155d9a7b5404128417075e3aa3aaafbc Mon Sep 17 00:00:00 2001 From: yaso Date: Fri, 26 Jun 2026 10:33:06 +0200 Subject: [PATCH 08/14] Mzansi Wallet Display done --- mih_ui/lib/main.dart | 10 +++- mih_ui/lib/main_dev.dart | 6 ++ mih_ui/lib/mih_hive/hive_adapters.dart | 2 + mih_ui/lib/mih_hive/hive_adapters.g.dart | 52 ++++++++++++++++ mih_ui/lib/mih_hive/hive_adapters.g.yaml | 20 ++++++- mih_ui/lib/mih_hive/hive_registrar.g.dart | 2 + .../lib/mih_hive/mzansi_wallet_hive_data.dart | 59 +++++++++++++++++++ .../mzansi_wallet/mih_wallet.dart | 44 ++++---------- .../package_tools/mih_cards.dart | 32 ++++++++++ .../mih_providers/mzansi_wallet_provider.dart | 23 +++++++- .../mih_mzansi_wallet_services.dart | 35 ++++++++++- 11 files changed, 246 insertions(+), 39 deletions(-) create mode 100644 mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart diff --git a/mih_ui/lib/main.dart b/mih_ui/lib/main.dart index b9c221fd..ebf3c1d0 100644 --- a/mih_ui/lib/main.dart +++ b/mih_ui/lib/main.dart @@ -4,8 +4,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; -import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_hive/mzansi_profile_hive_data.dart'; +import 'package:mzansi_innovation_hub/mih_hive/mzansi_wallet_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_access_controlls_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_authentication_provider.dart'; @@ -123,10 +123,14 @@ class _MzansiInnovationHubState extends State { create: (context) => MihAuthenticationProvider(), ), ChangeNotifierProvider( - create: (context) => MzansiProfileProvider(MzansiProfileHiveData()), + create: (context) => MzansiProfileProvider( + MzansiProfileHiveData(), + ), ), ChangeNotifierProvider( - create: (context) => MzansiWalletProvider(), + create: (context) => MzansiWalletProvider( + MzansiWalletHiveData(), + ), ), ChangeNotifierProvider( create: (context) => MzansiAiProvider(), diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 645315c3..55881da2 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -14,6 +14,7 @@ import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:pwa_install/pwa_install.dart'; @@ -29,8 +30,10 @@ void main() async { apiDomain: AppEnviroment.baseApiUrl, apiBasePath: "/auth", ); + // Offine Hive Data await Hive.initFlutter('mih_offline_storage'); Hive.registerAdapters(); + // Mzansi Profile Data await Hive.openBox('user_box'); await Hive.openBox('business_box'); await Hive.openBox('business_user_box'); @@ -39,6 +42,9 @@ void main() async { await Hive.openBox('personal_profile_links_box'); await Hive.openBox('business_profile_links_box'); await Hive.openBox('business_employees_box'); + // Mzansi Wallet Data + await Hive.openBox('loyalty_card_box'); + await Hive.openBox('fav_loyalty_card_box'); // await Firebase.initializeApp( // // options: DefaultFirebaseOptions.currentPlatform, diff --git a/mih_ui/lib/mih_hive/hive_adapters.dart b/mih_ui/lib/mih_hive/hive_adapters.dart index 40db3c0e..78d43de4 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.dart @@ -4,6 +4,7 @@ import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; @@ -14,5 +15,6 @@ import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; AdapterSpec(), AdapterSpec(), AdapterSpec(), + AdapterSpec(), ]) part 'hive_adapters.g.dart'; diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.dart b/mih_ui/lib/mih_hive/hive_adapters.g.dart index 0431eab4..df0aa419 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.g.dart @@ -338,3 +338,55 @@ class BusinessEmployeeAdapter extends TypeAdapter { runtimeType == other.runtimeType && typeId == other.typeId; } + +class MIHLoyaltyCardAdapter extends TypeAdapter { + @override + final typeId = 6; + + @override + MIHLoyaltyCard read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return MIHLoyaltyCard( + idloyalty_cards: (fields[0] as num).toInt(), + app_id: fields[1] as String, + shop_name: fields[2] as String, + card_number: fields[3] as String, + favourite: fields[4] as String, + priority_index: (fields[5] as num).toInt(), + nickname: fields[6] as String, + ); + } + + @override + void write(BinaryWriter writer, MIHLoyaltyCard obj) { + writer + ..writeByte(7) + ..writeByte(0) + ..write(obj.idloyalty_cards) + ..writeByte(1) + ..write(obj.app_id) + ..writeByte(2) + ..write(obj.shop_name) + ..writeByte(3) + ..write(obj.card_number) + ..writeByte(4) + ..write(obj.favourite) + ..writeByte(5) + ..write(obj.priority_index) + ..writeByte(6) + ..write(obj.nickname); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is MIHLoyaltyCardAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.yaml b/mih_ui/lib/mih_hive/hive_adapters.g.yaml index c8fb856c..7193a532 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.yaml +++ b/mih_ui/lib/mih_hive/hive_adapters.g.yaml @@ -1,7 +1,7 @@ # Generated by Hive CE # Manual modifications may be necessary for certain migrations # Check in to version control -nextTypeId: 6 +nextTypeId: 7 types: AppUser: typeId: 0 @@ -125,3 +125,21 @@ types: index: 6 username: index: 7 + MIHLoyaltyCard: + typeId: 6 + nextIndex: 7 + fields: + idloyalty_cards: + index: 0 + app_id: + index: 1 + shop_name: + index: 2 + card_number: + index: 3 + favourite: + index: 4 + priority_index: + index: 5 + nickname: + index: 6 diff --git a/mih_ui/lib/mih_hive/hive_registrar.g.dart b/mih_ui/lib/mih_hive/hive_registrar.g.dart index 641002d4..9d9d484b 100644 --- a/mih_ui/lib/mih_hive/hive_registrar.g.dart +++ b/mih_ui/lib/mih_hive/hive_registrar.g.dart @@ -11,6 +11,7 @@ extension HiveRegistrar on HiveInterface { registerAdapter(BusinessAdapter()); registerAdapter(BusinessEmployeeAdapter()); registerAdapter(BusinessUserAdapter()); + registerAdapter(MIHLoyaltyCardAdapter()); registerAdapter(ProfileLinkAdapter()); registerAdapter(UserConsentAdapter()); } @@ -22,6 +23,7 @@ extension IsolatedHiveRegistrar on IsolatedHiveInterface { registerAdapter(BusinessAdapter()); registerAdapter(BusinessEmployeeAdapter()); registerAdapter(BusinessUserAdapter()); + registerAdapter(MIHLoyaltyCardAdapter()); registerAdapter(ProfileLinkAdapter()); registerAdapter(UserConsentAdapter()); } diff --git a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart new file mode 100644 index 00000000..66fa4187 --- /dev/null +++ b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart @@ -0,0 +1,59 @@ +import 'package:hive_ce_flutter/hive_ce_flutter.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; + +class MzansiWalletHiveData { + final Box _loyaltyCardBox = + Hive.box('loyalty_card_box'); + final Box _favLoyaltyCardBox = + Hive.box('fav_loyalty_card_box'); + + // Get Offline Data + List getCachedLoyaltyCards() { + final cards = _loyaltyCardBox.values.toList(); + cards.sort((a, b) => a.shop_name.compareTo(b.shop_name)); + return cards; + } + + List getCachedFavLoyaltyCards() { + final cards = _favLoyaltyCardBox.values.toList(); + cards.sort((a, b) => a.shop_name.compareTo(b.shop_name)); + return cards; + } + + // Cache data for offline use + Future cacheFavLoyaltyCardsData( + List remoteLoyaltyCards) async { + await _favLoyaltyCardBox.clear(); + await _favLoyaltyCardBox.addAll(remoteLoyaltyCards); + KenLogger.success("Favourite Loyalty Cards Cached"); + } + + Future cacheLoyaltyCardsData( + List remoteFavLoyaltyCards) async { + await _loyaltyCardBox.clear(); + await _loyaltyCardBox.addAll(remoteFavLoyaltyCards); + KenLogger.success("Loyalty Cards Cached"); + } + + // Sync Local Data from data from MIH Server + Future syncWalletWithServer( + MzansiProfileProvider profileProvider) async { + try { + final remoteLoyaltyCards = await MIHMzansiWalletApis.getLoyaltyCardsV2( + profileProvider.user!.app_id); + cacheLoyaltyCardsData(remoteLoyaltyCards); + final remoteFavLoyaltyCards = + await MIHMzansiWalletApis.getFavouriteLoyaltyCardsV2( + profileProvider.user!.app_id); + cacheFavLoyaltyCardsData(remoteFavLoyaltyCards); + return true; + } catch (error) { + KenLogger.warning("App Operating in Offline Mode. Sync Paused"); + return false; + // KenLogger.warning("App operating offline mode. Sync paused: $error"); + } + } +} diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart index f9b20e4b..cf61c013 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -20,50 +20,32 @@ class MihWallet extends StatefulWidget { class _MihWalletState extends State { bool _isLoadingInitialData = true; - late final MihCards _cards; - late final MihCardFavourites _cardFavourites; Future _loadInitialData() async { - setState(() { - _isLoadingInitialData = true; - }); MzansiProfileProvider mzansiProfileProvider = context.read(); + mzansiProfileProvider.loadCachedProfileState(); MzansiWalletProvider walletProvider = context.read(); + walletProvider.loadCachedWallet(); if (mzansiProfileProvider.user == null) { - await MihDataHelperServices().loadUserDataWithBusinessesData( - mzansiProfileProvider, - ); + mzansiProfileProvider.syncWithMihServerData(); + } + if (walletProvider.loyaltyCards.isEmpty) { + walletProvider.syncWithMihServerData(mzansiProfileProvider); } - await setLoyaltyCards(mzansiProfileProvider, walletProvider); - await setFavouritesCards(mzansiProfileProvider, walletProvider); setState(() { _isLoadingInitialData = false; }); } - Future setLoyaltyCards( - MzansiProfileProvider mzansiProfileProvider, - MzansiWalletProvider walletProvider, - ) async { - await MIHMzansiWalletApis.getLoyaltyCards( - walletProvider, mzansiProfileProvider.user!.app_id, context); - } - - Future setFavouritesCards( - MzansiProfileProvider mzansiProfileProvider, - MzansiWalletProvider walletProvider, - ) async { - await MIHMzansiWalletApis.getFavouriteLoyaltyCards( - walletProvider, mzansiProfileProvider.user!.app_id, context); - } - @override void initState() { super.initState(); - _cards = MihCards(); - _cardFavourites = MihCardFavourites(); - _loadInitialData(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _loadInitialData(); + } + }); } @override @@ -122,8 +104,8 @@ class _MihWalletState extends State { List getToolBody() { return [ - _cards, - _cardFavourites, + MihCards(), + MihCardFavourites(), ]; } diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart b/mih_ui/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart index bc10d4ad..71f715c0 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart @@ -1,5 +1,6 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_add_card_window.dart'; import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; @@ -161,6 +162,37 @@ class _MihCardsState extends State { onTap: () { addCardWindow(context, width); }, + ), + SpeedDialChild( + child: Icon( + Icons.cloud_sync_rounded, + color: MihColors.primary(), + ), + label: "Sync Wallet", + labelBackgroundColor: MihColors.green(), + labelStyle: TextStyle( + color: MihColors.primary(), + fontWeight: FontWeight.bold, + ), + backgroundColor: MihColors.green(), + onTap: () async { + MzansiProfileProvider profileProvider = + context.read(); + bool success = await walletProvider + .syncWithMihServerData(profileProvider); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text( + success + ? "Wallet Synced with MIH Server." + : "MIH App operation in Offline Mode", + ), + // backgroundColor: success ? null : MihColors.red(), + ), + ); + } + }, ) ]), ) diff --git a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart index ac9b13ac..2517561d 100644 --- a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart @@ -1,17 +1,38 @@ import 'package:flutter/material.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_hive/mzansi_wallet_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; class MzansiWalletProvider extends ChangeNotifier { + final MzansiWalletHiveData _hiveData; + List loyaltyCards; List favouriteCards; int toolIndex; - MzansiWalletProvider({ + MzansiWalletProvider( + this._hiveData, { this.loyaltyCards = const [], this.favouriteCards = const [], this.toolIndex = 0, }); + void loadCachedWallet() { + loyaltyCards = _hiveData.getCachedLoyaltyCards(); + favouriteCards = _hiveData.getCachedFavLoyaltyCards(); + + KenLogger.success("Mzansi Wallet Loaded from Cache"); + notifyListeners(); + } + + Future syncWithMihServerData( + MzansiProfileProvider profileProvider) async { + bool success = await _hiveData.syncWalletWithServer(profileProvider); + loadCachedWallet(); + return success; + } + void reset() { toolIndex = 0; loyaltyCards = []; diff --git a/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart b/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart index c2fcd967..7290ab5d 100644 --- a/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart +++ b/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart @@ -31,6 +31,21 @@ class MIHMzansiWalletApis { } } + static Future> getLoyaltyCardsV2( + String app_id, + ) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/$app_id")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List myCards = List.from( + l.map((model) => MIHLoyaltyCard.fromJson(model))); + return myCards; + } else { + throw Exception('failed to fatch loyalty cards'); + } + } + static Future getFavouriteLoyaltyCards( MzansiWalletProvider walletProvider, String app_id, @@ -44,10 +59,24 @@ class MIHMzansiWalletApis { List myCards = List.from( l.map((model) => MIHLoyaltyCard.fromJson(model))); walletProvider.setFavouriteCards(cards: myCards); + } else { + throw Exception('failed to fatch loyalty cards'); + } + } + + static Future> getFavouriteLoyaltyCardsV2( + String app_id, + ) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/favourites/$app_id")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List myCards = List.from( + l.map((model) => MIHLoyaltyCard.fromJson(model))); + return myCards; + } else { + throw Exception('failed to fatch loyalty cards'); } - // else { - // throw Exception('failed to fatch loyalty cards'); - // } } /// This function is used to Delete loyalty card from users mzansi wallet. From 6ad1ea613c9625576996e07d4e6727cad800bcc2 Mon Sep 17 00:00:00 2001 From: yaso Date: Mon, 29 Jun 2026 09:53:23 +0200 Subject: [PATCH 09/14] add sync data package, enable offline display of mzansi wallet, about mih & mzansi ai --- mih_ui/analysis_options.yaml | 27 +- mih_ui/build.yaml | 14 + mih_ui/lib/main.dart | 5 +- mih_ui/lib/main_dev.dart | 1 + mih_ui/lib/mih_hive/about_mih_hive_data.dart | 42 + .../mih_hive/mzansi_profile_hive_data.dart | 2 +- .../lib/mih_hive/mzansi_wallet_hive_data.dart | 2 +- .../components/about_mih_heading.dart | 57 ++ .../components/call_to_action_buttons.dart | 239 ++++++ .../about_mih/components/founder_details.dart | 97 +++ .../components/mih_social_links.dart | 137 +++ .../components/mission_and_vission.dart | 101 +++ .../about_mih/package_tools/mih_info.dart | 811 ++---------------- .../lib/mih_packages/mih_home/mih_home.dart | 12 +- .../package_tile/mih_home_refresh_tile.dart | 53 +- .../lib/mih_packages/mzansi_ai/mzansi_ai.dart | 30 +- .../mzansi_wallet/mih_wallet.dart | 2 - .../lib/mih_providers/about_mih_provider.dart | 27 +- 18 files changed, 826 insertions(+), 833 deletions(-) create mode 100644 mih_ui/build.yaml create mode 100644 mih_ui/lib/mih_hive/about_mih_hive_data.dart create mode 100644 mih_ui/lib/mih_packages/about_mih/components/about_mih_heading.dart create mode 100644 mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart create mode 100644 mih_ui/lib/mih_packages/about_mih/components/founder_details.dart create mode 100644 mih_ui/lib/mih_packages/about_mih/components/mih_social_links.dart create mode 100644 mih_ui/lib/mih_packages/about_mih/components/mission_and_vission.dart diff --git a/mih_ui/analysis_options.yaml b/mih_ui/analysis_options.yaml index 0d290213..65062592 100644 --- a/mih_ui/analysis_options.yaml +++ b/mih_ui/analysis_options.yaml @@ -1,28 +1,9 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. +analyzer: + exclude: + - lib/**/*.g.dart + - lib/**/hive_registrar.g.dart -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/mih_ui/build.yaml b/mih_ui/build.yaml new file mode 100644 index 00000000..f99dfb8c --- /dev/null +++ b/mih_ui/build.yaml @@ -0,0 +1,14 @@ +targets: + $default: + builders: + # 1. Restrict adapter generation to your mih_hive folder + hive_ce_generator:hive_adapters_generator: + generate_for: + - lib/mih_hive/*.dart + + # 2. Restrict registrar generation to your entry points + hive_ce_generator:hive_registrar_generator: + generate_for: + - lib/main.dart + - lib/main_dev.dart + - lib/main_prod.dart diff --git a/mih_ui/lib/main.dart b/mih_ui/lib/main.dart index ebf3c1d0..49ae024b 100644 --- a/mih_ui/lib/main.dart +++ b/mih_ui/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_hive/about_mih_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_hive/mzansi_profile_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_hive/mzansi_wallet_hive_data.dart'; import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; @@ -151,7 +152,9 @@ class _MzansiInnovationHubState extends State { create: (context) => MihCalendarProvider(), ), ChangeNotifierProvider( - create: (context) => AboutMihProvider(), + create: (context) => AboutMihProvider( + AboutMihHiveData(), + ), ), ChangeNotifierProvider( create: (context) => MihMineSweeperProvider(), diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 55881da2..71e42e5c 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -45,6 +45,7 @@ void main() async { // Mzansi Wallet Data await Hive.openBox('loyalty_card_box'); await Hive.openBox('fav_loyalty_card_box'); + await Hive.openBox('about_mih_box'); // await Firebase.initializeApp( // // options: DefaultFirebaseOptions.currentPlatform, diff --git a/mih_ui/lib/mih_hive/about_mih_hive_data.dart b/mih_ui/lib/mih_hive/about_mih_hive_data.dart new file mode 100644 index 00000000..3429c7b8 --- /dev/null +++ b/mih_ui/lib/mih_hive/about_mih_hive_data.dart @@ -0,0 +1,42 @@ +import 'package:hive_ce_flutter/adapters.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; + +class AboutMihHiveData { + final Box _mihUserBusinessCountBox = Hive.box('about_mih_box'); + + static const String kUserCountKey = 'current_user_count'; + static const String kBusinessCountKey = 'current_user_count'; + + // Get Data from local storage + int? getcachedUserCount() => _mihUserBusinessCountBox.get(kUserCountKey); + int? getcachedBusinessCount() => + _mihUserBusinessCountBox.get(kBusinessCountKey); + + // Caching Data to local storage + Future cacheUserCount(int remoteUserCount) async { + await _mihUserBusinessCountBox.put(kUserCountKey, remoteUserCount); + KenLogger.success("MIH User Count Cached"); + } + + Future cacheBusinessCount(int remoteBusinessCount) async { + await _mihUserBusinessCountBox.put(kUserCountKey, remoteBusinessCount); + KenLogger.success("MIH Business Count Cached"); + } + + // Sync Local Data from data from MIH Server + Future syncAboutMihDataWithServer() async { + try { + int remoteUserCount = await MihUserServices().fetchUserCount(); + cacheUserCount(remoteUserCount); + int remoteBusinessCount = + await MihBusinessDetailsServices().fetchBusinessCount(); + cacheBusinessCount(remoteBusinessCount); + return true; + } catch (error) { + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); + return false; + } + } +} diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index cd818fff..a6b5318a 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -159,7 +159,7 @@ class MzansiProfileHiveData { } return true; } catch (error) { - KenLogger.warning("App Operating in Offline Mode. Sync Paused"); + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); return false; // KenLogger.warning("App operating offline mode. Sync paused: $error"); } diff --git a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart index 66fa4187..21bdec6e 100644 --- a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart @@ -51,7 +51,7 @@ class MzansiWalletHiveData { cacheFavLoyaltyCardsData(remoteFavLoyaltyCards); return true; } catch (error) { - KenLogger.warning("App Operating in Offline Mode. Sync Paused"); + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); return false; // KenLogger.warning("App operating offline mode. Sync paused: $error"); } diff --git a/mih_ui/lib/mih_packages/about_mih/components/about_mih_heading.dart b/mih_ui/lib/mih_packages/about_mih/components/about_mih_heading.dart new file mode 100644 index 00000000..33e89743 --- /dev/null +++ b/mih_ui/lib/mih_packages/about_mih/components/about_mih_heading.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; +import 'package:provider/provider.dart'; + +class AboutMihHeading extends StatefulWidget { + const AboutMihHeading({super.key}); + + @override + State createState() => _AboutMihHeadingState(); +} + +class _AboutMihHeadingState extends State { + @override + Widget build(BuildContext context) { + return Consumer( + builder: (BuildContext context, AboutMihProvider aboutProvider, + Widget? child) { + return Column( + children: [ + SizedBox( + width: 165, + child: FittedBox( + child: Icon( + MihIcons.mihLogo, + color: MihColors.secondary(), + ), + ), + ), + const SizedBox( + height: 10, + ), + const Text( + "Mzansi Innovation Hub", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 30, + ), + ), + Text( + "MIH App Version: ${aboutProvider.version}", + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.normal, + fontSize: 15, + ), + ), + const SizedBox( + height: 10, + ), + ], + ); + }, + ); + } +} diff --git a/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart b/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart new file mode 100644 index 00000000..326453ca --- /dev/null +++ b/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart @@ -0,0 +1,239 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_install_services.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class CallToActionButtons extends StatefulWidget { + const CallToActionButtons({super.key}); + + @override + State createState() => _CallToActionButtonsState(); +} + +class _CallToActionButtonsState extends State { + Future launchSocialUrl(Uri linkUrl) async { + if (!await launchUrl(linkUrl)) { + throw Exception('Could not launch $linkUrl'); + } + } + + Widget getInstallButtonText() { + final isWebAndroid = + kIsWeb && (defaultTargetPlatform == TargetPlatform.android); + final isWebIos = kIsWeb && (defaultTargetPlatform == TargetPlatform.iOS); + String btnText = ""; + FaIconData platformIcon; + if (isWebAndroid) { + btnText = "Install MIH"; + platformIcon = FontAwesomeIcons.googlePlay; + } else if (isWebIos) { + btnText = "Install MIH"; + platformIcon = FontAwesomeIcons.appStoreIos; + } else if (MzansiInnovationHub.of(context)!.theme.getPlatform() == + "Android") { + btnText = "Update MIH"; + platformIcon = FontAwesomeIcons.googlePlay; + } else if (MzansiInnovationHub.of(context)!.theme.getPlatform() == "iOS") { + btnText = "Update MIH"; + platformIcon = FontAwesomeIcons.appStoreIos; + } else { + btnText = "Install MIH"; + platformIcon = FontAwesomeIcons.globe; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon( + platformIcon, + color: MihColors.primary(), + ), + const SizedBox(width: 10), + Text( + btnText, + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 10, + runSpacing: 10, + children: [ + MihButton( + onPressed: () { + if (MzansiInnovationHub.of(context)!.theme.getPlatform() == + "Android") { + showDialog( + context: context, + builder: (context) { + return MihPackageWindow( + fullscreen: false, + windowTitle: "Select Option", + onWindowTapClose: () { + context.pop(); + }, + windowBody: Column( + children: [ + Text( + "Please select the platform you want to install/ Update MIH from", + style: TextStyle( + color: MihColors.secondary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25), + MihButton( + onPressed: () { + launchSocialUrl( + Uri.parse( + "https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih", + ), + ); + }, + buttonColor: MihColors.green(), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon( + FontAwesomeIcons.googlePlay, + color: MihColors.primary(), + ), + const SizedBox(width: 10), + Text( + "Play Store", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + MihButton( + onPressed: () { + launchSocialUrl( + Uri.parse( + "https://appgallery.huawei.com/app/C113315335?pkgName=za.co.mzansiinnovationhub.mih", + ), + ); + }, + buttonColor: MihColors.green(), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.store, + color: MihColors.primary(), + ), + const SizedBox(width: 10), + Text( + "App Gallery", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ], + ), + ); + }, + ); + } else { + MihInstallServices().installMihTrigger(context); + } + }, + buttonColor: MihColors.green(), + width: 300, + child: getInstallButtonText(), + ), + MihButton( + onPressed: () { + launchSocialUrl( + Uri.parse( + "https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh", + ), + ); + }, + buttonColor: MihColors.green(), + width: 300, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon( + FontAwesomeIcons.youtube, + color: MihColors.primary(), + ), + const SizedBox(width: 10), + Text( + "MIH Beginners Guide", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + MihButton( + onPressed: () { + launchSocialUrl( + Uri.parse( + "https://patreon.com/MzansiInnovationHub?utm_medium=unknown&utm_source=join_link&utm_campaign=creatorshare_creator&utm_content=copyLink", + ), + ); + }, + buttonColor: MihColors.green(), + width: 300, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FaIcon( + FontAwesomeIcons.patreon, + color: MihColors.primary(), + ), + const SizedBox(width: 10), + Text( + "Support Our Journey", + style: TextStyle( + color: MihColors.primary(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + ], + ); + } +} diff --git a/mih_ui/lib/mih_packages/about_mih/components/founder_details.dart b/mih_ui/lib/mih_packages/about_mih/components/founder_details.dart new file mode 100644 index 00000000..a45053cd --- /dev/null +++ b/mih_ui/lib/mih_packages/about_mih/components/founder_details.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:mih_package_toolkit/mih_package_toolkit.dart'; + +class FounderDetails extends StatefulWidget { + const FounderDetails({super.key}); + + @override + State createState() => _FounderDetailsState(); +} + +class _FounderDetailsState extends State { + Widget founderTitle() { + String heading = "Yasien Meth (Founder & CEO)"; + return Column( + children: [ + Text( + heading, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + ), + ), + const SizedBox( + height: 10, + ), + ], + ); + } + + Widget founderBio() { + String bio = ""; + bio += "BSc Computer Science & Information Systems\n"; + bio += "(University of the Western Cape)\n"; + bio += + "6 Year of banking experience with one of the big 5 banks of South Africa."; + return Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 10, + runSpacing: 10, + children: [ + SizedBox( + width: 300, + child: Stack( + alignment: Alignment.center, + fit: StackFit.loose, + children: [ + Padding( + padding: const EdgeInsets.only(left: 4.0), + child: CircleAvatar( + backgroundColor: MihColors.primary(), + backgroundImage: const AssetImage( + "lib/mih_package_components/assets/images/founder.jpg"), + //'https://media.licdn.com/dms/image/D4D03AQGd1-QhjtWWpA/profile-displayphoto-shrink_400_400/0/1671698053061?e=2147483647&v=beta&t=a3dJI5yxs5-KeXjj10LcNCFuC9IOfa8nNn3k_Qyr0CA'), + radius: 75, + ), + ), + Icon( + MihIcons.mihRing, + size: 165, + color: MihColors.secondary(), + ), + ], + ), + ), + SizedBox( + width: 400, + child: Text( + bio, + textAlign: TextAlign.center, + style: const TextStyle( + //fontWeight: FontWeight.bold, + fontSize: 17, + ), + ), + ), + const SizedBox( + height: 10, + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + founderTitle(), + founderBio(), + ], + ); + } +} diff --git a/mih_ui/lib/mih_packages/about_mih/components/mih_social_links.dart b/mih_ui/lib/mih_packages/about_mih/components/mih_social_links.dart new file mode 100644 index 00000000..bbb4301c --- /dev/null +++ b/mih_ui/lib/mih_packages/about_mih/components/mih_social_links.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; +import 'package:mzansi_innovation_hub/mih_package_components/mih_profile_links.dart'; + +class MihSocialLinks extends StatefulWidget { + const MihSocialLinks({super.key}); + + @override + State createState() => _MihSocialLinksState(); +} + +class _MihSocialLinksState extends State { + List links = [ + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Youtube", + custom_name: "", + destination: "https://www.youtube.com/@MzansiInnovationHub", + order: 1, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "TikTok", + custom_name: "", + destination: "https://www.tiktok.com/@mzansiinnovationhub", + order: 2, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Twitch", + custom_name: "", + destination: "https://www.twitch.tv/mzansiinnovationhub", + order: 3, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Threads", + custom_name: "", + destination: "https://www.threads.com/@mzansi.innovation.hub", + order: 4, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "WhatsApp", + custom_name: "", + destination: "https://whatsapp.com/channel/0029Vax3INCIyPtMn8KgeM2F", + order: 5, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Instagram", + custom_name: "", + destination: "https://www.instagram.com/mzansi.innovation.hub/", + order: 6, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "X", + custom_name: "", + destination: "https://x.com/mzansi_inno_hub", + order: 7, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "LinkedIn", + custom_name: "", + destination: "https://www.linkedin.com/company/mzansi-innovation-hub/", + order: 8, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Facebook", + custom_name: "", + destination: "https://www.facebook.com/profile.php?id=61565345762136", + order: 9, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Reddit", + custom_name: "", + destination: "https://www.reddit.com/r/Mzani_Innovation_Hub/", + order: 10, + ), + ProfileLink( + idprofile_links: 1, + app_id: "1234", + business_id: "", + site_name: "Git", + custom_name: "", + destination: + "https://git.mzansi-innovation-hub.co.za/yaso_meth/mih-project", + order: 11, + ), + ]; + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + "Follow Our Journey", + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + ), + ), + const SizedBox( + height: 10, + ), + MihProfileLinks(links: links), + const SizedBox( + height: 75, + ), + ], + ); + } +} diff --git a/mih_ui/lib/mih_packages/about_mih/components/mission_and_vission.dart b/mih_ui/lib/mih_packages/about_mih/components/mission_and_vission.dart new file mode 100644 index 00000000..c06fea09 --- /dev/null +++ b/mih_ui/lib/mih_packages/about_mih/components/mission_and_vission.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; + +class MissionAndVission extends StatefulWidget { + const MissionAndVission({super.key}); + + @override + State createState() => _MissionAndVissionState(); +} + +class _MissionAndVissionState extends State { + Widget ourVision() { + String heading = "Our Vision"; + String vision = + "Digitizing Mzansi one process at a time. Discover essential Mzansi apps to streamline your personal and professional life. Simplify your daily tasks with our user-friendly solutions."; + return SizedBox( + width: 500, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + heading, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + ), + ), + const SizedBox( + height: 10, + ), + Text( + vision, + textAlign: TextAlign.center, + style: const TextStyle( + //fontWeight: FontWeight.bold, + fontSize: 17, + ), + ), + ], + ), + ); + } + + Widget ourMission() { + String heading = "Our Mission"; + String mission = + "Bridge the digital divide in Mzansi, ensuring that everyone can benefit from the power of technology. We empower lives by providing simple, elegant solutions that elevate daily experiences. With our user-friendly approach, we're making the digital world accessible to all, ensuring no one is left behind in the digital revolution."; + return SizedBox( + width: 500, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + heading, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + ), + ), + const SizedBox( + height: 10, + ), + Text( + mission, + textAlign: TextAlign.center, + style: const TextStyle( + //fontWeight: FontWeight.bold, + fontSize: 17, + ), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0), + child: Wrap( + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 10, + runSpacing: 10, + children: [ + ourVision(), + ourMission(), + ], + ), + ), + const SizedBox( + height: 10, + ), + ], + ); + } +} diff --git a/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart b/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart index 44493a26..9f24529b 100644 --- a/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart +++ b/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart @@ -1,18 +1,13 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; -import 'package:go_router/go_router.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; -import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; -import 'package:mzansi_innovation_hub/mih_package_components/mih_profile_links.dart'; +import 'package:mzansi_innovation_hub/mih_packages/about_mih/components/about_mih_heading.dart'; +import 'package:mzansi_innovation_hub/mih_packages/about_mih/components/call_to_action_buttons.dart'; +import 'package:mzansi_innovation_hub/mih_packages/about_mih/components/founder_details.dart'; +import 'package:mzansi_innovation_hub/mih_packages/about_mih/components/mih_social_links.dart'; +import 'package:mzansi_innovation_hub/mih_packages/about_mih/components/mission_and_vission.dart'; import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_install_services.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:redacted/redacted.dart'; import 'package:share_plus/share_plus.dart'; @@ -24,199 +19,6 @@ class MihInfo extends StatefulWidget { } class _MihInfoState extends State { - late Future _futureUserCount; - late Future _futureBusinessCount; - - Widget founderBio() { - String bio = ""; - bio += "BSc Computer Science & Information Systems\n"; - bio += "(University of the Western Cape)\n"; - bio += - "6 Year of banking experience with one of the big 5 banks of South Africa."; - return Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 10, - runSpacing: 10, - children: [ - SizedBox( - width: 300, - child: Stack( - alignment: Alignment.center, - fit: StackFit.loose, - children: [ - Padding( - padding: const EdgeInsets.only(left: 4.0), - child: CircleAvatar( - backgroundColor: MihColors.primary(), - backgroundImage: const AssetImage( - "lib/mih_package_components/assets/images/founder.jpg"), - //'https://media.licdn.com/dms/image/D4D03AQGd1-QhjtWWpA/profile-displayphoto-shrink_400_400/0/1671698053061?e=2147483647&v=beta&t=a3dJI5yxs5-KeXjj10LcNCFuC9IOfa8nNn3k_Qyr0CA'), - radius: 75, - ), - ), - Icon( - MihIcons.mihRing, - size: 165, - color: MihColors.secondary(), - ), - ], - ), - ), - SizedBox( - width: 400, - child: Text( - bio, - textAlign: TextAlign.center, - style: const TextStyle( - //fontWeight: FontWeight.bold, - fontSize: 17, - ), - ), - ), - const SizedBox( - height: 10, - ), - ], - ); - } - - Widget founderTitle() { - String heading = "Yasien Meth (Founder & CEO)"; - return Column( - children: [ - Text( - heading, - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - const SizedBox( - height: 10, - ), - ], - ); - } - - Widget ourVision() { - String heading = "Our Vision"; - String vision = - "Digitizing Mzansi one process at a time. Discover essential Mzansi apps to streamline your personal and professional life. Simplify your daily tasks with our user-friendly solutions."; - - return SizedBox( - width: 500, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Text( - heading, - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - const SizedBox( - height: 10, - ), - Text( - vision, - textAlign: TextAlign.center, - style: const TextStyle( - //fontWeight: FontWeight.bold, - fontSize: 17, - ), - ), - ], - ), - ); - } - - Widget ourMission() { - String heading = "Our Mission"; - String mission = - "Bridge the digital divide in Mzansi, ensuring that everyone can benefit from the power of technology. We empower lives by providing simple, elegant solutions that elevate daily experiences. With our user-friendly approach, we're making the digital world accessible to all, ensuring no one is left behind in the digital revolution."; - return SizedBox( - width: 500, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - heading, - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - const SizedBox( - height: 10, - ), - Text( - mission, - textAlign: TextAlign.center, - style: const TextStyle( - //fontWeight: FontWeight.bold, - fontSize: 17, - ), - ), - ], - ), - ); - } - - Future launchSocialUrl(Uri linkUrl) async { - if (!await launchUrl(linkUrl)) { - throw Exception('Could not launch $linkUrl'); - } - } - - Widget getInstallButtonText() { - final isWebAndroid = - kIsWeb && (defaultTargetPlatform == TargetPlatform.android); - final isWebIos = kIsWeb && (defaultTargetPlatform == TargetPlatform.iOS); - String btnText = ""; - FaIconData platformIcon; - if (isWebAndroid) { - btnText = "Install MIH"; - platformIcon = FontAwesomeIcons.googlePlay; - } else if (isWebIos) { - btnText = "Install MIH"; - platformIcon = FontAwesomeIcons.appStoreIos; - } else if (MzansiInnovationHub.of(context)!.theme.getPlatform() == - "Android") { - btnText = "Update MIH"; - platformIcon = FontAwesomeIcons.googlePlay; - } else if (MzansiInnovationHub.of(context)!.theme.getPlatform() == "iOS") { - btnText = "Update MIH"; - platformIcon = FontAwesomeIcons.appStoreIos; - } else { - btnText = "Install MIH"; - platformIcon = FontAwesomeIcons.globe; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FaIcon( - platformIcon, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - btnText, - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ); - } - void shareMIHLink(BuildContext context, String message, String link) { String shareText = "$message: $link"; SharePlus.instance.share( @@ -224,45 +26,26 @@ class _MihInfoState extends State { ); } - Widget displayBusinessCount() { + Widget displayBusinessCount(AboutMihProvider aboutProvider) { return Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - FutureBuilder( - future: _futureBusinessCount, - builder: (context, snapshot) { - bool isLoading = true; - String userCount = "⚠️"; - if (snapshot.connectionState == ConnectionState.waiting) { - isLoading = true; - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasError) { - isLoading = false; - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - isLoading = false; - userCount = snapshot.data.toString(); - } else { - isLoading = true; - } - return SizedBox( - child: Text( - userCount, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 23, - ), - ), - ).redacted( - context: context, - redact: isLoading, - configuration: RedactedConfiguration( - defaultBorderRadius: BorderRadius.circular(5), - redactedColor: MihColors.secondary(), - ), - ); - }, + SizedBox( + child: Text( + "${aboutProvider.businessCount}", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 23, + ), + ), + ).redacted( + context: context, + redact: aboutProvider.businessCount == null, + configuration: RedactedConfiguration( + defaultBorderRadius: BorderRadius.circular(5), + redactedColor: MihColors.secondary(), + ), ), const SizedBox(width: 10), Text( @@ -277,45 +60,26 @@ class _MihInfoState extends State { ); } - Widget displayUserCount() { + Widget displayUserCount(AboutMihProvider aboutProvider) { return Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - FutureBuilder( - future: _futureUserCount, - builder: (context, snapshot) { - bool isLoading = true; - String userCount = "⚠️"; - if (snapshot.connectionState == ConnectionState.waiting) { - isLoading = true; - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasError) { - isLoading = false; - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - isLoading = false; - userCount = snapshot.data.toString(); - } else { - isLoading = true; - } - return SizedBox( - child: Text( - userCount, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 23, - ), - ), - ).redacted( - context: context, - redact: isLoading, - configuration: RedactedConfiguration( - defaultBorderRadius: BorderRadius.circular(5), - redactedColor: MihColors.secondary(), - ), - ); - }, + SizedBox( + child: Text( + "${aboutProvider.businessCount}", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 23, + ), + ), + ).redacted( + context: context, + redact: aboutProvider.userCount == null, + configuration: RedactedConfiguration( + defaultBorderRadius: BorderRadius.circular(5), + redactedColor: MihColors.secondary(), + ), ), const SizedBox(width: 10), Text( @@ -343,45 +107,7 @@ class _MihInfoState extends State { ); } - Widget aboutHeadings(AboutMihProvider aboutProvider) { - return Column( - children: [ - SizedBox( - width: 165, - child: FittedBox( - child: Icon( - MihIcons.mihLogo, - color: MihColors.secondary(), - ), - ), - ), - const SizedBox( - height: 10, - ), - const Text( - "Mzansi Innovation Hub", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 30, - ), - ), - Text( - "MIH App Version: ${aboutProvider.version}", - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.normal, - fontSize: 15, - ), - ), - const SizedBox( - height: 10, - ), - ], - ); - } - - Widget communityCounter() { + Widget communityCounter(AboutMihProvider aboutProvider) { return Column( children: [ Wrap( @@ -390,8 +116,8 @@ class _MihInfoState extends State { spacing: 25, runSpacing: 10, children: [ - displayUserCount(), - displayBusinessCount(), + displayUserCount(aboutProvider), + displayBusinessCount(aboutProvider), ], ), Text( @@ -409,447 +135,18 @@ class _MihInfoState extends State { ); } - Widget callToActionsButtons() { - return Column( - children: [ - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 10, - runSpacing: 10, - children: [ - MihButton( - onPressed: () { - if (MzansiInnovationHub.of(context)!.theme.getPlatform() == - "Android") { - showDialog( - context: context, - builder: (context) { - return MihPackageWindow( - fullscreen: false, - windowTitle: "Select Option", - onWindowTapClose: () { - context.pop(); - }, - windowBody: Column( - children: [ - Text( - "Please select the platform you want to install/ Update MIH from", - style: TextStyle( - color: MihColors.secondary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 25), - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih", - ), - ); - }, - buttonColor: MihColors.green(), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FaIcon( - FontAwesomeIcons.googlePlay, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "Play Store", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - const SizedBox( - height: 10, - ), - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://appgallery.huawei.com/app/C113315335?pkgName=za.co.mzansiinnovationhub.mih", - ), - ); - }, - buttonColor: MihColors.green(), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.store, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "App Gallery", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ], - ), - ); - }, - ); - } else { - MihInstallServices().installMihTrigger(context); - } - }, - buttonColor: MihColors.green(), - width: 300, - child: getInstallButtonText(), - ), - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh", - ), - ); - }, - buttonColor: MihColors.green(), - width: 300, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FaIcon( - FontAwesomeIcons.youtube, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "MIH Beginners Guide", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://patreon.com/MzansiInnovationHub?utm_medium=unknown&utm_source=join_link&utm_campaign=creatorshare_creator&utm_content=copyLink", - ), - ); - }, - buttonColor: MihColors.green(), - width: 300, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FaIcon( - FontAwesomeIcons.patreon, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "Support Our Journey", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - ); - } - - Widget womenForChange() { - String heading = "MIH Stands with Women For Change SA"; - String mission = - "South Africa is facing a devastating crisis of Gender-Based Violence and Femicide (GBVF), with at least 15 women murdered and 117 women reporting rape daily, often at the hands of known individuals, as highlighted by a shocking 33.8% rise in femicide in the last year, despite the existence of the National Strategic Plan on GBVF (NSP GBVF). Due to the government's lack of urgent action and funding for the NSP GBVF's implementation, organizations like Women For Change are urgently calling for the immediate declaration of GBVF as a National Disaster to mobilize resources and political will for decisive action, which must include judicial reforms (like opposing bail and implementing harsher sentences), immediate funding of the NSP GBVF and the new National Council, making the National Sex Offenders Register publicly accessible, and mandating comprehensive GBVF education and continuous public awareness campaigns."; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: SizedBox( - width: 500, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - heading, - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - const SizedBox( - height: 10, - ), - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 10, - runSpacing: 10, - children: [ - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://www.tiktok.com/@womenforchange.sa", - ), - ); - }, - buttonColor: MihColors.green(), - width: 300, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FaIcon( - FontAwesomeIcons.tiktok, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "@womenforchange.sa", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - MihButton( - onPressed: () { - launchSocialUrl( - Uri.parse( - "https://www.change.org/p/declare-gbvf-a-national-disaster-in-south-africa", - ), - ); - }, - buttonColor: MihColors.green(), - width: 300, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.edit, - color: MihColors.primary(), - ), - const SizedBox(width: 10), - Text( - "Sign Petition", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - Text( - mission, - textAlign: TextAlign.center, - style: const TextStyle( - //fontWeight: FontWeight.bold, - fontSize: 17, - ), - ), - ], - ), - ), - ); - } - - Widget missionAndVission() { - return Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: Wrap( - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - spacing: 10, - runSpacing: 10, - children: [ - ourVision(), - ourMission(), - ], - ), - ), - const SizedBox( - height: 10, - ), - ], - ); - } - - Widget founderDetails() { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - founderTitle(), - founderBio(), - ], - ); - } - - Widget mihSocials() { - List links = [ - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Youtube", - custom_name: "", - destination: "https://www.youtube.com/@MzansiInnovationHub", - order: 1, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "TikTok", - custom_name: "", - destination: "https://www.tiktok.com/@mzansiinnovationhub", - order: 2, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Twitch", - custom_name: "", - destination: "https://www.twitch.tv/mzansiinnovationhub", - order: 3, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Threads", - custom_name: "", - destination: "https://www.threads.com/@mzansi.innovation.hub", - order: 4, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "WhatsApp", - custom_name: "", - destination: "https://whatsapp.com/channel/0029Vax3INCIyPtMn8KgeM2F", - order: 5, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Instagram", - custom_name: "", - destination: "https://www.instagram.com/mzansi.innovation.hub/", - order: 6, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "X", - custom_name: "", - destination: "https://x.com/mzansi_inno_hub", - order: 7, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "LinkedIn", - custom_name: "", - destination: "https://www.linkedin.com/company/mzansi-innovation-hub/", - order: 8, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Facebook", - custom_name: "", - destination: "https://www.facebook.com/profile.php?id=61565345762136", - order: 9, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Reddit", - custom_name: "", - destination: "https://www.reddit.com/r/Mzani_Innovation_Hub/", - order: 10, - ), - ProfileLink( - idprofile_links: 1, - app_id: "1234", - business_id: "", - site_name: "Git", - custom_name: "", - destination: - "https://git.mzansi-innovation-hub.co.za/yaso_meth/mih-project", - order: 11, - ), - ]; - return Column( - children: [ - Text( - "Follow Our Journey", - textAlign: TextAlign.center, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - const SizedBox( - height: 10, - ), - MihProfileLinks(links: links), - const SizedBox( - height: 75, - ), - ], - ); + Future _syncUserBizCountData() async { + AboutMihProvider aboutProvider = context.read(); + aboutProvider.loadCachedAboutMihSate(); + await aboutProvider.syncWithMihServerData(); } @override void initState() { super.initState(); - _futureUserCount = MihUserServices().fetchUserCount(); - _futureBusinessCount = MihBusinessDetailsServices().fetchBusinessCount(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _syncUserBizCountData(); + }); } @override @@ -874,17 +171,15 @@ class _MihInfoState extends State { scrollbarOn: true, child: Column( children: [ - aboutHeadings(aboutProvider), - communityCounter(), - callToActionsButtons(), - // mihDivider(), - // womenForChange(), + AboutMihHeading(), + communityCounter(aboutProvider), + CallToActionButtons(), mihDivider(), - missionAndVission(), + MissionAndVission(), mihDivider(), - founderDetails(), + FounderDetails(), mihDivider(), - mihSocials(), + MihSocialLinks(), ], ), ), diff --git a/mih_ui/lib/mih_packages/mih_home/mih_home.dart b/mih_ui/lib/mih_packages/mih_home/mih_home.dart index cd29c124..320f4c54 100644 --- a/mih_ui/lib/mih_packages/mih_home/mih_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/mih_home.dart @@ -2,11 +2,13 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_user_consent_window.dart'; +import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_business_home.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart'; import 'package:provider/provider.dart'; class MihHome extends StatefulWidget { @@ -88,8 +90,14 @@ class _MihHomeState extends State { RefreshIndicator( key: mzansiProfileProvider.refreshIndicatorKey, onRefresh: () async { - bool success = - await mzansiProfileProvider.syncWithMihServerData(); + MzansiWalletProvider walletProvider = + context.read(); + AboutMihProvider aboutProvider = + context.read(); + await mzansiProfileProvider.syncWithMihServerData(); + await walletProvider + .syncWithMihServerData(mzansiProfileProvider); + bool success = await aboutProvider.syncWithMihServerData(); if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( MihSnackBar( diff --git a/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart b/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart index 8e7c7d1b..65cd2796 100644 --- a/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart +++ b/mih_ui/lib/mih_packages/mih_home/package_tile/mih_home_refresh_tile.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; +import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart'; import 'package:provider/provider.dart'; class MihHomeRefreshTile extends StatefulWidget { @@ -17,35 +19,34 @@ class MihHomeRefreshTile extends StatefulWidget { class _MihHomeRefreshTileState extends State { @override Widget build(BuildContext context) { - return Consumer( - builder: (BuildContext context, MzansiProfileProvider profileProvider, - Widget? child) { - return MihPackageTile( - onTap: profileProvider.triggerRefresh, - packageName: "Sync Data", - packageIcon: Stack( - alignment: Alignment.center, - children: [ - Icon( - MihIcons.mihRing, + return MihPackageTile( + onTap: () async { + MzansiProfileProvider profileProvider = + context.read(); + profileProvider.triggerRefresh(); + }, + packageName: "Sync Data", + packageIcon: Stack( + alignment: Alignment.center, + children: [ + Icon( + MihIcons.mihRing, + color: MihColors.secondary(), + ), + Center( + child: Transform.scale( + scale: 0.75, + origin: Offset(-4, 0), + child: Icon( + Icons.cloud_sync_rounded, color: MihColors.secondary(), ), - Center( - child: Transform.scale( - scale: 0.75, - origin: Offset(-4, 0), - child: Icon( - Icons.cloud_sync_rounded, - color: MihColors.secondary(), - ), - ), - ), - ], + ), ), - iconSize: widget.packageSize, - textColor: MihColors.secondary(), - ); - }, + ], + ), + iconSize: widget.packageSize, + textColor: MihColors.secondary(), ); } } diff --git a/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart b/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart index 60bc360b..ff081e5a 100644 --- a/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart +++ b/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart @@ -4,7 +4,6 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/package_tools/mih_ai_chat.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart'; import 'package:provider/provider.dart'; class MzansiAi extends StatefulWidget { @@ -17,37 +16,36 @@ class MzansiAi extends StatefulWidget { } class _MzansiAiState extends State { - bool _isLoadingInitialData = true; late final MihAiChat _aiChat; - Future _loadInitialData() async { - setState(() { - _isLoadingInitialData = true; - }); + Future _syncProfileData() async { MzansiProfileProvider mzansiProfileProvider = context.read(); + mzansiProfileProvider.loadCachedProfileState(); if (mzansiProfileProvider.user == null) { - await MihDataHelperServices().loadUserDataWithBusinessesData( - mzansiProfileProvider, - ); + await mzansiProfileProvider.syncWithMihServerData(); + } else { + await mzansiProfileProvider.syncWithMihServerData(); } - setState(() { - _isLoadingInitialData = false; - }); } @override void initState() { super.initState(); _aiChat = MihAiChat(); - _loadInitialData(); + _syncProfileData(); } @override Widget build(BuildContext context) { - return Consumer( - builder: (BuildContext context, MzansiAiProvider value, Widget? child) { - if (_isLoadingInitialData) { + return Consumer2( + builder: ( + BuildContext context, + MzansiAiProvider aiProvider, + MzansiProfileProvider profileProvider, + Widget? child, + ) { + if (profileProvider.user == null) { return Scaffold( body: Center( child: Mihloadingcircle(), diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart index cf61c013..5ddd4f32 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -5,8 +5,6 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart' import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tools/mih_cards.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; import 'package:provider/provider.dart'; class MihWallet extends StatefulWidget { diff --git a/mih_ui/lib/mih_providers/about_mih_provider.dart b/mih_ui/lib/mih_providers/about_mih_provider.dart index e5da12d0..05288d0d 100644 --- a/mih_ui/lib/mih_providers/about_mih_provider.dart +++ b/mih_ui/lib/mih_providers/about_mih_provider.dart @@ -1,13 +1,34 @@ import 'package:flutter/foundation.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_hive/about_mih_hive_data.dart'; class AboutMihProvider extends ChangeNotifier { - int toolIndex; - String version = "1.3.0"; + final AboutMihHiveData _hiveData; - AboutMihProvider({ + int toolIndex; + String version = "1.4.0"; + int? userCount; + int? businessCount; + + AboutMihProvider( + this._hiveData, { this.toolIndex = 0, }); + void loadCachedAboutMihSate() { + userCount = _hiveData.getcachedUserCount(); + businessCount = _hiveData.getcachedBusinessCount(); + + KenLogger.success("About Mih Data Loaded from Cache"); + notifyListeners(); + } + + Future syncWithMihServerData() async { + bool success = await _hiveData.syncAboutMihDataWithServer(); + loadCachedAboutMihSate(); + return success; + } + void reset() { toolIndex = 0; notifyListeners(); From 04f034971f43336eb38784c8aa73b02d1fd72d3a Mon Sep 17 00:00:00 2001 From: yaso Date: Tue, 30 Jun 2026 16:21:47 +0200 Subject: [PATCH 10/14] Complete Offline Wallet Display & Edit --- mih_ui/analysis_options.yaml | 4 +- mih_ui/build.yaml | 6 +- mih_ui/lib/main_dev.dart | 6 + mih_ui/lib/mih_hive/hive_adapters.dart | 2 + mih_ui/lib/mih_hive/hive_adapters.g.dart | 56 +- mih_ui/lib/mih_hive/hive_adapters.g.yaml | 22 +- .../lib/mih_hive/mih_calendar_hive_data.dart | 33 + .../lib/mih_hive/mzansi_wallet_hive_data.dart | 226 +++++- mih_ui/lib/mih_objects/loyalty_card.dart | 2 + .../lib/mih_packages/mzansi_ai/mzansi_ai.dart | 2 - .../builder/build_loyalty_card_list.dart | 160 ++-- .../components/mih_add_card_window.dart | 68 +- .../mzansi_wallet/mih_wallet.dart | 3 +- .../mih_providers/mzansi_wallet_provider.dart | 31 + .../mih_mzansi_calendar_services.dart | 19 + .../mih_mzansi_wallet_services.dart | 104 +++ mih_ui/linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 8 +- mih_ui/pubspec.lock | 716 +++++++++--------- .../flutter/generated_plugin_registrant.cc | 9 +- .../windows/flutter/generated_plugins.cmake | 2 + 21 files changed, 973 insertions(+), 507 deletions(-) create mode 100644 mih_ui/lib/mih_hive/mih_calendar_hive_data.dart diff --git a/mih_ui/analysis_options.yaml b/mih_ui/analysis_options.yaml index 65062592..d73341aa 100644 --- a/mih_ui/analysis_options.yaml +++ b/mih_ui/analysis_options.yaml @@ -1,7 +1,7 @@ analyzer: exclude: - - lib/**/*.g.dart - - lib/**/hive_registrar.g.dart + - lib/mih_hive/*.g.dart + - lib/mih_hive/hive_registrar.g.dart include: package:flutter_lints/flutter.yaml diff --git a/mih_ui/build.yaml b/mih_ui/build.yaml index f99dfb8c..a022b6d7 100644 --- a/mih_ui/build.yaml +++ b/mih_ui/build.yaml @@ -1,10 +1,14 @@ targets: $default: builders: + # Disable type adapter generator since we use GenerateAdapters in hive_adapters.dart + hive_ce_generator:hive_type_adapter_generator: + enabled: false + # 1. Restrict adapter generation to your mih_hive folder hive_ce_generator:hive_adapters_generator: generate_for: - - lib/mih_hive/*.dart + - lib/mih_hive/hive_adapters.dart # 2. Restrict registrar generation to your entry points hive_ce_generator:hive_registrar_generator: diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 71e42e5c..e11b0b37 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -11,6 +11,7 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_go_router.dart'; import 'package:mzansi_innovation_hub/mih_hive/hive_registrar.g.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/appointment.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; @@ -45,7 +46,12 @@ void main() async { // Mzansi Wallet Data await Hive.openBox('loyalty_card_box'); await Hive.openBox('fav_loyalty_card_box'); + await Hive.openBox('wallet_modifications_queue'); + // About MIH Data await Hive.openBox('about_mih_box'); + // Mih Calendar Data + await Hive.openBox('personal_calendar_box'); + await Hive.openBox('business_calendar_box'); // await Firebase.initializeApp( // // options: DefaultFirebaseOptions.currentPlatform, diff --git a/mih_ui/lib/mih_hive/hive_adapters.dart b/mih_ui/lib/mih_hive/hive_adapters.dart index 78d43de4..2e84a35d 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.dart @@ -1,6 +1,7 @@ // hive_adapters.dart import 'package:hive_ce/hive_ce.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/appointment.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; @@ -16,5 +17,6 @@ import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; AdapterSpec(), AdapterSpec(), AdapterSpec(), + AdapterSpec(), ]) part 'hive_adapters.g.dart'; diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.dart b/mih_ui/lib/mih_hive/hive_adapters.g.dart index df0aa419..e9d1ec0f 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.dart +++ b/mih_ui/lib/mih_hive/hive_adapters.g.dart @@ -357,13 +357,14 @@ class MIHLoyaltyCardAdapter extends TypeAdapter { favourite: fields[4] as String, priority_index: (fields[5] as num).toInt(), nickname: fields[6] as String, + offline_id: fields[7] as String?, ); } @override void write(BinaryWriter writer, MIHLoyaltyCard obj) { writer - ..writeByte(7) + ..writeByte(8) ..writeByte(0) ..write(obj.idloyalty_cards) ..writeByte(1) @@ -377,7 +378,9 @@ class MIHLoyaltyCardAdapter extends TypeAdapter { ..writeByte(5) ..write(obj.priority_index) ..writeByte(6) - ..write(obj.nickname); + ..write(obj.nickname) + ..writeByte(7) + ..write(obj.offline_id); } @override @@ -390,3 +393,52 @@ class MIHLoyaltyCardAdapter extends TypeAdapter { runtimeType == other.runtimeType && typeId == other.typeId; } + +class AppointmentAdapter extends TypeAdapter { + @override + final typeId = 7; + + @override + Appointment read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Appointment( + idappointments: (fields[0] as num).toInt(), + app_id: fields[1] as String, + business_id: fields[2] as String, + date_time: fields[3] as String, + title: fields[4] as String, + description: fields[5] as String, + ); + } + + @override + void write(BinaryWriter writer, Appointment obj) { + writer + ..writeByte(6) + ..writeByte(0) + ..write(obj.idappointments) + ..writeByte(1) + ..write(obj.app_id) + ..writeByte(2) + ..write(obj.business_id) + ..writeByte(3) + ..write(obj.date_time) + ..writeByte(4) + ..write(obj.title) + ..writeByte(5) + ..write(obj.description); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AppointmentAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/mih_ui/lib/mih_hive/hive_adapters.g.yaml b/mih_ui/lib/mih_hive/hive_adapters.g.yaml index 7193a532..f1e1138a 100644 --- a/mih_ui/lib/mih_hive/hive_adapters.g.yaml +++ b/mih_ui/lib/mih_hive/hive_adapters.g.yaml @@ -1,7 +1,7 @@ # Generated by Hive CE # Manual modifications may be necessary for certain migrations # Check in to version control -nextTypeId: 7 +nextTypeId: 8 types: AppUser: typeId: 0 @@ -127,7 +127,7 @@ types: index: 7 MIHLoyaltyCard: typeId: 6 - nextIndex: 7 + nextIndex: 8 fields: idloyalty_cards: index: 0 @@ -143,3 +143,21 @@ types: index: 5 nickname: index: 6 + offline_id: + index: 7 + Appointment: + typeId: 7 + nextIndex: 6 + fields: + idappointments: + index: 0 + app_id: + index: 1 + business_id: + index: 2 + date_time: + index: 3 + title: + index: 4 + description: + index: 5 diff --git a/mih_ui/lib/mih_hive/mih_calendar_hive_data.dart b/mih_ui/lib/mih_hive/mih_calendar_hive_data.dart new file mode 100644 index 00000000..e91f7c5b --- /dev/null +++ b/mih_ui/lib/mih_hive/mih_calendar_hive_data.dart @@ -0,0 +1,33 @@ +import 'package:hive_ce_flutter/hive_ce_flutter.dart'; +import 'package:mzansi_innovation_hub/mih_objects/appointment.dart'; + +class MihCalendarHiveData { + final Box _personalAppointmentBox = + Hive.box('personal_calendar_box'); + final Box _businessAppointmentBox = + Hive.box('business_calendar_box'); + + List getCachedPersonalAppointments() { + final appointments = _personalAppointmentBox.values.toList(); + appointments.sort((a, b) { + final dateA = DateTime.parse(a.date_time); + final dateB = DateTime.parse(b.date_time); + return dateB.compareTo(dateA); + }); + return appointments; + } + + List getCachedBusinessAppointments() { + final appointments = _businessAppointmentBox.values.toList(); + appointments.sort((a, b) { + final dateA = DateTime.parse(a.date_time); + final dateB = DateTime.parse(b.date_time); + return dateB.compareTo(dateA); + }); + return appointments; + } + + Future syncCalendarDataWithServer() async { + return false; + } +} diff --git a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart index 21bdec6e..d5bb5dfe 100644 --- a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart @@ -3,12 +3,15 @@ import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; +import 'package:uuid/uuid.dart'; class MzansiWalletHiveData { final Box _loyaltyCardBox = Hive.box('loyalty_card_box'); final Box _favLoyaltyCardBox = Hive.box('fav_loyalty_card_box'); + final Box _modificationsQueue = + Hive.box('wallet_modifications_queue'); // Get Offline Data List getCachedLoyaltyCards() { @@ -19,10 +22,116 @@ class MzansiWalletHiveData { List getCachedFavLoyaltyCards() { final cards = _favLoyaltyCardBox.values.toList(); - cards.sort((a, b) => a.shop_name.compareTo(b.shop_name)); + cards.sort((a, b) => a.priority_index.compareTo(b.priority_index)); return cards; } + // Set Offline Data + Future addLoyaltyCardLocally(MIHLoyaltyCard newCard) async { + await _loyaltyCardBox.put(newCard.offline_id, newCard); + + if (newCard.favourite == "Yes") { + await _favLoyaltyCardBox.put(newCard.offline_id, newCard); + } + KenLogger.success("New Card Saved Locally."); + } + + Future deleteLoyaltyCardLocally(MIHLoyaltyCard deleteCard) async { + dynamic mainTargetKey; + dynamic favTargetKey; + for (var key in _loyaltyCardBox.keys) { + final card = _loyaltyCardBox.get(key); + if (card != null) { + if (deleteCard.idloyalty_cards != 0 && + card.idloyalty_cards == deleteCard.idloyalty_cards) { + mainTargetKey = key; + break; + } else if (deleteCard.idloyalty_cards == 0 && + card.offline_id == deleteCard.offline_id) { + mainTargetKey = key; + break; + } + } + } + for (var key in _favLoyaltyCardBox.keys) { + final card = _favLoyaltyCardBox.get(key); + if (card != null) { + if (deleteCard.idloyalty_cards != 0 && + card.idloyalty_cards == deleteCard.idloyalty_cards) { + favTargetKey = key; + break; + } else if (deleteCard.idloyalty_cards == 0 && + card.offline_id == deleteCard.offline_id) { + favTargetKey = key; + break; + } + } + } + if (mainTargetKey != null) { + await _loyaltyCardBox.delete(mainTargetKey); + KenLogger.success("Card Deleted Locally."); + } + if (favTargetKey != null) { + await _favLoyaltyCardBox.delete(favTargetKey); + KenLogger.success("Fav Card Deleted Locally."); + } + } + + Future updateLoyaltyCardLocally(MIHLoyaltyCard updatedCard) async { + dynamic mainTargetKey; + dynamic favTargetKey; + for (var key in _loyaltyCardBox.keys) { + final card = _loyaltyCardBox.get(key); + if (card != null) { + if (updatedCard.idloyalty_cards != 0 && + card.idloyalty_cards == updatedCard.idloyalty_cards) { + mainTargetKey = key; + break; + } else if (updatedCard.idloyalty_cards == 0 && + card.offline_id == updatedCard.offline_id) { + mainTargetKey = key; + break; + } + } + } + for (var key in _favLoyaltyCardBox.keys) { + final card = _favLoyaltyCardBox.get(key); + if (card != null) { + if (updatedCard.idloyalty_cards != 0 && + card.idloyalty_cards == updatedCard.idloyalty_cards) { + favTargetKey = key; + break; + } else if (updatedCard.idloyalty_cards == 0 && + card.offline_id == updatedCard.offline_id) { + favTargetKey = key; + break; + } + } + } + if (mainTargetKey != null) { + await _loyaltyCardBox.put(mainTargetKey, updatedCard); + KenLogger.success("Card Udpdated Locally."); + } + if (favTargetKey != null) { + if (updatedCard.favourite == "Yes") { + await _favLoyaltyCardBox.put(favTargetKey, updatedCard); + KenLogger.success("Fav Card Updated Locally."); + } else { + await _favLoyaltyCardBox.delete(favTargetKey); + KenLogger.success("Fav Card Removed Locally."); + } + } else { + if (updatedCard.offline_id == null) { + final String uniqueKey = const Uuid().v4(); + await _favLoyaltyCardBox.put(uniqueKey, updatedCard); + KenLogger.success("Fav Card Added Locally."); + } else { + await _favLoyaltyCardBox.put(updatedCard.offline_id, updatedCard); + KenLogger.success("Fav Card Added Locally."); + } + } + } + // Cache data for offline use Future cacheFavLoyaltyCardsData( List remoteLoyaltyCards) async { @@ -51,9 +160,122 @@ class MzansiWalletHiveData { cacheFavLoyaltyCardsData(remoteFavLoyaltyCards); return true; } catch (error) { - KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused."); return false; // KenLogger.warning("App operating offline mode. Sync paused: $error"); } } + + // Modicfications processing + Future queueAddModification(MIHLoyaltyCard newCardData) async { + await _modificationsQueue.add({ + 'action': 'ADD', + 'payload': newCardData, + }); + KenLogger.warning("Add Card Queued For Online Sync"); + } + + Future queueDeleteModification(MIHLoyaltyCard deleteCardData) async { + await _modificationsQueue.add({ + 'action': 'DELETE', + 'payload': deleteCardData, + }); + KenLogger.warning("Delete Card Queued For Online Sync"); + } + + Future queueUpdateModification(MIHLoyaltyCard updatedCardData) async { + await _modificationsQueue.add({ + 'action': 'UPDATE', + 'payload': updatedCardData, + }); + KenLogger.warning("Update Card Queued For Online Sync"); + } + + Future processModificationsQueue( + MzansiProfileProvider profileProvider) async { + if (_modificationsQueue.isEmpty) { + return true; + } + final List queueKeys = _modificationsQueue.keys.toList(); + for (var taskKey in queueKeys) { + final task = _modificationsQueue.get(taskKey); + if (task == null) { + continue; + } + final String action = task['action']; + final MIHLoyaltyCard taskCard = task['payload']; + KenLogger.warning( + "Card Details: id=${taskCard.idloyalty_cards}, shop=${taskCard.shop_name}, Nunber=${taskCard.card_number}, offline_id=${taskCard.offline_id}"); + if (action == 'ADD') { + dynamic deleteCardTaskKey; + for (var entry in _modificationsQueue.toMap().entries) { + if (entry.value['action'] == 'DELETE' && + entry.value['payload'].offline_id == taskCard.offline_id) { + deleteCardTaskKey = entry.key; + break; + } + } + + if (deleteCardTaskKey != null) { + await _modificationsQueue.delete(taskKey); // Remove 'ADD' + await _modificationsQueue + .delete(deleteCardTaskKey); // Remove 'DELETE' + KenLogger.success( + "Offline add & delete cancelled out. Queue cleaned."); + continue; + } + + final responseCode = await MIHMzansiWalletApis.addLoyaltyCardAPICallV2( + profileProvider.user!.app_id, + taskCard.shop_name, + taskCard.card_number, + taskCard.favourite, + taskCard.priority_index, + taskCard.nickname, + ); + if (responseCode != null && responseCode == 201) { + await _modificationsQueue.delete(taskKey); + KenLogger.success("Add New Local Card to MIH Server"); + } else { + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); + return false; + } + } + if (action == 'DELETE') { + final responseCode = + await MIHMzansiWalletApis.deleteLoyaltyCardAPICallV2( + taskCard.idloyalty_cards, + ); + if (responseCode != null && responseCode == 200) { + await _modificationsQueue.delete(taskKey); + KenLogger.success("Delete Local Card from MIH Server"); + } else { + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); + return false; + } + } + if (action == 'UPDATE') { + final responseCode = + await MIHMzansiWalletApis.updateLoyaltyCardAPICallV2( + taskCard.idloyalty_cards, + taskCard.favourite, + taskCard.priority_index, + taskCard.nickname, + taskCard.card_number, + ); + if (responseCode != null && responseCode == 200) { + await _modificationsQueue.delete(taskKey); + KenLogger.success("Update Local Card from MIH Server"); + } else { + KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); + return false; + } + } + } + return true; + } + + bool isModificationNotEmpty() { + return _modificationsQueue.values.toList().isNotEmpty; + } } diff --git a/mih_ui/lib/mih_objects/loyalty_card.dart b/mih_ui/lib/mih_objects/loyalty_card.dart index 5926ae2d..34d235bc 100644 --- a/mih_ui/lib/mih_objects/loyalty_card.dart +++ b/mih_ui/lib/mih_objects/loyalty_card.dart @@ -6,6 +6,7 @@ class MIHLoyaltyCard { final String favourite; final int priority_index; final String nickname; + final String? offline_id; const MIHLoyaltyCard({ required this.idloyalty_cards, @@ -15,6 +16,7 @@ class MIHLoyaltyCard { required this.favourite, required this.priority_index, required this.nickname, + this.offline_id, }); factory MIHLoyaltyCard.fromJson(Map json) { diff --git a/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart b/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart index ff081e5a..0160fcfc 100644 --- a/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart +++ b/mih_ui/lib/mih_packages/mzansi_ai/mzansi_ai.dart @@ -24,8 +24,6 @@ class _MzansiAiState extends State { mzansiProfileProvider.loadCachedProfileState(); if (mzansiProfileProvider.user == null) { await mzansiProfileProvider.syncWithMihServerData(); - } else { - await mzansiProfileProvider.syncWithMihServerData(); } } diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart b/mih_ui/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart index ba15d3e6..1d30be31 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart @@ -11,7 +11,6 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_ import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display.dart'; @@ -130,29 +129,27 @@ class _BuildLoyaltyCardListState extends State { child: MihButton( onPressed: () async { if (_formKey.currentState!.validate()) { - int statusCode = await MIHMzansiWalletApis - .updateLoyaltyCardAPICall( - walletProvider, - mzansiProfileProvider.user!, - widget.cardList[index].idloyalty_cards, - widget.cardList[index].shop_name, - widget.cardList[index].favourite, - widget.cardList[index].priority_index, - _nicknameController.text, - _cardNumberController.text, - ctxt, + walletProvider.updateLocalLoyaltyCard( + mzansiProfileProvider, + MIHLoyaltyCard( + idloyalty_cards: + widget.cardList[index].idloyalty_cards, + app_id: widget.cardList[index].app_id, + shop_name: widget.cardList[index].shop_name, + card_number: _cardNumberController.text, + favourite: widget.cardList[index].favourite, + priority_index: + widget.cardList[index].priority_index, + nickname: _nicknameController.text, + ), + ); + context.pop(); + context.pop(); + MihAlertServices().successBasicAlert( + "Success!", + "You have successfully updated the loyalty card details.", + context, ); - if (statusCode == 200) { - context.pop(); - context.pop(); - MihAlertServices().successBasicAlert( - "Success!", - "You have successfully updated the loyalty card details.", - context, - ); - } else { - MihAlertServices().internetConnectionAlert(context); - } } else { MihAlertServices().inputErrorAlert(context); } @@ -183,24 +180,17 @@ class _BuildLoyaltyCardListState extends State { MihAlertServices().deleteConfirmationAlert( "This Card will be deleted permanently from your Mzansi Wallet. Are you certain you want to delete it?", () async { - int statusCode = await MIHMzansiWalletApis.deleteLoyaltyCardAPICall( - walletProvider, - mzansiProfileProvider.user!, - widget.cardList[index].idloyalty_cards, + walletProvider.deleteLocalLoyaltyCard( + mzansiProfileProvider, + widget.cardList[index], + ); + context.pop(); + context.pop(); + MihAlertServices().successBasicAlert( + "Success!", + "You have successfully deleted the loyalty card from your Mzansi Wallet.", context, ); - if (statusCode == 200) { - context.pop(); - context.pop(); - MihAlertServices().successBasicAlert( - "Success!", - "You have successfully deleted the loyalty card from your Mzansi Wallet.", - context, - ); - } else { - context.pop(); - MihAlertServices().internetConnectionAlert(context); - } }, context, ); @@ -231,34 +221,26 @@ class _BuildLoyaltyCardListState extends State { ), MihButton( onPressed: () async { - int statusCode = await MIHMzansiWalletApis.updateLoyaltyCardAPICall( - walletProvider, - mzansiProfileProvider.user!, - widget.cardList[index].idloyalty_cards, - widget.cardList[index].shop_name, - "Yes", - _noFavourites, - widget.cardList[index].nickname, - widget.cardList[index].card_number, - ctxt, + await walletProvider.updateLocalLoyaltyCard( + mzansiProfileProvider, + MIHLoyaltyCard( + idloyalty_cards: widget.cardList[index].idloyalty_cards, + app_id: widget.cardList[index].app_id, + shop_name: widget.cardList[index].shop_name, + card_number: widget.cardList[index].card_number, + favourite: "Yes", + priority_index: _noFavourites, + nickname: widget.cardList[index].nickname, + ), + ); + context.pop(); + context.pop(); + context.read().setToolIndex(1); + MihAlertServices().successBasicAlert( + "Success!", + "You have successfully added the loyalty card to your favourites.", + context, ); - if (statusCode == 200) { - context.pop(); - context.pop(); - await MIHMzansiWalletApis.getFavouriteLoyaltyCards( - walletProvider, - mzansiProfileProvider.user!.app_id, - context, - ); - context.read().setToolIndex(1); - MihAlertServices().successBasicAlert( - "Success!", - "You have successfully added the loyalty card to your favourites.", - context, - ); - } else { - MihAlertServices().internetConnectionAlert(context); - } }, buttonColor: MihColors.green(), width: 300, @@ -284,34 +266,26 @@ class _BuildLoyaltyCardListState extends State { [ MihButton( onPressed: () async { - int statusCode = await MIHMzansiWalletApis.updateLoyaltyCardAPICall( - walletProvider, - mzansiProfileProvider.user!, - widget.cardList[index].idloyalty_cards, - widget.cardList[index].shop_name, - "", - 0, - widget.cardList[index].nickname, - widget.cardList[index].card_number, - ctxt, + await walletProvider.updateLocalLoyaltyCard( + mzansiProfileProvider, + MIHLoyaltyCard( + idloyalty_cards: widget.cardList[index].idloyalty_cards, + app_id: widget.cardList[index].app_id, + shop_name: widget.cardList[index].shop_name, + card_number: widget.cardList[index].card_number, + favourite: "", + priority_index: 0, + nickname: widget.cardList[index].nickname, + ), + ); + context.pop(); + context.pop(); + context.read().setToolIndex(0); + MihAlertServices().successBasicAlert( + "Success!", + "You have successfully removed the loyalty card to your favourites.", + context, ); - if (statusCode == 200) { - context.pop(); - context.pop(); - await MIHMzansiWalletApis.getFavouriteLoyaltyCards( - walletProvider, - mzansiProfileProvider.user!.app_id, - context, - ); - context.read().setToolIndex(0); - MihAlertServices().successBasicAlert( - "Success!", - "You have successfully removed the loyalty card to your favourites.", - context, - ); - } else { - MihAlertServices().internetConnectionAlert(context); - } }, buttonColor: MihColors.red(), width: 300, diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/components/mih_add_card_window.dart b/mih_ui/lib/mih_packages/mzansi_wallet/components/mih_add_card_window.dart index 2c0512d4..379eeefe 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/components/mih_add_card_window.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/components/mih_add_card_window.dart @@ -3,13 +3,14 @@ import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:provider/provider.dart'; +import 'package:uuid/uuid.dart'; class MihAddCardWindow extends StatefulWidget { const MihAddCardWindow({ @@ -58,6 +59,38 @@ class _MihAddCardWindowState extends State { } } + void addLoyaltyCard(MzansiProfileProvider profileProvider, + MzansiWalletProvider walletProvider) async { + if (_formKey.currentState!.validate()) { + if (_shopController.text == "") { + MihAlertServices().inputErrorAlert(context); + } else { + final String uniqueKey = const Uuid().v4(); + + MIHLoyaltyCard newCard = MIHLoyaltyCard( + idloyalty_cards: 0, + app_id: profileProvider.user!.app_id, + shop_name: _shopController.text, + card_number: _cardNumberController.text, + favourite: "No", + priority_index: 0, + nickname: _nicknameController.text, + offline_id: uniqueKey, + ); + await walletProvider.addLocalLoyaltyCard(profileProvider, newCard); + context.pop(); + KenLogger.success("Card Added Successfully"); + successPopUp( + "Successfully Added Card", + "The loyalty card has been added to your favourites.", + 0, + ); + } + } else { + MihAlertServices().inputErrorAlert(context); + } + } + @override Widget build(BuildContext context) { final double width = MediaQuery.sizeOf(context).width; @@ -224,38 +257,7 @@ class _MihAddCardWindowState extends State { Center( child: MihButton( onPressed: () async { - if (_formKey.currentState!.validate()) { - if (_shopController.text == "") { - MihAlertServices().inputErrorAlert(context); - } else { - int statusCode = await MIHMzansiWalletApis - .addLoyaltyCardAPICall( - walletProvider, - mzansiProfileProvider.user!, - mzansiProfileProvider.user!.app_id, - _shopController.text, - _cardNumberController.text, - "", - 0, - _nicknameController.text, - context, - ); - if (statusCode == 201) { - context.pop(); - KenLogger.success("Card Added Successfully"); - successPopUp( - "Successfully Added Card", - "The loyalty card has been added to your favourites.", - 0, - ); - } else { - MihAlertServices() - .internetConnectionAlert(context); - } - } - } else { - MihAlertServices().inputErrorAlert(context); - } + addLoyaltyCard(mzansiProfileProvider, walletProvider); }, buttonColor: MihColors.green(), width: 300, diff --git a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart index 5ddd4f32..45dbb849 100644 --- a/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/mih_ui/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -28,7 +28,8 @@ class _MihWalletState extends State { if (mzansiProfileProvider.user == null) { mzansiProfileProvider.syncWithMihServerData(); } - if (walletProvider.loyaltyCards.isEmpty) { + if (walletProvider.loyaltyCards.isEmpty || + walletProvider.isLocalModificationsPending()) { walletProvider.syncWithMihServerData(mzansiProfileProvider); } setState(() { diff --git a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart index 2517561d..c00f46d9 100644 --- a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart @@ -28,11 +28,42 @@ class MzansiWalletProvider extends ChangeNotifier { Future syncWithMihServerData( MzansiProfileProvider profileProvider) async { + await _hiveData.processModificationsQueue(profileProvider); bool success = await _hiveData.syncWalletWithServer(profileProvider); loadCachedWallet(); return success; } + Future addLocalLoyaltyCard( + MzansiProfileProvider profileProvider, MIHLoyaltyCard newCard) async { + await _hiveData.addLoyaltyCardLocally(newCard); + await _hiveData.queueAddModification(newCard); + await _hiveData.processModificationsQueue(profileProvider); + await _hiveData.syncWalletWithServer(profileProvider); + loadCachedWallet(); + } + + Future deleteLocalLoyaltyCard( + MzansiProfileProvider profileProvider, MIHLoyaltyCard deleteCard) async { + await _hiveData.deleteLoyaltyCardLocally(deleteCard); + await _hiveData.queueDeleteModification(deleteCard); + loadCachedWallet(); + _hiveData.processModificationsQueue(profileProvider); + } + + bool isLocalModificationsPending() { + return _hiveData.isModificationNotEmpty(); + } + + Future updateLocalLoyaltyCard( + MzansiProfileProvider profileProvider, MIHLoyaltyCard updatedCard) async { + await _hiveData.updateLoyaltyCardLocally(updatedCard); + await _hiveData.queueUpdateModification(updatedCard); + await _hiveData.processModificationsQueue(profileProvider); + await _hiveData.syncWalletWithServer(profileProvider); + loadCachedWallet(); + } + void reset() { toolIndex = 0; loyaltyCards = []; diff --git a/mih_ui/lib/mih_services/mih_mzansi_calendar_services.dart b/mih_ui/lib/mih_services/mih_mzansi_calendar_services.dart index d1ad09c1..4121fc3b 100644 --- a/mih_ui/lib/mih_services/mih_mzansi_calendar_services.dart +++ b/mih_ui/lib/mih_services/mih_mzansi_calendar_services.dart @@ -40,6 +40,25 @@ class MihMzansiCalendarApis { } } + static Future getPersonalAppointmentsV2( + String app_id, + String date, + MihCalendarProvider mihCalendarProvider, + ) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/appointments/personal/$app_id?date=$date")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List personalAppointments = + List.from(l.map((model) => Appointment.fromJson(model))); + mihCalendarProvider.setPersonalAppointments( + appointments: personalAppointments); + return response.statusCode; + } else { + throw Exception('failed to fatch personal appointments'); + } + } + /// This function is used to fetch a list of appointment for a personal user. /// /// Patameters: diff --git a/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart b/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart index 7290ab5d..f71255d6 100644 --- a/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart +++ b/mih_ui/lib/mih_services/mih_mzansi_wallet_services.dart @@ -127,6 +127,32 @@ class MIHMzansiWalletApis { // } } + /// This function is used to Delete loyalty card from users mzansi wallet. + /// + /// Patameters:- + /// AppUser signedInUser, + /// int idloyalty_cards, + /// BuildContext context, + /// + /// Returns VOID (TRIGGERS NOTIGICATIOPN ON SUCCESS) + static Future deleteLoyaltyCardAPICallV2( + int idloyalty_cards, + ) async { + try { + var response = await http.delete( + Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/delete/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({"idloyalty_cards": idloyalty_cards}), + ); + return response.statusCode; + } catch (error) { + return null; + } + } + /// This function is used to add a lopyalty card to users mzansi wallet. /// /// Patameters:- @@ -187,6 +213,48 @@ class MIHMzansiWalletApis { // } } + /// This function is used to add a lopyalty card to users mzansi wallet. + /// + /// Patameters:- + /// AppUser signedInUser, + /// String app_id, + /// String shop_name, + /// String card_number, + /// BuildContext context, + /// + /// Returns VOID (TRIGGERS SUCCESS pop up) + static Future addLoyaltyCardAPICallV2( + String app_id, + String shop_name, + String card_number, + String favourite, + int priority_index, + String nickname, + ) async { + try { + var response = await http + .post( + Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "app_id": app_id, + "shop_name": shop_name, + "card_number": card_number, + "favourite": favourite, + "priority_index": priority_index, + "nickname": nickname, + }), + ) + .timeout(const Duration(seconds: 5)); + return response.statusCode; + } catch (error) { + return null; + } + } + /// This function is used to Update loyalty card from users mzansi wallet. /// /// Patameters:- @@ -238,6 +306,42 @@ class MIHMzansiWalletApis { return response.statusCode; } + /// This function is used to Update loyalty card from users mzansi wallet. + /// + /// Patameters:- + /// AppUser signedInUser, + /// int idloyalty_cards, + /// BuildContext context, + /// + /// Returns VOID (TRIGGERS NOTIGICATIOPN ON SUCCESS) + static Future updateLoyaltyCardAPICallV2( + int idloyalty_cards, + String favourite, + int priority_index, + String nickname, + String card_number, + ) async { + try { + var response = await http.put( + Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/update/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "idloyalty_cards": idloyalty_cards, + "favourite": favourite, + "priority_index": priority_index, + "nickname": nickname, + "card_number": card_number, + }), + ); + return response.statusCode; + } catch (error) { + return null; + } + } + //================== POP UPS ========================================================================== static void loadingPopUp(BuildContext context) { diff --git a/mih_ui/linux/flutter/generated_plugins.cmake b/mih_ui/linux/flutter/generated_plugins.cmake index 8ee15a6f..1061886b 100644 --- a/mih_ui/linux/flutter/generated_plugins.cmake +++ b/mih_ui/linux/flutter/generated_plugins.cmake @@ -11,6 +11,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/mih_ui/macos/Flutter/GeneratedPluginRegistrant.swift b/mih_ui/macos/Flutter/GeneratedPluginRegistrant.swift index 3cef27da..9c913249 100644 --- a/mih_ui/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/mih_ui/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,6 +10,7 @@ import device_info_plus import file_picker import file_saver import file_selector_macos +import firebase_ai import firebase_app_check import firebase_auth import firebase_core @@ -18,7 +19,6 @@ import geolocator_apple import local_auth_darwin import mobile_scanner import package_info_plus -import path_provider_foundation import printing import record_macos import screen_brightness_macos @@ -35,15 +35,15 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSaverPlugin.register(with: registry.registrar(forPlugin: "FileSaverPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) - FLTFirebaseAppCheckPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAppCheckPlugin")) + FirebaseAIPlugin.register(with: registry.registrar(forPlugin: "FirebaseAIPlugin")) + FirebaseAppCheckPlugin.register(with: registry.registrar(forPlugin: "FirebaseAppCheckPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) - FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin")) diff --git a/mih_ui/pubspec.lock b/mih_ui/pubspec.lock index 1eff8ae4..a180a0cf 100644 --- a/mih_ui/pubspec.lock +++ b/mih_ui/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + sha256: a49d6cf99e8d8e7a8e93668d09ced0bbdb954d0b4fccc2f5f9241c6b87fad95c url: "https://pub.dev" source: hosted - version: "82.0.0" + version: "99.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: "8a1f5f3020ef2a74fb93f7ab3ef127a8feea33a7a2276279113660784ee7516a" + sha256: "78f98c1f9c4dbbd22c2bb7b7f17c4a5c06150e8b2cb791a0947979ad0d3dabd5" url: "https://pub.dev" source: hosted - version: "1.3.64" + version: "1.3.73" analyzer: dependency: transitive description: name: analyzer - sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + sha256: "663efa951fb8a45e06f491223a604c93820598f20e6a99c25617a1576065e8b7" url: "https://pub.dev" source: hosted - version: "7.4.5" + version: "12.1.0" ansicolor: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: archive - sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff url: "https://pub.dev" source: hosted - version: "4.0.7" + version: "4.0.9" args: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.1" barcode: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: bazel_worker - sha256: "373a6ef07caa6c674c1cf144a5fe1e0f712c040552031ce669f298e35f7e110a" + sha256: "87cae9150fcf9942b8057e5f51c4848a3efde1289e97411e1c8f01e350120999" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.5" bidi: dependency: transitive description: @@ -109,66 +109,42 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "4.0.6" build_config: dependency: transitive description: name: build_config - sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.3.0" build_daemon: dependency: transitive description: name: build_daemon - sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 url: "https://pub.dev" source: hosted - version: "4.0.4" - build_modules: - dependency: transitive - description: - name: build_modules - sha256: "51422a5753a74fda433d4345b11ce6ad40c2033880a26b2c6b7a8fa7e10e8f2f" - url: "https://pub.dev" - source: hosted - version: "5.1.11" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 - url: "https://pub.dev" - source: hosted - version: "2.4.4" + version: "4.1.1" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" url: "https://pub.dev" source: hosted - version: "2.4.15" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" - url: "https://pub.dev" - source: hosted - version: "8.0.0" + version: "2.15.0" build_web_compilers: dependency: "direct dev" description: name: build_web_compilers - sha256: "311e0b9c797f40eecc8450f0836200b0ad9ea5227f86428a7ed5691f35e347c0" + sha256: c8be4b48f09289d145c7eaa3240f1e7776c529ea1cecddf483218edd3129de3f url: "https://pub.dev" source: hosted - version: "4.4.18" + version: "4.8.0" built_collection: dependency: transitive description: @@ -181,10 +157,10 @@ packages: dependency: transitive description: name: built_value - sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27" + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" url: "https://pub.dev" source: hosted - version: "8.10.1" + version: "8.12.6" cached_network_image: dependency: "direct main" description: @@ -213,42 +189,42 @@ packages: dependency: transitive description: name: camera - sha256: "87a27e0553e3432119c1c2f6e4b9a1bbf7d2c660552b910bfa59185a9facd632" + sha256: "4142a19a38e388d3bab444227636610ba88982e36dff4552d5191a86f65dc437" url: "https://pub.dev" source: hosted - version: "0.11.2+1" + version: "0.11.4" camera_android_camerax: dependency: transitive description: name: camera_android_camerax - sha256: "58b8fe843a3c83fd1273c00cb35f5a8ae507f6cc9b2029bcf7e2abba499e28d8" + sha256: "8516fe308bc341a5067fb1a48edff0ddfa57c0d3cdcc9dbe7ceca3ba119e2577" url: "https://pub.dev" source: hosted - version: "0.6.19+1" + version: "0.6.30" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "951ef122d01ebba68b7a54bfe294e8b25585635a90465c311b2f875ae72c412f" + sha256: "11b4aee2f5e5e038982e152b4a342c749b414aa27857899d20f4323e94cb5f0b" url: "https://pub.dev" source: hosted - version: "0.9.21+2" + version: "0.9.23+2" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" + sha256: "7ac852d77699acee79f0d438b793feee26721841e50973576419ff5c6d95e9b7" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" camera_web: dependency: transitive description: name: camera_web - sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" + sha256: "1245a480a113437f8d46d19c0fb90cea9db921436d9cf2ba5fb11854a1312693" url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+4" characters: dependency: transitive description: @@ -289,14 +265,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" - code_builder: + code_assets: dependency: transitive description: - name: code_builder - sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 url: "https://pub.dev" source: hosted - version: "4.10.1" + version: "1.2.1" collection: dependency: transitive description: @@ -317,26 +293,26 @@ packages: dependency: "direct main" description: name: country_code_picker - sha256: ee216486da1db8e3c5688f9650c99472ab6a4025ed1ea0c5a54ae6063143d90d + sha256: f0411f4833b6f98e8b7215f4fa3813bcc88e50f13925f70a170dbd36e3e447f5 url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.4.1" cross_file: dependency: "direct main" description: name: cross_file - sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" url: "https://pub.dev" source: hosted - version: "0.3.5+1" + version: "0.3.5+2" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: @@ -349,10 +325,10 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" custom_rating_bar: dependency: "direct main" description: @@ -365,34 +341,34 @@ packages: dependency: transitive description: name: dart_style - sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" + sha256: a4c1ccfee44c7e75ed80484071a5c142a385345e658fd8bd7c4b5c97e7198f98 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.8" dbus: dependency: transitive description: name: dbus - sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" url: "https://pub.dev" source: hosted - version: "0.7.12" + version: "0.7.14" device_info_plus: dependency: transitive description: name: device_info_plus - sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53" + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "11.5.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.0.3" diacritic: dependency: transitive description: @@ -413,26 +389,26 @@ packages: dependency: transitive description: name: dio - sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c url: "https://pub.dev" source: hosted - version: "5.8.0+1" + version: "5.9.2" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" equatable: dependency: transitive description: name: equatable - sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" url: "https://pub.dev" source: hosted - version: "2.0.7" + version: "2.0.8" fake_async: dependency: transitive description: @@ -445,10 +421,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" file: dependency: transitive description: @@ -461,10 +437,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" + sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" url: "https://pub.dev" source: hosted - version: "10.1.9" + version: "10.3.10" file_saver: dependency: "direct main" description: @@ -477,146 +453,146 @@ packages: dependency: transitive description: name: file_selector - sha256: "5f1d15a7f17115038f433d1b0ea57513cc9e29a9d5338d166cb0bef3fa90a7a0" + sha256: bd15e43e9268db636b53eeaca9f56324d1622af30e5c34d6e267649758c84d9a url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" file_selector_android: dependency: transitive description: name: file_selector_android - sha256: "1ce58b609289551f8ec07265476720e77d19764339cc1d8e4df3c4d34dac6499" + sha256: "6a26687fa65cbc28a5345c7ae6f227e89f0b47740978a4c475b1a625da7a331b" url: "https://pub.dev" source: hosted - version: "0.5.1+17" + version: "0.5.2+8" file_selector_ios: dependency: transitive description: name: file_selector_ios - sha256: fe9f52123af16bba4ad65bd7e03defbbb4b172a38a8e6aaa2a869a0c56a5f5fb + sha256: e2ecf2885c121691ce13b60db3508f53c01f869fb6e8dc5c1cfa771e4c46aeca url: "https://pub.dev" source: hosted - version: "0.5.3+2" + version: "0.5.3+5" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" url: "https://pub.dev" source: hosted - version: "0.9.3+2" + version: "0.9.4" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" url: "https://pub.dev" source: hosted - version: "0.9.4+4" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" url: "https://pub.dev" source: hosted - version: "2.6.2" + version: "2.7.0" file_selector_web: dependency: transitive description: name: file_selector_web - sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 + sha256: "73181fbc5257776d8ecaa6a94ab3c8e920ad143b9132a6d984a9271dfc6928d3" url: "https://pub.dev" source: hosted - version: "0.9.4+2" + version: "0.9.5" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" url: "https://pub.dev" source: hosted - version: "0.9.3+4" + version: "0.9.3+5" firebase_ai: dependency: transitive description: name: firebase_ai - sha256: "6bffa52bc4b9557b73f59de12ec36349bde76f772431d0702c7ecb4bfeeeb21b" + sha256: "8eea58a5430d3870af62428631c8f4ecfcee813c385a5b2bae048bcba4f3f937" url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.13.1" firebase_app_check: dependency: transitive description: name: firebase_app_check - sha256: "4d00b502f510ee97cdb395e95a31a8b871fc96cb917ffc60591528d3c9735986" + sha256: "9d5c79d382a8b87cc0d899294a5234a9f0d15125cd1c97c45ca2faeca6c62918" url: "https://pub.dev" source: hosted - version: "0.4.1+2" + version: "0.4.5" firebase_app_check_platform_interface: dependency: transitive description: name: firebase_app_check_platform_interface - sha256: "7d104d01b00e5dec367dc79184ad99bd1941f2d839b5ef41156b2330c18af13f" + sha256: "58248ca4a6be624f17e47d1f18b3846e477cce3dc7f1c08917e3845aa973beb3" url: "https://pub.dev" source: hosted - version: "0.2.1+2" + version: "0.4.1" firebase_app_check_web: dependency: transitive description: name: firebase_app_check_web - sha256: "885a1a7b8e33c52afaf9c5d75eca616ae310d6ea90322e9a462f8c154ad16b64" + sha256: "6b34be4bb8aa0bc5c2bbe930dd57035e971144521ee7d52d8e293c6cb1216a66" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.5" firebase_auth: dependency: transitive description: name: firebase_auth - sha256: e54fb3ba57de041d832574126a37726eedf0f57400869f1942b0ca8ce4a6e209 + sha256: "7996a49c4b4054573eac9124c1c412095ae1406ca367bd2373de1ad2eaba04b8" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.5.4" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "421f95dc553cb283ed9d4d140e719800c0331d49ed37b962e513c9d1d61b090b" + sha256: "2975965782c8cc46fe5bafc653882617e6fbdceed4499c97345c980734c50d2e" url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "9.0.3" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: a064ffee202f7d42d62e2c01775899d4ffcb83c602af07632f206acd46a0964e + sha256: b35db5997b32889885dc9b1420b7c81b704f1ec153c3bb2efd228733e1878119 url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.3" firebase_core: dependency: transitive description: name: firebase_core - sha256: "923085c881663ef685269b013e241b428e1fb03cdd0ebde265d9b40ff18abf80" + sha256: d2625088d8f8836a7a74a7eb94a5372d70ad88382602ba2dcc02805c294d0d16 url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.11.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 + sha256: "913e7c96ef83a80ad7e1c3f8a059167b3de23b5d5e07fa3ed8f11abe24de98b6" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.1.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "83e7356c704131ca4d8d8dd57e360d8acecbca38b1a3705c7ae46cc34c708084" + sha256: "30ba3ae56f5beb2cea836033201570612c911661889f815eca73b6056c7b55bf" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.9.0" fixnum: dependency: transitive description: @@ -629,10 +605,10 @@ packages: dependency: "direct main" description: name: fl_downloader - sha256: e3f0696f7b22933baeae3c99d806c3a6f11507ab6c2bf74b4c580abf8e036f80 + sha256: "7e28207e959c5d327b3776b7320f88cb475224946e40bcc335a0f7414f7cc563" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" flutter: dependency: "direct main" description: flutter @@ -714,18 +690,18 @@ packages: dependency: "direct main" description: name: flutter_markdown_plus - sha256: "7f349c075157816da399216a4127096108fd08e1ac931e34e72899281db4113c" + sha256: "039177906850278e8fb1cd364115ee0a46281135932fa8ecea8455522166d2de" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.7" flutter_native_splash: dependency: "direct main" description: name: flutter_native_splash - sha256: "8321a6d11a8d13977fa780c89de8d257cce3d841eecfb7a4cadffcc4f12d82dc" + sha256: "9db4b80b044e9af17cc4b1272137fc7ace0054d879ef8210a76adc34aaf4cdff" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.8" flutter_parsed_text: dependency: transitive description: @@ -746,10 +722,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" url: "https://pub.dev" source: hosted - version: "2.0.28" + version: "2.0.35" flutter_speed_dial: dependency: "direct main" description: @@ -762,10 +738,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 + sha256: "35882981abcbfb8c15b286f0cd690ff25bac12d95eff3e25ee207f37d4c42e7f" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" flutter_test: dependency: "direct dev" description: flutter @@ -775,10 +751,10 @@ packages: dependency: "direct main" description: name: flutter_tts - sha256: bdf2fc4483e74450dc9fc6fe6a9b6a5663e108d4d0dad3324a22c8e26bf48af4 + sha256: ce5eb209b40e95f2f4a1397116c87ab2fcdff32257d04ed7a764e75894c03775 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.5" flutter_web_plugins: dependency: "direct main" description: flutter @@ -800,14 +776,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" - source: hosted - version: "4.0.0" geoclue: dependency: transitive description: @@ -820,26 +788,26 @@ packages: dependency: "direct main" description: name: geolocator - sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" url: "https://pub.dev" source: hosted - version: "14.0.1" + version: "14.0.2" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" + sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" url: "https://pub.dev" source: hosted - version: "5.0.1+1" + version: "5.0.3" geolocator_apple: dependency: transitive description: name: geolocator_apple - sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" url: "https://pub.dev" source: hosted - version: "2.3.13" + version: "2.3.14" geolocator_linux: dependency: "direct main" description: @@ -852,18 +820,18 @@ packages: dependency: transitive description: name: geolocator_platform_interface - sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + sha256: cdb082e4f048b69da244117b7914cc60d2a8897546ffaa4f2529c786ded7aee2 url: "https://pub.dev" source: hosted - version: "4.2.6" + version: "4.2.8" geolocator_web: dependency: transitive description: name: geolocator_web - sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "4.1.4" geolocator_windows: dependency: transitive description: @@ -884,26 +852,26 @@ packages: dependency: "direct main" description: name: gma_mediation_meta - sha256: "8c9448d194faf85dbd7e09e4cd602192018915b2803b1605af01549fb72088b3" + sha256: "765367719c81043ee9cde12c854fae9c8de00c619bb0811fd8ce63541d962710" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.5.0" go_router: dependency: "direct main" description: name: go_router - sha256: "8b1f37dfaf6e958c6b872322db06f946509433bec3de753c3491a42ae9ec2b48" + sha256: d8f590a69729f719177ea68eb1e598295e8dbc41bbc247fed78b2c8a25660d7c url: "https://pub.dev" source: hosted - version: "16.1.0" + version: "16.3.0" google_fonts: dependency: transitive description: name: google_fonts - sha256: "517b20870220c48752eafa0ba1a797a092fb22df0d89535fd9991e86ee2cdd9c" + sha256: ba03d03bcaa2f6cb7bd920e3b5027181db75ab524f8891c8bc3aa603885b8055 url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" google_mobile_ads: dependency: "direct main" description: @@ -948,10 +916,18 @@ packages: dependency: "direct dev" description: name: hive_ce_generator - sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" + sha256: "69800cb5e9bde43d457d24d38c20f458cf95b122c25ba04cfe9519578f31548d" url: "https://pub.dev" source: hosted - version: "1.9.2" + version: "1.11.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" html: dependency: transitive description: @@ -964,10 +940,10 @@ packages: dependency: "direct main" description: name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.6.0" http_multi_server: dependency: transitive description: @@ -988,42 +964,42 @@ packages: dependency: transitive description: name: image - sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce url: "https://pub.dev" source: hosted - version: "4.5.4" + version: "4.8.0" image_picker: dependency: transitive description: name: image_picker - sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041" + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "28f3987ca0ec702d346eae1d90eda59603a2101b52f1e234ded62cff1d5cfa6e" + sha256: "6f3a1995eafb000333174fae92202622033b0ee7fd917a6cd3730295264df84a" url: "https://pub.dev" source: hosted - version: "0.8.13+1" + version: "0.8.13+19" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 url: "https://pub.dev" source: hosted - version: "0.8.13" + version: "0.8.13+6" image_picker_linux: dependency: transitive description: @@ -1036,10 +1012,10 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: @@ -1060,10 +1036,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: "1ca20c894b1717686a2319b8548763d812bc0aabdac580420a44c5178c57a867" url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.20.3" io: dependency: transitive description: @@ -1080,6 +1056,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.1" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" js: dependency: transitive description: @@ -1092,18 +1084,18 @@ packages: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.12.0" ken_logger: dependency: "direct main" description: name: ken_logger - sha256: d48e3606688555a32a152a7d51c85a6f046b4157a6342812987c4722e90f998f + sha256: "04b9e9a1d964eb80545d7c75105d4e550f678a52ac6440ab1b155d68a4144ac0" url: "https://pub.dev" source: hosted - version: "0.0.3" + version: "0.0.4" leak_tracker: dependency: transitive description: @@ -1140,10 +1132,10 @@ packages: dependency: transitive description: name: lints - sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" local_auth: dependency: "direct main" description: @@ -1156,26 +1148,26 @@ packages: dependency: transitive description: name: local_auth_android - sha256: "63ad7ca6396290626dc0cb34725a939e4cfe965d80d36112f08d49cf13a8136e" + sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 url: "https://pub.dev" source: hosted - version: "1.0.49" + version: "1.0.56" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "630996cd7b7f28f5ab92432c4b35d055dd03a747bc319e5ffbb3c4806a3e50d2" + sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" url: "https://pub.dev" source: hosted - version: "1.4.3" + version: "1.6.1" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 url: "https://pub.dev" source: hosted - version: "1.0.10" + version: "1.1.0" local_auth_windows: dependency: transitive description: @@ -1196,10 +1188,10 @@ packages: dependency: transitive description: name: markdown - sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.1" matcher: dependency: transitive description: @@ -1220,10 +1212,10 @@ packages: dependency: "direct main" description: name: math_expressions - sha256: "218dc65bed4726562bb31c53d8daa3cc824664b26fb72d77bc592757edf74ba0" + sha256: e32d803d758ace61cc6c4bdfed1226ff60a6a23646b35685670d28b5616139f8 url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.6.0" measure_size: dependency: transitive description: @@ -1260,10 +1252,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" + sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.2.0" mutex: dependency: transitive description: @@ -1280,6 +1272,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" octo_image: dependency: transitive description: @@ -1316,10 +1316,10 @@ packages: dependency: transitive description: name: package_info_plus - sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.0.1" package_info_plus_platform_interface: dependency: transitive description: @@ -1348,42 +1348,42 @@ packages: dependency: transitive description: name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" url: "https://pub.dev" source: hosted - version: "2.2.17" + version: "2.3.1" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.6.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" path_provider_windows: dependency: transitive description: @@ -1396,10 +1396,10 @@ packages: dependency: transitive description: name: pdf - sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416" + sha256: e47a275b267873d5944ad5f5ff0dcc7ac2e36c02b3046a0ffac9b72fd362c44b url: "https://pub.dev" source: hosted - version: "3.11.3" + version: "3.12.0" pdf_widget_wrapper: dependency: transitive description: @@ -1412,10 +1412,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "7.0.2" photo_view: dependency: transitive description: @@ -1444,34 +1444,34 @@ packages: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" posix: dependency: transitive description: name: posix - sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.5.0" printing: dependency: "direct main" description: name: printing - sha256: "482cd5a5196008f984bb43ed0e47cbfdca7373490b62f3b27b3299275bf22a93" + sha256: "689170c9ddb1bda85826466ba80378aa8993486d3c959a71cd7d2d80cb606692" url: "https://pub.dev" source: hosted - version: "5.14.2" + version: "5.14.3" protobuf: dependency: transitive description: name: protobuf - sha256: "579fe5557eae58e3adca2e999e38f02441d8aa908703854a9e0a0f47fa857731" + sha256: "75ec242d22e950bdcc79ee38dd520ce4ee0bc491d7fadc4ea47694604d22bf06" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "6.0.0" provider: dependency: "direct main" description: @@ -1524,18 +1524,18 @@ packages: dependency: transitive description: name: quick_actions_android - sha256: "612c9d53364c641ddcdeafed83c68fc14efb1bf4f686979d755024fc976fc888" + sha256: af50d52d882a0f520c4be082636b5177b3de239bd468857d5da0b5a6eec61e07 url: "https://pub.dev" source: hosted - version: "1.0.23" + version: "1.0.32" quick_actions_ios: dependency: transitive description: name: quick_actions_ios - sha256: ee2cd54e3bd674eb031ca195b3b9974583638d141493aec1066dee3b2599ed08 + sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.4" quick_actions_platform_interface: dependency: transitive description: @@ -1548,58 +1548,66 @@ packages: dependency: transitive description: name: record - sha256: "6bad72fb3ea6708d724cf8b6c97c4e236cf9f43a52259b654efeb6fd9b737f1f" + sha256: "10911465138fafacef459a780564e883e01bd48eabf87ab20543684884492870" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.2.1" record_android: dependency: transitive description: name: record_android - sha256: fb54ee4e28f6829b8c580252a9ef49d9c549cfd263b0660ad7eeac0908658e9f + sha256: eb1732e42d0d2a1895b8db86e4fc917287e6d8491b6ed59918aea8bed6c69de4 url: "https://pub.dev" source: hosted - version: "1.4.4" + version: "1.5.2" record_ios: dependency: transitive description: name: record_ios - sha256: "765b42ac1be019b1674ddd809b811fc721fe5a93f7bb1da7803f0d16772fd6d7" + sha256: c051fb48edd7a0e265daafb9108730dc827c27b551728a3fdfb3ef69efd89c73 url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.1" record_linux: dependency: transitive description: name: record_linux - sha256: "235b1f1fb84e810f8149cc0c2c731d7d697f8d1c333b32cb820c449bf7bb72d8" + sha256: "31181787bf7eccb0e298835836b69b3cd0a903863b75d70e937de3dec71cd8f3" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.1" record_macos: dependency: transitive description: name: record_macos - sha256: "842ea4b7e95f4dd237aacffc686d1b0ff4277e3e5357865f8d28cd28bc18ed95" + sha256: cfe1b61435e27db418bf513dc36820d10c9f7eb1843786c2c9a52e07e2f4f627 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.2" record_platform_interface: dependency: transitive description: name: record_platform_interface - sha256: b0065fdf1ec28f5a634d676724d388a77e43ce7646fb049949f58c69f3fcb4ed + sha256: "8e56cbe06c6984137fb86132ff03459f29938d927496d9b2d0962e2d6345d488" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.6.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" record_web: dependency: transitive description: name: record_web - sha256: "20ac10d56514cb9f8cecc8f3579383084fdfb43b0d04e05a95244d0d76091d90" + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" record_windows: dependency: transitive description: @@ -1628,66 +1636,66 @@ packages: dependency: transitive description: name: scratch_space - sha256: "3417e014d20b12cebc5bfb1c0b1f63806054177158596cc31cc4d9aaca767a60" + sha256: "55f141cf286eca871f739518b689af61cb994d671f3fd8efabd63aba7578c309" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" screen_brightness: dependency: "direct main" description: name: screen_brightness - sha256: b6cb9381b83fef7be74187ea043d54598b9a265b4ef6e40b69345ae28699b13e + sha256: e0edf92c08889e8f493cde291e7c687db2b4a1471f2371c074070b75d7c7d79b url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.11" screen_brightness_android: dependency: transitive description: name: screen_brightness_android - sha256: fb5fa43cb89d0c9b8534556c427db1e97e46594ac5d66ebdcf16063b773d54ed + sha256: "2008ad8e9527cc968f7a4de1ec58b476d495b3c612a149dbd6550c4f046da147" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.6" screen_brightness_ios: dependency: transitive description: name: screen_brightness_ios - sha256: "2493953340ecfe8f4f13f61db50ce72533a55b0bbd58ba1402893feecf3727f5" + sha256: "352d355e8523a186ba1e494b74218e5ca96e51975a0630b8ed89fbb7ff609762" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" screen_brightness_macos: dependency: transitive description: name: screen_brightness_macos - sha256: "4edf330ad21078686d8bfaf89413325fbaf571dcebe1e89254d675a3f288b5b9" + sha256: b0957237b842d846a84363b69f229b339a8f91faced55041e245b2ebff7b0142 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" screen_brightness_ohos: dependency: transitive description: name: screen_brightness_ohos - sha256: af2680660f7df785bcd2b1bef9b9f3c172191166dd27098f2dfe020c50c3dea4 + sha256: "569a2c97909a50894b81487619eb7654f5358443a5af05f840c19261f49c0940" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" screen_brightness_platform_interface: dependency: transitive description: name: screen_brightness_platform_interface - sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c" + sha256: "2de60c0ba569b898950029cc1f7e9dd72bda44a22beb5054aac331cb6fce2ff2" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" screen_brightness_windows: dependency: transitive description: name: screen_brightness_windows - sha256: d3518bf0f5d7a884cee2c14449ae0b36803802866de09f7ef74077874b6b2448 + sha256: "368b9c822e1671de81616e48150006e39eff2a434957e47ee638b09a32b2297c" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" screenshot: dependency: "direct main" description: @@ -1708,42 +1716,42 @@ packages: dependency: "direct main" description: name: share_plus - sha256: b2961506569e28948d75ec346c28775bb111986bb69dc6a20754a457e3d97fa0 + sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.1.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "1032d392bc5d2095a77447a805aa3f804d2ae6a4d5eef5e6ebb3bd94c1bc19ef" + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" + sha256: "93ae5884a9df5d3bb696825bceb3a17590754548b5d740eba51500afc8d088f5" url: "https://pub.dev" source: hosted - version: "2.4.10" + version: "2.4.26" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -1756,10 +1764,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" shared_preferences_web: dependency: transitive description: @@ -1809,18 +1817,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.2.3" source_helper: dependency: transitive description: name: source_helper - sha256: a447acb083d3a5ef17f983dd36201aeea33fedadb3228fa831f2f0c92f0f3aca + sha256: "4227d54ceefd0bb8ca4c8fcb96e1719dc53f1ee1b6e2ca9d7a6069da160e4eae" url: "https://pub.dev" source: hosted - version: "1.3.7" + version: "1.3.12" source_maps: dependency: transitive description: @@ -1833,58 +1841,50 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev" - source: hosted - version: "7.0.0" + version: "1.10.2" sqflite: dependency: transitive description: name: sqflite - sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + sha256: "58a799e6ac17dd32fbab93813d39ed835a75ccc0f8f85b8955fe318c6712b082" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" sqflite_android: dependency: transitive description: name: sqflite_android - sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + sha256: d0548f9d7422a2dae99ec6f8b0a3074463b132d216fa5ba0d230eeefc901983b url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.3" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" + sha256: "5bf6a55c166e73bf651ba7ec3ed486e577620e3dc8f3a9c6a258a8031b624590" url: "https://pub.dev" source: hosted - version: "2.5.6" + version: "2.5.11" sqflite_darwin: dependency: transitive description: name: sqflite_darwin - sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + sha256: c86ca18b8f666bbf903924687fe21cc16fc385d086005067e26619ca530bef9f url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3+1" sqflite_platform_interface: dependency: transitive description: name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + sha256: f84939f84350d92d04416f8bc4dc52d3896aec7716cc9e80cf0146342139dc50 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" stack_trace: dependency: transitive description: @@ -1921,82 +1921,82 @@ packages: dependency: "direct main" description: name: supertokens_flutter - sha256: "54ebc0ba9269ae17dc8d26c524cca53a6f0c9155625331839954aa9294a63821" + sha256: "8337f832116f0c5c43ca9c5954b65e2ab04ad611e46fb10567a476dfb67e457e" url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.6.5" syncfusion_flutter_core: dependency: "direct main" description: name: syncfusion_flutter_core - sha256: "0e1e1f50edca35bf1a36c75ebd9c4bef722d3ff9998dac9cee3bf11745639d6a" + sha256: bee87cdfe527b31705190162e3bd27bf468d591ae7c68182244bdfd94e21f737 url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_flutter_pdf: dependency: transitive description: name: syncfusion_flutter_pdf - sha256: "7610e12ef69a072705d051f506751518aff91fd76d581d3fbde73fd776ca003c" + sha256: "08fc998934dab953e980ab3b98482e994beda2e736b88c9fec99cdcf04036509" url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_flutter_pdfviewer: dependency: "direct main" description: name: syncfusion_flutter_pdfviewer - sha256: e656bda13b923bd0abaaec826990e57f404c865e13f805f210d50a9c96fc8202 + sha256: "240c3c50e5a9a0ed2ca9d0449414f83ddcb09dafc798362bf8d8db11dabffdfe" url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_flutter_signaturepad: dependency: transitive description: name: syncfusion_flutter_signaturepad - sha256: "65f812d4e8f54fde8e262c7936627488a9aea294ec4dcc11ac1ddbf147ea0b86" + sha256: "903dcd8a6afcd94488be296f9e45c28e2ea6634849eccb70066e310db4198edc" url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_pdfviewer_macos: dependency: transitive description: name: syncfusion_pdfviewer_macos - sha256: "1cba449d5695044d1ced21cbc1e5c45553d5f3523ad3e8842e0cdd7ccf6d35be" + sha256: "529befb03610bc5f647ddba84150355bea18a25f5ce8329f3065971a498b89d1" url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_pdfviewer_platform_interface: dependency: transitive description: name: syncfusion_pdfviewer_platform_interface - sha256: "93244ccbb1f7663fa9988f8c22845f7106e28eccff83685825302c8ddded0861" + sha256: e27a16b987b7b0d241a153ac96119c2bf753075cae93301e0143ebf7c139503b url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_pdfviewer_web: dependency: transitive description: name: syncfusion_pdfviewer_web - sha256: "25e5a91a04a2016907e17552b0581f58d401489d8d5ad9cdefd5be74c0f6ab1d" + sha256: "1cf1d8f8871fd421e454e7e38f1044b6b170bb0201a5bee8634210d27aa79e2e" url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" syncfusion_pdfviewer_windows: dependency: transitive description: name: syncfusion_pdfviewer_windows - sha256: "6dbc08118892a77a269a73f20074093dd3f5e47af5125a296e4080e0858b1a56" + sha256: cc6826cdae73657d010bd4480b5c6f06a78589e86185eeec9f6ec931c4c4276a url: "https://pub.dev" source: hosted - version: "29.2.10" + version: "29.2.11" synchronized: dependency: transitive description: name: synchronized - sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + sha256: "93b153dcb6a26dcddee6ca087dd634b53e38c10b5aa163e8e49501a776456153" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.4.1" table_calendar: dependency: "direct main" description: @@ -2021,14 +2021,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.11" - timing: - dependency: transitive - description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" - source: hosted - version: "1.0.2" typed_data: dependency: transitive description: @@ -2041,18 +2033,18 @@ packages: dependency: "direct main" description: name: universal_html - sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" + sha256: c0bcae5c733c60f26c7dfc88b10b0fd27cbcc45cb7492311cdaa6067e21c9cd4 url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.0" universal_io: dependency: transitive description: name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.1" universal_platform: dependency: transitive description: @@ -2065,50 +2057,50 @@ packages: dependency: "direct main" description: name: upgrader - sha256: e4878f33198ed627af9ec64cb12626ca12672ad94e9671feccd58625ccb484b6 + sha256: "3fae4eb861c7e8567f91412d9ca4a287e024e58d6f79f98da79e3f6d78da74ba" url: "https://pub.dev" source: hosted - version: "12.0.0" + version: "12.5.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" + sha256: b413d49b73867ac08dd2f9890efd3cc11f2a0e577618d50843440a1fb3776c32 url: "https://pub.dev" source: hosted - version: "6.3.16" + version: "6.3.32" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -2121,34 +2113,34 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" uuid: dependency: "direct main" description: name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" url: "https://pub.dev" source: hosted - version: "4.5.1" + version: "4.5.3" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + sha256: "2306c03da2ba81724afeb589c351ebbc0aa7d86005925be8f8735856dbe5e42d" url: "https://pub.dev" source: hosted - version: "1.1.19" + version: "1.2.2" vector_graphics_codec: dependency: transitive description: @@ -2161,10 +2153,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" + sha256: "142a9146f447d15b10bdc00e21d5f4d83e5b32bb5f8f8f5a04c75311344923a3" url: "https://pub.dev" source: hosted - version: "1.1.17" + version: "1.2.6" vector_math: dependency: transitive description: @@ -2193,18 +2185,18 @@ packages: dependency: transitive description: name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "15.2.0" watcher: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.1" waveform_flutter: dependency: transitive description: @@ -2249,42 +2241,42 @@ packages: dependency: transitive description: name: webview_flutter - sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba + sha256: e4d3474277c5043f5f3100ed27d94ad693abfd5c602b0221c719a4497e4ba1e4 url: "https://pub.dev" source: hosted - version: "4.13.0" + version: "4.14.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 + sha256: a97db7a44f8e71af2f3971c45550a08cce1fb60059c1b8e534251e6cfb753490 url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.13.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 + sha256: "1221c1b12f5278791042f2ec2841743784cf25c5a644e23d6680e5d718824f04" url: "https://pub.dev" source: hosted - version: "2.13.1" + version: "2.15.1" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 + sha256: c879dd64b87c452aa84381b244d5469da57ba7e8cca6884c7b1e0d406372c12d url: "https://pub.dev" source: hosted - version: "3.22.0" + version: "3.26.0" win32: dependency: transitive description: name: win32 - sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "5.15.0" win32_registry: dependency: transitive description: @@ -2305,10 +2297,10 @@ packages: dependency: transitive description: name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.6.1" yaml: dependency: transitive description: @@ -2326,5 +2318,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.10.0-0 <3.13.0-z" - flutter: ">=3.29.0" + dart: ">=3.12.0 <3.13.0-z" + flutter: ">=3.44.0" diff --git a/mih_ui/windows/flutter/generated_plugin_registrant.cc b/mih_ui/windows/flutter/generated_plugin_registrant.cc index ad71ace9..6333ee3e 100644 --- a/mih_ui/windows/flutter/generated_plugin_registrant.cc +++ b/mih_ui/windows/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -16,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -26,6 +27,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FileSaverPlugin")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseAppCheckPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAppCheckPluginCApi")); FirebaseAuthPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); FirebaseCorePluginCApiRegisterWithRegistrar( @@ -42,8 +45,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("PrintingPlugin")); RecordWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); - ScreenBrightnessWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin")); + ScreenBrightnessWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar( diff --git a/mih_ui/windows/flutter/generated_plugins.cmake b/mih_ui/windows/flutter/generated_plugins.cmake index 57f48306..e04ffd25 100644 --- a/mih_ui/windows/flutter/generated_plugins.cmake +++ b/mih_ui/windows/flutter/generated_plugins.cmake @@ -5,6 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_saver file_selector_windows + firebase_app_check firebase_auth firebase_core fl_downloader @@ -20,6 +21,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) From 7a5c8721ddf6a69a240f8047e191688e94b9fb32 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 1 Jul 2026 14:01:25 +0200 Subject: [PATCH 11/14] Adoird build migration and update --- mih_ui/android/app/build.gradle.kts | 20 +- .../firebase_app_check-0.4.5/CHANGELOG.md | 576 ++ .../firebase_app_check-0.4.5/LICENSE | 27 + .../firebase_app_check-0.4.5/README.md | 24 + .../android/build.gradle | 94 + .../android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/local-config.gradle | 7 + .../android/settings.gradle | 10 + .../android/src/main/AndroidManifest.xml | 9 + .../appcheck/FirebaseAppCheckPlugin.kt | 161 + .../appcheck/FlutterFirebaseAppRegistrar.kt | 37 + .../GeneratedAndroidFirebaseAppCheck.g.kt | 223 + .../appcheck/TokenChannelStreamHandler.kt | 30 + .../android/user-agent.gradle | 22 + .../example/README.md | 8 + .../example/analysis_options.yaml | 10 + .../example/android/app/build.gradle | 65 + .../example/android/app/google-services.json | 615 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 + .../firebase/appcheck/example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 18 + .../example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 28 + .../ios/Flutter/AppFrameworkInfo.plist | 24 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../example/ios/Podfile | 43 + .../ios/Runner.xcodeproj/project.pbxproj | 553 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 114 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 16 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GoogleService-Info.plist | 38 + .../example/ios/Runner/Info.plist | 70 + .../example/ios/Runner/Runner.entitlements | 8 + .../ios/Runner/RunnerRelease.entitlements | 8 + .../example/ios/Runner/main.m | 9 + .../example/ios/firebase_app_id_file.json | 7 + .../example/lib/firebase_options.dart | 98 + .../example/lib/main.dart | 249 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../example/macos/Podfile | 42 + .../macos/Runner.xcodeproj/project.pbxproj | 613 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 105 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 + .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../macos/Runner/GoogleService-Info.plist | 38 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 5 + .../example/macos/firebase_app_id_file.json | 7 + .../example/pubspec.yaml | 21 + .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 41 + .../example/web/manifest.json | 35 + .../example/windows/CMakeLists.txt | 108 + .../example/windows/flutter/CMakeLists.txt | 109 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 + .../example/windows/runner/flutter_window.cpp | 73 + .../example/windows/runner/flutter_window.h | 37 + .../example/windows/runner/main.cpp | 46 + .../example/windows/runner/resource.h | 20 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 14 + .../example/windows/runner/utils.cpp | 69 + .../example/windows/runner/utils.h | 23 + .../example/windows/runner/win32_window.cpp | 284 + .../example/windows/runner/win32_window.h | 104 + .../ios/firebase_app_check.podspec | 46 + .../ios/firebase_app_check/Package.swift | 41 + .../firebase_app_check/Constants.swift | 6 + .../FirebaseAppCheckMessages.g.swift | 236 + .../FirebaseAppCheckPlugin.swift | 369 ++ .../lib/firebase_app_check.dart | 34 + .../lib/src/firebase_app_check.dart | 156 + .../macos/firebase_app_check.podspec | 63 + .../macos/firebase_app_check/Package.swift | 36 + .../firebase_app_check/Constants.swift | 6 + .../FirebaseAppCheckMessages.g.swift | 236 + .../FirebaseAppCheckPlugin.swift | 369 ++ .../firebase_app_check-0.4.5/pubspec.yaml | 48 + .../test/firebase_app_check_test.dart | 79 + .../firebase_app_check-0.4.5/test/mock.dart | 35 + .../windows/CMakeLists.txt | 81 + .../windows/firebase_app_check_plugin.cpp | 249 + .../windows/firebase_app_check_plugin.h | 72 + .../firebase_app_check_plugin_c_api.cpp | 16 + .../firebase_app_check_plugin_c_api.h | 29 + .../windows/messages.g.cpp | 517 ++ .../windows/messages.g.h | 119 + .../windows/plugin_version.h.in | 13 + .../firebase_auth-6.5.4/CHANGELOG.md | 1613 +++++ .../firebase_auth-6.5.4/LICENSE | 27 + .../firebase_auth-6.5.4/README.md | 26 + .../firebase_auth-6.5.4/android/build.gradle | 66 + .../android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 8 + .../android/src/main/AndroidManifest.xml | 9 + .../auth/AuthStateChannelStreamHandler.java | 63 + .../plugins/firebase/auth/Constants.java | 46 + .../auth/FlutterFirebaseAuthPlugin.java | 782 +++ .../FlutterFirebaseAuthPluginException.java | 157 + .../auth/FlutterFirebaseAuthRegistrar.java | 21 + .../auth/FlutterFirebaseAuthUser.java | 548 ++ .../auth/FlutterFirebaseMultiFactor.java | 252 + .../auth/FlutterFirebaseTotpMultiFactor.java | 82 + .../auth/FlutterFirebaseTotpSecret.java | 42 + .../auth/GeneratedAndroidFirebaseAuth.java | 5308 ++++++++++++++++ .../auth/IdTokenChannelStreamHandler.java | 63 + .../PhoneNumberVerificationStreamHandler.java | 197 + .../plugins/firebase/auth/PigeonParser.java | 382 ++ .../android/user-agent.gradle | 22 + .../firebase_auth-6.5.4/example/README.md | 58 + .../example/analysis_options.yaml | 7 + .../example/android/app/build.gradle | 62 + .../example/android/app/google-services.json | 615 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 + .../firebase/auth/example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 18 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 28 + .../ios/Flutter/AppFrameworkInfo.plist | 30 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 3 + .../firebase_auth-6.5.4/example/ios/Podfile | 48 + .../ios/Runner.xcodeproj/project.pbxproj | 700 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 94 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 13 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GoogleService-Info.plist | 38 + .../example/ios/Runner/Info.plist | 98 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/Runner/Runner.entitlements | 14 + .../example/ios/Runner/main.m | 9 + .../example/ios/firebase_app_id_file.json | 7 + .../firebase_auth-6.5.4/example/lib/auth.dart | 748 +++ .../example/lib/firebase_options.dart | 98 + .../firebase_auth-6.5.4/example/lib/main.dart | 108 + .../example/lib/profile.dart | 391 ++ .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../firebase_auth-6.5.4/example/macos/Podfile | 40 + .../macos/Runner.xcodeproj/project.pbxproj | 718 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 120 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 + .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 18 + .../macos/Runner/GoogleService-Info.plist | 38 + .../example/macos/Runner/Info.plist | 48 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 14 + .../example/macos/firebase_app_id_file.json | 7 + .../firebase_auth-6.5.4/example/pubspec.yaml | 26 + .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 38 + .../example/web/manifest.json | 35 + .../example/windows/CMakeLists.txt | 102 + .../example/windows/flutter/CMakeLists.txt | 109 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 + .../example/windows/runner/flutter_window.cpp | 68 + .../example/windows/runner/flutter_window.h | 39 + .../example/windows/runner/main.cpp | 46 + .../example/windows/runner/resource.h | 22 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 69 + .../example/windows/runner/utils.h | 25 + .../example/windows/runner/win32_window.cpp | 284 + .../example/windows/runner/win32_window.h | 106 + .../ios/firebase_auth.podspec | 43 + .../ios/firebase_auth/Package.swift | 43 + .../FLTAuthStateChannelStreamHandler.m | 56 + .../firebase_auth/FLTFirebaseAuthPlugin.m | 2376 +++++++ .../FLTIdTokenChannelStreamHandler.m | 54 + .../FLTPhoneNumberVerificationStreamHandler.m | 98 + .../Sources/firebase_auth/PigeonParser.m | 171 + .../firebase_auth/firebase_auth_messages.g.m | 3005 +++++++++ .../FLTAuthStateChannelStreamHandler.h | 26 + .../Private/FLTIdTokenChannelStreamHandler.h | 27 + .../FLTPhoneNumberVerificationStreamHandler.h | 36 + .../include/Private/PigeonParser.h | 33 + .../include/Public/CustomPigeonHeader.h | 16 + .../include/Public/FLTFirebaseAuthPlugin.h | 45 + .../include/Public/firebase_auth_messages.g.h | 571 ++ .../lib/firebase_auth.dart | 72 + .../lib/src/confirmation_result.dart | 36 + .../lib/src/firebase_auth.dart | 893 +++ .../lib/src/multi_factor.dart | 213 + .../lib/src/recaptcha_verifier.dart | 100 + .../firebase_auth-6.5.4/lib/src/user.dart | 685 ++ .../lib/src/user_credential.dart | 39 + .../macos/firebase_auth.podspec | 65 + .../macos/firebase_auth/Package.swift | 43 + .../FLTAuthStateChannelStreamHandler.m | 56 + .../firebase_auth/FLTFirebaseAuthPlugin.m | 2376 +++++++ .../FLTIdTokenChannelStreamHandler.m | 54 + .../FLTPhoneNumberVerificationStreamHandler.m | 98 + .../Sources/firebase_auth/PigeonParser.m | 171 + .../firebase_auth/firebase_auth_messages.g.m | 3005 +++++++++ .../FLTAuthStateChannelStreamHandler.h | 26 + .../Private/FLTIdTokenChannelStreamHandler.h | 27 + .../FLTPhoneNumberVerificationStreamHandler.h | 36 + .../include/Private/PigeonParser.h | 33 + .../include/Public/CustomPigeonHeader.h | 16 + .../include/Public/FLTFirebaseAuthPlugin.h | 45 + .../include/Public/firebase_auth_messages.g.h | 571 ++ .../firebase_auth-6.5.4/pubspec.yaml | 52 + .../test/firebase_auth_test.dart | 1382 ++++ .../firebase_auth-6.5.4/test/mock.dart | 40 + .../firebase_auth-6.5.4/test/user_test.dart | 571 ++ .../windows/CMakeLists.txt | 123 + .../windows/firebase_auth_plugin.cpp | 1341 ++++ .../windows/firebase_auth_plugin.h | 218 + .../windows/firebase_auth_plugin_c_api.cpp | 16 + .../firebase_auth_plugin_c_api.h | 29 + .../windows/messages.g.cpp | 5562 +++++++++++++++++ .../firebase_auth-6.5.4/windows/messages.g.h | 1531 +++++ .../windows/plugin_version.h.in | 13 + .../test/firebase_auth_plugin_test.cpp | 47 + .../google_mobile_ads-8.0.0/CHANGELOG.md | 695 ++ .../google_mobile_ads-8.0.0/LICENSE | 202 + .../google_mobile_ads-8.0.0/README.md | 33 + .../android/build.gradle | 77 + .../android/gradle.properties | 15 + .../gradle/gradle-daemon-jvm.properties | 12 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 9 + .../nativetemplates/NativeTemplateStyle.java | 272 + .../ads/nativetemplates/TemplateView.java | 295 + .../googlemobileads/AdInstanceManager.java | 245 + .../googlemobileads/AdMessageCodec.java | 484 ++ .../googlemobileads/AppStateNotifier.java | 94 + .../googlemobileads/BannerAdCreator.java | 40 + .../plugins/googlemobileads/Constants.java | 27 + .../FluidAdManagerBannerAd.java | 125 + .../plugins/googlemobileads/FlutterAd.java | 388 ++ .../googlemobileads/FlutterAdListener.java | 112 + .../googlemobileads/FlutterAdLoader.java | 140 + .../FlutterAdManagerAdRequest.java | 163 + .../FlutterAdManagerBannerAd.java | 131 + .../FlutterAdManagerInterstitialAd.java | 143 + .../googlemobileads/FlutterAdRequest.java | 359 ++ .../googlemobileads/FlutterAdSize.java | 200 + .../googlemobileads/FlutterAdValue.java | 30 + .../googlemobileads/FlutterAdapterStatus.java | 88 + .../googlemobileads/FlutterAppOpenAd.java | 130 + .../googlemobileads/FlutterBannerAd.java | 102 + .../googlemobileads/FlutterDestroyableAd.java | 22 + .../FlutterFullScreenContentCallback.java | 60 + .../FlutterInitializationStatus.java | 44 + .../FlutterInterstitialAd.java | 119 + .../FlutterMediationExtras.java | 68 + .../FlutterMobileAdsWrapper.java | 93 + .../googlemobileads/FlutterNativeAd.java | 273 + .../FlutterNativeAdOptions.java | 68 + .../FlutterPaidEventListener.java | 38 + .../googlemobileads/FlutterPlatformView.java | 40 + .../FlutterRequestAgentProvider.java | 71 + .../googlemobileads/FlutterRewardedAd.java | 213 + .../FlutterRewardedInterstitialAd.java | 187 + .../FlutterServerSideVerificationOptions.java | 57 + .../googlemobileads/FlutterVideoOptions.java | 49 + .../GoogleMobileAdsPlugin.java | 724 +++ .../GoogleMobileAdsViewFactory.java | 99 + .../MediationNetworkExtrasProvider.java | 54 + .../FlutterNativeTemplateFontStyle.java | 47 + .../FlutterNativeTemplateStyle.java | 180 + .../FlutterNativeTemplateTextStyle.java | 82 + .../FlutterNativeTemplateType.java | 41 + .../ConsentDebugSettingsWrapper.java | 77 + .../ConsentRequestParametersWrapper.java | 74 + .../UserMessagingCodec.java | 124 + .../UserMessagingPlatformManager.java | 237 + .../main/res/drawable/gnt_outline_shape.xml | 6 + .../drawable/gnt_rounded_corners_shape.xml | 17 + .../res/layout/gnt_medium_template_view.xml | 231 + .../res/layout/gnt_small_template_view.xml | 189 + .../layout/medium_template_view_layout.xml | 8 + .../res/layout/small_template_view_layout.xml | 8 + .../android/src/main/res/values/attrs.xml | 7 + .../android/src/main/res/values/colors.xml | 13 + .../android/src/main/res/values/dimens.xml | 21 + .../googlemobileads/AdMessageCodecTest.java | 547 ++ .../FluidAdManagerBannerAdTest.java | 202 + .../FlutterAdManagerAdRequestTest.java | 111 + .../FlutterAdManagerBannerAdTest.java | 184 + .../FlutterAdManagerInterstitialAdTest.java | 284 + .../googlemobileads/FlutterAdRequestTest.java | 96 + .../googlemobileads/FlutterAppOpenAdTest.java | 458 ++ .../googlemobileads/FlutterBannerAdTest.java | 182 + .../FlutterInterstitialAdTest.java | 233 + .../FlutterNativeAdOptionsTest.java | 64 + .../googlemobileads/FlutterNativeAdTest.java | 375 ++ .../FlutterRequestAgentProviderTest.java | 118 + .../FlutterRewardedAdTest.java | 373 ++ .../FlutterRewardedInterstitialAdTest.java | 393 ++ .../FlutterVideoOptionsTest.java | 50 + .../googlemobileads/GoogleMobileAdsTest.java | 1035 +++ .../FlutterNativeTemplateFontStyleTest.java | 40 + .../FlutterNativeTemplateStyleTest.java | 215 + .../FlutterNativeTemplateTextStyleTest.java | 42 + .../FlutterNativeTemplateTypeTest.java | 40 + .../UserMessagingCodecTest.java | 146 + .../UserMessagingPlatformManagerTest.java | 364 ++ .../google_mobile_ads-8.0.0/example/README.md | 8 + .../example/analysis_options.yaml | 15 + .../example/android/app/build.gradle | 70 + .../android/app/src/main/AndroidManifest.xml | 23 + .../googlemobileadsexample/MainActivity.java | 34 + .../NativeAdFactoryExample.java | 114 + .../app/src/main/res/layout/my_native_ad.xml | 131 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../example/android/build.gradle | 18 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 25 + .../ios/Flutter/AppFrameworkInfo.plist | 28 + .../example/ios/Flutter/Debug.xcconfig | 3 + .../example/ios/Flutter/Release.xcconfig | 3 + .../example/ios/Podfile | 46 + .../ios/Runner.xcodeproj/project.pbxproj | 822 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/swiftpm/Package.resolved | 23 + .../xcshareddata/xcschemes/Runner.xcscheme | 112 + .../contents.xcworkspacedata | 10 + .../xcshareddata/swiftpm/Package.resolved | 23 + .../example/ios/Runner/AppDelegate.h | 20 + .../example/ios/Runner/AppDelegate.m | 88 + .../AppIcon.appiconset/Contents.json | 121 + .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 85 + .../example/ios/Runner/NativeAdView.xib | 149 + .../example/ios/Runner/main.m | 24 + .../ios/RunnerTests/FLTAdRequestTest.m | 145 + .../example/ios/RunnerTests/FLTAdUtilTest.m | 97 + .../ios/RunnerTests/FLTAppOpenAdTest.m | 185 + .../example/ios/RunnerTests/FLTBannerAdTest.m | 126 + .../ios/RunnerTests/FLTFluidGAMBannerAdTest.m | 204 + .../ios/RunnerTests/FLTGAMAdRequestTest.m | 152 + .../ios/RunnerTests/FLTGAMBannerAdTest.m | 137 + .../RunnerTests/FLTGamInterstitialAdTest.m | 173 + .../FLTGoogleMobileAdsPluginMethodCallsTest.m | 712 +++ .../FLTGoogleMobileAdsReaderWriterTest.m | 816 +++ .../ios/RunnerTests/FLTGoogleMobileAdsTest.m | 472 ++ .../ios/RunnerTests/FLTInterstitialAdTest.m | 154 + .../example/ios/RunnerTests/FLTNativeAdTest.m | 197 + .../ios/RunnerTests/FLTRewardedAdTest.m | 239 + .../FLTRewardedInterstitialAdTest.m | 232 + .../FLTUserMessagingPlatformManagerTest.m | 454 ++ ...FLTUserMessagingPlatformReaderWriterTest.m | 115 + .../FLTNativeTemplateColorTest.m | 41 + .../FLTNativeTemplateFontStyleTest.m | 38 + .../FLTNativeTemplateStyleTest.m | 222 + .../FLTNativeTemplateTextStyleTest.m | 148 + .../FLTNativeTemplateTypeTest.m | 42 + .../google_mobile_ads_exampleTests/Info.plist | 22 + .../lib/anchored_adaptive_example.dart | 146 + .../example/lib/constants.dart | 30 + .../example/lib/fluid_example.dart | 102 + .../example/lib/inline_adaptive_example.dart | 154 + .../example/lib/main.dart | 388 ++ ..._adaptive_inline_with_recycle_example.dart | 148 + .../example/lib/native_template_example.dart | 106 + .../example/lib/reusable_inline_example.dart | 163 + .../lib/snippets/banner_ad_snippets.dart | 79 + .../snippets/interstitial_ad_snippets.dart | 112 + .../lib/snippets/rewarded_ad_snippets.dart | 152 + .../rewarded_interstitial_ad_snippets.dart | 153 + .../example/lib/webview_example.dart | 77 + .../example/pubspec.yaml | 37 + .../ios/google_mobile_ads.podspec | 31 + .../ios/google_mobile_ads/Package.swift | 34 + .../FLTAdInstanceManager_Internal.m | 259 + .../Sources/google_mobile_ads/FLTAdUtil.m | 58 + .../google_mobile_ads/FLTAd_Internal.m | 1407 +++++ .../google_mobile_ads/FLTAppStateNotifier.m | 142 + .../FLTGoogleMobileAdsCollection_Internal.m | 70 + .../FLTGoogleMobileAdsPlugin.m | 592 ++ .../FLTGoogleMobileAdsReaderWriter_Internal.m | 532 ++ .../google_mobile_ads/FLTMobileAds_Internal.m | 61 + .../Sources/google_mobile_ads/FLTNSString.m | 24 + .../GADTFullScreenTemplateView.m | 30 + .../GADTMediumTemplateView.m | 29 + .../GADTSmallTemplateView.m | 30 + .../GADTTemplateView.m | 326 + .../NativeTemplates/FLTNativeTemplateColor.m | 45 + .../FLTNativeTemplateFontStyle.m | 45 + .../NativeTemplates/FLTNativeTemplateStyle.m | 157 + .../FLTNativeTemplateTextStyle.m | 67 + .../NativeTemplates/FLTNativeTemplateType.m | 69 + .../Resources/GADTFullScreenTemplateView.xib | 134 + .../Resources/GADTMediumTemplateView.xib | 192 + .../Resources/GADTSmallTemplateView.xib | 121 + .../FLTUserMessagingPlatformManager.m | 180 + .../FLTUserMessagingPlatformReaderWriter.m | 138 + .../FLTAdInstanceManager_Internal.h | 74 + .../include/google_mobile_ads/FLTAdUtil.h | 31 + .../google_mobile_ads/FLTAd_Internal.h | 319 + .../google_mobile_ads/FLTAppStateNotifier.h | 22 + .../include/google_mobile_ads/FLTConstants.h | 16 + .../FLTGoogleMobileAdsCollection_Internal.h | 29 + .../FLTGoogleMobileAdsPlugin.h | 111 + .../FLTGoogleMobileAdsReaderWriter_Internal.h | 38 + .../google_mobile_ads/FLTMediationExtras.h | 35 + .../FLTMediationNetworkExtrasProvider.h | 42 + .../google_mobile_ads/FLTMobileAds_Internal.h | 57 + .../include/google_mobile_ads/FLTNSString.h | 22 + .../FLTNativeTemplateColor.h | 34 + .../FLTNativeTemplateFontStyle.h | 36 + .../FLTNativeTemplateStyle.h | 58 + .../FLTNativeTemplateTextStyle.h | 35 + .../google_mobile_ads/FLTNativeTemplateType.h | 27 + .../FLTUserMessagingPlatformManager.h | 29 + .../FLTUserMessagingPlatformReaderWriter.h | 24 + .../GADTFullScreenTemplateView.h | 21 + .../GADTMediumTemplateView.h | 23 + .../google_mobile_ads/GADTSmallTemplateView.h | 22 + .../google_mobile_ads/GADTTemplateView.h | 114 + .../lib/google_mobile_ads.dart | 28 + .../lib/src/ad_containers.dart | 1663 +++++ .../lib/src/ad_inspector_containers.dart | 31 + .../lib/src/ad_instance_manager.dart | 1488 +++++ .../lib/src/ad_listeners.dart | 325 + .../src/app_background_event_notifier.dart | 63 + .../lib/src/mediation_extras.dart | 39 + .../lib/src/mobile_ads.dart | 186 + .../native_template_font_style.dart | 28 + .../native_template_style.dart | 85 + .../native_template_text_style.dart | 51 + .../src/nativetemplates/template_type.dart | 22 + .../lib/src/request_configuration.dart | 105 + .../lib/src/ump/consent_form.dart | 71 + .../lib/src/ump/consent_form_impl.dart | 43 + .../lib/src/ump/consent_information.dart | 85 + .../lib/src/ump/consent_information_impl.dart | 61 + .../src/ump/consent_request_parameters.dart | 86 + .../lib/src/ump/form_error.dart | 43 + .../lib/src/ump/user_messaging_channel.dart | 200 + .../lib/src/ump/user_messaging_codec.dart | 88 + .../lib/src/webview_controller_util.dart | 35 + .../google_mobile_ads-8.0.0/pubspec.yaml | 52 + .../test/ad_containers_test.dart | 1573 +++++ .../test/admanager_banner_ad_test.dart | 360 ++ .../test/app_open_test.dart | 292 + .../test/banner_ad_test.dart | 380 ++ .../test/fluid_ad_test.dart | 268 + .../test/mobile_ads_test.dart | 638 ++ .../test/mobile_ads_test.mocks.dart | 754 +++ .../test/rewarded_interstitial_ad_test.dart | 519 ++ .../test/test_util.dart | 47 + .../test/ump/consent_form_impl_test.dart | 80 + .../ump/consent_form_impl_test.mocks.dart | 140 + .../test/ump/consent_form_test.dart | 133 + .../test/ump/consent_form_test.mocks.dart | 147 + .../ump/consent_information_impl_test.dart | 140 + .../consent_information_impl_test.mocks.dart | 140 + .../test/ump/user_messaging_channel_test.dart | 460 ++ .../test/ump/user_messaging_codec_test.dart | 84 + ...ins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json | 1 + ...hash=046b943ca2c386252fefb70091df62cb-json | 1 + ...hash=091b7b21a80cde9e2510d4e82d4cbd78-json | 1 + ...hash=0a63255185fd1fe5f5bce3e3d92075cc-json | 1 + ...hash=0b58e1096693d1b2f665847f3d6ed644-json | 1 + ...hash=0b5c502676ea77f04ab6ea7a2e8956d9-json | 1 + ...hash=110600b415fe8fc7dd4ca8c0f3c4e215-json | 1 + ...hash=1140ca82d597cd38dc60054d3a158f68-json | 1 + ...hash=14b6e6d9e2eda3680623b9cb266fb1b3-json | 1 + ...hash=1a4fe29d3cb9f9220793e4797839ee1f-json | 1 + ...hash=1abbdfc13b53a75a94289fd5712275b6-json | 1 + ...hash=1e4d2a3be90cd0a545f0c49cf9dce02c-json | 1 + ...hash=1f36083119fed8be641437f19af66acc-json | 1 + ...hash=2044c736a22918f3a12ecb44d3e0c006-json | 1 + ...hash=211721151cd848f04aa31d195dc75f4a-json | 1 + ...hash=218c90a1920c10390be2408439f5191f-json | 1 + ...hash=25067fd2852a0fd76a8f9f479b2d4630-json | 1 + ...hash=35adaf1be68b319de0505ded2815bc62-json | 1 + ...hash=376189dccaae382545d5e718c59412f6-json | 1 + ...hash=3a7fbdb39c618b52ee7b40baa1e884b1-json | 1 + ...hash=3af0402199bd31e72f681872a46f8b81-json | 1 + ...hash=46e4fdabe3969081354e9e5e60b64b4b-json | 1 + ...hash=4b924fd5a51dd455efd4e7fe9f2f3ae9-json | 1 + ...hash=4cabd0c48a00d7a4ed741cb699f1cc8e-json | 1 + ...hash=4cc1f6e212912d53710de3aa08e4aa3c-json | 1 + ...hash=4d623afd122ecb9d6d730809785df91d-json | 1 + ...hash=5248d9ba098cf8d77d31b3cf7f8b5a69-json | 1 + ...hash=525a617ce5cf51a2c10a01508fbe4adf-json | 1 + ...hash=5319ba36858c0aa8d085cf090833a92c-json | 1 + ...hash=558846d52469eb6457f7fa805fbcac19-json | 1 + ...hash=55e76bc78bd49d51860d689a4f5e9c62-json | 1 + ...hash=5815137460cbcfbe6d2f7a5b54b4ca09-json | 1 + ...hash=5b871dc0aeb742795842305fce24cf10-json | 1 + ...hash=5bd0bad9e37ac0efe7eb7e9b6a040622-json | 1 + ...hash=61f30aa6dfaff3adeef504cd04583578-json | 1 + ...hash=6a019aebe92f33ef6d2d1a27354a274c-json | 1 + ...hash=6fb30a1c5b3e857d561640581873eb18-json | 1 + ...hash=754922e16fd2edb654ed183d0b9ffc4e-json | 1 + ...hash=76c81320e671cd52e5aa73c6af313230-json | 1 + ...hash=7aa8351d9b24919942e9946725aa9a4e-json | 1 + ...hash=7b3186407410bb111b40b5143ff956ed-json | 1 + ...hash=7c10b1b705eef3cc27b008fa5df200ca-json | 1 + ...hash=7dc9dce1405849bf477070cc9de38aed-json | 1 + ...hash=8078b8651d861575cd929af1542b7261-json | 1 + ...hash=8d133a19301914cd8e6a4b60878e87a2-json | 1 + ...hash=98c62b097118c3a71fbcc1ac381d0554-json | 1 + ...hash=a067526aa1156f18ea027d11109a29d4-json | 1 + ...hash=a1626071b7e4461b7a78f87d063ecc17-json | 1 + ...hash=a6be57b3049abd7b9f2b4e20f4ba91af-json | 1 + ...hash=a771b9f79fd75fad08749ef861b3bddf-json | 1 + ...hash=aa56745ff0f6a68146d6117b991ff12e-json | 1 + ...hash=ab724a4a507acc9a546958f9aaaa80fd-json | 1 + ...hash=b02384d9efc0e497521a0ba9096939bd-json | 1 + ...hash=b77db6430f49f02a32943c46bd03734b-json | 1 + ...hash=bca7282312c3cbd6420517c0b06b2299-json | 1 + ...hash=bec8a7e752ab7d5daa41943969c542ce-json | 1 + ...hash=c1be6d82376acb043052cbc000a547ae-json | 1 + ...hash=c369ca2358afe46d56e9c4f067675637-json | 1 + ...hash=c57ff86689b99a8853e2ae591b9ac8c6-json | 1 + ...hash=c5e74116acf786c1a12c0ae36c3b648b-json | 1 + ...hash=c7e279690d57f8e9617670c2dd8215da-json | 1 + ...hash=c832b6797055a73fc2a937f2ace5a80c-json | 1 + ...hash=cbb1eb454f498b998b145ed6dace7d98-json | 1 + ...hash=cc4efb059f8f4ef111f94e7221f71ad1-json | 1 + ...hash=cc9ef9cfbfe34cf5230700b7d8fcc951-json | 1 + ...hash=cccb0eb2cb0393abaa5f1f05d755160e-json | 1 + ...hash=cf214d336cf673b4a25ba8952e58ad2f-json | 1 + ...hash=d014b307105d5d21e3d383fba60d7745-json | 1 + ...hash=d1efbd94e043870162f1a431e0d81426-json | 1 + ...hash=d204a2d23a6add831c951cc6c525c071-json | 1 + ...hash=d360bbd5e759c5936a6004b5766066e3-json | 1 + ...hash=d560c2e797b744ca35425688afeb9717-json | 1 + ...hash=d5f04c64bab0734f1ab47fd9bcf15bc4-json | 1 + ...hash=d67c7fe50f94aa30e853cef078cfecc9-json | 1 + ...hash=d6e43cdf0cbce99338da86c88c7a9b38-json | 1 + ...hash=dbb0219d17436c670986b94b7945fa23-json | 1 + ...hash=ddbefab0336a5b7a75af7835b2eb8ae3-json | 1 + ...hash=de9cdf72fffe1fdedbf989540b2a67e3-json | 1 + ...hash=dfe05d0a1a29529d21d126a4eec3834c-json | 1 + ...hash=e04e9400c66a280cff3815703b38f084-json | 1 + ...hash=e48e30a0663eeb6ce1b0165ff162002a-json | 1 + ...hash=eb424d111b233087eeb27f0dcd5e1868-json | 1 + ...hash=eb71d09d11dfb3cc8ccae98e4e65ea84-json | 1 + ...hash=ebe021611ae425ec05c93c24ce7a6607-json | 1 + ...hash=ec851e59095ec5bf084fefcd5588ef75-json | 1 + ...hash=f3bbe05679242975dafb6d8e69ca7557-json | 1 + ...hash=f8fcc6d355b2806d43f663daae6a06d4-json | 1 + ...hash=fbb75b67977f7fd3136c2c9e82b06c66-json | 1 + ...hash=ff36872ab1512227359a12a6bdfb005a-json | 1 + ...hash=ff5000f2df75d09390a7c02a18cf47cb-json | 1 + ...hash=ff93596a3d92ba01970679242c7f2f1b-json | 1 + ...ects=d4d37871a9d2a6dba5291c9ce70cda86-json | 1 + .../firebase_app_check-0.4.5/CHANGELOG.md | 576 ++ .../firebase_app_check-0.4.5/LICENSE | 27 + .../firebase_app_check-0.4.5/README.md | 24 + .../android/build.gradle | 94 + .../android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/local-config.gradle | 7 + .../android/settings.gradle | 10 + .../android/src/main/AndroidManifest.xml | 9 + .../appcheck/FirebaseAppCheckPlugin.kt | 161 + .../appcheck/FlutterFirebaseAppRegistrar.kt | 37 + .../GeneratedAndroidFirebaseAppCheck.g.kt | 223 + .../appcheck/TokenChannelStreamHandler.kt | 30 + .../android/user-agent.gradle | 22 + .../example/README.md | 8 + .../example/analysis_options.yaml | 10 + .../example/android/app/build.gradle | 65 + .../example/android/app/google-services.json | 615 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 + .../firebase/appcheck/example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 18 + .../example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 28 + .../ios/Flutter/AppFrameworkInfo.plist | 24 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../example/ios/Podfile | 43 + .../ios/Runner.xcodeproj/project.pbxproj | 553 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 114 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 16 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GoogleService-Info.plist | 38 + .../example/ios/Runner/Info.plist | 70 + .../example/ios/Runner/Runner.entitlements | 8 + .../ios/Runner/RunnerRelease.entitlements | 8 + .../example/ios/Runner/main.m | 9 + .../example/ios/firebase_app_id_file.json | 7 + .../example/lib/firebase_options.dart | 98 + .../example/lib/main.dart | 249 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../example/macos/Podfile | 42 + .../macos/Runner.xcodeproj/project.pbxproj | 613 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 105 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 + .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../macos/Runner/GoogleService-Info.plist | 38 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 5 + .../example/macos/firebase_app_id_file.json | 7 + .../example/pubspec.yaml | 21 + .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 41 + .../example/web/manifest.json | 35 + .../example/windows/CMakeLists.txt | 108 + .../example/windows/flutter/CMakeLists.txt | 109 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 + .../example/windows/runner/flutter_window.cpp | 73 + .../example/windows/runner/flutter_window.h | 37 + .../example/windows/runner/main.cpp | 46 + .../example/windows/runner/resource.h | 20 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 14 + .../example/windows/runner/utils.cpp | 69 + .../example/windows/runner/utils.h | 23 + .../example/windows/runner/win32_window.cpp | 284 + .../example/windows/runner/win32_window.h | 104 + .../ios/firebase_app_check.podspec | 46 + .../ios/firebase_app_check/Package.swift | 41 + .../firebase_app_check/Constants.swift | 6 + .../FirebaseAppCheckMessages.g.swift | 236 + .../FirebaseAppCheckPlugin.swift | 369 ++ .../lib/firebase_app_check.dart | 34 + .../lib/src/firebase_app_check.dart | 156 + .../macos/firebase_app_check.podspec | 63 + .../macos/firebase_app_check/Package.swift | 36 + .../firebase_app_check/Constants.swift | 6 + .../FirebaseAppCheckMessages.g.swift | 236 + .../FirebaseAppCheckPlugin.swift | 369 ++ .../firebase_app_check-0.4.5/pubspec.yaml | 48 + .../test/firebase_app_check_test.dart | 79 + .../firebase_app_check-0.4.5/test/mock.dart | 35 + .../windows/CMakeLists.txt | 81 + .../windows/firebase_app_check_plugin.cpp | 249 + .../windows/firebase_app_check_plugin.h | 72 + .../firebase_app_check_plugin_c_api.cpp | 16 + .../firebase_app_check_plugin_c_api.h | 29 + .../windows/messages.g.cpp | 517 ++ .../windows/messages.g.h | 119 + .../windows/plugin_version.h.in | 13 + .../firebase_auth-6.5.4/CHANGELOG.md | 1613 +++++ .../firebase_auth-6.5.4/LICENSE | 27 + .../firebase_auth-6.5.4/README.md | 26 + .../firebase_auth-6.5.4/android/build.gradle | 66 + .../android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 8 + .../android/src/main/AndroidManifest.xml | 9 + .../auth/AuthStateChannelStreamHandler.java | 63 + .../plugins/firebase/auth/Constants.java | 46 + .../auth/FlutterFirebaseAuthPlugin.java | 782 +++ .../FlutterFirebaseAuthPluginException.java | 157 + .../auth/FlutterFirebaseAuthRegistrar.java | 21 + .../auth/FlutterFirebaseAuthUser.java | 548 ++ .../auth/FlutterFirebaseMultiFactor.java | 252 + .../auth/FlutterFirebaseTotpMultiFactor.java | 82 + .../auth/FlutterFirebaseTotpSecret.java | 42 + .../auth/GeneratedAndroidFirebaseAuth.java | 5308 ++++++++++++++++ .../auth/IdTokenChannelStreamHandler.java | 63 + .../PhoneNumberVerificationStreamHandler.java | 197 + .../plugins/firebase/auth/PigeonParser.java | 382 ++ .../android/user-agent.gradle | 22 + .../firebase_auth-6.5.4/example/README.md | 58 + .../example/analysis_options.yaml | 7 + .../example/android/app/build.gradle | 62 + .../example/android/app/google-services.json | 615 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 + .../firebase/auth/example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 18 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 28 + .../ios/Flutter/AppFrameworkInfo.plist | 30 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 3 + .../firebase_auth-6.5.4/example/ios/Podfile | 48 + .../ios/Runner.xcodeproj/project.pbxproj | 700 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 94 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 13 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GoogleService-Info.plist | 38 + .../example/ios/Runner/Info.plist | 98 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/Runner/Runner.entitlements | 14 + .../example/ios/Runner/main.m | 9 + .../example/ios/firebase_app_id_file.json | 7 + .../firebase_auth-6.5.4/example/lib/auth.dart | 748 +++ .../example/lib/firebase_options.dart | 98 + .../firebase_auth-6.5.4/example/lib/main.dart | 108 + .../example/lib/profile.dart | 391 ++ .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../firebase_auth-6.5.4/example/macos/Podfile | 40 + .../macos/Runner.xcodeproj/project.pbxproj | 718 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 120 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 + .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 18 + .../macos/Runner/GoogleService-Info.plist | 38 + .../example/macos/Runner/Info.plist | 48 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 14 + .../example/macos/firebase_app_id_file.json | 7 + .../firebase_auth-6.5.4/example/pubspec.yaml | 26 + .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 38 + .../example/web/manifest.json | 35 + .../example/windows/CMakeLists.txt | 102 + .../example/windows/flutter/CMakeLists.txt | 109 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 + .../example/windows/runner/flutter_window.cpp | 68 + .../example/windows/runner/flutter_window.h | 39 + .../example/windows/runner/main.cpp | 46 + .../example/windows/runner/resource.h | 22 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 69 + .../example/windows/runner/utils.h | 25 + .../example/windows/runner/win32_window.cpp | 284 + .../example/windows/runner/win32_window.h | 106 + .../ios/firebase_auth.podspec | 43 + .../ios/firebase_auth/Package.swift | 43 + .../FLTAuthStateChannelStreamHandler.m | 56 + .../firebase_auth/FLTFirebaseAuthPlugin.m | 2376 +++++++ .../FLTIdTokenChannelStreamHandler.m | 54 + .../FLTPhoneNumberVerificationStreamHandler.m | 98 + .../Sources/firebase_auth/PigeonParser.m | 171 + .../firebase_auth/firebase_auth_messages.g.m | 3005 +++++++++ .../FLTAuthStateChannelStreamHandler.h | 26 + .../Private/FLTIdTokenChannelStreamHandler.h | 27 + .../FLTPhoneNumberVerificationStreamHandler.h | 36 + .../include/Private/PigeonParser.h | 33 + .../include/Public/CustomPigeonHeader.h | 16 + .../include/Public/FLTFirebaseAuthPlugin.h | 45 + .../include/Public/firebase_auth_messages.g.h | 571 ++ .../lib/firebase_auth.dart | 72 + .../lib/src/confirmation_result.dart | 36 + .../lib/src/firebase_auth.dart | 893 +++ .../lib/src/multi_factor.dart | 213 + .../lib/src/recaptcha_verifier.dart | 100 + .../firebase_auth-6.5.4/lib/src/user.dart | 685 ++ .../lib/src/user_credential.dart | 39 + .../macos/firebase_auth.podspec | 65 + .../macos/firebase_auth/Package.swift | 43 + .../FLTAuthStateChannelStreamHandler.m | 56 + .../firebase_auth/FLTFirebaseAuthPlugin.m | 2376 +++++++ .../FLTIdTokenChannelStreamHandler.m | 54 + .../FLTPhoneNumberVerificationStreamHandler.m | 98 + .../Sources/firebase_auth/PigeonParser.m | 171 + .../firebase_auth/firebase_auth_messages.g.m | 3005 +++++++++ .../FLTAuthStateChannelStreamHandler.h | 26 + .../Private/FLTIdTokenChannelStreamHandler.h | 27 + .../FLTPhoneNumberVerificationStreamHandler.h | 36 + .../include/Private/PigeonParser.h | 33 + .../include/Public/CustomPigeonHeader.h | 16 + .../include/Public/FLTFirebaseAuthPlugin.h | 45 + .../include/Public/firebase_auth_messages.g.h | 571 ++ .../firebase_auth-6.5.4/pubspec.yaml | 52 + .../test/firebase_auth_test.dart | 1382 ++++ .../firebase_auth-6.5.4/test/mock.dart | 40 + .../firebase_auth-6.5.4/test/user_test.dart | 571 ++ .../windows/CMakeLists.txt | 123 + .../windows/firebase_auth_plugin.cpp | 1341 ++++ .../windows/firebase_auth_plugin.h | 218 + .../windows/firebase_auth_plugin_c_api.cpp | 16 + .../firebase_auth_plugin_c_api.h | 29 + .../windows/messages.g.cpp | 5562 +++++++++++++++++ .../firebase_auth-6.5.4/windows/messages.g.h | 1531 +++++ .../windows/plugin_version.h.in | 13 + .../test/firebase_auth_plugin_test.cpp | 47 + .../reports/problems/problems-report.html | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- mih_ui/android/settings.gradle.kts | 6 +- mih_ui/android_build_logs.txt | 399 ++ mih_ui/ios/Runner.xcodeproj/project.pbxproj | 22 + .../xcshareddata/swiftpm/Package.resolved | 149 + .../xcshareddata/xcschemes/Runner.xcscheme | 18 + mih_ui/lib/main_prod.dart | 45 +- .../mih_circle_avatar.dart | 3 +- .../mih_image_display.dart | 3 +- .../package_tools/mih_business_qr_code.dart | 5 +- .../package_tools/mih_personal_qr_code.dart | 8 +- .../package_tools/patient_documents.dart | 4 +- mih_ui/lib/mih_providers/ollama_provider.dart | 95 +- .../flutter/generated_plugin_registrant.cc | 4 + mih_ui/linux/flutter/generated_plugins.cmake | 1 + mih_ui/pubspec.lock | 256 +- mih_ui/pubspec.yaml | 26 +- 1062 files changed, 143083 insertions(+), 221 deletions(-) create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/LICENSE create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/index.html create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/mock.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/LICENSE create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/README.md create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/build.gradle create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/settings.gradle create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/index.html create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h create mode 100755 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/pubspec.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/mock.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/user_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in create mode 100644 mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/CHANGELOG.md create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/LICENSE create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/gradle-daemon-jvm.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/settings.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/NativeTemplateStyle.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/TemplateView.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdInstanceManager.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdMessageCodec.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AppStateNotifier.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/BannerAdCreator.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/Constants.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdListener.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdLoader.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdRequest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdSize.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdValue.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdapterStatus.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterBannerAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterDestroyableAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterFullScreenContentCallback.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInitializationStatus.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMediationExtras.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMobileAdsWrapper.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptions.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPaidEventListener.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPlatformView.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProvider.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAd.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterServerSideVerificationOptions.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterVideoOptions.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsPlugin.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsViewFactory.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/MediationNetworkExtrasProvider.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyle.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyle.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyle.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateType.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentDebugSettingsWrapper.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentRequestParametersWrapper.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodec.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManager.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_outline_shape.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_rounded_corners_shape.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_medium_template_view.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_small_template_view.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/medium_template_view_layout.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/small_template_view_layout.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/attrs.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/colors.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/dimens.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/AdMessageCodecTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequestTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdRequestTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterBannerAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptionsTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProviderTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAdTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterVideoOptionsTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyleTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyleTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyleTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTypeTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodecTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManagerTest.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/README.md create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/analysis_options.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/MainActivity.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/NativeAdFactoryExample.java create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/layout/my_native_ad.xml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/build.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/gradle.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/settings.gradle create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Flutter/Debug.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Flutter/Release.xcconfig create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Podfile create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/AppDelegate.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/AppDelegate.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/NativeAdView.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/main.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdRequestTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdUtilTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAppOpenAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTBannerAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTFluidGAMBannerAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMAdRequestTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMBannerAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGamInterstitialAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsPluginMethodCallsTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsReaderWriterTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTInterstitialAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTNativeAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedInterstitialAdTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformManagerTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformReaderWriterTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateColorTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateFontStyleTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateStyleTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTextStyleTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTypeTest.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/google_mobile_ads_exampleTests/Info.plist create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/anchored_adaptive_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/constants.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/fluid_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/inline_adaptive_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/main.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/multi_adaptive_inline_with_recycle_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/native_template_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/reusable_inline_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/banner_ad_snippets.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/interstitial_ad_snippets.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_ad_snippets.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_interstitial_ad_snippets.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/webview_example.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/pubspec.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads.podspec create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Package.swift create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdInstanceManager_Internal.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdUtil.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAd_Internal.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAppStateNotifier.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsPlugin.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTMobileAds_Internal.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTNSString.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateColor.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateFontStyle.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateStyle.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateTextStyle.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateType.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTFullScreenTemplateView.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTMediumTemplateView.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTSmallTemplateView.xib create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformManager.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.m create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdInstanceManager_Internal.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdUtil.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAd_Internal.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAppStateNotifier.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTConstants.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsPlugin.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationExtras.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationNetworkExtrasProvider.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMobileAds_Internal.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNSString.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateColor.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateFontStyle.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateStyle.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateTextStyle.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateType.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformManager.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformReaderWriter.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTFullScreenTemplateView.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTMediumTemplateView.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTSmallTemplateView.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTTemplateView.h create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/google_mobile_ads.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_containers.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_inspector_containers.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_instance_manager.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_listeners.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/app_background_event_notifier.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mediation_extras.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mobile_ads.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_font_style.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_style.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_text_style.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/template_type.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/request_configuration.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form_impl.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information_impl.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_request_parameters.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/form_error.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_channel.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_codec.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/webview_controller_util.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/pubspec.yaml create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ad_containers_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/admanager_banner_ad_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/app_open_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/banner_ad_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/fluid_ad_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.mocks.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/rewarded_interstitial_ad_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/test_util.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.mocks.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.mocks.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.mocks.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_channel_test.dart create mode 100644 mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_codec_test.dart create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/project/PROJECT@v11_mod=d0293ee0112d0357cf900112c05ab991_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=046b943ca2c386252fefb70091df62cb-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=091b7b21a80cde9e2510d4e82d4cbd78-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0a63255185fd1fe5f5bce3e3d92075cc-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b58e1096693d1b2f665847f3d6ed644-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b5c502676ea77f04ab6ea7a2e8956d9-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=110600b415fe8fc7dd4ca8c0f3c4e215-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1140ca82d597cd38dc60054d3a158f68-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=14b6e6d9e2eda3680623b9cb266fb1b3-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1a4fe29d3cb9f9220793e4797839ee1f-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1abbdfc13b53a75a94289fd5712275b6-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1e4d2a3be90cd0a545f0c49cf9dce02c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1f36083119fed8be641437f19af66acc-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=2044c736a22918f3a12ecb44d3e0c006-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=211721151cd848f04aa31d195dc75f4a-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=218c90a1920c10390be2408439f5191f-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=25067fd2852a0fd76a8f9f479b2d4630-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=35adaf1be68b319de0505ded2815bc62-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=376189dccaae382545d5e718c59412f6-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3a7fbdb39c618b52ee7b40baa1e884b1-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3af0402199bd31e72f681872a46f8b81-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=46e4fdabe3969081354e9e5e60b64b4b-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4b924fd5a51dd455efd4e7fe9f2f3ae9-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cabd0c48a00d7a4ed741cb699f1cc8e-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cc1f6e212912d53710de3aa08e4aa3c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4d623afd122ecb9d6d730809785df91d-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5248d9ba098cf8d77d31b3cf7f8b5a69-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=525a617ce5cf51a2c10a01508fbe4adf-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5319ba36858c0aa8d085cf090833a92c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=558846d52469eb6457f7fa805fbcac19-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=55e76bc78bd49d51860d689a4f5e9c62-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5815137460cbcfbe6d2f7a5b54b4ca09-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5b871dc0aeb742795842305fce24cf10-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5bd0bad9e37ac0efe7eb7e9b6a040622-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=61f30aa6dfaff3adeef504cd04583578-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6a019aebe92f33ef6d2d1a27354a274c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6fb30a1c5b3e857d561640581873eb18-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=754922e16fd2edb654ed183d0b9ffc4e-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=76c81320e671cd52e5aa73c6af313230-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7aa8351d9b24919942e9946725aa9a4e-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7b3186407410bb111b40b5143ff956ed-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7c10b1b705eef3cc27b008fa5df200ca-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7dc9dce1405849bf477070cc9de38aed-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8078b8651d861575cd929af1542b7261-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8d133a19301914cd8e6a4b60878e87a2-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=98c62b097118c3a71fbcc1ac381d0554-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a067526aa1156f18ea027d11109a29d4-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a1626071b7e4461b7a78f87d063ecc17-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a6be57b3049abd7b9f2b4e20f4ba91af-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a771b9f79fd75fad08749ef861b3bddf-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=aa56745ff0f6a68146d6117b991ff12e-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ab724a4a507acc9a546958f9aaaa80fd-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b02384d9efc0e497521a0ba9096939bd-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b77db6430f49f02a32943c46bd03734b-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bca7282312c3cbd6420517c0b06b2299-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bec8a7e752ab7d5daa41943969c542ce-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c1be6d82376acb043052cbc000a547ae-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c369ca2358afe46d56e9c4f067675637-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c57ff86689b99a8853e2ae591b9ac8c6-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c5e74116acf786c1a12c0ae36c3b648b-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c7e279690d57f8e9617670c2dd8215da-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c832b6797055a73fc2a937f2ace5a80c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cbb1eb454f498b998b145ed6dace7d98-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc4efb059f8f4ef111f94e7221f71ad1-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc9ef9cfbfe34cf5230700b7d8fcc951-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cccb0eb2cb0393abaa5f1f05d755160e-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cf214d336cf673b4a25ba8952e58ad2f-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d014b307105d5d21e3d383fba60d7745-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d1efbd94e043870162f1a431e0d81426-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d204a2d23a6add831c951cc6c525c071-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d360bbd5e759c5936a6004b5766066e3-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d560c2e797b744ca35425688afeb9717-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d5f04c64bab0734f1ab47fd9bcf15bc4-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d67c7fe50f94aa30e853cef078cfecc9-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d6e43cdf0cbce99338da86c88c7a9b38-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dbb0219d17436c670986b94b7945fa23-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ddbefab0336a5b7a75af7835b2eb8ae3-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=de9cdf72fffe1fdedbf989540b2a67e3-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dfe05d0a1a29529d21d126a4eec3834c-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e04e9400c66a280cff3815703b38f084-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e48e30a0663eeb6ce1b0165ff162002a-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb424d111b233087eeb27f0dcd5e1868-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb71d09d11dfb3cc8ccae98e4e65ea84-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ebe021611ae425ec05c93c24ce7a6607-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ec851e59095ec5bf084fefcd5588ef75-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f3bbe05679242975dafb6d8e69ca7557-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f8fcc6d355b2806d43f663daae6a06d4-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=fbb75b67977f7fd3136c2c9e82b06c66-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff36872ab1512227359a12a6bdfb005a-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff5000f2df75d09390a7c02a18cf47cb-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff93596a3d92ba01970679242c7f2f1b-json create mode 100644 mih_ui/android/build/ios/XCBuildData/PIFCache/workspace/WORKSPACE@v11_hash=(null)_subobjects=d4d37871a9d2a6dba5291c9ce70cda86-json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/LICENSE create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/README.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/build.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/README.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/index.html create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/mock.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/LICENSE create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/README.md create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/build.gradle create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/settings.gradle create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/README.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/index.html create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h create mode 100755 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/pubspec.yaml create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/mock.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/user_test.dart create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in create mode 100644 mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp create mode 100644 mih_ui/android_build_logs.txt create mode 100644 mih_ui/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/mih_ui/android/app/build.gradle.kts b/mih_ui/android/app/build.gradle.kts index 8250e847..0c703761 100644 --- a/mih_ui/android/app/build.gradle.kts +++ b/mih_ui/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { // START: FlutterFire Configuration id("com.google.gms.google-services") // END: FlutterFire Configuration - id("kotlin-android") + //id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } @@ -20,17 +20,17 @@ if (keystorePropertiesFile.exists()) { android { namespace = "za.co.mzansiinnovationhub.mih" compileSdk = 36 - ndkVersion = "27.0.12077973" + ndkVersion = "28.2.13676358" // ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() - } + //kotlinOptions { + // jvmTarget = JavaVersion.VERSION_17.toString() + //} defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). @@ -67,6 +67,12 @@ android { } } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + flutter { source = "../.." } diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md new file mode 100644 index 00000000..ee988ff3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md @@ -0,0 +1,576 @@ +## 0.4.5 + + - **FEAT**(appcheck): appcheck reCAPTCHA mobile support (gradually rolling out) ([#18261](https://github.com/firebase/flutterfire/issues/18261)). ([036a860a](https://github.com/firebase/flutterfire/commit/036a860a0e66d46b5c57eb3df3a0f9e5846ef00b)) + +## 0.4.4+2 + + - Update a dependency to the latest release. + +## 0.4.4+1 + + - Update a dependency to the latest release. + +## 0.4.4 + + - **REFACTOR**: move all packages to workspace ([#18182](https://github.com/firebase/flutterfire/issues/18182)). ([6cdfcb10](https://github.com/firebase/flutterfire/commit/6cdfcb103da7be46ccb190d7e107d8c537aa1ff8)) + - **FIX**: update core, auth and app-check logic so internal resources on method channels are properly disposed ([#18268](https://github.com/firebase/flutterfire/issues/18268)). ([a0de4ed8](https://github.com/firebase/flutterfire/commit/a0de4ed86b0dff89bb9e557f2a54f38cd2546016)) + - **FEAT**(core): Add Auth and AppCheck as App's registered service. ([#18237](https://github.com/firebase/flutterfire/issues/18237)). ([7ce191cb](https://github.com/firebase/flutterfire/commit/7ce191cbd598b299cd0ec64b45d1366914367a5d)) + +## 0.4.3 + + - **FEAT**(app_check,windows): add support for AppCheck for Windows ([#18140](https://github.com/firebase/flutterfire/issues/18140)). ([81f30325](https://github.com/firebase/flutterfire/commit/81f30325fc926fe94b630e49f56b795c781a4cbe)) + - **FEAT**: use local firebase_core instead of remote SPM dependency ([#18141](https://github.com/firebase/flutterfire/issues/18141)). ([995caf40](https://github.com/firebase/flutterfire/commit/995caf400df80c0fde7151c651ccc6c0f756e381)) + +## 0.4.2 + + - **FEAT**(messaging,web): add support for debug tokens on Web ([#18057](https://github.com/firebase/flutterfire/issues/18057)). ([b853386e](https://github.com/firebase/flutterfire/commit/b853386e987d686eab4b8fd9b8dad14eda97479c)) + - **FEAT**(ios): migrate iOS to UIScene lifecycle ([#18054](https://github.com/firebase/flutterfire/issues/18054)). ([3ffa4110](https://github.com/firebase/flutterfire/commit/3ffa411098132fd5182a84be4e7a226106bc7451)) + +## 0.4.1+5 + + - Update a dependency to the latest release. + +## 0.4.1+4 + + - Update a dependency to the latest release. + +## 0.4.1+3 + + - Update a dependency to the latest release. + +## 0.4.1+2 + + - Update a dependency to the latest release. + +## 0.4.1+1 + + - **FIX**(app_check): Deprecate androidProvider and appleProvider parameters in activate method ([#17742](https://github.com/firebase/flutterfire/issues/17742)). ([4e7f800e](https://github.com/firebase/flutterfire/commit/4e7f800e94a895c6553bd3c1595b4f06ac69bb81)) + - **FIX**(app_check): Expose AppleAppAttestProvider without importing platform interface ([#17740](https://github.com/firebase/flutterfire/issues/17740)). ([6c2355a0](https://github.com/firebase/flutterfire/commit/6c2355a05d6bba763768ce3bc09c3cc0528fa900)) + +## 0.4.1 + + - **FEAT**(app-check): Debug token support for the activate method ([#17723](https://github.com/firebase/flutterfire/issues/17723)). ([3c638264](https://github.com/firebase/flutterfire/commit/3c638264565d902ddbe4dff5bb027aef9e1c2140)) + +## 0.4.0+1 + + - **FIX**(app_check,iOS): correctly parse `forceRefresh` argument using `boolValue` ([#17627](https://github.com/firebase/flutterfire/issues/17627)). ([8c0802d0](https://github.com/firebase/flutterfire/commit/8c0802d098c970740a34e83952f56dbe9eb279fd)) + +## 0.4.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: bump iOS SDK to version 12.0.0 ([#17549](https://github.com/firebase/flutterfire/issues/17549)). ([b2619e68](https://github.com/firebase/flutterfire/commit/b2619e685fec897513483df1d7be347b64f95606)) + - **BREAKING** **FEAT**(app-check): remove deprecated functions ([#17561](https://github.com/firebase/flutterfire/issues/17561)). ([3e4302c4](https://github.com/firebase/flutterfire/commit/3e4302c4281d1d39c140ff116643d700cd3c5ace)) + - **BREAKING** **FEAT**: bump Android SDK to version 34.0.0 ([#17554](https://github.com/firebase/flutterfire/issues/17554)). ([a5bdc051](https://github.com/firebase/flutterfire/commit/a5bdc051d40ee44e39cf0b8d2a7801bc6f618b67)) + +## 0.3.2+10 + + - Update a dependency to the latest release. + +## 0.3.2+9 + + - Update a dependency to the latest release. + +## 0.3.2+8 + + - Update a dependency to the latest release. + +## 0.3.2+7 + + - Update a dependency to the latest release. + +## 0.3.2+6 + + - Update a dependency to the latest release. + +## 0.3.2+5 + + - Update a dependency to the latest release. + +## 0.3.2+4 + + - Update a dependency to the latest release. + +## 0.3.2+3 + + - Update a dependency to the latest release. + +## 0.3.2+2 + + - Update a dependency to the latest release. + +## 0.3.2+1 + + - Update a dependency to the latest release. + +## 0.3.2 + + + - **FEAT**(app-check): Swift Package Manager support ([#16810](https://github.com/firebase/flutterfire/issues/16810)). ([f2e3f396](https://github.com/firebase/flutterfire/commit/f2e3f3965e83a6bf8c52c1cd9f80509a08907a84)) + +## 0.3.1+7 + + - Update a dependency to the latest release. + +## 0.3.1+6 + + - Update a dependency to the latest release. + +## 0.3.1+5 + + - Update a dependency to the latest release. + +## 0.3.1+4 + + - Update a dependency to the latest release. + +## 0.3.1+3 + + - **FIX**(all,apple): use modular headers to import ([#13400](https://github.com/firebase/flutterfire/issues/13400)). ([d7d2d4b9](https://github.com/firebase/flutterfire/commit/d7d2d4b93e7c00226027fffde46699f3d5388a41)) + +## 0.3.1+2 + + - Update a dependency to the latest release. + +## 0.3.1+1 + + - Update a dependency to the latest release. + +## 0.3.1 + + - **FEAT**(firestore,web): expose `webExperimentalForceLongPolling`, `webExperimentalAutoDetectLongPolling` and `timeoutSeconds` on web ([#13201](https://github.com/firebase/flutterfire/issues/13201)). ([6ec2a103](https://github.com/firebase/flutterfire/commit/6ec2a103a3a325a73550bdfff4c0d524ae7e4068)) + +## 0.3.0+5 + + - **DOCS**: remove reference to flutter.io and firebase.flutter.dev ([#13152](https://github.com/firebase/flutterfire/issues/13152)). ([5f0874b9](https://github.com/firebase/flutterfire/commit/5f0874b91e28a203dd62d37d391e5760c91f5729)) + +## 0.3.0+4 + + - Update a dependency to the latest release. + +## 0.3.0+3 + + - Update a dependency to the latest release. + +## 0.3.0+2 + + - Update a dependency to the latest release. + +## 0.3.0+1 + + - **FIX**(app-check,web): fixed broken `onTokenChanged` and ensured it is properly cleaned up. Streams are also cleaned up on "hot restart" ([#12933](https://github.com/firebase/flutterfire/issues/12933)). ([093b5fef](https://github.com/firebase/flutterfire/commit/093b5fef8c3b8314835dc954ce02daacd1e077f4)) + - **FIX**(firebase_app_check,ios): Replace angles with quotes in import statement ([#12929](https://github.com/firebase/flutterfire/issues/12929)). ([f2fc902b](https://github.com/firebase/flutterfire/commit/f2fc902b9e954baf9d72bd3863a85bde402d2133)) + - **FIX**(app-check,ios): update app check to stable release ([#12924](https://github.com/firebase/flutterfire/issues/12924)). ([ced11684](https://github.com/firebase/flutterfire/commit/ced1168482c3b8e8b4746abde13649d212a503fd)) + +## 0.3.0 + +> Note: This release has breaking changes. + + - **BREAKING** **REFACTOR**: android plugins require `minSdk 21`, auth requires `minSdk 23` ahead of android BOM `>=33.0.0` ([#12873](https://github.com/firebase/flutterfire/issues/12873)). ([52accfc6](https://github.com/firebase/flutterfire/commit/52accfc6c39d6360d9c0f36efe369ede990b7362)) + - **BREAKING** **REFACTOR**: bump all iOS deployment targets to iOS 13 ahead of Firebase iOS SDK `v11` breaking change ([#12872](https://github.com/firebase/flutterfire/issues/12872)). ([de0cea2c](https://github.com/firebase/flutterfire/commit/de0cea2c3c36694a76361be784255986fac84a43)) + +## 0.2.2+7 + + - Update a dependency to the latest release. + +## 0.2.2+6 + + - Update a dependency to the latest release. + +## 0.2.2+5 + + - Update a dependency to the latest release. + +## 0.2.2+4 + + - Update a dependency to the latest release. + +## 0.2.2+3 + + - Update a dependency to the latest release. + +## 0.2.2+2 + + - Update a dependency to the latest release. + +## 0.2.2+1 + + - **FIX**(app-check,android): fix unnecessary deprecation warning ([#12578](https://github.com/firebase/flutterfire/issues/12578)). ([805ca028](https://github.com/firebase/flutterfire/commit/805ca028d20c582e93bcebbeca3105deab365edc)) + +## 0.2.2 + + - **FEAT**(android): Bump `compileSdk` version of Android plugins to latest stable (34) ([#12566](https://github.com/firebase/flutterfire/issues/12566)). ([e891fab2](https://github.com/firebase/flutterfire/commit/e891fab291e9beebc223000b133a6097e066a7fc)) + +## 0.2.1+19 + + - **REFACTOR**(app_check,web): small refactor around initialisation of FirebaseAppCheckWeb ([#12474](https://github.com/firebase/flutterfire/issues/12474)). ([83aab7f8](https://github.com/firebase/flutterfire/commit/83aab7f8f6a6dde6e71765826c0e1f9aabc110a0)) + +## 0.2.1+18 + + - Update a dependency to the latest release. + +## 0.2.1+17 + + - Update a dependency to the latest release. + +## 0.2.1+16 + + - Update a dependency to the latest release. + +## 0.2.1+15 + + - Update a dependency to the latest release. + +## 0.2.1+14 + + - Update a dependency to the latest release. + +## 0.2.1+13 + + - Update a dependency to the latest release. + +## 0.2.1+12 + + - Update a dependency to the latest release. + +## 0.2.1+11 + + - Update a dependency to the latest release. + +## 0.2.1+10 + + - Update a dependency to the latest release. + +## 0.2.1+9 + + - Update a dependency to the latest release. + +## 0.2.1+8 + + - Update a dependency to the latest release. + +## 0.2.1+7 + + - Update a dependency to the latest release. + +## 0.2.1+6 + + - Update a dependency to the latest release. + +## 0.2.1+5 + + - Update a dependency to the latest release. + +## 0.2.1+4 + + - Update a dependency to the latest release. + +## 0.2.1+3 + + - Update a dependency to the latest release. + +## 0.2.1+2 + + - Update a dependency to the latest release. + +## 0.2.1+1 + + - Update a dependency to the latest release. + +## 0.2.1 + + - **REFACTOR**(app-check,android): update linting warnings ([#11666](https://github.com/firebase/flutterfire/issues/11666)). ([fa9c8181](https://github.com/firebase/flutterfire/commit/fa9c8181156697a96b2615906b24613f28346175)) + - **FIX**(firebase_app_check): Allow non-default app for Android debug provider ([#11680](https://github.com/firebase/flutterfire/issues/11680)). ([dd20c0c7](https://github.com/firebase/flutterfire/commit/dd20c0c7413dd9c9cd4c54426afc2572f9438607)) + - **FEAT**: Full support of AGP 8 ([#11699](https://github.com/firebase/flutterfire/issues/11699)). ([bdb5b270](https://github.com/firebase/flutterfire/commit/bdb5b27084d225809883bdaa6aa5954650551927)) + - **FEAT**(app_check): Use Android dependencies from Firebase BOM ([#11671](https://github.com/firebase/flutterfire/issues/11671)). ([378fcbdc](https://github.com/firebase/flutterfire/commit/378fcbdc4909e448d47cc204147a2ecd978b4fb7)) + - **DOCS**: Updated documentation link in firebase_app_check README.md ([#11712](https://github.com/firebase/flutterfire/issues/11712)). ([dd3e56c6](https://github.com/firebase/flutterfire/commit/dd3e56c67a2ddad0a11043f00e9d80544d36355a)) + +## 0.2.0+1 + + - Update a dependency to the latest release. + +## 0.2.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**(app-check,web): support for `ReCaptchaEnterpriseProvider`. User facing API updated. ([#11573](https://github.com/firebase/flutterfire/issues/11573)). ([09825edd](https://github.com/firebase/flutterfire/commit/09825edd0e1ecd609e2046fdefda439ce4099087)) + +## 0.1.5+2 + + - Update a dependency to the latest release. + +## 0.1.5+1 + + - Update a dependency to the latest release. + +## 0.1.5 + + - **FEAT**(app-check): support for `getLimitedUseToken()` API ([#11091](https://github.com/firebase/flutterfire/issues/11091)). ([9db9326f](https://github.com/firebase/flutterfire/commit/9db9326fe503c31299c9685449150e809543974e)) + +## 0.1.4+3 + + - Update a dependency to the latest release. + +## 0.1.4+2 + + - Update a dependency to the latest release. + +## 0.1.4+1 + + - Update a dependency to the latest release. + +## 0.1.4 + + - **FEAT**: update dependency constraints to `sdk: '>=2.18.0 <4.0.0'` `flutter: '>=3.3.0'` ([#10946](https://github.com/firebase/flutterfire/issues/10946)). ([2772d10f](https://github.com/firebase/flutterfire/commit/2772d10fe510dcc28ec2d37a26b266c935699fa6)) + - **FEAT**: update libraries to be compatible with Flutter 3.10.0 ([#10944](https://github.com/firebase/flutterfire/issues/10944)). ([e1f5a5ea](https://github.com/firebase/flutterfire/commit/e1f5a5ea798c54f19d1d2f7b8f2250f8819f44b7)) + +## 0.1.3 + + - **FIX**: add support for AGP 8.0 ([#10901](https://github.com/firebase/flutterfire/issues/10901)). ([a3b96735](https://github.com/firebase/flutterfire/commit/a3b967354294c295a9be8d699a6adb7f4b1dba7f)) + - **FEAT**: upgrade to dart 3 compatible dependencies ([#10890](https://github.com/firebase/flutterfire/issues/10890)). ([4bd7e59b](https://github.com/firebase/flutterfire/commit/4bd7e59b1f2b09a2230c49830159342dd4592041)) + +## 0.1.2+3 + + - **FIX**(app-check): use correct `getAppCheckToken()` method. Print out debug token for iOS. ([#10819](https://github.com/firebase/flutterfire/issues/10819)). ([66909a9c](https://github.com/firebase/flutterfire/commit/66909a9c5b10e85f93565cbc308fdbee4ec6f607)) + +## 0.1.2+2 + + - Update a dependency to the latest release. + +## 0.1.2+1 + + - **FIX**(app-check): fix 'Semantic Issue (Xcode): `new` is unavailable' on XCode 14.3 ([#10734](https://github.com/firebase/flutterfire/issues/10734)). ([cc6d1c28](https://github.com/firebase/flutterfire/commit/cc6d1c28193d5cdaaa564729340c380b5f632982)) + +## 0.1.2 + + - **FEAT**: bump dart sdk constraint to 2.18 ([#10618](https://github.com/firebase/flutterfire/issues/10618)). ([f80948a2](https://github.com/firebase/flutterfire/commit/f80948a28b62eead358bdb900d5a0dfb97cebb33)) + +## 0.1.1+14 + + - Update a dependency to the latest release. + +## 0.1.1+13 + + - Update a dependency to the latest release. + +## 0.1.1+12 + + - Update a dependency to the latest release. + +## 0.1.1+11 + + - Update a dependency to the latest release. + +## 0.1.1+10 + + - Update a dependency to the latest release. + +## 0.1.1+9 + + - Update a dependency to the latest release. + +## 0.1.1+8 + + - Update a dependency to the latest release. + +## 0.1.1+7 + + - Update a dependency to the latest release. + +## 0.1.1+6 + + - Update a dependency to the latest release. + +## 0.1.1+5 + + - Update a dependency to the latest release. + +## 0.1.1+4 + + - Update a dependency to the latest release. + +## 0.1.1+3 + + - Update a dependency to the latest release. + +## 0.1.1+2 + + - **REFACTOR**: add `verify` to `QueryPlatform` and change internal `verifyToken` API to `verify` ([#9711](https://github.com/firebase/flutterfire/issues/9711)). ([c99a842f](https://github.com/firebase/flutterfire/commit/c99a842f3e3f5f10246e73f51530cc58c42b49a3)) + +## 0.1.1+1 + + - Update a dependency to the latest release. + +## 0.1.1 + +- Update a dependency to the latest release. + +## 0.1.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: Firebase iOS SDK version: `10.0.0` ([#9708](https://github.com/firebase/flutterfire/issues/9708)). ([9627c56a](https://github.com/firebase/flutterfire/commit/9627c56a37d657d0250b6f6b87d0fec1c31d4ba3)) + +## 0.0.9+1 + + - Update a dependency to the latest release. + +## 0.0.9 + + - **FEAT**: provide `androidDebugProvider` boolean for android debug provider & update app check example app ([#9412](https://github.com/firebase/flutterfire/issues/9412)). ([f1f26748](https://github.com/firebase/flutterfire/commit/f1f26748615c7c9d406e1d3d605e2987e1134ee7)) + +## 0.0.8 + + - **FEAT**: provide `androidDebugProvider` boolean for android debug provider & update app check example app ([#9412](https://github.com/firebase/flutterfire/issues/9412)). ([f1f26748](https://github.com/firebase/flutterfire/commit/f1f26748615c7c9d406e1d3d605e2987e1134ee7)) + +## 0.0.7+2 + + - Update a dependency to the latest release. + +## 0.0.7+1 + + - Update a dependency to the latest release. + +## 0.0.7 + + - **FEAT**: update the example app with webRecaptcha in activate button ([#9373](https://github.com/firebase/flutterfire/issues/9373)). ([1ff76c1b](https://github.com/firebase/flutterfire/commit/1ff76c1b87b623ff21c921d6a6cc2c586cf43ac3)) + - **REFACTOR**: update deprecated `Tasks.call()` to `TaskCompletionSource` API ([#9404](https://github.com/firebase/flutterfire/pull/9404)). ([837d68ea](https://github.com/firebase/flutterfire/commit/5aa9f665e70297fecb88bd0fda5445753470660f)) + +## 0.0.6+20 + + - Update a dependency to the latest release. + +## 0.0.6+19 + + - Update a dependency to the latest release. + +## 0.0.6+18 + + - Update a dependency to the latest release. + +## 0.0.6+17 + + - Update a dependency to the latest release. + +## 0.0.6+16 + + - **FIX**: bump `firebase_core_platform_interface` version to fix previous release. ([bea70ea5](https://github.com/firebase/flutterfire/commit/bea70ea5cbbb62cbfd2a7a74ae3a07cb12b3ee5a)) + +## 0.0.6+15 + + - **DOCS**: separate the first sentence of a doc comment into its own paragraph for `getToken()` (#8968). ([4d487ef7](https://github.com/firebase/flutterfire/commit/4d487ef7abdb9a8333735ced9c40438fef9912a3)) + +## 0.0.6+14 + + - **REFACTOR**: use `firebase.google.com` link for `homepage` in `pubspec.yaml` (#8727). ([41a963b3](https://github.com/firebase/flutterfire/commit/41a963b376ae4ec23e1394bc074f8feee6ae16b2)) + - **REFACTOR**: use "firebase" instead of "FirebaseExtended" as organisation in all links for this repository (#8791). ([d90b8357](https://github.com/firebase/flutterfire/commit/d90b8357db01d65e753021358668f0b129713e6b)) + - **DOCS**: point to "firebase.google" domain for hyperlinks in the usage section of `README.md` files (for the missing packages) (#8818). ([5bda8c92](https://github.com/firebase/flutterfire/commit/5bda8c92be1651a941d1285d36e885ee0b967b11)) + +## 0.0.6+13 + + - **DOCS**: use camel case style for "FlutterFire" in `README.md` (#8747). ([e2a022d7](https://github.com/firebase/flutterfire/commit/e2a022d7427817002e4114eb7434aa6e53384891)) + +## 0.0.6+12 + + - Update a dependency to the latest release. + +## 0.0.6+11 + + - Update a dependency to the latest release. + +## 0.0.6+10 + + - Update a dependency to the latest release. + +## 0.0.6+9 + + - Update a dependency to the latest release. + +## 0.0.6+8 + + - Update a dependency to the latest release. + +## 0.0.6+7 + + - **FIX**: update all Dart SDK version constraints to Dart >= 2.16.0 (#8184). ([df4a5bab](https://github.com/firebase/flutterfire/commit/df4a5bab3c029399b4f257a5dd658d302efe3908)) + +## 0.0.6+6 + + - Update a dependency to the latest release. + +## 0.0.6+5 + + - **FIX**: workaround iOS build issue when targeting platforms < iOS 11. ([c78e0b79](https://github.com/firebase/flutterfire/commit/c78e0b79bde479e78c558d3df92988c130280e81)) + +## 0.0.6+4 + + - **FIX**: bump Android `compileSdkVersion` to 31 (#7726). ([a9562bac](https://github.com/firebase/flutterfire/commit/a9562bac60ba927fb3664a47a7f7eaceb277dca6)) + +## 0.0.6+3 + + - **REFACTOR**: fix all `unnecessary_import` analyzer issues introduced with Flutter 2.8. ([7f0e82c9](https://github.com/firebase/flutterfire/commit/7f0e82c978a3f5a707dd95c7e9136a3e106ff75e)) + +## 0.0.6+2 + + - Update a dependency to the latest release. + +## 0.0.6+1 + + - Update a dependency to the latest release. + +## 0.0.6 + + - **FEAT**: add token apis and documentation (#7419). + +## 0.0.5 + +- **NEW**: Added support for multi-app via the `instanceFor()` method. +- **NEW**: Added support for getting the current App Check token via the `getToken()` method. +- **NEW**: Added support for enabling automatic token refreshing via the `setTokenAutoRefreshEnabled()` method. +- **NEW**: Added support for subscribing to token change events (as a `Stream`) via `onTokenChange`. + +## 0.0.4 + + - **REFACTOR**: migrate remaining examples & e2e tests to null-safety (#7393). + - **FEAT**: automatically inject Firebase JS SDKs (#7359). + +## 0.0.3 + + - **FEAT**: support initializing default `FirebaseApp` instances from Dart (#6549). + +## 0.0.2+4 + + - Update a dependency to the latest release. + +## 0.0.2+3 + + - Update a dependency to the latest release. + +## 0.0.2+2 + + - Update a dependency to the latest release. + +## 0.0.2+1 + + - **DOCS**: using for version `0.0.1` the same markdown headline level as the other versions have in the changelog (#6845). + +## 0.0.2 + + - **STYLE**: enable additional lint rules (#6832). + - **FEAT**: lower iOS & macOS deployment targets for relevant plugins (#6757). + +## 0.0.1+3 + + - Update a dependency to the latest release. + +## 0.0.1+2 + + - Update a dependency to the latest release. + +## 0.0.1+1 + + - Update a dependency to the latest release. + +## 0.0.1 + + - Initial release. diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/LICENSE b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/LICENSE new file mode 100644 index 00000000..88629004 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/README.md new file mode 100644 index 00000000..1d0c9574 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/README.md @@ -0,0 +1,24 @@ +# Firebase App Check for Flutter +[![pub package](https://img.shields.io/pub/v/firebase_app_check.svg)](https://pub.dev/packages/firebase_app_check) + +A Flutter plugin to use the [Firebase App Check API](https://firebase.google.com/docs/app-check/). + +To learn more about Firebase App Check, please visit the [Firebase website](https://firebase.google.com/docs/app-check) + +## Getting Started + +To get started with Firebase App Check for Flutter, please [see the documentation](https://firebase.google.com/docs/app-check/flutter/default-providers). + +## Usage + +To use this plugin, please visit the [App Check Usage documentation](https://firebase.google.com/docs/app-check/flutter/default-providers#initialize) + +## Issues and feedback + +Please file FlutterFire specific issues, bugs, or feature requests in our [issue tracker](https://github.com/firebase/flutterfire/issues/new). + +Plugin issues that are not specific to FlutterFire can be filed in the [Flutter issue tracker](https://github.com/flutter/flutter/issues/new). + +To contribute a change to this plugin, +please review our [contribution guide](https://github.com/firebase/flutterfire/blob/main/CONTRIBUTING.md) +and open a [pull request](https://github.com/firebase/flutterfire/pulls). diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/build.gradle new file mode 100644 index 00000000..cc7c342a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/build.gradle @@ -0,0 +1,94 @@ +group 'io.flutter.plugins.firebase.appcheck' +version '1.0-SNAPSHOT' + +apply plugin: 'com.android.library' +apply from: file("local-config.gradle") + +buildscript { + ext.kotlin_version = "2.0.0" + repositories { + google() + mavenCentral() + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +// AGP 9+ has built-in Kotlin support unless Flutter opts out via android.builtInKotlin=false. +def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int +def builtInKotlin = providers.gradleProperty("android.builtInKotlin") + .map { it.toBoolean() } + .orElse(agpMajor >= 9) + .get() +if (agpMajor < 9 || !builtInKotlin) { + apply plugin: 'kotlin-android' +} + +def firebaseCoreProject = findProject(':firebase_core') +if (firebaseCoreProject == null) { + throw new GradleException('Could not find the firebase_core FlutterFire plugin, have you added it as a dependency in your pubspec?') +} else if (!firebaseCoreProject.properties['FirebaseSDKVersion']) { + throw new GradleException('A newer version of the firebase_core FlutterFire plugin is required, please update your firebase_core pubspec dependency.') +} + +def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { + if (!rootProject.ext.has('FlutterFire')) return firebaseCoreProject.properties[name] + if (!rootProject.ext.get('FlutterFire')[name]) return firebaseCoreProject.properties[name] + return rootProject.ext.get('FlutterFire').get(name) +} + +android { + // Conditional for compatibility with AGP <4.2. + if (project.android.hasProperty("namespace")) { + namespace 'io.flutter.plugins.firebase.appcheck' + } + + compileSdkVersion project.ext.compileSdk + + defaultConfig { + minSdkVersion project.ext.minSdk + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility project.ext.javaVersion + targetCompatibility project.ext.javaVersion + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + buildFeatures { + buildConfig true + } + + lintOptions { + disable 'InvalidPackage' + } + + dependencies { + api firebaseCoreProject + implementation platform("com.google.firebase:firebase-bom:${getRootProjectExtOrCoreProperty("FirebaseSDKVersion", firebaseCoreProject)}") + implementation 'com.google.firebase:firebase-appcheck-debug' + implementation 'com.google.firebase:firebase-appcheck-playintegrity' + implementation 'com.google.firebase:firebase-appcheck-recaptcha' + implementation 'androidx.annotation:annotation:1.7.0' + } +} + +plugins.withId("org.jetbrains.kotlin.android") { + kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.fromTarget(project.ext.javaVersion.toString()) + } + } +} + +apply from: file("./user-agent.gradle") diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties new file mode 100644 index 00000000..d9cf55df --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle new file mode 100644 index 00000000..802b7e1d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle @@ -0,0 +1,7 @@ +ext { + compileSdk=34 + minSdk=23 + targetSdk=34 + javaVersion = JavaVersion.toVersion(17) + androidGradlePluginVersion = '8.3.0' +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle new file mode 100644 index 00000000..11ac1690 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle @@ -0,0 +1,10 @@ +rootProject.name = 'firebase_app_check' + +apply from: file("local-config.gradle") + +pluginManagement { + plugins { + id "com.android.application" version project.ext.androidGradlePluginVersion + id "com.android.library" version project.ext.androidGradlePluginVersion + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..18867831 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt new file mode 100644 index 00000000..99aab95e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt @@ -0,0 +1,161 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import android.os.Handler +import android.os.Looper +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.TaskCompletionSource +import com.google.firebase.FirebaseApp +import com.google.firebase.appcheck.FirebaseAppCheck +import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory +import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory +import com.google.firebase.appcheck.recaptcha.RecaptchaAppCheckProviderFactory +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin +import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry + +class FirebaseAppCheckPlugin : FlutterFirebasePlugin, FlutterPlugin, FirebaseAppCheckHostApi { + + private val streamHandlers: MutableMap = HashMap() + private val eventChannels: MutableMap = HashMap() + private val mainThreadHandler = Handler(Looper.getMainLooper()) + private var messenger: BinaryMessenger? = null + + companion object { + const val METHOD_CHANNEL = "plugins.flutter.io/firebase_app_check" + const val EVENT_CHANNEL_PREFIX = "plugins.flutter.io/firebase_app_check/token/" + } + + override fun onAttachedToEngine(binding: FlutterPluginBinding) { + messenger = binding.binaryMessenger + FirebaseAppCheckHostApi.setUp(binding.binaryMessenger, this) + FlutterFirebasePluginRegistry.registerPlugin(METHOD_CHANNEL, this) + } + + override fun onDetachedFromEngine(binding: FlutterPluginBinding) { + FirebaseAppCheckHostApi.setUp(binding.binaryMessenger, null) + messenger = null + removeEventListeners() + } + + private fun getAppCheck(appName: String): FirebaseAppCheck { + val app = FirebaseApp.getInstance(appName) + return FirebaseAppCheck.getInstance(app) + } + + override fun activate( + appName: String, + androidProvider: String?, + appleProvider: String?, + debugToken: String?, + callback: (Result) -> Unit + ) { + try { + val firebaseAppCheck = getAppCheck(appName) + when (androidProvider) { + "debug" -> { + FlutterFirebaseAppRegistrar.debugToken = debugToken + firebaseAppCheck.installAppCheckProviderFactory( + DebugAppCheckProviderFactory.getInstance()) + } + "recaptcha" -> { + firebaseAppCheck.installAppCheckProviderFactory( + RecaptchaAppCheckProviderFactory.getInstance()) + } + else -> { + firebaseAppCheck.installAppCheckProviderFactory( + PlayIntegrityAppCheckProviderFactory.getInstance()) + } + } + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun getToken( + appName: String, + forceRefresh: Boolean, + callback: (Result) -> Unit + ) { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.getAppCheckToken(forceRefresh).addOnCompleteListener { task -> + if (task.isSuccessful) { + callback(Result.success(task.result?.token)) + } else { + callback(Result.failure(FlutterError("firebase_app_check", task.exception?.message, null))) + } + } + } + + override fun setTokenAutoRefreshEnabled( + appName: String, + isTokenAutoRefreshEnabled: Boolean, + callback: (Result) -> Unit + ) { + try { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled) + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun registerTokenListener(appName: String, callback: (Result) -> Unit) { + try { + val firebaseAppCheck = getAppCheck(appName) + val name = EVENT_CHANNEL_PREFIX + appName + + val handler = TokenChannelStreamHandler(firebaseAppCheck) + val channel = EventChannel(messenger, name) + channel.setStreamHandler(handler) + eventChannels[name] = channel + streamHandlers[name] = handler + + callback(Result.success(name)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun getLimitedUseAppCheckToken(appName: String, callback: (Result) -> Unit) { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.limitedUseAppCheckToken.addOnCompleteListener { task -> + if (task.isSuccessful) { + callback(Result.success(task.result?.token ?: "")) + } else { + callback(Result.failure(FlutterError("firebase_app_check", task.exception?.message, null))) + } + } + } + + override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> { + val taskCompletionSource = TaskCompletionSource>() + taskCompletionSource.setResult(HashMap()) + return taskCompletionSource.task + } + + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() + removeEventListeners() + taskCompletionSource.setResult(null) + return taskCompletionSource.task + } + + private fun removeEventListeners() { + for ((name, channel) in eventChannels) { + channel.setStreamHandler(null) + } + for ((name, handler) in streamHandlers) { + handler.onCancel(null) + } + eventChannels.clear() + streamHandlers.clear() + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt new file mode 100644 index 00000000..1f1087b1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt @@ -0,0 +1,37 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import androidx.annotation.Keep +import com.google.firebase.appcheck.debug.InternalDebugSecretProvider +import com.google.firebase.components.Component +import com.google.firebase.components.ComponentRegistrar +import com.google.firebase.platforminfo.LibraryVersionComponent + +@Keep +class FlutterFirebaseAppRegistrar : ComponentRegistrar, InternalDebugSecretProvider { + + companion object { + private const val DEBUG_SECRET_NAME = "fire-app-check-debug-secret" + + @JvmStatic var debugToken: String? = null + } + + override fun getComponents(): List> { + val library = + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION) + + val debugSecretProvider = + Component.builder(InternalDebugSecretProvider::class.java) + .name(DEBUG_SECRET_NAME) + .factory { this } + .build() + + return listOf(library, debugSecretProvider) + } + + override fun getDebugSecret(): String? { + return debugToken + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt new file mode 100644 index 00000000..4cd7a39b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt @@ -0,0 +1,223 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon +@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") + +package io.flutter.plugins.firebase.appcheck + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer + +private object GeneratedAndroidFirebaseAppCheckPigeonUtils { + + fun wrapResult(result: Any?): List { + return listOf(result) + } + + fun wrapError(exception: Throwable): List { + return if (exception is FlutterError) { + listOf(exception.code, exception.message, exception.details) + } else { + listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)) + } + } +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class FlutterError( + val code: String, + override val message: String? = null, + val details: Any? = null +) : RuntimeException() + +private open class GeneratedAndroidFirebaseAppCheckPigeonCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return super.readValueOfType(type, buffer) + } + + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + super.writeValue(stream, value) + } +} + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface FirebaseAppCheckHostApi { + fun activate( + appName: String, + androidProvider: String?, + appleProvider: String?, + debugToken: String?, + callback: (Result) -> Unit + ) + + fun getToken(appName: String, forceRefresh: Boolean, callback: (Result) -> Unit) + + fun setTokenAutoRefreshEnabled( + appName: String, + isTokenAutoRefreshEnabled: Boolean, + callback: (Result) -> Unit + ) + + fun registerTokenListener(appName: String, callback: (Result) -> Unit) + + fun getLimitedUseAppCheckToken(appName: String, callback: (Result) -> Unit) + + companion object { + /** The codec used by FirebaseAppCheckHostApi. */ + val codec: MessageCodec by lazy { GeneratedAndroidFirebaseAppCheckPigeonCodec() } + /** + * Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + * `binaryMessenger`. + */ + @JvmOverloads + fun setUp( + binaryMessenger: BinaryMessenger, + api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + val separatedMessageChannelSuffix = + if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val androidProviderArg = args[1] as String? + val appleProviderArg = args[2] as String? + val debugTokenArg = args[3] as String? + api.activate(appNameArg, androidProviderArg, appleProviderArg, debugTokenArg) { + result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val forceRefreshArg = args[1] as Boolean + api.getToken(appNameArg, forceRefreshArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val isTokenAutoRefreshEnabledArg = args[1] as Boolean + api.setTokenAutoRefreshEnabled(appNameArg, isTokenAutoRefreshEnabledArg) { + result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + api.registerTokenListener(appNameArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + api.getLimitedUseAppCheckToken(appNameArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt new file mode 100644 index 00000000..81d1b83e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt @@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import com.google.firebase.appcheck.FirebaseAppCheck +import io.flutter.plugin.common.EventChannel + +class TokenChannelStreamHandler(private val firebaseAppCheck: FirebaseAppCheck) : + EventChannel.StreamHandler { + + private var listener: FirebaseAppCheck.AppCheckListener? = null + + override fun onListen(arguments: Any?, events: EventChannel.EventSink) { + listener = + FirebaseAppCheck.AppCheckListener { result -> + val event = HashMap() + event["token"] = result.token + events.success(event) + } + firebaseAppCheck.addAppCheckListener(listener!!) + } + + override fun onCancel(arguments: Any?) { + listener?.let { + firebaseAppCheck.removeAppCheckListener(it) + listener = null + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle new file mode 100644 index 00000000..7b9c028a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle @@ -0,0 +1,22 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +String libraryVersionName = "UNKNOWN" +String libraryName = "flutter-fire-app-check" +File pubspec = new File(project.projectDir.parentFile, 'pubspec.yaml') + +if (pubspec.exists()) { + String yaml = pubspec.text + // Using \s*['|"]?([^\n|'|"]*)['|"]? to extract version number. + Matcher versionMatcher = Pattern.compile("^version:\\s*['|\"]?([^\\n|'|\"]*)['|\"]?\$", Pattern.MULTILINE).matcher(yaml) + if (versionMatcher.find()) libraryVersionName = versionMatcher.group(1).replaceAll("\\+", "-") +} + +android { + defaultConfig { + // BuildConfig.VERSION_NAME + buildConfigField 'String', 'LIBRARY_VERSION', "\"${libraryVersionName}\"" + // BuildConfig.LIBRARY_NAME + buildConfigField 'String', 'LIBRARY_NAME', "\"${libraryName}\"" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/README.md new file mode 100644 index 00000000..595e1145 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/README.md @@ -0,0 +1,8 @@ +# firebase_app_check_example + +Demonstrates how to use the firebase_app_check plugin. + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](https://flutter.dev/). diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml new file mode 100644 index 00000000..b6cd704f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml @@ -0,0 +1,10 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# in the LICENSE file. + +include: ../../../../analysis_options.yaml +linter: + rules: + avoid_print: false + depend_on_referenced_packages: false + library_private_types_in_public_api: false diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle new file mode 100644 index 00000000..92298e72 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle @@ -0,0 +1,65 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} +apply from: file("../../../android/local-config.gradle") + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "io.flutter.plugins.firebase.appcheck.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = project.ext.javaVersion + targetCompatibility = project.ext.javaVersion + } + + kotlinOptions { + jvmTarget = "17" + } + + defaultConfig { + applicationId = "io.flutter.plugins.firebase.appcheck.example" + // 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. + minSdkVersion = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json new file mode 100644 index 00000000..6b7e0408 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json @@ -0,0 +1,615 @@ +{ + "project_info": { + "project_number": "406099696497", + "firebase_url": "https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app", + "project_id": "flutterfire-e2e-tests", + "storage_bucket": "flutterfire-e2e-tests.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:d86a91cc7b338b233574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.analytics.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:a241c4b471513a203574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-7bvmqp0fffe24vm2arng0dtdeh2tvkgl.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:21d5142deea38dda3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.auth.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-emmujnd7g2ammh5uu9ni6v04p4ateqac.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-in8bfp0nali85oul1o98huoar6eo1vv1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:3ef965ff044efc0b3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.database.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:40da41183cb3d3ff3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:175ea7a64b2faf5e3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firestore.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:7ca3394493cc601a3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.functions.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-tvtvuiqogct1gs1s6lh114jeps7hpjm5.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:6d1c1fbf4688f39c3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.installations.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:74ebb073d7727cd43574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.messaging.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:f54b85cfa36a39f73574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.remoteconfig.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0d4ed619c031c0ac3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.tests" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ib9hj9281l3343cm3nfvvdotaojrthdc.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-lc54d5l8sp90k39r0bb39ovsgo1s9bek.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:899c6485cfce26c13574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase_ui_example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ltgvphphcckosvqhituel5km2k3aecg8.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase_ui_example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:bc0b12b0605df8633574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecoreexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0f3f7bfe78b8b7103574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:2751af6868a69f073574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasestorageexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74a78b93 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt new file mode 100644 index 00000000..fd3526f1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt @@ -0,0 +1,5 @@ +package io.flutter.plugins.firebase.appcheck.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle new file mode 100644 index 00000000..d2ffbffa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties new file mode 100644 index 00000000..3c0f502f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true +androidGradlePluginVersion=8.3.0 \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle new file mode 100644 index 00000000..4fb566e9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "${androidGradlePluginVersion}" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "2.1.0" apply false +} + +include ":app" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..391a902b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile new file mode 100644 index 00000000..620e46eb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..1ef35c77 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,553 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4627F94B299406540090DA25 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4632D5BC275CD47A0059DC83 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 46A64A032996811C003FC4F3 /* RunnerRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerRelease.entitlements; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + F919868105D7CB93D33CAD83 /* Pods */, + BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 46A64A032996811C003FC4F3 /* RunnerRelease.entitlements */, + 4632D5BC275CD47A0059DC83 /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + F919868105D7CB93D33CAD83 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 46A64A04299681F5003FC4F3 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4627F94B299406540090DA25 /* GoogleService-Info.plist in Resources */, + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 46A64A04299681F5003FC4F3 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\necho \"YYYYYYYY: ${CONFIGURATION}\"\n"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..8a6c683e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h new file mode 100644 index 00000000..01e6e1d4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m new file mode 100644 index 00000000..7171162c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m @@ -0,0 +1,16 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" +@import Firebase; + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (void)didInitializeImplicitFlutterEngine:(NSObject *)engineBridge { + [GeneratedPluginRegistrant registerWithRegistry:engineBridge.pluginRegistry]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..7e2f0dcb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-17cfsesi620nhia0sck4map450gngkoh + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.appcheck.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:bd8702ba3865bb333574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist new file mode 100644 index 00000000..3a8a7a2f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIApplicationSupportsIndirectInputEvents + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..70084b41 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.devicecheck.appattest-environment + development + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements new file mode 100644 index 00000000..70084b41 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.devicecheck.appattest-environment + development + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m new file mode 100644 index 00000000..dff6597e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json new file mode 100644 index 00000000..ab0e60a0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:bd8702ba3865bb333574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart new file mode 100644 index 00000000..8bbd98af --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart @@ -0,0 +1,98 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return web; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyB7wZb2tO1-Fs6GbDADUSTs2Qs3w08Hovw', + appId: '1:406099696497:web:87e25e51afe982cd3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + authDomain: 'flutterfire-e2e-tests.firebaseapp.com', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + measurementId: 'G-JN95N1JV2E', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw', + appId: '1:406099696497:android:a241c4b471513a203574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:bd8702ba3865bb333574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.appcheck.example', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:bd8702ba3865bb333574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.appcheck.example', + ); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart new file mode 100644 index 00000000..8f26c643 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart @@ -0,0 +1,249 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// ignore_for_file: do_not_use_environment + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_app_check/firebase_app_check.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'firebase_options.dart'; + +const kWebRecaptchaSiteKey = '6Lemcn0dAAAAABLkf6aiiHvpGD6x-zF3nOSDU2M8'; + +// Windows: create a debug token in the Firebase Console +// (App Check > Apps > Manage debug tokens), then paste it here +// or set the APP_CHECK_DEBUG_TOKEN environment variable. +const kWindowsDebugToken = String.fromEnvironment( + 'APP_CHECK_DEBUG_TOKEN', + // ignore: avoid_redundant_argument_values + defaultValue: '', +); + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + + // Activate app check after initialization, but before + // usage of any Firebase services. + await FirebaseAppCheck.instance.activate( + providerWeb: kDebugMode + ? WebDebugProvider() + : ReCaptchaV3Provider(kWebRecaptchaSiteKey), + providerAndroid: const AndroidDebugProvider(), + providerApple: const AppleDebugProvider(), + // On Windows, only the debug provider is available. + // You must supply a debug token — the desktop C++ SDK does not + // auto-generate one. Create one in the Firebase Console under + // App Check > Apps > Manage debug tokens, then either: + // - pass it via --dart-define=APP_CHECK_DEBUG_TOKEN= + // - or set the APP_CHECK_DEBUG_TOKEN environment variable + providerWindows: WindowsDebugProvider( + debugToken: kWindowsDebugToken.isNotEmpty ? kWindowsDebugToken : null, + ), + ); + + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + final String title = 'Firebase App Check'; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Firebase App Check', + home: FirebaseAppCheckExample(title: title), + ); + } +} + +class FirebaseAppCheckExample extends StatefulWidget { + FirebaseAppCheckExample({ + Key? key, + required this.title, + }) : super(key: key); + + final String title; + + @override + _FirebaseAppCheck createState() => _FirebaseAppCheck(); +} + +class _FirebaseAppCheck extends State { + final appCheck = FirebaseAppCheck.instance; + String _message = ''; + String _eventToken = 'not yet'; + + @override + void initState() { + appCheck.onTokenChange.listen(setEventToken); + super.initState(); + } + + void setMessage(String message) { + setState(() { + _message = message; + }); + } + + void setEventToken(String? token) { + setState(() { + _eventToken = token ?? 'not yet'; + }); + } + + Future _activate({ + AndroidAppCheckProvider? android, + AppleAppCheckProvider? apple, + WindowsAppCheckProvider? windows, + }) async { + try { + await appCheck.activate( + providerAndroid: android ?? const AndroidPlayIntegrityProvider(), + providerApple: apple ?? const AppleDeviceCheckProvider(), + providerWeb: ReCaptchaV3Provider(kWebRecaptchaSiteKey), + providerWindows: windows ?? const WindowsDebugProvider(), + ); + final providerName = windows?.runtimeType.toString() ?? + apple?.runtimeType.toString() ?? + android?.runtimeType.toString() ?? + 'default'; + setMessage('Activated with $providerName'); + } catch (e) { + setMessage('activate error: $e'); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Text( + 'Providers', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () => _activate( + android: const AndroidDebugProvider(), + apple: const AppleDebugProvider(), + windows: WindowsDebugProvider( + debugToken: + kWindowsDebugToken.isNotEmpty ? kWindowsDebugToken : null, + ), + ), + child: const Text('activate(Debug)'), + ), + ElevatedButton( + onPressed: () => _activate( + android: const AndroidPlayIntegrityProvider(), + apple: const AppleDeviceCheckProvider(), + ), + child: const Text('activate(PlayIntegrity / DeviceCheck)'), + ), + if (!kIsWeb) + ElevatedButton( + onPressed: () => _activate( + apple: const AppleAppAttestProvider(), + ), + child: const Text('activate(AppAttest)'), + ), + if (!kIsWeb) + ElevatedButton( + onPressed: () => _activate( + apple: const AppleAppAttestWithDeviceCheckFallbackProvider(), + ), + child: const Text( + 'activate(AppAttest + DeviceCheck fallback)', + ), + ), + const SizedBox(height: 16), + const Text( + 'Actions', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () async { + try { + final token = await appCheck.getToken(true); + setMessage('Token: ${token?.substring(0, 20)}...'); + } catch (e) { + setMessage('getToken error: $e'); + } + }, + child: const Text('getToken(forceRefresh: true)'), + ), + ElevatedButton( + onPressed: () async { + try { + final token = await appCheck.getLimitedUseToken(); + setMessage( + 'Limited use token: ${token.substring(0, 20)}...', + ); + } catch (e) { + setMessage('getLimitedUseToken error: $e'); + } + }, + child: const Text('getLimitedUseToken()'), + ), + ElevatedButton( + onPressed: () async { + await appCheck.setTokenAutoRefreshEnabled(true); + setMessage('Token auto-refresh enabled'); + }, + child: const Text('setTokenAutoRefreshEnabled(true)'), + ), + ElevatedButton( + onPressed: () async { + try { + final result = await FirebaseFirestore.instance + .collection('flutter-tests') + .limit(1) + .get(); + setMessage( + result.docs.isNotEmpty + ? 'Firestore: Document found' + : 'Firestore: No documents', + ); + } catch (e) { + setMessage('Firestore error: $e'); + } + }, + child: const Text('Test Firestore with App Check'), + ), + const SizedBox(height: 20), + Text( + _message, + style: const TextStyle( + color: Color.fromRGBO(47, 79, 79, 1), + fontSize: 16, + ), + ), + const SizedBox(height: 20), + Text( + 'Token from onTokenChange: $_eventToken', + style: const TextStyle( + color: Color.fromRGBO(128, 0, 128, 1), + fontSize: 14, + ), + ), + ], + ), + ), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile new file mode 100644 index 00000000..ff5ddb3b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c0dc3860 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,613 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 25624AEC275E1E7900B1E491 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0DC934EE60634F0D37DD0EC3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = firebase_app_check_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + 74CB5F55BD11E25520F6FF45 /* Pods */, + 0DC934EE60634F0D37DD0EC3 /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */, + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + 74CB5F55BD11E25520F6FF45 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 25624AEC275E1E7900B1E491 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..92a5c6f9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..800dd3d2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = firebase_app_check_example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 io.flutter.plugins.firebase.appcheck.example. All rights reserved. diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..7e2f0dcb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-17cfsesi620nhia0sck4map450gngkoh + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.appcheck.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:bd8702ba3865bb333574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json new file mode 100644 index 00000000..ab0e60a0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:bd8702ba3865bb333574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml new file mode 100644 index 00000000..c652ec30 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml @@ -0,0 +1,21 @@ +name: firebase_app_check_example +description: Firebase App Check example application. + +publish_to: 'none' + +version: 1.0.0+1 +resolution: workspace + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + cloud_firestore: ^6.6.0 + firebase_app_check: ^0.4.5 + firebase_core: ^4.11.0 + flutter: + sdk: flutter + +flutter: + uses-material-design: true diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/index.html b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/index.html new file mode 100644 index 00000000..e619aadd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/index.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + flutterfire_app_check + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json new file mode 100644 index 00000000..a5a5ebda --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutterfire_app_check", + "short_name": "flutterfire_app_check", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt new file mode 100644 index 00000000..ffc5f0c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(firebase_app_check_example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_app_check_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc new file mode 100644 index 00000000..26d198ff --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "io.flutter.plugins.firebase.appcheck" "\0" + VALUE "FileDescription", "firebase_app_check_example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "firebase_app_check_example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 io.flutter.plugins.firebase.appcheck. All rights reserved." "\0" + VALUE "OriginalFilename", "firebase_app_check_example.exe" "\0" + VALUE "ProductName", "firebase_app_check_example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..d1bd86f4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp @@ -0,0 +1,73 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..243c8352 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h @@ -0,0 +1,37 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp new file mode 100644 index 00000000..129ed2c3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp @@ -0,0 +1,46 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t* command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"firebase_app_check_example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h new file mode 100644 index 00000000..91d70fa3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h @@ -0,0 +1,20 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..153653e8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp new file mode 100644 index 00000000..3b134475 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp @@ -0,0 +1,69 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE* unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = + ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, + nullptr, 0, nullptr, nullptr) - + 1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, + utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h new file mode 100644 index 00000000..8ec0c44d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h @@ -0,0 +1,23 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..82754b04 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp @@ -0,0 +1,284 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: +/// https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = + L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { ++g_active_window_count; } + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { return window_handle_; } + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = + RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, + &light_mode, &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h new file mode 100644 index 00000000..dd242548 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h @@ -0,0 +1,104 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec new file mode 100644 index 00000000..b4d81500 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec @@ -0,0 +1,46 @@ +require 'yaml' +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + s.source_files = 'firebase_app_check/Sources/firebase_app_check/**/*.swift' + s.ios.deployment_target = '15.0' + + # Flutter dependencies + s.dependency 'Flutter' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'FirebaseAppCheck', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-appcheck\\\"", + 'DEFINES_MODULE' => 'YES', + # Flutter.framework does not contain a i386 slice. + 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' + } +end + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift new file mode 100644 index 00000000..ffee709b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_app_check", + platforms: [ + .iOS("15.0") + ], + products: [ + .library(name: "firebase-app-check", targets: ["firebase_app_check"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package( + url: "https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk.git", + from: "18.0.0" + ), + .package(name: "firebase_core", path: "../firebase_core-4.11.0"), + ], + targets: [ + .target( + name: "firebase_app_check", + dependencies: [ + .product(name: "FirebaseAppCheck", package: "firebase-ios-sdk"), + .product(name: "RecaptchaEnterprise", package: "recaptcha-enterprise-mobile-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ] + ) + ] +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift new file mode 100644 index 00000000..28a2ec57 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift @@ -0,0 +1,6 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Auto-generated file. Do not edit. +public let versionNumber = "0.4.5" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift new file mode 100644 index 00000000..d8f3a100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift @@ -0,0 +1,236 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(Swift.type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {} + +private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {} + +private class FirebaseAppCheckMessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + FirebaseAppCheckMessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + FirebaseAppCheckMessagesPigeonCodecWriter(data: data) + } +} + +class FirebaseAppCheckMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = FirebaseAppCheckMessagesPigeonCodec( + readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter() + ) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseAppCheckHostApi { + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void) + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void) + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void) + func registerTokenListener(appName: String, completion: @escaping (Result) -> Void) + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseAppCheckHostApiSetup { + static var codec: FlutterStandardMessageCodec { + FirebaseAppCheckMessagesPigeonCodec.shared + } + + /// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + /// `binaryMessenger`. + static func setUp( + binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let activateChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + activateChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let androidProviderArg: String? = nilOrValue(args[1]) + let appleProviderArg: String? = nilOrValue(args[2]) + let debugTokenArg: String? = nilOrValue(args[3]) + api.activate( + appName: appNameArg, androidProvider: androidProviderArg, appleProvider: appleProviderArg, + debugToken: debugTokenArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + activateChannel.setMessageHandler(nil) + } + let getTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let forceRefreshArg = args[1] as! Bool + api.getToken(appName: appNameArg, forceRefresh: forceRefreshArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getTokenChannel.setMessageHandler(nil) + } + let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + setTokenAutoRefreshEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let isTokenAutoRefreshEnabledArg = args[1] as! Bool + api.setTokenAutoRefreshEnabled( + appName: appNameArg, isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setTokenAutoRefreshEnabledChannel.setMessageHandler(nil) + } + let registerTokenListenerChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + registerTokenListenerChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.registerTokenListener(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + registerTokenListenerChannel.setMessageHandler(nil) + } + let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getLimitedUseAppCheckTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.getLimitedUseAppCheckToken(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getLimitedUseAppCheckTokenChannel.setMessageHandler(nil) + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift new file mode 100644 index 00000000..2d63a765 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseAppCheck +import FirebaseCore + +#if canImport(FlutterMacOS) + import FlutterMacOS +#else + import Flutter +#endif + +#if canImport(firebase_core) + import firebase_core +#else + import firebase_core_shared +#endif + +let kFirebaseAppCheckChannelName = "plugins.flutter.io/firebase_app_check" +let kFirebaseAppCheckTokenChannelPrefix = "plugins.flutter.io/firebase_app_check/token/" + +// swift-format-ignore: AvoidRetroactiveConformances +extension FlutterError: @retroactive Error {} + +public class FirebaseAppCheckPlugin: NSObject, FlutterPlugin, + FLTFirebasePluginProtocol, FirebaseAppCheckHostApi +{ + private var eventChannels: [String: FlutterEventChannel] = [:] + private var streamHandlers: [String: AppCheckTokenStreamHandler] = [:] + private var providerFactory: FlutterAppCheckProviderFactory? + + static let shared: FirebaseAppCheckPlugin = { + let instance = FirebaseAppCheckPlugin() + instance.providerFactory = FlutterAppCheckProviderFactory() + AppCheck.setAppCheckProviderFactory(instance.providerFactory) + FLTFirebasePluginRegistry.sharedInstance().register(instance) + return instance + }() + + public static func register(with registrar: FlutterPluginRegistrar) { + let binaryMessenger: FlutterBinaryMessenger + + #if os(macOS) + binaryMessenger = registrar.messenger + #elseif os(iOS) + binaryMessenger = registrar.messenger() + #endif + + let instance = shared + instance.binaryMessenger = binaryMessenger + FirebaseAppCheckHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: instance) + + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: instance.firebaseLibraryName(), + with: instance.firebaseLibraryVersion() + ) + } + } + + private var binaryMessenger: FlutterBinaryMessenger? + + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName) else { + completion( + .failure( + FlutterError( + code: "unknown", message: "Firebase app not found: \(appName)", details: nil + ) + ) + ) + return + } + let provider = appleProvider ?? "deviceCheck" + + providerFactory?.configure( + app: app, + providerName: provider, + debugToken: debugToken + ) + + completion(.success(())) + } + + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.token(forcingRefresh: forceRefresh) { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token)) + } + } + } + + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + appCheck.isTokenAutoRefreshEnabled = isTokenAutoRefreshEnabled + completion(.success(())) + } + + func registerTokenListener( + appName: String, + completion: @escaping (Result) -> Void + ) { + let name = kFirebaseAppCheckTokenChannelPrefix + appName + + guard let messenger = binaryMessenger else { + completion( + .failure( + FlutterError( + code: "no-messenger", + message: "Binary messenger not available", + details: nil + ) + ) + ) + return + } + + let channel = FlutterEventChannel(name: name, binaryMessenger: messenger) + let handler = AppCheckTokenStreamHandler() + channel.setStreamHandler(handler) + + eventChannels[name] = channel + streamHandlers[name] = handler + + completion(.success(name)) + } + + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.limitedUseToken { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token ?? "")) + } + } + } + + // MARK: - FLTFirebasePluginProtocol + + public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + for (_, channel) in eventChannels { + channel.setStreamHandler(nil) + } + for (_, handler) in streamHandlers { + _ = handler.onCancel(withArguments: nil) + } + eventChannels.removeAll() + streamHandlers.removeAll() + completion() + } + + public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + [:] + } + + public func firebaseLibraryName() -> String { + "flutter-fire-appcheck" + } + + public func firebaseLibraryVersion() -> String { + versionNumber + } + + public func flutterChannelName() -> String { + kFirebaseAppCheckChannelName + } + + private func createFlutterError(_ error: Error) -> FlutterError { + let nsError = error as NSError + var code = "unknown" + switch nsError.code { + case 0: // FIRAppCheckErrorCodeServerUnreachable + code = "server-unreachable" + case 1: // FIRAppCheckErrorCodeInvalidConfiguration + code = "invalid-configuration" + case 2: // FIRAppCheckErrorCodeKeychain + code = "code-keychain" + case 3: // FIRAppCheckErrorCodeUnsupported + code = "code-unsupported" + default: + code = "unknown" + } + return FlutterError( + code: code, + message: nsError.localizedDescription, + details: nil + ) + } +} + +// MARK: - Token Stream Handler + +class AppCheckTokenStreamHandler: NSObject, FlutterStreamHandler { + private var observer: NSObjectProtocol? + + func onListen( + withArguments arguments: Any?, + eventSink events: @escaping FlutterEventSink + ) -> FlutterError? { + observer = NotificationCenter.default.addObserver( + forName: NSNotification.Name("FIRAppCheckAppCheckTokenDidChangeNotification"), + object: nil, + queue: nil + ) { notification in + if let token = notification.userInfo?["FIRAppCheckTokenNotificationKey"] as? String { + events(["token": token]) + } + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + if let observer { + NotificationCenter.default.removeObserver(observer) + self.observer = nil + } + return nil + } +} + +// MARK: - App Check Provider Factory + +class FlutterAppCheckProviderFactory: NSObject, AppCheckProviderFactory { + private var providers: [String: AppCheckProviderWrapper] = [:] + + func createProvider(with app: FirebaseApp) -> (any AppCheckProvider)? { + if providers[app.name] == nil { + let wrapper = AppCheckProviderWrapper() + // Default to deviceCheck. activate() will reconfigure with the correct provider. + wrapper.configure( + app: app, + providerName: "deviceCheck", + debugToken: nil + ) + providers[app.name] = wrapper + } + return providers[app.name] + } + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + if providers[app.name] == nil { + providers[app.name] = AppCheckProviderWrapper() + } + providers[app.name]?.configure( + app: app, + providerName: providerName, + debugToken: debugToken + ) + } +} + +class AppCheckProviderWrapper: NSObject, AppCheckProvider { + private var delegateProvider: (any AppCheckProvider)? + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + switch providerName { + case "debug": + if let debugToken { + setenv("FIRAAppCheckDebugToken", debugToken, 1) + } + delegateProvider = AppCheckDebugProvider(app: app) + if debugToken == nil, let debugProvider = delegateProvider as? AppCheckDebugProvider { + print("Firebase App Check Debug Token: \(debugProvider.localDebugToken())") + } + case "appAttest": + if #available(iOS 14.0, macOS 14.0, macCatalyst 14.0, tvOS 15.0, watchOS 9.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = AppCheckDebugProvider(app: app) + } + case "appAttestWithDeviceCheckFallback": + if #available(iOS 14.0, macOS 14.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = DeviceCheckProvider(app: app) + } + case "recaptcha": + #if os(iOS) + delegateProvider = RecaptchaProvider(app: app) + if delegateProvider == nil { + print( + "Firebase App Check: failed to initialize RecaptchaProvider. Ensure site key is in GoogleService-Info.plist." + ) + } + #else + print("Firebase App Check: reCAPTCHA is only supported on iOS.") + #endif + default: + // deviceCheck + delegateProvider = DeviceCheckProvider(app: app) + } + } + + func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) { + guard let delegateProvider else { + handler( + nil, + NSError( + domain: "firebase_app_check", code: -1, + userInfo: [NSLocalizedDescriptionKey: "Provider not configured"] + ) + ) + return + } + delegateProvider.getToken(completion: handler) + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart new file mode 100644 index 00000000..5e6a8cc9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart @@ -0,0 +1,34 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_app_check_platform_interface/firebase_app_check_platform_interface.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; + +export 'package:firebase_app_check_platform_interface/firebase_app_check_platform_interface.dart' + show + AndroidProvider, + AndroidAppCheckProvider, + AndroidDebugProvider, + AndroidPlayIntegrityProvider, + AndroidReCaptchaProvider, + AppleProvider, + AppleAppCheckProvider, + AppleDebugProvider, + AppleDeviceCheckProvider, + AppleAppAttestProvider, + AppleAppAttestWithDeviceCheckFallbackProvider, + AppleReCaptchaProvider, + ReCaptchaEnterpriseProvider, + ReCaptchaV3Provider, + WebDebugProvider, + WebProvider, + WebReCaptchaProvider, + WindowsAppCheckProvider, + WindowsDebugProvider; +export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' + show FirebaseException; + +part 'src/firebase_app_check.dart'; diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart new file mode 100644 index 00000000..8deabfc9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart @@ -0,0 +1,156 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_app_check.dart'; + +class FirebaseAppCheck extends FirebasePluginPlatform + implements FirebaseService { + static Map _firebaseAppCheckInstances = {}; + + FirebaseAppCheck._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_app_check'); + + /// The [FirebaseApp] for this current [FirebaseAppCheck] instance. + FirebaseApp app; + + // Cached and lazily loaded instance of [FirebaseAppCheckPlatform] to avoid + // creating a [MethodChannelFirebaseAppCheck] when not needed or creating an + // instance with the default app before a user specifies an app. + FirebaseAppCheckPlatform? _delegatePackingProperty; + + /// Returns the underlying delegate implementation. + /// + /// If called and no [_delegatePackingProperty] exists, it will first be + /// created and assigned before returning the delegate. + FirebaseAppCheckPlatform get _delegate { + _delegatePackingProperty ??= FirebaseAppCheckPlatform.instanceFor( + app: app, + ); + + return _delegatePackingProperty!; + } + + /// Returns an instance using the default [FirebaseApp]. + static FirebaseAppCheck get instance { + FirebaseApp defaultAppInstance = Firebase.app(); + + return FirebaseAppCheck.instanceFor(app: defaultAppInstance); + } + + /// Returns an instance using a specified [FirebaseApp]. + static FirebaseAppCheck instanceFor({required FirebaseApp app}) { + return _firebaseAppCheckInstances.putIfAbsent(app.name, () { + final instance = FirebaseAppCheck._(app: app); + app.registerService( + instance, + dispose: (appCheck) => appCheck._dispose(), + ); + return instance; + }); + } + + Future _dispose() async { + _firebaseAppCheckInstances.remove(app.name); + final delegate = _delegatePackingProperty; + _delegatePackingProperty = null; + await delegate?.dispose(); + } + + /// Activates the Firebase App Check service. + /// + /// ## Platform Configuration + /// + /// **Web**: Provide the reCAPTCHA v3 Site Key using `webProvider`, which can be + /// found in the Firebase Console. + /// + /// **Android**: The default provider is "play integrity". Use `providerAndroid` + /// to configure alternative providers such as "safety net", debug providers, or + /// custom implementations via `AndroidAppCheckProvider`. + /// + /// **iOS/macOS**: The default provider is "device check". Use `providerApple` + /// to configure alternative providers such as "app attest", debug providers, or + /// "app attest with fallback to device check" via `AppleAppCheckProvider`. + /// Note: App Attest is only available on iOS 14.0+ and macOS 14.0+. + /// + /// **Windows**: Only the debug provider is supported. You **must** supply a + /// debug token — the desktop C++ SDK does not auto-generate one. Either pass + /// it via `providerWindows: WindowsDebugProvider(debugToken: 'your-token')` + /// or set the `APP_CHECK_DEBUG_TOKEN` environment variable. The token must + /// first be registered in the Firebase Console under + /// *App Check → Apps → Manage debug tokens*. + /// + /// ## Migration Notice + /// + /// The `androidProvider` and `appleProvider` parameters will be deprecated + /// in a future release. Use `providerAndroid` and `providerApple` instead, + /// which support the new provider classes including `AndroidDebugProvider` + /// and `AppleDebugProvider` for passing debug tokens directly. + /// + /// For more information, see [the Firebase Documentation](https://firebase.google.com/docs/app-check) + Future activate({ + @Deprecated( + 'Use providerWeb instead. ' + 'This parameter will be removed in a future major release.', + ) + WebProvider? webProvider, + WebProvider? providerWeb, + @Deprecated( + 'Use providerAndroid instead. ' + 'This parameter will be removed in a future major release.', + ) + AndroidProvider androidProvider = AndroidProvider.playIntegrity, + @Deprecated( + 'Use providerApple instead. ' + 'This parameter will be removed in a future major release.', + ) + AppleProvider appleProvider = AppleProvider.deviceCheck, + AndroidAppCheckProvider providerAndroid = + const AndroidPlayIntegrityProvider(), + AppleAppCheckProvider providerApple = const AppleDeviceCheckProvider(), + WindowsAppCheckProvider providerWindows = const WindowsDebugProvider(), + }) { + return _delegate.activate( + webProvider: providerWeb ?? webProvider, + // ignore: deprecated_member_use + androidProvider: androidProvider, + // ignore: deprecated_member_use + appleProvider: appleProvider, + providerAndroid: providerAndroid, + providerApple: providerApple, + providerWindows: providerWindows, + ); + } + + /// Get the current App Check token. + /// + /// Attaches to the most recent in-flight request if one is present. Returns + /// null if no token is present and no token requests are in-flight. + /// + /// If `forceRefresh` is true, will always try to fetch a fresh token. If + /// false, will use a cached token if found in storage. + Future getToken([bool? forceRefresh]) async { + return _delegate.getToken(forceRefresh ?? false); + } + + /// If true, the SDK automatically refreshes App Check tokens as needed. + Future setTokenAutoRefreshEnabled(bool isTokenAutoRefreshEnabled) { + return _delegate.setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled); + } + + /// Requests a limited-use Firebase App Check token. This method should be used only + /// if you need to authorize requests to a non-Firebase backend. + // + // Returns limited-use tokens that are intended for use with your non-Firebase backend + // endpoints that are protected with Replay Protection. This method does not affect + // the token generation behavior of the `getToken()` method. + Future getLimitedUseToken() { + return _delegate.getLimitedUseToken(); + } + + /// Registers a listener to changes in the token state. + Stream get onTokenChange { + return _delegate.onTokenChange; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec new file mode 100644 index 00000000..497fbc64 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec @@ -0,0 +1,63 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +begin + required_macos_version = "10.15" + current_target_definition = Pod::Config.instance.podfile.send(:current_target_definition) + user_osx_target = current_target_definition.to_hash["platform"]["osx"] + if (Gem::Version.new(user_osx_target) < Gem::Version.new(required_macos_version)) + error_message = "The FlutterFire plugin #{pubspec['name']} for macOS requires a macOS deployment target of #{required_macos_version} or later." + Pod::UI.warn error_message, [ + "Update the `platform :osx, '#{user_osx_target}'` line in your macOS/Podfile to version `#{required_macos_version}` and ensure you commit this file.", + "Open your `macos/Runner.xcodeproj` Xcode project and under the 'Runner' target General tab set your Deployment Target to #{required_macos_version} or later." + ] + raise Pod::Informative, error_message + end +rescue Pod::Informative + raise +rescue + # Do nothing for all other errors and let `pod install` deal with any issues. +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_app_check/Sources/firebase_app_check/**/*.swift' + + s.platform = :osx, '10.13' + + # Flutter dependencies + s.dependency 'FlutterMacOS' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'Firebase/AppCheck', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-appcheck\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift new file mode 100644 index 00000000..2edc73e6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift @@ -0,0 +1,36 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_app_check", + platforms: [ + .macOS("10.15") + ], + products: [ + .library(name: "firebase-app-check", targets: ["firebase_app_check"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core"), + ], + targets: [ + .target( + name: "firebase_app_check", + dependencies: [ + .product(name: "FirebaseAppCheck", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ] + ) + ] +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift new file mode 100644 index 00000000..28a2ec57 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift @@ -0,0 +1,6 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Auto-generated file. Do not edit. +public let versionNumber = "0.4.5" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift new file mode 100644 index 00000000..d8f3a100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift @@ -0,0 +1,236 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(Swift.type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {} + +private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {} + +private class FirebaseAppCheckMessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + FirebaseAppCheckMessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + FirebaseAppCheckMessagesPigeonCodecWriter(data: data) + } +} + +class FirebaseAppCheckMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = FirebaseAppCheckMessagesPigeonCodec( + readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter() + ) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseAppCheckHostApi { + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void) + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void) + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void) + func registerTokenListener(appName: String, completion: @escaping (Result) -> Void) + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseAppCheckHostApiSetup { + static var codec: FlutterStandardMessageCodec { + FirebaseAppCheckMessagesPigeonCodec.shared + } + + /// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + /// `binaryMessenger`. + static func setUp( + binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let activateChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + activateChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let androidProviderArg: String? = nilOrValue(args[1]) + let appleProviderArg: String? = nilOrValue(args[2]) + let debugTokenArg: String? = nilOrValue(args[3]) + api.activate( + appName: appNameArg, androidProvider: androidProviderArg, appleProvider: appleProviderArg, + debugToken: debugTokenArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + activateChannel.setMessageHandler(nil) + } + let getTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let forceRefreshArg = args[1] as! Bool + api.getToken(appName: appNameArg, forceRefresh: forceRefreshArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getTokenChannel.setMessageHandler(nil) + } + let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + setTokenAutoRefreshEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let isTokenAutoRefreshEnabledArg = args[1] as! Bool + api.setTokenAutoRefreshEnabled( + appName: appNameArg, isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setTokenAutoRefreshEnabledChannel.setMessageHandler(nil) + } + let registerTokenListenerChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + registerTokenListenerChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.registerTokenListener(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + registerTokenListenerChannel.setMessageHandler(nil) + } + let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getLimitedUseAppCheckTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.getLimitedUseAppCheckToken(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getLimitedUseAppCheckTokenChannel.setMessageHandler(nil) + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift new file mode 100644 index 00000000..2d63a765 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseAppCheck +import FirebaseCore + +#if canImport(FlutterMacOS) + import FlutterMacOS +#else + import Flutter +#endif + +#if canImport(firebase_core) + import firebase_core +#else + import firebase_core_shared +#endif + +let kFirebaseAppCheckChannelName = "plugins.flutter.io/firebase_app_check" +let kFirebaseAppCheckTokenChannelPrefix = "plugins.flutter.io/firebase_app_check/token/" + +// swift-format-ignore: AvoidRetroactiveConformances +extension FlutterError: @retroactive Error {} + +public class FirebaseAppCheckPlugin: NSObject, FlutterPlugin, + FLTFirebasePluginProtocol, FirebaseAppCheckHostApi +{ + private var eventChannels: [String: FlutterEventChannel] = [:] + private var streamHandlers: [String: AppCheckTokenStreamHandler] = [:] + private var providerFactory: FlutterAppCheckProviderFactory? + + static let shared: FirebaseAppCheckPlugin = { + let instance = FirebaseAppCheckPlugin() + instance.providerFactory = FlutterAppCheckProviderFactory() + AppCheck.setAppCheckProviderFactory(instance.providerFactory) + FLTFirebasePluginRegistry.sharedInstance().register(instance) + return instance + }() + + public static func register(with registrar: FlutterPluginRegistrar) { + let binaryMessenger: FlutterBinaryMessenger + + #if os(macOS) + binaryMessenger = registrar.messenger + #elseif os(iOS) + binaryMessenger = registrar.messenger() + #endif + + let instance = shared + instance.binaryMessenger = binaryMessenger + FirebaseAppCheckHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: instance) + + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: instance.firebaseLibraryName(), + with: instance.firebaseLibraryVersion() + ) + } + } + + private var binaryMessenger: FlutterBinaryMessenger? + + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName) else { + completion( + .failure( + FlutterError( + code: "unknown", message: "Firebase app not found: \(appName)", details: nil + ) + ) + ) + return + } + let provider = appleProvider ?? "deviceCheck" + + providerFactory?.configure( + app: app, + providerName: provider, + debugToken: debugToken + ) + + completion(.success(())) + } + + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.token(forcingRefresh: forceRefresh) { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token)) + } + } + } + + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + appCheck.isTokenAutoRefreshEnabled = isTokenAutoRefreshEnabled + completion(.success(())) + } + + func registerTokenListener( + appName: String, + completion: @escaping (Result) -> Void + ) { + let name = kFirebaseAppCheckTokenChannelPrefix + appName + + guard let messenger = binaryMessenger else { + completion( + .failure( + FlutterError( + code: "no-messenger", + message: "Binary messenger not available", + details: nil + ) + ) + ) + return + } + + let channel = FlutterEventChannel(name: name, binaryMessenger: messenger) + let handler = AppCheckTokenStreamHandler() + channel.setStreamHandler(handler) + + eventChannels[name] = channel + streamHandlers[name] = handler + + completion(.success(name)) + } + + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.limitedUseToken { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token ?? "")) + } + } + } + + // MARK: - FLTFirebasePluginProtocol + + public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + for (_, channel) in eventChannels { + channel.setStreamHandler(nil) + } + for (_, handler) in streamHandlers { + _ = handler.onCancel(withArguments: nil) + } + eventChannels.removeAll() + streamHandlers.removeAll() + completion() + } + + public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + [:] + } + + public func firebaseLibraryName() -> String { + "flutter-fire-appcheck" + } + + public func firebaseLibraryVersion() -> String { + versionNumber + } + + public func flutterChannelName() -> String { + kFirebaseAppCheckChannelName + } + + private func createFlutterError(_ error: Error) -> FlutterError { + let nsError = error as NSError + var code = "unknown" + switch nsError.code { + case 0: // FIRAppCheckErrorCodeServerUnreachable + code = "server-unreachable" + case 1: // FIRAppCheckErrorCodeInvalidConfiguration + code = "invalid-configuration" + case 2: // FIRAppCheckErrorCodeKeychain + code = "code-keychain" + case 3: // FIRAppCheckErrorCodeUnsupported + code = "code-unsupported" + default: + code = "unknown" + } + return FlutterError( + code: code, + message: nsError.localizedDescription, + details: nil + ) + } +} + +// MARK: - Token Stream Handler + +class AppCheckTokenStreamHandler: NSObject, FlutterStreamHandler { + private var observer: NSObjectProtocol? + + func onListen( + withArguments arguments: Any?, + eventSink events: @escaping FlutterEventSink + ) -> FlutterError? { + observer = NotificationCenter.default.addObserver( + forName: NSNotification.Name("FIRAppCheckAppCheckTokenDidChangeNotification"), + object: nil, + queue: nil + ) { notification in + if let token = notification.userInfo?["FIRAppCheckTokenNotificationKey"] as? String { + events(["token": token]) + } + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + if let observer { + NotificationCenter.default.removeObserver(observer) + self.observer = nil + } + return nil + } +} + +// MARK: - App Check Provider Factory + +class FlutterAppCheckProviderFactory: NSObject, AppCheckProviderFactory { + private var providers: [String: AppCheckProviderWrapper] = [:] + + func createProvider(with app: FirebaseApp) -> (any AppCheckProvider)? { + if providers[app.name] == nil { + let wrapper = AppCheckProviderWrapper() + // Default to deviceCheck. activate() will reconfigure with the correct provider. + wrapper.configure( + app: app, + providerName: "deviceCheck", + debugToken: nil + ) + providers[app.name] = wrapper + } + return providers[app.name] + } + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + if providers[app.name] == nil { + providers[app.name] = AppCheckProviderWrapper() + } + providers[app.name]?.configure( + app: app, + providerName: providerName, + debugToken: debugToken + ) + } +} + +class AppCheckProviderWrapper: NSObject, AppCheckProvider { + private var delegateProvider: (any AppCheckProvider)? + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + switch providerName { + case "debug": + if let debugToken { + setenv("FIRAAppCheckDebugToken", debugToken, 1) + } + delegateProvider = AppCheckDebugProvider(app: app) + if debugToken == nil, let debugProvider = delegateProvider as? AppCheckDebugProvider { + print("Firebase App Check Debug Token: \(debugProvider.localDebugToken())") + } + case "appAttest": + if #available(iOS 14.0, macOS 14.0, macCatalyst 14.0, tvOS 15.0, watchOS 9.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = AppCheckDebugProvider(app: app) + } + case "appAttestWithDeviceCheckFallback": + if #available(iOS 14.0, macOS 14.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = DeviceCheckProvider(app: app) + } + case "recaptcha": + #if os(iOS) + delegateProvider = RecaptchaProvider(app: app) + if delegateProvider == nil { + print( + "Firebase App Check: failed to initialize RecaptchaProvider. Ensure site key is in GoogleService-Info.plist." + ) + } + #else + print("Firebase App Check: reCAPTCHA is only supported on iOS.") + #endif + default: + // deviceCheck + delegateProvider = DeviceCheckProvider(app: app) + } + } + + func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) { + guard let delegateProvider else { + handler( + nil, + NSError( + domain: "firebase_app_check", code: -1, + userInfo: [NSLocalizedDescriptionKey: "Provider not configured"] + ) + ) + return + } + delegateProvider.getToken(completion: handler) + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml new file mode 100644 index 00000000..605a2914 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml @@ -0,0 +1,48 @@ +name: firebase_app_check +description: App Check works alongside other Firebase services to help protect your backend resources from abuse, such as billing fraud or phishing. +homepage: https://firebase.google.com/docs/app-check +repository: https://github.com/firebase/flutterfire/tree/main/packages/firebase_app_check/firebase_app_check +version: 0.4.5 +resolution: workspace +topics: + - firebase + - app-check + - security + - protection + +false_secrets: + - example/** + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + firebase_app_check_platform_interface: ^0.4.1 + firebase_app_check_web: ^0.2.5 + firebase_core: ^4.11.0 + firebase_core_platform_interface: ^7.1.0 + flutter: + sdk: flutter + +dev_dependencies: + async: ^2.5.0 + flutter_test: + sdk: flutter + mockito: ^5.0.0 + plugin_platform_interface: ^2.1.3 + +flutter: + plugin: + platforms: + android: + package: io.flutter.plugins.firebase.appcheck + pluginClass: FirebaseAppCheckPlugin + ios: + pluginClass: FirebaseAppCheckPlugin + macos: + pluginClass: FirebaseAppCheckPlugin + web: + default_package: firebase_app_check_web + windows: + pluginClass: FirebaseAppCheckPluginCApi diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart new file mode 100755 index 00000000..f939040d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart @@ -0,0 +1,79 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_app_check/firebase_app_check.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import './mock.dart'; + +void main() { + setupFirebaseAppCheckMocks(); + late FirebaseApp secondaryApp; + + group('$FirebaseAppCheck', () { + setUpAll(() async { + await Firebase.initializeApp(); + secondaryApp = await Firebase.initializeApp( + name: 'secondaryApp', + options: const FirebaseOptions( + appId: '1:1234567890:ios:42424242424242', + apiKey: '123', + projectId: '123', + messagingSenderId: '1234567890', + ), + ); + }); + + group('instance', () { + test('successful call', () async { + final appCheck = FirebaseAppCheck.instance; + + expect(appCheck, isA()); + expect(appCheck.app.name, defaultFirebaseAppName); + }); + }); + + group('instanceFor', () { + test('successful call', () async { + final appCheck = FirebaseAppCheck.instanceFor(app: secondaryApp); + + expect(appCheck, isA()); + expect(appCheck.app.name, 'secondaryApp'); + }); + + test('creates a fresh instance after app delete and reinitialize', + () async { + const appName = 'delete-reinit-app-check'; + const options = FirebaseOptions( + appId: '1:1234567890:ios:42424242424242', + apiKey: '123', + projectId: '123', + messagingSenderId: '1234567890', + ); + final app = await Firebase.initializeApp( + name: appName, + options: options, + ); + final appCheck1 = FirebaseAppCheck.instanceFor(app: app); + + expect(app.getService(), same(appCheck1)); + + await app.delete(); + + final app2 = await Firebase.initializeApp( + name: appName, + options: options, + ); + addTearDown(app2.delete); + + final appCheck2 = FirebaseAppCheck.instanceFor(app: app2); + + expect(appCheck2, isNot(same(appCheck1))); + expect(appCheck2.app, app2); + expect(app2.getService(), same(appCheck2)); + }); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/mock.dart b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/mock.dart new file mode 100644 index 00000000..0a6701d3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/test/mock.dart @@ -0,0 +1,35 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_core_platform_interface/test.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +typedef Callback = void Function(MethodCall call); + +final List methodCallLog = []; + +void setupFirebaseAppCheckMocks([Callback? customHandlers]) { + TestWidgetsFlutterBinding.ensureInitialized(); + + setupFirebaseCoreMocks(); + TestFirebaseAppHostApi.setUp(MockFirebaseAppHostApi()); +} + +class MockFirebaseAppHostApi implements TestFirebaseAppHostApi { + @override + Future delete(String appName) async {} + + @override + Future setAutomaticDataCollectionEnabled( + String appName, + bool enabled, + ) async {} + + @override + Future setAutomaticResourceManagementEnabled( + String appName, + bool enabled, + ) async {} +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt new file mode 100644 index 00000000..7c40c200 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt @@ -0,0 +1,81 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "firebase_app_check") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_app_check_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "firebase_app_check_plugin.cpp" + "firebase_app_check_plugin.h" + "messages.g.cpp" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +add_library(${PLUGIN_NAME} STATIC + "include/firebase_app_check/firebase_app_check_plugin_c_api.h" + "firebase_app_check_plugin_c_api.cpp" + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +set(MSVC_RUNTIME_MODE MD) +set(firebase_libs firebase_core_plugin firebase_app_check) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_app_check_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp new file mode 100644 index 00000000..d9a0a72d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp @@ -0,0 +1,249 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_app_check_plugin.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/app_check/debug_provider.h" +#include "firebase/future.h" +#include "firebase_app_check/plugin_version.h" +#include "firebase_core/firebase_core_plugin_c_api.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::Future; +using ::firebase::app_check::AppCheck; +using ::firebase::app_check::AppCheckListener; +using ::firebase::app_check::AppCheckToken; +using ::firebase::app_check::DebugAppCheckProviderFactory; + +namespace firebase_app_check_windows { + +static const std::string kLibraryName = "flutter-fire-app-check"; +static const std::string kEventChannelNamePrefix = + "plugins.flutter.io/firebase_app_check/token/"; + +flutter::BinaryMessenger* FirebaseAppCheckPlugin::binaryMessenger = nullptr; +std::map>> + FirebaseAppCheckPlugin::event_channels_; +std::map + FirebaseAppCheckPlugin::listeners_map_; + +// AppCheckListener implementation that forwards token changes to an EventSink. +class FlutterAppCheckListener : public AppCheckListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnAppCheckTokenChanged(const AppCheckToken& token) override { + if (event_sink_) { + flutter::EncodableMap event; + event[flutter::EncodableValue("token")] = + flutter::EncodableValue(token.token); + event_sink_->Success(flutter::EncodableValue(event)); + } + } + + private: + std::unique_ptr> event_sink_; +}; + +// StreamHandler for token change events. +class TokenStreamHandler + : public flutter::StreamHandler { + public: + TokenStreamHandler(AppCheck* app_check, const std::string& app_name) + : app_check_(app_check), app_name_(app_name) {} + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = std::make_unique(); + listener_->SetEventSink(std::move(events)); + app_check_->AddAppCheckListener(listener_.get()); + FirebaseAppCheckPlugin::listeners_map_[app_name_] = listener_.get(); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + if (listener_) { + app_check_->RemoveAppCheckListener(listener_.get()); + FirebaseAppCheckPlugin::listeners_map_.erase(app_name_); + listener_.reset(); + } + return nullptr; + } + + private: + AppCheck* app_check_; + std::string app_name_; + std::unique_ptr listener_; +}; + +static AppCheck* GetAppCheckFromPigeon(const std::string& app_name) { + App* app = App::GetInstance(app_name.c_str()); + return AppCheck::GetInstance(app); +} + +static FlutterError ParseError(const firebase::FutureBase& completed_future) { + std::string error_code = "unknown"; + int error = completed_future.error(); + switch (error) { + case firebase::app_check::kAppCheckErrorServerUnreachable: + error_code = "server-unreachable"; + break; + case firebase::app_check::kAppCheckErrorInvalidConfiguration: + error_code = "invalid-configuration"; + break; + case firebase::app_check::kAppCheckErrorSystemKeychain: + error_code = "system-keychain"; + break; + case firebase::app_check::kAppCheckErrorUnsupportedProvider: + error_code = "unsupported-provider"; + break; + default: + error_code = "unknown"; + break; + } + + std::string error_message = completed_future.error_message() + ? completed_future.error_message() + : "An unknown error occurred"; + + return FlutterError(error_code, error_message); +} + +// static +void FirebaseAppCheckPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarWindows* registrar) { + auto plugin = std::make_unique(); + + FirebaseAppCheckHostApi::SetUp(registrar->messenger(), plugin.get()); + + registrar->AddPlugin(std::move(plugin)); + + binaryMessenger = registrar->messenger(); + + // Register for platform logging + App::RegisterLibrary(kLibraryName.c_str(), getPluginVersion().c_str(), + nullptr); +} + +FirebaseAppCheckPlugin::FirebaseAppCheckPlugin() {} + +FirebaseAppCheckPlugin::~FirebaseAppCheckPlugin() { + for (auto& [app_name, listener] : listeners_map_) { + App* app = App::GetInstance(app_name.c_str()); + if (app) { + AppCheck* app_check = AppCheck::GetInstance(app); + if (app_check) { + app_check->RemoveAppCheckListener(listener); + } + } + } + listeners_map_.clear(); + event_channels_.clear(); +} + +void FirebaseAppCheckPlugin::Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) { + // On Windows/desktop, only the Debug provider is available. + DebugAppCheckProviderFactory* factory = + DebugAppCheckProviderFactory::GetInstance(); + + if (debug_token != nullptr && !debug_token->empty()) { + factory->SetDebugToken(*debug_token); + } + + AppCheck::SetAppCheckProviderFactory(factory); + + result(std::nullopt); +} + +void FirebaseAppCheckPlugin::GetToken( + const std::string& app_name, bool force_refresh, + std::function> reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + Future future = app_check->GetAppCheckToken(force_refresh); + future.OnCompletion([result](const Future& completed_future) { + if (completed_future.error() != 0) { + result(ParseError(completed_future)); + } else { + const AppCheckToken* token = completed_future.result(); + if (token) { + result(std::optional(token->token)); + } else { + result(std::optional(std::nullopt)); + } + } + }); +} + +void FirebaseAppCheckPlugin::SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + app_check->SetTokenAutoRefreshEnabled(is_token_auto_refresh_enabled); + result(std::nullopt); +} + +void FirebaseAppCheckPlugin::RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + const std::string name = kEventChannelNamePrefix + app_name; + + auto event_channel = + std::make_unique>( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + event_channel->SetStreamHandler( + std::make_unique(app_check, app_name)); + + event_channels_[app_name] = std::move(event_channel); + + result(name); +} + +void FirebaseAppCheckPlugin::GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + Future future = app_check->GetLimitedUseAppCheckToken(); + future.OnCompletion([result](const Future& completed_future) { + if (completed_future.error() != 0) { + result(ParseError(completed_future)); + } else { + const AppCheckToken* token = completed_future.result(); + if (token) { + result(token->token); + } else { + result(FlutterError("unknown", "Failed to get limited use token")); + } + } + }); +} + +} // namespace firebase_app_check_windows diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h new file mode 100644 index 00000000..baabf2bd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h @@ -0,0 +1,72 @@ +/* + * Copyright 2025, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ + +#include +#include +#include + +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/future.h" +#include "messages.g.h" + +namespace firebase_app_check_windows { + +class TokenStreamHandler; + +class FirebaseAppCheckPlugin : public flutter::Plugin, + public FirebaseAppCheckHostApi { + friend class TokenStreamHandler; + + public: + static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar); + + FirebaseAppCheckPlugin(); + + virtual ~FirebaseAppCheckPlugin(); + + // Disallow copy and assign. + FirebaseAppCheckPlugin(const FirebaseAppCheckPlugin&) = delete; + FirebaseAppCheckPlugin& operator=(const FirebaseAppCheckPlugin&) = delete; + + // FirebaseAppCheckHostApi methods. + void Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) override; + void GetToken(const std::string& app_name, bool force_refresh, + std::function> reply)> + result) override; + void SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) override; + void RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) override; + void GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) override; + + private: + static flutter::BinaryMessenger* binaryMessenger; + static std::map< + std::string, + std::unique_ptr>> + event_channels_; + static std::map + listeners_map_; +}; + +} // namespace firebase_app_check_windows + +#endif // FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp new file mode 100644 index 00000000..f0ace78f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp @@ -0,0 +1,16 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_app_check/firebase_app_check_plugin_c_api.h" + +#include + +#include "firebase_app_check_plugin.h" + +void FirebaseAppCheckPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + firebase_app_check_windows::FirebaseAppCheckPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h new file mode 100644 index 00000000..ab2d9e94 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h @@ -0,0 +1,29 @@ +/* + * Copyright 2025, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void FirebaseAppCheckPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp new file mode 100644 index 00000000..0da3e3c1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp @@ -0,0 +1,517 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#undef _HAS_EXCEPTIONS + +#include "messages.g.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace firebase_app_check_windows { +using ::flutter::BasicMessageChannel; +using ::flutter::CustomEncodableValue; +using ::flutter::EncodableList; +using ::flutter::EncodableMap; +using ::flutter::EncodableValue; + +FlutterError CreateConnectionError(const std::string channel_name) { + return FlutterError( + "channel-error", + "Unable to establish connection on channel: '" + channel_name + "'.", + EncodableValue("")); +} + +namespace { +template +bool PigeonInternalDeepEquals(const T& a, const T& b); + +bool PigeonInternalDeepEquals(const double& a, const double& b); + +template +bool PigeonInternalDeepEquals(const std::vector& a, const std::vector& b); + +template +bool PigeonInternalDeepEquals(const std::map& a, const std::map& b); + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b); + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b); + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b); + +template +bool PigeonInternalDeepEquals(const T& a, const T& b) { + return a == b; +} + +template +bool PigeonInternalDeepEquals(const std::vector& a, + const std::vector& b) { + if (a.size() != b.size()) { + return false; + } + for (size_t i = 0; i < a.size(); ++i) { + if (!PigeonInternalDeepEquals(a[i], b[i])) { + return false; + } + } + return true; +} + +template +bool PigeonInternalDeepEquals(const std::map& a, + const std::map& b) { + if (a.size() != b.size()) { + return false; + } + for (const auto& kv : a) { + bool found = false; + for (const auto& b_kv : b) { + if (PigeonInternalDeepEquals(kv.first, b_kv.first)) { + if (PigeonInternalDeepEquals(kv.second, b_kv.second)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; +} + +bool PigeonInternalDeepEquals(const double& a, const double& b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == b) || (std::isnan(a) && std::isnan(b)); +} + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b) { + if (!a && !b) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b) { + if (a.get() == b.get()) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b) { + if (a.index() != b.index()) { + return false; + } + if (const double* da = std::get_if(&a)) { + return PigeonInternalDeepEquals(*da, std::get(b)); + } else if (const ::flutter::EncodableList* la = + std::get_if<::flutter::EncodableList>(&a)) { + return PigeonInternalDeepEquals(*la, std::get<::flutter::EncodableList>(b)); + } else if (const ::flutter::EncodableMap* ma = + std::get_if<::flutter::EncodableMap>(&a)) { + return PigeonInternalDeepEquals(*ma, std::get<::flutter::EncodableMap>(b)); + } + return a == b; +} + +template +size_t PigeonInternalDeepHash(const T& v); + +size_t PigeonInternalDeepHash(const double& v); + +template +size_t PigeonInternalDeepHash(const std::vector& v); + +template +size_t PigeonInternalDeepHash(const std::map& v); + +template +size_t PigeonInternalDeepHash(const std::optional& v); + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v); + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v); + +template +size_t PigeonInternalDeepHash(const T& v) { + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::vector& v) { + size_t result = 1; + for (const auto& item : v) { + result = result * 31 + PigeonInternalDeepHash(item); + } + return result; +} + +template +size_t PigeonInternalDeepHash(const std::map& v) { + size_t result = 0; + for (const auto& kv : v) { + result += ((PigeonInternalDeepHash(kv.first) * 31) ^ + PigeonInternalDeepHash(kv.second)); + } + return result; +} + +size_t PigeonInternalDeepHash(const double& v) { + if (std::isnan(v)) { + // Normalize NaN to a consistent hash. + return std::hash()(std::numeric_limits::quiet_NaN()); + } + if (v == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return std::hash()(0.0); + } + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::optional& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v) { + size_t result = v.index(); + if (const double* dv = std::get_if(&v)) { + result = result * 31 + PigeonInternalDeepHash(*dv); + } else if (const ::flutter::EncodableList* lv = + std::get_if<::flutter::EncodableList>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*lv); + } else if (const ::flutter::EncodableMap* mv = + std::get_if<::flutter::EncodableMap>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*mv); + } else { + std::visit( + [&result](const auto& val) { + using T = std::decay_t; + if constexpr (!std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v) { + result = result * 31 + PigeonInternalDeepHash(val); + } + }, + v); + } + return result; +} + +} // namespace + +PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {} + +EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const { + return ::flutter::StandardCodecSerializer::ReadValueOfType(type, stream); +} + +void PigeonInternalCodecSerializer::WriteValue( + const EncodableValue& value, ::flutter::ByteStreamWriter* stream) const { + ::flutter::StandardCodecSerializer::WriteValue(value, stream); +} + +/// The codec used by FirebaseAppCheckHostApi. +const ::flutter::StandardMessageCodec& FirebaseAppCheckHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through +// the `binary_messenger`. +void FirebaseAppCheckHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api) { + FirebaseAppCheckHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAppCheckHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, FirebaseAppCheckHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.activate" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_android_provider_arg = args.at(1); + const auto* android_provider_arg = + std::get_if(&encodable_android_provider_arg); + const auto& encodable_apple_provider_arg = args.at(2); + const auto* apple_provider_arg = + std::get_if(&encodable_apple_provider_arg); + const auto& encodable_debug_token_arg = args.at(3); + const auto* debug_token_arg = + std::get_if(&encodable_debug_token_arg); + api->Activate(app_name_arg, android_provider_arg, + apple_provider_arg, debug_token_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_force_refresh_arg = args.at(1); + if (encodable_force_refresh_arg.IsNull()) { + reply(WrapError("force_refresh_arg unexpectedly null.")); + return; + } + const auto& force_refresh_arg = + std::get(encodable_force_refresh_arg); + api->GetToken( + app_name_arg, force_refresh_arg, + [reply](ErrorOr>&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + auto output_optional = std::move(output).TakeValue(); + if (output_optional) { + wrapped.push_back( + EncodableValue(std::move(output_optional).value())); + } else { + wrapped.push_back(EncodableValue()); + } + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_is_token_auto_refresh_enabled_arg = + args.at(1); + if (encodable_is_token_auto_refresh_enabled_arg.IsNull()) { + reply(WrapError( + "is_token_auto_refresh_enabled_arg unexpectedly null.")); + return; + } + const auto& is_token_auto_refresh_enabled_arg = + std::get(encodable_is_token_auto_refresh_enabled_arg); + api->SetTokenAutoRefreshEnabled( + app_name_arg, is_token_auto_refresh_enabled_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.registerTokenListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + api->RegisterTokenListener( + app_name_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getLimitedUseAppCheckToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + api->GetLimitedUseAppCheckToken( + app_name_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAppCheckHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAppCheckHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +} // namespace firebase_app_check_windows diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h new file mode 100644 index 00000000..50ae4829 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h @@ -0,0 +1,119 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_app_check_windows { + +// Generated class from Pigeon. + +class FlutterError { + public: + explicit FlutterError(const std::string& code) : code_(code) {} + explicit FlutterError(const std::string& code, const std::string& message) + : code_(code), message_(message) {} + explicit FlutterError(const std::string& code, const std::string& message, + const ::flutter::EncodableValue& details) + : code_(code), message_(message), details_(details) {} + + const std::string& code() const { return code_; } + const std::string& message() const { return message_; } + const ::flutter::EncodableValue& details() const { return details_; } + + private: + std::string code_; + std::string message_; + ::flutter::EncodableValue details_; +}; + +template +class ErrorOr { + public: + ErrorOr(const T& rhs) : v_(rhs) {} + ErrorOr(const T&& rhs) : v_(std::move(rhs)) {} + ErrorOr(const FlutterError& rhs) : v_(rhs) {} + ErrorOr(const FlutterError&& rhs) : v_(std::move(rhs)) {} + + bool has_error() const { return std::holds_alternative(v_); } + const T& value() const { return std::get(v_); }; + const FlutterError& error() const { return std::get(v_); }; + + private: + friend class FirebaseAppCheckHostApi; + ErrorOr() = default; + T TakeValue() && { return std::get(std::move(v_)); } + + std::variant v_; +}; + +class PigeonInternalCodecSerializer + : public ::flutter::StandardCodecSerializer { + public: + PigeonInternalCodecSerializer(); + inline static PigeonInternalCodecSerializer& GetInstance() { + static PigeonInternalCodecSerializer sInstance; + return sInstance; + } + + void WriteValue(const ::flutter::EncodableValue& value, + ::flutter::ByteStreamWriter* stream) const override; + + protected: + ::flutter::EncodableValue ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const override; +}; + +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAppCheckHostApi { + public: + FirebaseAppCheckHostApi(const FirebaseAppCheckHostApi&) = delete; + FirebaseAppCheckHostApi& operator=(const FirebaseAppCheckHostApi&) = delete; + virtual ~FirebaseAppCheckHostApi() {} + virtual void Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) = 0; + virtual void GetToken( + const std::string& app_name, bool force_refresh, + std::function> reply)> + result) = 0; + virtual void SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) = 0; + virtual void RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) = 0; + virtual void GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) = 0; + + // The codec used by FirebaseAppCheckHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAppCheckHostApi() = default; +}; +} // namespace firebase_app_check_windows +#endif // PIGEON_MESSAGES_G_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in new file mode 100644 index 00000000..0a52f845 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_app_check_windows { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_app_check_windows + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md new file mode 100644 index 00000000..b712b5e1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md @@ -0,0 +1,1613 @@ +## 6.5.4 + + - **FIX**: resolve FlutterSceneLifeCycleDelegate conformance guard ([#18385](https://github.com/firebase/flutterfire/issues/18385)). ([48d67196](https://github.com/firebase/flutterfire/commit/48d67196a10affe09724529df5f67cf40b62bccf)) + +## 6.5.3 + + - Update a dependency to the latest release. + +## 6.5.2 + + - **FIX**(auth,android): update token retrieval in PigeonParser to handle Number type correctly ([#18328](https://github.com/firebase/flutterfire/issues/18328)). ([3b77147b](https://github.com/firebase/flutterfire/commit/3b77147bc00bb19af5f4821436a1a4cdd8ff6791)) + - **DOCS**(auth): clarify behavior of password reset email with email enumeration protection enabled ([#18296](https://github.com/firebase/flutterfire/issues/18296)). ([0bcce87a](https://github.com/firebase/flutterfire/commit/0bcce87a17830797dae6ff3c1a8ba4ce210c2c0d)) + +## 6.5.1 + + - Update a dependency to the latest release. + +## 6.5.0 + + - **REFACTOR**: move all packages to workspace ([#18182](https://github.com/firebase/flutterfire/issues/18182)). ([6cdfcb10](https://github.com/firebase/flutterfire/commit/6cdfcb103da7be46ccb190d7e107d8c537aa1ff8)) + - **FIX**: update core, auth and app-check logic so internal resources on method channels are properly disposed ([#18268](https://github.com/firebase/flutterfire/issues/18268)). ([a0de4ed8](https://github.com/firebase/flutterfire/commit/a0de4ed86b0dff89bb9e557f2a54f38cd2546016)) + - **FIX**(auth,apple): remove incorrect paths in Package.swift files search paths ([#18239](https://github.com/firebase/flutterfire/issues/18239)). ([7c2fa5b8](https://github.com/firebase/flutterfire/commit/7c2fa5b83201f2f68e031476dc37ad41809215f2)) + - **FIX**(auth,iOS): update import path for autogenerated messages ([#18227](https://github.com/firebase/flutterfire/issues/18227)). ([4351179d](https://github.com/firebase/flutterfire/commit/4351179d357eeab6b23ec66f45d558c02d3fde69)) + - **FEAT**(core): Add Auth and AppCheck as App's registered service. ([#18237](https://github.com/firebase/flutterfire/issues/18237)). ([7ce191cb](https://github.com/firebase/flutterfire/commit/7ce191cbd598b299cd0ec64b45d1366914367a5d)) + - **FEAT**: upgrade pigeon to version 26.3.4 ([#18205](https://github.com/firebase/flutterfire/issues/18205)). ([cb6b4aef](https://github.com/firebase/flutterfire/commit/cb6b4aeffc568755ea3eebe32b998f00237bf5ad)) + - **FEAT**(auth,android): add revokeAccessToken support for Android ([#18206](https://github.com/firebase/flutterfire/issues/18206)) ([#18207](https://github.com/firebase/flutterfire/issues/18207)). ([7e0a2227](https://github.com/firebase/flutterfire/commit/7e0a222700178a57d064c27b4ef62cefdda1e253)) + +## 6.4.0 + + - **FIX**(auth,ios): serialize Sign in with Apple to prevent crash on overlapping requests ([#18172](https://github.com/firebase/flutterfire/issues/18172)). ([752cbcaa](https://github.com/firebase/flutterfire/commit/752cbcaa57f887a8fea3bda728bb8482290fa049)) + - **FEAT**: use local firebase_core instead of remote SPM dependency ([#18141](https://github.com/firebase/flutterfire/issues/18141)). ([995caf40](https://github.com/firebase/flutterfire/commit/995caf400df80c0fde7151c651ccc6c0f756e381)) + +## 6.3.0 + + - **FIX**(auth): fix inconsistence in casing in the native iOS SDK and Web SDK ([#18086](https://github.com/firebase/flutterfire/issues/18086)). ([60b5cd5c](https://github.com/firebase/flutterfire/commit/60b5cd5c7888fa932124958125e87bd39e1c323c)) + - **FIX**(auth,ios): fix crash that could happen when reloading currentUser informations ([#18065](https://github.com/firebase/flutterfire/issues/18065)). ([6e6f6546](https://github.com/firebase/flutterfire/commit/6e6f65468c07045e1c21b1d7970234b2dfc16b3d)) + - **FIX**(auth,windows): add pluginregistry to properly restore state on Windows ([#18049](https://github.com/firebase/flutterfire/issues/18049)). ([8d715a77](https://github.com/firebase/flutterfire/commit/8d715a777a4827bff59f820d9978007bd7568a7d)) + - **FEAT**(ios): migrate iOS to UIScene lifecycle ([#18054](https://github.com/firebase/flutterfire/issues/18054)). ([3ffa4110](https://github.com/firebase/flutterfire/commit/3ffa411098132fd5182a84be4e7a226106bc7451)) + - **DOCS**(auth): add documentation about errors code when Email Enumeration Protection is activated ([#18084](https://github.com/firebase/flutterfire/issues/18084)). ([476ba53f](https://github.com/firebase/flutterfire/commit/476ba53f016f20009fd571ad6ab359631f97094b)) + +## 6.2.0 + + - **FEAT**(remote-config,windows): add support for windows ([#18006](https://github.com/firebase/flutterfire/issues/18006)). ([a6ec167f](https://github.com/firebase/flutterfire/commit/a6ec167f4ece9c9b455a916366781f482cc380b3)) + +## 6.1.4 + + - Update a dependency to the latest release. + +## 6.1.3 + + - Update a dependency to the latest release. + +## 6.1.2 + + - Update a dependency to the latest release. + +## 6.1.1 + + - Update a dependency to the latest release. + +## 6.1.0 + + - **FEAT**(auth): TOTP macOS support ([#17513](https://github.com/firebase/flutterfire/issues/17513)). ([41890d62](https://github.com/firebase/flutterfire/commit/41890d62a49258df097c19fd3b90e0b5de181526)) + +## 6.0.2 + + - Update a dependency to the latest release. + +## 6.0.1 + + - **FIX**(auth,apple): Move FirebaseAuth imports to implementation files ([#17607](https://github.com/firebase/flutterfire/issues/17607)). ([0c3ccd37](https://github.com/firebase/flutterfire/commit/0c3ccd3722038a47e656b0a703a0395a78befc5b)) + +## 6.0.0 + +> Note: This release has breaking changes. + + - **FEAT**(auth): validatePassword method/PasswordPolicy Support ([#17439](https://github.com/firebase/flutterfire/issues/17439)). ([9a032b34](https://github.com/firebase/flutterfire/commit/9a032b344d6a22c1e3a181ae27e511939f2d8972)) + - **BREAKING** **FEAT**: bump iOS SDK to version 12.0.0 ([#17549](https://github.com/firebase/flutterfire/issues/17549)). ([b2619e68](https://github.com/firebase/flutterfire/commit/b2619e685fec897513483df1d7be347b64f95606)) + - **BREAKING** **FEAT**(auth): remove deprecated functions ([#17562](https://github.com/firebase/flutterfire/issues/17562)). ([d50aad95](https://github.com/firebase/flutterfire/commit/d50aad954443904d64d4ebd4442ebc63ed702986)) + - **BREAKING** **FEAT**: bump Android SDK to version 34.0.0 ([#17554](https://github.com/firebase/flutterfire/issues/17554)). ([a5bdc051](https://github.com/firebase/flutterfire/commit/a5bdc051d40ee44e39cf0b8d2a7801bc6f618b67)) + +## Removed Methods + +- `ActionCodeSettings.dynamicLinkDomain` - Firebase Dynamic Links is deprecated and will be shut down +- `MicrosoftAuthProvider.credential()` - Use `signInWithProvider(MicrosoftAuthProvider)` instead +- `FirebaseAuth.instanceFor()` persistence parameter - Use `setPersistence()` instead +- `FirebaseAuth.fetchSignInMethodsForEmail()` - Removed for security best practices +- `User.updateEmail()` - Use `verifyBeforeUpdateEmail()` instead + +## Migration Guide + +### ActionCodeSettings +```dart +// Before +ActionCodeSettings( + url: 'https://example.com', + dynamicLinkDomain: 'example.page.link', +) + +// After +ActionCodeSettings( + url: 'https://example.com', + linkDomain: 'your-custom-domain.com', // Use custom Firebase Hosting domain +) +``` + +### Microsoft Authentication +```dart +// Before +final credential = MicrosoftAuthProvider.credential(accessToken); +await FirebaseAuth.instance.signInWithCredential(credential); + +// After +final provider = MicrosoftAuthProvider(); +await FirebaseAuth.instance.signInWithProvider(provider); +``` + +### FirebaseAuth Instance +```dart +// Before +FirebaseAuth.instanceFor(app: app, persistence: Persistence.local); + +// After +final auth = FirebaseAuth.instanceFor(app: app); +auth.setPersistence(Persistence.local); +``` + +### Email Updates +```dart +// Before +await user.updateEmail('new@email.com'); + +// After +await user.verifyBeforeUpdateEmail('new@email.com'); +``` + +### Email Sign-in Methods +The `fetchSignInMethodsForEmail()` method has been removed for security reasons. Consider implementing alternative authentication flows that don't require email enumeration. + +## 5.7.0 + + - **FEAT**(auth,macos): add support for `publish` and `addApplicationDelegate` on macOS FlutterPluginRegistrar ([#17518](https://github.com/firebase/flutterfire/issues/17518)). ([376bb6ea](https://github.com/firebase/flutterfire/commit/376bb6ea8878df3f25cc1416fe26ace2203fd793)) + +## 5.6.2 + + - Update a dependency to the latest release. + +## 5.6.1 + + - Update a dependency to the latest release. + +## 5.6.0 + + - **FEAT**(auth): add support for initializeRecaptchaConfig ([#17365](https://github.com/firebase/flutterfire/issues/17365)). ([73f9028e](https://github.com/firebase/flutterfire/commit/73f9028e114874fddc8a4f76f22b247504a95a02)) + +## 5.5.4 + + - **FIX**(auth,apple): prevent EXC_BAD_ACCESS crash in Apple Sign-In completion handler ([#17273](https://github.com/firebase/flutterfire/issues/17273)). ([cc7d28ae](https://github.com/firebase/flutterfire/commit/cc7d28ae09036464f7ece6a2637bae6a3c7a292d)) + - **DOCS**(firebase_auth): Removed duplicates; fixed typos; removed "unnecessary use of a null check" ([#16815](https://github.com/firebase/flutterfire/issues/16815)). ([0eb17e13](https://github.com/firebase/flutterfire/commit/0eb17e13587ebfe5c8d64cbba9c0a2ccd0b7ce90)) + +## 5.5.3 + + - **FIX**(auth,iOS): include missing email and credential in account-exists-with-different-credential error ([#17180](https://github.com/firebase/flutterfire/issues/17180)). ([2a0bdc64](https://github.com/firebase/flutterfire/commit/2a0bdc64086e99f8a98bd18b472b36bcfe05a9a4)) + +## 5.5.2 + + - Update a dependency to the latest release. + +## 5.5.1 + + - Update a dependency to the latest release. + +## 5.5.0 + + - **FEAT**(auth): support for `linkDomain` in `ActionCodeSettings` ([#17099](https://github.com/firebase/flutterfire/issues/17099)). ([090cdb20](https://github.com/firebase/flutterfire/commit/090cdb2078dc66e58aa4b1a3ef9a48101467b6ac)) + +## 5.4.2 + + - Update a dependency to the latest release. + +## 5.4.1 + + - Update a dependency to the latest release. + +## 5.4.0 + + + - **FIX**: Remove dart:io imports for analytics, auth and app check ([#16827](https://github.com/firebase/flutterfire/issues/16827)). ([8c7f57c4](https://github.com/firebase/flutterfire/commit/8c7f57c4a181b8cae3b0d2ba564682ad7d68f484)) + - **FIX**(firebase_auth): Fix `std::variant` compiler errors with VS 2022 17.12 ([#16840](https://github.com/firebase/flutterfire/issues/16840)). ([b88b71f4](https://github.com/firebase/flutterfire/commit/b88b71f45c856eb0ff2d2caefb8b6aa367e91418)) + - **FEAT**(auth): Swift Package Manager support ([#16773](https://github.com/firebase/flutterfire/issues/16773)). ([69abbe19](https://github.com/firebase/flutterfire/commit/69abbe19bb37e6eb450b0b5123a74c2d68a761c7)) + +## 5.3.4 + + - **FIX**(auth,android): `signInWithProvider()` for non-default instances ([#13522](https://github.com/firebase/flutterfire/issues/13522)). ([fe016a44](https://github.com/firebase/flutterfire/commit/fe016a4487993c8aa444e15c9881fe355b5f6624)) + +## 5.3.3 + + - Update a dependency to the latest release. + +## 5.3.2 + + - **FIX**(auth,apple): set nullability on pigeon parser method ([#13571](https://github.com/firebase/flutterfire/issues/13571)). ([7e8a1b2e](https://github.com/firebase/flutterfire/commit/7e8a1b2e5be454b168d942056c4abb7f8e92a9a8)) + +## 5.3.1 + + - **FIX**(all,apple): use modular headers to import ([#13400](https://github.com/firebase/flutterfire/issues/13400)). ([d7d2d4b9](https://github.com/firebase/flutterfire/commit/d7d2d4b93e7c00226027fffde46699f3d5388a41)) + +## 5.3.0 + + - **FEAT**(fdc): Initial Release of Data Connect ([#13313](https://github.com/firebase/flutterfire/issues/13313)). ([603a6726](https://github.com/firebase/flutterfire/commit/603a67261a2f7cbdd6ef594bfaef480aeb820683)) + +## 5.2.1 + + - Update a dependency to the latest release. + +## 5.2.0 + + - **FEAT**: bump iOS SDK to version 11.0.0 ([#13158](https://github.com/firebase/flutterfire/issues/13158)). ([c0e0c997](https://github.com/firebase/flutterfire/commit/c0e0c99703ea394d1bb873ac225c5fe3539b002d)) + - **DOCS**: remove reference to flutter.io and firebase.flutter.dev ([#13152](https://github.com/firebase/flutterfire/issues/13152)). ([5f0874b9](https://github.com/firebase/flutterfire/commit/5f0874b91e28a203dd62d37d391e5760c91f5729)) + +## 5.1.4 + + - **FIX**(firebase_auth): added supporting rawNonce for OAuth credential on Windows platform ([#13086](https://github.com/firebase/flutterfire/issues/13086)). ([12e87de9](https://github.com/firebase/flutterfire/commit/12e87de93ddc39d41a6a634d7d03766b3e36996a)) + +## 5.1.3 + + - **DOCS**(auth): add information about error codes for email/password functions ([#13100](https://github.com/firebase/flutterfire/issues/13100)). ([aeafc356](https://github.com/firebase/flutterfire/commit/aeafc356953a0531003f765e766ffcff2387401d)) + +## 5.1.2 + + - **DOCS**(auth): add information about error codes for `verifyBeforeUpdateEmail` ([#13036](https://github.com/firebase/flutterfire/issues/13036)). ([8ef7421d](https://github.com/firebase/flutterfire/commit/8ef7421d6a524938087769537ac70ec249096ed4)) + +## 5.1.1 + + - **FIX**(auth,apple): bug with cached `AuthCredential`, hash key was producing different value ([#12957](https://github.com/firebase/flutterfire/issues/12957)). ([ef0077e3](https://github.com/firebase/flutterfire/commit/ef0077e37744360264eb60d6eea4359a5cc13227)) + - **FIX**(auth,windows): fix a crash that could happen when using `sendEmailVerification` or `sendPasswordResetEmail` ([#12946](https://github.com/firebase/flutterfire/issues/12946)). ([a1008290](https://github.com/firebase/flutterfire/commit/a100829087dbf83ea59e73c3811d87b67e2a4012)) + - **DOCS**: Update documentation for auth/user-not-found exception to reflect email enumeration protection ([#12964](https://github.com/firebase/flutterfire/issues/12964)). ([125f8209](https://github.com/firebase/flutterfire/commit/125f820971331ec75e7fe59cff3b296c42c7d8f3)) + +## 5.1.0 + + - **FIX**(auth,ios): fix the parsing of an error that could specifically happen when using MicrosoftProvider ([#12920](https://github.com/firebase/flutterfire/issues/12920)). ([3b415e64](https://github.com/firebase/flutterfire/commit/3b415e641e6107b131a170277bbc1fa0e2908e27)) + - **FEAT**(auth,apple): create a credential with `idToken`, `rawNonce` & `appleFullPersonName` ([#12356](https://github.com/firebase/flutterfire/issues/12356)). ([17793080](https://github.com/firebase/flutterfire/commit/177930802ca13a3af1610968e54b8ce79f0781ca)) + +## 5.0.0 + +> Note: This release has breaking changes. + + - **BREAKING** **REFACTOR**: android plugins require `minSdk 21`, auth requires `minSdk 23` ahead of android BOM `>=33.0.0` ([#12873](https://github.com/firebase/flutterfire/issues/12873)). ([52accfc6](https://github.com/firebase/flutterfire/commit/52accfc6c39d6360d9c0f36efe369ede990b7362)) + - **BREAKING** **REFACTOR**: bump all iOS deployment targets to iOS 13 ahead of Firebase iOS SDK `v11` breaking change ([#12872](https://github.com/firebase/flutterfire/issues/12872)). ([de0cea2c](https://github.com/firebase/flutterfire/commit/de0cea2c3c36694a76361be784255986fac84a43)) + - **BREAKING** **REFACTOR**(auth): remove deprecated API ahead of breaking change release ([#12859](https://github.com/firebase/flutterfire/issues/12859)). ([995fa7e1](https://github.com/firebase/flutterfire/commit/995fa7e19540fe52ba75a66865823c8ca86b6657)) + +## 4.20.0 + + - **FIX**(auth,android): remove unnecessary error type guarding ([#12816](https://github.com/firebase/flutterfire/issues/12816)). ([7d4c200a](https://github.com/firebase/flutterfire/commit/7d4c200ac6f06a50c2e7ee852aea2c9fa7bcb0ff)) + - **FEAT**(auth,windows): `verifyBeforeUpdateEmail()` API support ([#12825](https://github.com/firebase/flutterfire/issues/12825)). ([111b1ad9](https://github.com/firebase/flutterfire/commit/111b1ad91e985b0462532bc579e64342b7f46fe2)) + - **FEAT**(auth): update Pigeon version to 19 ([#12828](https://github.com/firebase/flutterfire/issues/12828)). ([5e76153f](https://github.com/firebase/flutterfire/commit/5e76153fbcd337a26e83abc2b43b651ab6c501bc)) + - **FEAT**: bump CPP SDK to version 11.10.0 ([#12749](https://github.com/firebase/flutterfire/issues/12749)). ([2e410a23](https://github.com/firebase/flutterfire/commit/2e410a232758292baa70f8e78464bd3c62ec0373)) + +## 4.19.6 + + - **FIX**(auth,android): allow nullable `accessToken` when creating `OAuthProvider` ([#12795](https://github.com/firebase/flutterfire/issues/12795)). ([490319d4](https://github.com/firebase/flutterfire/commit/490319d4c046917bdd227c19fd37185d63076b4a)) + +## 4.19.5 + + - **FIX**(auth,windows): allow `idToken` and `accessToken` to be nullable to stop windows crashing for `signInWithCredential()` ([#12688](https://github.com/firebase/flutterfire/issues/12688)). ([ca9f92d0](https://github.com/firebase/flutterfire/commit/ca9f92d05f717b46c80307987f560454b90a4d67)) + +## 4.19.4 + + - Update a dependency to the latest release. + +## 4.19.3 + + - **FIX**(auth,ios): Give more details on internal error when calling `sendSignInLinkToEmail`. ([#12671](https://github.com/firebase/flutterfire/issues/12671)). ([2b086029](https://github.com/firebase/flutterfire/commit/2b0860296bf577c99810643bb286b7219ee9291f)) + +## 4.19.2 + + - Update a dependency to the latest release. + +## 4.19.1 + + - Update a dependency to the latest release. + +## 4.19.0 + + - **FEAT**(android): Bump `compileSdk` version of Android plugins to latest stable (34) ([#12566](https://github.com/firebase/flutterfire/issues/12566)). ([e891fab2](https://github.com/firebase/flutterfire/commit/e891fab291e9beebc223000b133a6097e066a7fc)) + +## 4.18.0 + + - **FIX**(auth,android): fixing an issue that could cause `getEnrolledFactors` to return an empty list if signing out in the same app session ([#12488](https://github.com/firebase/flutterfire/issues/12488)). ([04280a31](https://github.com/firebase/flutterfire/commit/04280a31310dbbe51a8e619f031f5190d02e695d)) + - **FEAT**(firebase_auth): add custom auth domain setter to Firebase Auth ([#12218](https://github.com/firebase/flutterfire/issues/12218)). ([e1297800](https://github.com/firebase/flutterfire/commit/e12978009e0fd785f267db560972ab0bbe021fcb)) + - **FEAT**(auth,windows): add support for oAuth with credentials on Windows ([#12154](https://github.com/firebase/flutterfire/issues/12154)). ([cc708e6f](https://github.com/firebase/flutterfire/commit/cc708e6fdce6053772da0f08c9872e1dbe9899b1)) + +## 4.17.9 + + - Update a dependency to the latest release. + +## 4.17.8 + + - Update a dependency to the latest release. + +## 4.17.7 + + - Update a dependency to the latest release. + +## 4.17.6 + + - Update a dependency to the latest release. + +## 4.17.5 + + - Update a dependency to the latest release. + +## 4.17.4 + + - Update a dependency to the latest release. + +## 4.17.3 + + - Update a dependency to the latest release. + +## 4.17.2 + + - **FIX**(auth,web): fix null safety issue in typing JS Interop ([#12250](https://github.com/firebase/flutterfire/issues/12250)). ([d0d30405](https://github.com/firebase/flutterfire/commit/d0d30405a895ae221603ddd158b1cb1636312fb4)) + +## 4.17.1 + + - Update a dependency to the latest release. + +## 4.17.0 + + - **FIX**(auth): deprecate `updateEmail()` & `fetchSignInMethodsForEmail()` ([#12143](https://github.com/firebase/flutterfire/issues/12143)). ([dcfd9e80](https://github.com/firebase/flutterfire/commit/dcfd9e801c3231d17821355df5865b179cf0bf11)) + - **FEAT**(auth,apple): Game Center sign-in support ([#12228](https://github.com/firebase/flutterfire/issues/12228)). ([ac625ec7](https://github.com/firebase/flutterfire/commit/ac625ec7a2ceb8c7ef78180f3bcaa8294cf06a2e)) + - **FEAT**(auth,android): Play Games provider sign-in support ([#12201](https://github.com/firebase/flutterfire/issues/12201)). ([1fb9019d](https://github.com/firebase/flutterfire/commit/1fb9019de1fd832223aa56139d98c1194b2d5efa)) + - **FEAT**(auth,windows): add support for `creationTime` and `lastSignInTime` ([#12116](https://github.com/firebase/flutterfire/issues/12116)). ([387e9434](https://github.com/firebase/flutterfire/commit/387e94343a237d0976bdfa4f5c0e20c6922456fa)) + +## 4.16.0 + + - **FIX**(auth,windows): fix a parsing issue of the Pigeon message on Windows for sendPasswordResetEmail ([#12082](https://github.com/firebase/flutterfire/issues/12082)). ([17c4ab12](https://github.com/firebase/flutterfire/commit/17c4ab128650c8e7a4f7e3cea0c55d1fea0998fd)) + - **FEAT**: allow users to disable automatic host mapping ([#11962](https://github.com/firebase/flutterfire/issues/11962)). ([13c1ce33](https://github.com/firebase/flutterfire/commit/13c1ce333b8cd113241a1f7ac07181c1c76194bc)) + +## 4.15.3 + + - **FIX**(auth): return email address if one is returned by the auth exception ([#11978](https://github.com/firebase/flutterfire/issues/11978)). ([ceee304d](https://github.com/firebase/flutterfire/commit/ceee304dd87cd66e34a7f7fa67c9961b72c10e72)) + +## 4.15.2 + + - Update a dependency to the latest release. + +## 4.15.1 + + - Update a dependency to the latest release. + +## 4.15.0 + + - **FEAT**(auth): add support for custom domains on mobile ([#11925](https://github.com/firebase/flutterfire/issues/11925)). ([552119c7](https://github.com/firebase/flutterfire/commit/552119c78e2750a929c6226de22f9f6d8df948a4)) + +## 4.14.1 + + - **FIX**(auth,apple): need to cache `AuthCredential` on native in case Dart exception passes `AuthCredential` back to user for sign-in ([#11889](https://github.com/firebase/flutterfire/issues/11889)). ([9c09f224](https://github.com/firebase/flutterfire/commit/9c09f22416f549e3b80bc7e618b07c1c3c24ee31)) + - **FIX**(auth,web): use the device language when using `setLanguageCode` with null ([#11905](https://github.com/firebase/flutterfire/issues/11905)). ([f9322b6f](https://github.com/firebase/flutterfire/commit/f9322b6f25cd9520c5e033361e63a4db3f375a15)) + - **FIX**(auth): add proper error message when trying to access the multifactor object on an unsupported platform ([#11894](https://github.com/firebase/flutterfire/issues/11894)). ([27d1c47d](https://github.com/firebase/flutterfire/commit/27d1c47d1168198e9fa296fcff52feb1f0a345d2)) + +## 4.14.0 + + - **FEAT**(auth,windows): add Windows support for Google Sign In ([#11861](https://github.com/firebase/flutterfire/issues/11861)). ([cde57d05](https://github.com/firebase/flutterfire/commit/cde57d059e099913efc994db27141540a2a981d1)) + +## 4.13.0 + + - **FEAT**(firebase_auth): export `AuthProvider` from `firebase_auth_interface` ([#11470](https://github.com/firebase/flutterfire/issues/11470)). ([39881e7e](https://github.com/firebase/flutterfire/commit/39881e7e4671faa94b274d980aad81829e6e0bfc)) + - **FEAT**(windows): add platform logging for core, auth, firestore and storage ([#11790](https://github.com/firebase/flutterfire/issues/11790)). ([e7d428d1](https://github.com/firebase/flutterfire/commit/e7d428d14be1535a2d579d4b2d376fbb81f06742)) + +## 4.12.1 + + - Update a dependency to the latest release. + +## 4.12.0 + + - **FEAT**(storage,windows): Add windows support ([#11617](https://github.com/firebase/flutterfire/issues/11617)). ([87ea02c8](https://github.com/firebase/flutterfire/commit/87ea02c8ae03eb351636cf202961ad0df6caebd8)) + +## 4.11.1 + + - **FIX**(ios): fix clashing filenames between Auth and Firestore ([#11731](https://github.com/firebase/flutterfire/issues/11731)). ([8770cafc](https://github.com/firebase/flutterfire/commit/8770cafccccb11607b5530311e3150ac08cd172e)) + +## 4.11.0 + + - **FIX**(auth): ensure `PigeonAuthCredential` is passed back to Dart side within try/catch ([#11683](https://github.com/firebase/flutterfire/issues/11683)). ([d42c3396](https://github.com/firebase/flutterfire/commit/d42c33969b096a9825af21c624f8d93aebede8b2)) + - **FEAT**: Full support of AGP 8 ([#11699](https://github.com/firebase/flutterfire/issues/11699)). ([bdb5b270](https://github.com/firebase/flutterfire/commit/bdb5b27084d225809883bdaa6aa5954650551927)) + - **FEAT**(firestore,windows): add support to Windows ([#11516](https://github.com/firebase/flutterfire/issues/11516)). ([e51d2a2d](https://github.com/firebase/flutterfire/commit/e51d2a2d287f4162f5a67d8200f1bf57fc2afe14)) + +## 4.10.1 + + - Update a dependency to the latest release. + +## 4.10.0 + + - **FIX**(auth): deprecate `FirebaseAuth.instanceFor`'s `persistence` parameter ([#11259](https://github.com/firebase/flutterfire/issues/11259)). ([a1966e82](https://github.com/firebase/flutterfire/commit/a1966e82c15f13119cb28a262a57c67b4f2b8d3b)) + - **FIX**(auth,apple): `fetchSignInMethodsForEmail` if value is `nil`, pass empty array. ([#11596](https://github.com/firebase/flutterfire/issues/11596)). ([6d261cc9](https://github.com/firebase/flutterfire/commit/6d261cc9a147befbfd203004aff8565492567f58)) + - **FEAT**(core,windows): Change the windows plugin compiling way ([#11594](https://github.com/firebase/flutterfire/issues/11594)). ([3dab95e0](https://github.com/firebase/flutterfire/commit/3dab95e01f7f71680aff84db4e9dccfe1e77643b)) + - **FEAT**(auth,windows): add Windows support to auth plugin ([#11089](https://github.com/firebase/flutterfire/issues/11089)). ([0cedfc85](https://github.com/firebase/flutterfire/commit/0cedfc8580bedd9e21b262537e643dbace0d7114)) + - **DOCS**: firebase_auth description ([#11292](https://github.com/firebase/flutterfire/issues/11292)). ([d9e05713](https://github.com/firebase/flutterfire/commit/d9e057137dffca09ea293b5df7292d7b7b21ca99)) + - **DOCS**(auth): update the incorrect "getting started" link ([#11440](https://github.com/firebase/flutterfire/issues/11440)). ([5db956dc](https://github.com/firebase/flutterfire/commit/5db956dc935dfec5be28e0463f7e8499a20d5577)) + +## 4.9.0 + + - **FEAT**(auth): TOTP (time-based one-time password) support for multi-factor authentication ([#11420](https://github.com/firebase/flutterfire/issues/11420)). ([3cc1243c](https://github.com/firebase/flutterfire/commit/3cc1243c94368de44d3a5c4be96b905a0a37b963)) + +## 4.8.0 + + - **FEAT**(auth): `revokeTokenWithAuthorizationCode()` implementation for revoking Apple sign-in token ([#11454](https://github.com/firebase/flutterfire/issues/11454)). ([92de98c9](https://github.com/firebase/flutterfire/commit/92de98c9e62f2bf20712dbfed22dd39f6883eb58)) + +## 4.7.3 + + - **FIX**(auth): rename import header to "firebase_auth_messages.g.h". ([#11472](https://github.com/firebase/flutterfire/issues/11472)). ([693a6f3c](https://github.com/firebase/flutterfire/commit/693a6f3cba3620933b905a964126406ae6ae3374)) + - **FIX**(firebase_auth): Fix forceRefresh parameter conversion before calling native API ([#11464](https://github.com/firebase/flutterfire/issues/11464)). ([86639876](https://github.com/firebase/flutterfire/commit/86639876b8e9138af740a1c74c122fcdb5c4566d)) + - **FIX**(auth): set the tenant id on iOS `FIRAuth` instance ([#11427](https://github.com/firebase/flutterfire/issues/11427)). ([15f3cf5d](https://github.com/firebase/flutterfire/commit/15f3cf5d9b86f287fac22370ea09abf9e773ea60)) + - **FIX**(firebase_auth,android): Remove implicit default locale used in error message ([#11321](https://github.com/firebase/flutterfire/issues/11321)). ([3a20f41c](https://github.com/firebase/flutterfire/commit/3a20f41c0d8a4d61d789874d7bb16d6ef710c9d1)) + +## 4.7.2 + + - **FIX**(auth): fix MFA issue where the error wouldn't be properly caught ([#11370](https://github.com/firebase/flutterfire/issues/11370)). ([72fef03f](https://github.com/firebase/flutterfire/commit/72fef03f775702aaf9a2ce0c6b31aea2a3c200a9)) + - **FIX**(auth,android): `getIdToken()` `IllegalStateException` crash fix ([#11362](https://github.com/firebase/flutterfire/issues/11362)). ([e925b4c9](https://github.com/firebase/flutterfire/commit/e925b4c9a937d90de0bdfb59ffa005938b3862dd)) + - **FIX**(auth,apple): pass in Firebase auth instance for correct app when using Provider sign in ([#11284](https://github.com/firebase/flutterfire/issues/11284)). ([1cffae79](https://github.com/firebase/flutterfire/commit/1cffae79ded28808ba55f2f4c9c1b47817987999)) + +## 4.7.1 + + - **FIX**(auth,android): Fix crash on Android where detaching from engine ([#11296](https://github.com/firebase/flutterfire/issues/11296)). ([d0a37332](https://github.com/firebase/flutterfire/commit/d0a373323a818d5005a58e95042b7ea3652ead50)) + - **FIX**(auth,ios): fix scoping of import for message.g.h, could cause incompatibility with other packages ([#11300](https://github.com/firebase/flutterfire/issues/11300)). ([91ccc57d](https://github.com/firebase/flutterfire/commit/91ccc57d4b40b1b7a77dc0d871f9ff7d3f24ba13)) + +## 4.7.0 + + - **FEAT**(auth): move to Pigeon for Platform channels ([#10802](https://github.com/firebase/flutterfire/issues/10802)). ([43e5b20b](https://github.com/firebase/flutterfire/commit/43e5b20b14799102a6544a4763476eaba44b9cfb)) + +## 4.6.3 + + - Update a dependency to the latest release. + +## 4.6.2 + + - Update a dependency to the latest release. + +## 4.6.1 + + - Update a dependency to the latest release. + +## 4.6.0 + + - **FEAT**: update dependency constraints to `sdk: '>=2.18.0 <4.0.0'` `flutter: '>=3.3.0'` ([#10946](https://github.com/firebase/flutterfire/issues/10946)). ([2772d10f](https://github.com/firebase/flutterfire/commit/2772d10fe510dcc28ec2d37a26b266c935699fa6)) + - **FEAT**: update libraries to be compatible with Flutter 3.10.0 ([#10944](https://github.com/firebase/flutterfire/issues/10944)). ([e1f5a5ea](https://github.com/firebase/flutterfire/commit/e1f5a5ea798c54f19d1d2f7b8f2250f8819f44b7)) + +## 4.5.0 + + - **FIX**: add support for AGP 8.0 ([#10901](https://github.com/firebase/flutterfire/issues/10901)). ([a3b96735](https://github.com/firebase/flutterfire/commit/a3b967354294c295a9be8d699a6adb7f4b1dba7f)) + - **FEAT**: upgrade to dart 3 compatible dependencies ([#10890](https://github.com/firebase/flutterfire/issues/10890)). ([4bd7e59b](https://github.com/firebase/flutterfire/commit/4bd7e59b1f2b09a2230c49830159342dd4592041)) + +## 4.4.2 + + - Update a dependency to the latest release. + +## 4.4.1 + + - Update a dependency to the latest release. + +## 4.4.0 + + - **FEAT**(auth,ios): automatically save the Apple Sign In display name ([#10652](https://github.com/firebase/flutterfire/issues/10652)). ([257f1ffb](https://github.com/firebase/flutterfire/commit/257f1ffbce7abd458df91d8e4b6422d83b5b849f)) + - **FEAT**: bump dart sdk constraint to 2.18 ([#10618](https://github.com/firebase/flutterfire/issues/10618)). ([f80948a2](https://github.com/firebase/flutterfire/commit/f80948a28b62eead358bdb900d5a0dfb97cebb33)) + +## 4.3.0 + + - **FIX**(auth): fix an issue where unenroll would not throw a FirebaseException ([#10572](https://github.com/firebase/flutterfire/issues/10572)). ([8dba33e1](https://github.com/firebase/flutterfire/commit/8dba33e1a95f03d70d527885aa58ce23622e359f)) + - **FEAT**(auth): improve error handling when Email enumeration feature is on ([#10591](https://github.com/firebase/flutterfire/issues/10591)). ([ff083025](https://github.com/firebase/flutterfire/commit/ff083025b724d683cc3a9ed5f4a4987c43663589)) + +## 4.2.10 + + - **FIX**(auth,web): fix currentUser being null when using emulator or named instance ([#10565](https://github.com/firebase/flutterfire/issues/10565)). ([11e8644d](https://github.com/firebase/flutterfire/commit/11e8644df402a5abbb0d0c37714879272dec024c)) + +## 4.2.9 + + - Update a dependency to the latest release. + +## 4.2.8 + + - Update a dependency to the latest release. + +## 4.2.7 + + - Update a dependency to the latest release. + +## 4.2.6 + + - **REFACTOR**: upgrade project to remove warnings from Flutter 3.7 ([#10344](https://github.com/firebase/flutterfire/issues/10344)). ([e0087c84](https://github.com/firebase/flutterfire/commit/e0087c845c7526c11a4241a26d39d4673b0ad29d)) + +## 4.2.5 + + - **FIX**: fix a null pointer exception that could occur when removing an even listener ([#10210](https://github.com/firebase/flutterfire/issues/10210)). ([72d2e973](https://github.com/firebase/flutterfire/commit/72d2e97363d89d716963dd224a2b9578ba446624)) + +## 4.2.4 + + - Update a dependency to the latest release. + +## 4.2.3 + + - Update a dependency to the latest release. + +## 4.2.2 + + - Update a dependency to the latest release. + +## 4.2.1 + + - Update a dependency to the latest release. + +## 4.2.0 + + - **FEAT**: improve error message when user cancels a sign in with a provider ([#10060](https://github.com/firebase/flutterfire/issues/10060)). ([6631da6b](https://github.com/firebase/flutterfire/commit/6631da6b6b165a0c1e3260d744df1d60f3c7abe0)) + +## 4.1.5 + + - **FIX**: Apple Sign In on a secondary app doesnt sign in the correct Firebase Auth instance ([#10018](https://github.com/firebase/flutterfire/issues/10018)). ([f746d5da](https://github.com/firebase/flutterfire/commit/f746d5da0c784e28f08b9fcedfce18933a9e448e)) + +## 4.1.4 + + - **FIX**: tentative fix for null pointer exception in `parseUserInfoList` ([#9960](https://github.com/firebase/flutterfire/issues/9960)). ([dad17407](https://github.com/firebase/flutterfire/commit/dad1740792b893920867528039a9c54398ae7e3e)) + +## 4.1.3 + + - **FIX**: fix reauthenticateWithProvider on iOS with Sign In With Apple that would throw a linked exception ([#9919](https://github.com/firebase/flutterfire/issues/9919)). ([7318a8f3](https://github.com/firebase/flutterfire/commit/7318a8f32de07bd47026d3e07b80b4bab5df1e6a)) + +## 4.1.2 + + - Update a dependency to the latest release. + +## 4.1.1 + + - Update a dependency to the latest release. + +## 4.1.0 + + - **REFACTOR**: add `verify` to `QueryPlatform` and change internal `verifyToken` API to `verify` ([#9711](https://github.com/firebase/flutterfire/issues/9711)). ([c99a842f](https://github.com/firebase/flutterfire/commit/c99a842f3e3f5f10246e73f51530cc58c42b49a3)) + - **FIX**: properly propagate the `FirebaseAuthMultiFactorException` for all reauthenticate and link methods ([#9700](https://github.com/firebase/flutterfire/issues/9700)). ([9ad97c82](https://github.com/firebase/flutterfire/commit/9ad97c82ead0f5c6f1307625374c34e0dcde730b)) + - **FEAT**: expose reauthenticateWithRedirect and reauthenticateWithPopup ([#9696](https://github.com/firebase/flutterfire/issues/9696)). ([2a1f910f](https://github.com/firebase/flutterfire/commit/2a1f910ff6cab21a126c62fd4322a14ec263b629)) + +## 4.0.2 + + - Update a dependency to the latest release. + +## 4.0.1 + +- Update a dependency to the latest release. + +## 4.0.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: Firebase iOS SDK version: `10.0.0` ([#9708](https://github.com/firebase/flutterfire/issues/9708)). ([9627c56a](https://github.com/firebase/flutterfire/commit/9627c56a37d657d0250b6f6b87d0fec1c31d4ba3)) + +## 3.11.2 + + - **DOCS**: update `setSettings()` inline documentation ([#9655](https://github.com/firebase/flutterfire/issues/9655)). ([39ca0029](https://github.com/firebase/flutterfire/commit/39ca00299ec5c6e0f2dc9b0b5a8d71b8d59d51d4)) + +## 3.11.1 + + - **FIX**: fix an iOS crash when using Sign In With Apple due to invalid return of nil instead of NSNull ([#9644](https://github.com/firebase/flutterfire/issues/9644)). ([3f76b53f](https://github.com/firebase/flutterfire/commit/3f76b53f375f4398652abfa7c9236571ee0bd87f)) + +## 3.11.0 + + - **FEAT**: add OAuth Access Token support to sign in with providers ([#9593](https://github.com/firebase/flutterfire/issues/9593)). ([cb6661bb](https://github.com/firebase/flutterfire/commit/cb6661bbc701031d6f920ace3a6efc8e8d56aa4c)) + - **FEAT**: add `linkWithRedirect` to the web ([#9580](https://github.com/firebase/flutterfire/issues/9580)). ([d834b90f](https://github.com/firebase/flutterfire/commit/d834b90f29fc1929a195d7d546170e4ea03c6ab1)) + +## 3.10.0 + + - **FIX**: fix path of generated Pigeon files to prevent name collision ([#9569](https://github.com/firebase/flutterfire/issues/9569)). ([71bde27d](https://github.com/firebase/flutterfire/commit/71bde27d4e613096f121abb16d7ea8483c3fbcd8)) + - **FEAT**: add `reauthenticateWithProvider` ([#9570](https://github.com/firebase/flutterfire/issues/9570)). ([dad6b481](https://github.com/firebase/flutterfire/commit/dad6b4813c682e35315dda3965ea8aaf5ba030e8)) + +## 3.9.0 + + - **REFACTOR**: deprecate `signInWithAuthProvider` in favor of `signInWithProvider` ([#9542](https://github.com/firebase/flutterfire/issues/9542)). ([ca340ea1](https://github.com/firebase/flutterfire/commit/ca340ea19c8dbb340f083e48cf1b0de36f7d64c4)) + - **FEAT**: add `linkWithProvider` to support for linking auth providers ([#9535](https://github.com/firebase/flutterfire/issues/9535)). ([1ac14fb1](https://github.com/firebase/flutterfire/commit/1ac14fb147f83cf5c7874004a9dc61838dce8da8)) + +## 3.8.0 + + - **FIX**: remove default scopes on iOS for Sign in With Apple ([#9477](https://github.com/firebase/flutterfire/issues/9477)). ([3fe02b29](https://github.com/firebase/flutterfire/commit/3fe02b2937135ea6d576c7e445da5f4266ff0fdf)) + - **FEAT**: add Twitter login for Android, iOS and Web ([#9421](https://github.com/firebase/flutterfire/issues/9421)). ([0bc6e6d5](https://github.com/firebase/flutterfire/commit/0bc6e6d5333e6be0d5749a083206f3f5bb79a7ba)) + - **FEAT**: add Yahoo as provider for iOS, Android and Web ([#9443](https://github.com/firebase/flutterfire/issues/9443)). ([6c3108a7](https://github.com/firebase/flutterfire/commit/6c3108a767aca3b1a844b2b5da04b2da45bc9fbd)) + - **DOCS**: fix typo "appearance" in `platform_interface_firebase_auth.dart` ([#9472](https://github.com/firebase/flutterfire/issues/9472)). ([323b917b](https://github.com/firebase/flutterfire/commit/323b917b5eecf0e5161a61c66f6cabac5b23e1b8)) + +## 3.7.0 + + - **FEAT**: add Microsoft login for Android, iOS and Web ([#9415](https://github.com/firebase/flutterfire/issues/9415)). ([1610ce8a](https://github.com/firebase/flutterfire/commit/1610ce8ac96d6da202ef014e9a3dfeb4acfacec9)) + - **FEAT**: add Sign in with Apple directly in Firebase Auth for Android, iOS 13+ and Web ([#9408](https://github.com/firebase/flutterfire/issues/9408)). ([da36b986](https://github.com/firebase/flutterfire/commit/da36b9861b7d635382705b4893eed85fd672125c)) + +## 3.6.4 + + - **FIX**: fix an error where MultifactorInfo factorId could be null on iOS ([#9367](https://github.com/firebase/flutterfire/issues/9367)). ([88bded11](https://github.com/firebase/flutterfire/commit/88bded119607473c7546154ac8bdd149a2d3f21f)) + +## 3.6.3 + + - **FIX**: use correct UTC time from server for `currentUser?.metadata.creationTime` & `currentUser?.metadata.lastSignInTime` ([#9248](https://github.com/firebase/flutterfire/issues/9248)). ([a6204128](https://github.com/firebase/flutterfire/commit/a6204128edf1f54ac734385d0ed6214d50cebd1b)) + - **DOCS**: explicit mention that `refreshToken` is empty string on native platforms on the `User`instance ([#9183](https://github.com/firebase/flutterfire/issues/9183)). ([1aa1c163](https://github.com/firebase/flutterfire/commit/1aa1c1638edc632dedf8de0f02127e26b1a86e17)) + +## 3.6.2 + + - **DOCS**: update `getIdTokenResult` inline documentation ([#9150](https://github.com/firebase/flutterfire/issues/9150)). ([519518ce](https://github.com/firebase/flutterfire/commit/519518ce3ed36580e35713e791281b251018201c)) + +## 3.6.1 + + - Update a dependency to the latest release. + +## 3.6.0 + + - **FIX**: pass `Persistence` value to `FirebaseAuth.instanceFor(app: app, persistence: persistence)` for setting persistence on Web platform ([#9138](https://github.com/firebase/flutterfire/issues/9138)). ([ae7ebaf8](https://github.com/firebase/flutterfire/commit/ae7ebaf8e304a2676b2acfa68aadf0538468b4a0)) + - **FIX**: fix crash on Android where detaching from engine was not properly resetting the Pigeon handler ([#9218](https://github.com/firebase/flutterfire/issues/9218)). ([96d35df0](https://github.com/firebase/flutterfire/commit/96d35df09914fbe40515fdcd20b17a802f37270d)) + - **FEAT**: expose the missing MultiFactor classes through the universal package ([#9194](https://github.com/firebase/flutterfire/issues/9194)). ([d8bf8185](https://github.com/firebase/flutterfire/commit/d8bf818528c3705350cdb1b4675d600ba1d29d14)) + +## 3.5.1 + + - Update a dependency to the latest release. + +## 3.5.0 + + - **FEAT**: add all providers available to MFA ([#9159](https://github.com/firebase/flutterfire/issues/9159)). ([5a03a859](https://github.com/firebase/flutterfire/commit/5a03a859385f0b06ad9afe8e8c706c046976b8d8)) + - **FEAT**: add phone MFA ([#9044](https://github.com/firebase/flutterfire/issues/9044)). ([1b85c8b7](https://github.com/firebase/flutterfire/commit/1b85c8b7fbcc3f21767f23981cb35061772d483f)) + +## 3.4.2 + + - Update a dependency to the latest release. + +## 3.4.1 + + - **FIX**: bump `firebase_core_platform_interface` version to fix previous release. ([bea70ea5](https://github.com/firebase/flutterfire/commit/bea70ea5cbbb62cbfd2a7a74ae3a07cb12b3ee5a)) + +## 3.4.0 + + - **FIX**: Web recaptcha hover removed after use. (#8812). ([790e450e](https://github.com/firebase/flutterfire/commit/790e450e8d6acd2fc50e0232c77a152430c7b3ea)) + - **FIX**: java.util.ConcurrentModificationException (#8967). ([dc6c04ae](https://github.com/firebase/flutterfire/commit/dc6c04aeb4fc535a8ccadf9c11fb4d5dc413606d)) + - **FEAT**: update GitHub sign in implementation (#8976). ([ffd3b019](https://github.com/firebase/flutterfire/commit/ffd3b019c3158c66476671d9a9df245035cc2295)) + +## 3.3.20 + + - **REFACTOR**: use `firebase.google.com` link for `homepage` in `pubspec.yaml` (#8729). ([43df32d4](https://github.com/firebase/flutterfire/commit/43df32d457a28523f5956a2252dafd47856ac756)) + - **REFACTOR**: use "firebase" instead of "FirebaseExtended" as organisation in all links for this repository (#8791). ([d90b8357](https://github.com/firebase/flutterfire/commit/d90b8357db01d65e753021358668f0b129713e6b)) + - **FIX**: update firebase_auth example to not be dependent on an emulator (#8601). ([bdc9772e](https://github.com/firebase/flutterfire/commit/bdc9772ec8a3fb6609b66c42166d6d132ddb67d9)) + - **DOCS**: fix two typos. (#8876). ([7390d5c5](https://github.com/firebase/flutterfire/commit/7390d5c51e61aeb4d59c0d74093921fad3f35083)) + - **DOCS**: point to "firebase.google" domain for hyperlinks in the usage section of `README.md` files (#8814). ([78006e0d](https://github.com/firebase/flutterfire/commit/78006e0d5b9dce8038ce3606a43ddcbc8a4a71b9)) + +## 3.3.19 + + - **DOCS**: use camel case style for "FlutterFire" in `README.md` (#8748). ([c6ff0b21](https://github.com/firebase/flutterfire/commit/c6ff0b21352eb0f9a9a576ca7ef737d203292a58)) + +## 3.3.18 + + - Update a dependency to the latest release. + +## 3.3.17 + + - Update a dependency to the latest release. + +## 3.3.16 + + - **REFACTOR**: remove deprecated `Tasks.call()` API from Android. (#8452). ([3e92496b](https://github.com/firebase/flutterfire/commit/3e92496b2783ec149258c22d3167c5388dcb1c40)) + +## 3.3.15 + + - **FIX**: Use iterator instead of enhanced for loop on android. (#8498). ([027c75a6](https://github.com/firebase/flutterfire/commit/027c75a60b39a40e6a3edc12edc51487cc954503)) + +## 3.3.14 + + - Update a dependency to the latest release. + +## 3.3.13 + + - Update a dependency to the latest release. + +## 3.3.12 + + - Update a dependency to the latest release. + +## 3.3.11 + + - **FIX**: Update APN token once auth plugin has been initialized on `iOS`. (#8201). ([ab6239dd](https://github.com/firebase/flutterfire/commit/ab6239ddf5cb14211b76bced04ec52203919a57a)) + +## 3.3.10 + + - **FIX**: return correct error code for linkWithCredential `provider-already-linked` on Android (#8245). ([ae090719](https://github.com/firebase/flutterfire/commit/ae090719ebbb0873cf227f76004feeae9a7d0580)) + - **FIX**: Fixed bug that sets email to `nil` on `iOS` when the `User` has no provider. (#8209). ([fb646438](https://github.com/firebase/flutterfire/commit/fb646438f219b0f0f7c6a8c52e2b9daa4afc833e)) + +## 3.3.9 + + - **FIX**: update all Dart SDK version constraints to Dart >= 2.16.0 (#8184). ([df4a5bab](https://github.com/firebase/flutterfire/commit/df4a5bab3c029399b4f257a5dd658d302efe3908)) + +## 3.3.8 + + - Update a dependency to the latest release. + +## 3.3.7 + + - **DOCS**: Update documentation for `currentUser` property to make expectations clearer. (#7843). ([59bb47c2](https://github.com/firebase/flutterfire/commit/59bb47c2490fbd641a1fcc26f2f888e8f4f02671)) + +## 3.3.6 + + - Update a dependency to the latest release. + +## 3.3.5 + + - **FIX**: bump Android `compileSdkVersion` to 31 (#7726). ([a9562bac](https://github.com/firebase/flutterfire/commit/a9562bac60ba927fb3664a47a7f7eaceb277dca6)) + +## 3.3.4 + + - **REFACTOR**: fix all `unnecessary_import` analyzer issues introduced with Flutter 2.8. ([7f0e82c9](https://github.com/firebase/flutterfire/commit/7f0e82c978a3f5a707dd95c7e9136a3e106ff75e)) + +## 3.3.3 + + - Update a dependency to the latest release. + +## 3.3.2 + + - **DOCS**: Fix typos and remove unused imports (#7504). + +## 3.3.1 + + - Update a dependency to the latest release. + +## 3.3.0 + + - **REFACTOR**: migrate remaining examples & e2e tests to null-safety (#7393). + - **FEAT**: automatically inject Firebase JS SDKs (#7359). + +## 3.2.0 + + - **FEAT**: support initializing default `FirebaseApp` instances from Dart (#6549). + +## 3.1.5 + + - Update a dependency to the latest release. + +## 3.1.4 + + - **REFACTOR**: remove deprecated Flutter Android v1 Embedding usages, including in example app (#7158). + - **STYLE**: macOS & iOS; explicitly include header that defines `TARGET_OS_OSX` (#7116). + +## 3.1.3 + + - **REFACTOR**: migrate example app to null-safety (#7111). + +## 3.1.2 + + - **FIX**: allow setLanguage to accept null (#7050). + - **CHORE**: remove google-signin plugin temporarily to fix CI (#7047). + +## 3.1.1 + + - **FIX**: use Locale.ROOT while processing error code (#6946). + +## 3.1.0 + + - **FEAT**: expose linkWithPopup() & correctly parse credentials in exceptions (#6562). + +## 3.0.2 + + - **STYLE**: enable additional lint rules (#6832). + - **FIX**: precise error message is propagated (#6793). + - **FIX**: Use angle bracket import consistently when importing Firebase.h for iOS (#5891). + - **FIX**: stop idTokenChanges & userChanges firing twice on initial listen (#6560). + +## 3.0.1 + + - **FIX**: reinstate deprecated emulator apis (#6626). + +## 3.0.0 + +> Note: This release has breaking changes. + + - **FEAT**: setSettings now possible for android (#6367). + - **DOCS**: phone provider account linking update (#6465). + - **CHORE**: update v2 embedding support (#6506). + - **CHORE**: verifyPhoneNumber() example (#6476). + - **CHORE**: rm deprecated jcenter repository (#6431). + - **BREAKING** **FEAT**: useEmulator(host, port) API update (#6439). + +## 2.0.0 + +> Note: This release has breaking changes. + + - **FEAT**: setSettings now possible for android (#6367). + - **DOCS**: phone provider account linking update (#6465). + - **CHORE**: verifyPhoneNumber() example (#6476). + - **CHORE**: rm deprecated jcenter repository (#6431). + - **BREAKING** **FEAT**: useAuthEmulator(host, port) API update. + +## 1.4.1 + + - Update a dependency to the latest release. + +## 1.4.0 + + - **FEAT**: add tenantId support (#5736). + +## 1.3.0 + + - **FEAT**: add User.updateDisplayName and User.updatePhotoURL (#6213). + - **DOCS**: Add Flutter Favorite badge (#6190). + +## 1.2.0 + + - **FEAT**: upgrade Firebase JS SDK version to 8.6.1. + - **FIX**: podspec osx version checking script should use a version range instead of a single fixed version. + +## 1.1.4 + + - **FIX**: correctly cleanup Dictionary handlers (#6101). + - **DOCS**: Update the documentation of sendPasswordResetEmail (#6051). + - **CHORE**: publish packages (#6022). + - **CHORE**: publish packages. + +## 1.1.3 + + - **FIX**: Fix firebase_auth not being registered as a plugin (#5987). + - **CI**: refactor to use Firebase Auth emulator (#5939). + +## 1.1.2 + + - **FIX**: fixed an issue where Web could not connect to the Firebase Auth emulator (#5940). + - **FIX**: Import all necessary headers from the header file. (#5890). + - **FIX**: Move communication to EventChannels (#4643). + - **DOCS**: remove implicit-cast in the doc of AuthProviders (#5862). + +## 1.1.1 + + - **FIX**: ensure web is initialized before sending stream events (#5766). + - **DOCS**: Add UserInfoCard widget in auth example SignInPage (#4635). + - **CI**: fix analyzer issues in example. + - **CHORE**: update Web plugins to use Firebase JS SDK version 8.4.1 (#4464). + +## 1.1.0 + + - **FEAT**: PhoneAuthProvider.credential and PhoneAuthProvider.credentialFromToken now return a PhoneAuthCredential (#5675). + - **CHORE**: update drive dependency (#5740). + +## 1.0.3 + + - **DOCS**: userChanges clarification (#5698). + +## 1.0.2 + + - Update a dependency to the latest release. + +## 1.0.1 + + - **DOCS**: note that auth emulator is not supported for web (#5169). + +## 1.0.0 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + +## 1.0.0-1.0.nullsafety.0 + + - Bump "firebase_auth" to `1.0.0-1.0.nullsafety.0`. + +## 0.21.0-1.1.nullsafety.3 + + - Update a dependency to the latest release. + +## 0.21.0-1.1.nullsafety.2 + + - **TESTS**: update mockito API usage in tests + +## 0.21.0-1.1.nullsafety.1 + + - **REFACTOR**: pubspec & dependency updates (#4932). + +## 0.21.0-1.1.nullsafety.0 + + - **FEAT**: implement support for `useEmulator` (#4263). + +## 0.21.0-1.0.nullsafety.0 + + - **FIX**: bump firebase_core_* package versions to updated NNBD versioning format (#4832). + +## 0.21.0-nullsafety.0 + + - **FEAT**: Migrated to null safety (#4633) + +## 0.20.0+1 + + - **FIX**: package compatibility. + +## 0.20.0 + +> Note: This release has breaking changes. + + - **FIX**: null pointer exception if user metadata null (#4622). + - **FEAT**: add check on podspec to assist upgrading users deployment target. + - **BUILD**: commit Podfiles with 10.12 deployment target. + - **BUILD**: remove default sdk version, version should always come from firebase_core, or be user defined. + - **BUILD**: set macOS deployment target to 10.12 (from 10.11). + - **BREAKING** **BUILD**: set osx min supported platform version to 10.12. + +## 0.19.0+1 + + - Update a dependency to the latest release. + +## 0.19.0 + +> Note: This release has breaking changes. + + - **CHORE**: harmonize dependencies and version handling. + - **BREAKING** **REFACTOR**: remove all currently deprecated APIs. + - **BREAKING** **FEAT**: forward port to firebase-ios-sdk v7.3.0. + - Due to this SDK upgrade, iOS 10 is now the minimum supported version by FlutterFire. Please update your build target version. + +## 0.18.4+1 + + - Update a dependency to the latest release. + +## 0.18.4 + + - **FEAT**: bump android `com.android.tools.build` & `'com.google.gms:google-services` versions (#4269). + - **DOCS**: Fixed two typos in method documentation (#4219). + +## 0.18.3+1 + + - **TEST**: Explicitly opt-out from null safety. + - **FIX**: stop authStateChange firing twice for initial event (#4099). + - **FIX**: updated email link signin to use latest format for ActionCodeSettings (#3425). + - **CHORE**: add missing dependency to example app. + - **CHORE**: bump gradle wrapper to 5.6.4 (#4158). + +## 0.18.3 + + - **FEAT**: migrate firebase interop files to local repository (#3973). + - **FEAT**: bump `compileSdkVersion` to 29 in preparation for upcoming Play Store requirement. + - **FEAT** [WEB] adds support for `EmailAuthProvider.credentialWithLink` + - **FEAT** [WEB] adds support for `FirebaseAuth.setSettings` + - **FEAT** [WEB] adds support for `User.tenantId` + - **FEAT** [WEB] `FirebaseAuthException` now supports `email` & `credential` properties + - **FEAT** [WEB] `ActionCodeInfo` now supports `previousEmail` field + +## 0.18.2 + + - **FEAT**: bump compileSdkVersion to 29 (#3975). + - **FEAT**: update Firebase iOS SDK version to 6.33.0 (from 6.26.0). + +## 0.18.1+2 + + - **FIX**: on iOS use sendEmailVerificationWithActionCodeSettings instead of sendEmailVerificationWithCompletion (#3686). + - **DOCS**: README updates (#3768). + +## 0.18.1+1 + + - **FIX**: Optional params for "signInWithCredential" method are converted to "nil" if "null" for iOS (#3731). + +## 0.18.1 + + - **FIX**: local dependencies in example apps (#3319). + - **FIX**: fix IdTokenResult timestamps (web, ios) (#3357). + - **FIX**: pub.dev score fixes (#3318). + - **FIX**: use unknown APNS token type (#3345). + - **FIX**: update FLTFirebaseAuthPlugin.m (#3360). + - **FIX**: use correct FIRAuth instance on listeners (#3316). + - **FEAT**: add support for linkWithPhoneNumber (#3436). + - **FEAT**: use named arguments for ActionCodeSettings (#3269). + - **FEAT**: implement signInWithPhoneNumber on web (#3205). + - **FEAT**: expose smsCode (android only) (#3308). + - **DOCS**: fixed signOut method documentation (#3342). + +## 0.18.0+1 + +* Fixed an Android issue where certain network related Firebase Auth error codes would come through as `unknown`. [(#3217)](https://github.com/firebase/flutterfire/pull/3217) +* Added missing deprecations: `FirebaseUser` class and `photoUrl` getter. +* Bump `firebase_auth_platform_interface` dependency to fix an assertion issue when creating Google sign-in credentials. +* Bump `firebase_auth_web` dependency to `^0.3.0+1`. + +## 0.18.0 + +Overall, Firebase Auth has been heavily reworked to bring it inline with the federated plugin setup along with adding new features, documentation and many more unit and end-to-end tests. The API has mainly been kept the same, however there are some breaking changes. + +### General + +- **BREAKING**: The `FirebaseUser` class has been renamed to `User`. +- **BREAKING**: The `AuthResult` class has been renamed to `UserCredential`. +- **NEW**: The `ActionCodeSettings` class is now consumable on all supporting methods. + - **NEW**: Added support for the `dynamicLinkDomain` property. +- **NEW**: Added a new `FirebaseAuthException` class (extends `FirebaseException`). + - All errors are now returned as a `FirebaseAuthException`, allowing you to access the code & message associated with the error. + - In addition, it is now possible to access the `email` and `credential` properties on exceptions if they exist. + +### `FirebaseAuth` + +- **BREAKING**: Accessing the current user via `currentUser()` is now synchronous via the `currentUser` getter. +- **BREAKING**: `isSignInWithEmailLink()` is now synchronous. +- **DEPRECATED**: `FirebaseAuth.fromApp()` is now deprecated in favor of `FirebaseAuth.instanceFor()`. +- **DEPRECATED**: `onAuthStateChanged` has been deprecated in favor of `authStateChanges()`. +- **NEW**: Added support for `idTokenChanges()` stream listener. +- **NEW**: Added support for `userChanges()` stream listener. + - The purpose of this API is to allow users to subscribe to all user events without having to manually hydrate app state in cases where a manual reload was required (e.g. `updateProfile()`). +- **NEW**: Added support for `applyActionCode()`. +- **NEW**: Added support for `checkActionCode()`. +- **NEW**: Added support for `verifyPasswordResetCode()`. +- **NEW**: Added support for accessing the current language code via the `languageCode` getter. +- **NEW**: `setLanguageCode()` now supports providing a `null` value. + - On web platforms, if `null` is provided the Firebase projects default language will be set. + - On native platforms, if `null` is provided the device language will be used. +- **NEW**: `verifyPhoneNumber()` exposes a `autoRetrievedSmsCodeForTesting` property. + - This allows developers to test automatic SMS code resolution on Android devices during development. +- **NEW** (iOS): `appVerificationDisabledForTesting` setting can now be set for iOS. + - This allows developers to skip ReCaptcha verification when testing phone authentication. +- **NEW** (iOS): `userAccessGroup` setting can now be set for iOS & MacOS. + - This allows developers to share authentication states across multiple apps or extensions on iOS & MacOS. For more information see the [Firebase iOS SDK documentation](https://firebase.google.com/docs/auth/ios/single-sign-on). + +### `User` + +- **BREAKING**: Removed the `UpdateUserInfo` class when using `updateProfile` in favor of named arguments. +- **NEW**: Added support for `getIdTokenResult()`. +- **NEW**: Added support for `verifyBeforeUpdateEmail()`. +- **FIX**: Fixed several iOS crashes when the Firebase SDK returned `nil` property values. +- **FIX**: Fixed an issue on Web & iOS where a users email address would still show after unlinking the email/password provider. + +### `UserCredential` + +- **NEW**: Added support for accessing the users `AuthCredential` via the `credential` property. + +### `AuthProvider` & `AuthCredential` + +- **DEPRECATED**: All sub-class (e.g. `GoogleAuthProvider`) `getCredential()` methods have been deprecated in favor of `credential()`. + - **DEPRECATED**: `EmailAuthProvider.getCredentialWithLink()` has been deprecated in favor of `EmailAuthProvider.credentialWithLink()`. +- **NEW**: Supporting providers can now assign scope and custom request parameters. + - The scope and parameters will be used on web platforms when triggering a redirect or popup via `signInWithPopup()` or `signInWithRedirect()`. + +## 0.17.0-dev.2 + +* Update plugin and example to use the same core. + +## 0.17.0-dev.1 + +* Depend on `firebase_core` pre-release versions. + +## 0.16.1+2 + +* Update README to make it clear which authentication options are possible. + +## 0.16.1+1 + +* Fix bug #2656 (verifyPhoneNumber always use the default FirebaseApp, not the configured one) + +## 0.16.1 + +* Update lower bound of dart dependency to 2.0.0. + +## 0.16.0 + +* Migrate to Android v2 embedding. + +## 0.15.5+3 + +* Fix for missing UserAgent.h compilation failures. + +## 0.15.5+2 + +* Update the platform interface dependency to 1.1.7 and update tests. + +## 0.15.5+1 + +* Make the pedantic dev_dependency explicit. + +## 0.15.5 + +* Add macOS support + +## 0.15.4+1 + +* Fix fallthrough bug in Android code. + +## 0.15.4 + +* Add support for `confirmPasswordReset` on Android and iOS. + +## 0.15.3+1 + +* Add integration instructions for the `web` platform. + +## 0.15.3 + +* Add support for OAuth Authentication for iOS and Android to solve generic providers authentication. + +## 0.15.2 + +* Add web support by default. +* Require Flutter SDK 1.12.13+hotfix.4 or later. + +## 0.15.1+1 + +* Remove the deprecated `author:` field from pubspec.yaml +* Migrate the plugin to the pubspec platforms manifest. +* Bump the minimum Flutter version to 1.10.0. + +## 0.15.1 + +* Migrate to use `firebase_auth_platform_interface`. + +## 0.15.0+2 + +* Update homepage since this package was moved. + +## 0.15.0+1 + +* Added missing ERROR_WRONG_PASSWORD Exception to the `reauthenticateWithCredential` docs. + +## 0.15.0 + +* Fixed `NoSuchMethodError` in `reauthenticateWithCredential`. +* Fixed `IdTokenResult` analyzer warnings. +* Reduced visibility of `IdTokenResult` constructor. + +## 0.14.0+10 + +* Formatted lists in member documentations for better readability. + +## 0.14.0+9 + +* Fix the behavior of `getIdToken` to use the `refresh` parameter instead of always refreshing. + +## 0.14.0+8 + +* Updated README instructions for contributing for consistency with other Flutterfire plugins. + +## 0.14.0+7 + +* Remove AndroidX warning. + +## 0.14.0+6 + +* Update example app with correct const constructors. + +## 0.14.0+5 + +* On iOS, `fetchSignInMethodsForEmail` now returns an empty list when the email + cannot be found, matching the Android behavior. + +## 0.14.0+4 + +* Fixed "Register a user" example code snippet in README.md. + +## 0.14.0+3 + +* Update documentation to reflect new repository location. +* Update unit tests to call `TestWidgetsFlutterBinding.ensureInitialized`. +* Remove executable bit on LICENSE file. + +## 0.14.0+2 + +* Reduce compiler warnings on iOS port by replacing `int` with `long` backing in returned timestamps. + +## 0.14.0+1 + +* Add dependency on `androidx.annotation:annotation:1.0.0`. + +## 0.14.0 + +* Added new `IdTokenResult` class. +* **Breaking Change**. `getIdToken()` method now returns `IdTokenResult` instead of a token `String`. + Use the `token` property of `IdTokenResult` to retrieve the token `String`. +* Added integration testing for `getIdToken()`. + +## 0.13.1+1 + +* Update authentication example in README. + +## 0.13.1 + +* Fixed a crash on iOS when sign-in fails. +* Additional integration testing. +* Updated documentation for `FirebaseUser.delete()` to include error codes. +* Updated Firebase project to match other Flutterfire apps. + +## 0.13.0 + +* **Breaking change**: Replace `FirebaseUserMetadata.creationTimestamp` and + `FirebaseUserMetadata.lastSignInTimestamp` with `creationTime` and `lastSignInTime`. + Previously on iOS `creationTimestamp` and `lastSignInTimestamp` returned in + seconds and on Android in milliseconds. Now, both platforms provide values as a + `DateTime`. + +## 0.12.0+1 + +* Fixes iOS sign-in exceptions when `additionalUserInfo` is `nil` or has `nil` fields. +* Additional integration testing. + +## 0.12.0 + +* Added new `AuthResult` and `AdditionalUserInfo` classes. +* **Breaking Change**. Sign-in methods now return `AuthResult` instead of `FirebaseUser`. + Retrieve the `FirebaseUser` using the `user` property of `AuthResult`. + +## 0.11.1+12 + +* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. + +## 0.11.1+11 + +* On iOS, `getIdToken()` now uses the `refresh` parameter instead of always using `true`. + +## 0.11.1+10 + +* On Android, `providerData` now includes `UserInfo` for the phone authentication provider. + +## 0.11.1+9 + +* Update README to clarify importance of filling out all fields for OAuth consent screen. + +## 0.11.1+8 + +* Automatically register for iOS notifications, ensuring that phone authentication + will work even if Firebase method swizzling is disabled. + +## 0.11.1+7 + +* Automatically use version from pubspec.yaml when reporting usage to Firebase. + +## 0.11.1+6 + +* Add documentation of support email requirement to README. + +## 0.11.1+5 + +* Fix `updatePhoneNumberCredential` on Android. + +## 0.11.1+4 + +* Fix `updatePhoneNumberCredential` on iOS. + +## 0.11.1+3 + +* Add missing template type parameter to `invokeMethod` calls. +* Bump minimum Flutter version to 1.5.0. +* Replace invokeMethod with invokeMapMethod wherever necessary. +* FirebaseUser private constructor takes `Map` instead of `Map`. + +## 0.11.1+2 + +* Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 + +## 0.11.1+1 + +* Updated the error code documentation for `linkWithCredential`. + +## 0.11.1 + +* Support for `updatePhoneNumberCredential`. + +## 0.11.0 + +* **Breaking change**: `linkWithCredential` is now a function of `FirebaseUser`instead of + `FirebaseAuth`. +* Added test for newer `linkWithCredential` function. + +## 0.10.0+1 + +* Increase Firebase/Auth CocoaPod dependency to '~> 6.0'. + +## 0.10.0 + +* Update firebase_dynamic_links dependency. +* Update Android dependencies to latest. + +## 0.9.0 + +* **Breaking change**: `PhoneVerificationCompleted` now provides an `AuthCredential` that can + be used with `signInWithCredential` or `linkWithCredential` instead of signing in automatically. +* **Breaking change**: Remove internal counter `nextHandle` from public API. + +## 0.8.4+5 + +* Increase Firebase/Auth CocoaPod dependency to '~> 5.19'. + +## 0.8.4+4 + +* Update FirebaseAuth CocoaPod dependency to ensure availability of `FIRAuthErrorUserInfoNameKey`. + +## 0.8.4+3 + +* Updated deprecated API usage on iOS to use non-deprecated versions. +* Updated FirebaseAuth CocoaPod dependency to ensure a minimum version of 5.0. + +## 0.8.4+2 + +* Fixes an error in the documentation of createUserWithEmailAndPassword. + +## 0.8.4+1 + +* Adds credential for email authentication with link. + +## 0.8.4 + +* Adds support for email link authentication. + +## 0.8.3 + +* Make providerId 'const String' to use in 'case' statement. + +## 0.8.2+1 + +* Fixed bug where `PhoneCodeAutoRetrievalTimeout` callback was never called. + +## 0.8.2 + +* Fixed `linkWithCredential` on Android. + +## 0.8.1+5 + +* Added a driver test. + +## 0.8.1+4 + +* Update README. +* Update the example app with separate pages for registration and sign-in. + +## 0.8.1+3 + +* Reduce compiler warnings in Android plugin +* Raise errors early when accessing methods that require a Firebase User + +## 0.8.1+2 + +* Log messages about automatic configuration of the default app are now less confusing. + +## 0.8.1+1 + +* Remove categories. + +## 0.8.1 + +* Fixes Firebase auth phone sign-in for Android. + +## 0.8.0+3 + +* Log a more detailed warning at build time about the previous AndroidX + migration. + +## 0.8.0+2 + +* Update Google sign-in example in the README. + +## 0.8.0+1 + +* Update a broken dependency. + +## 0.8.0 + +* **Breaking change**. Migrate from the deprecated original Android Support + Library to AndroidX. This shouldn't result in any functional changes, but it + requires any Android apps using this plugin to [also + migrate](https://developer.android.com/jetpack/androidx/migrate) if they're + using the original support library. + +## 0.7.0 + +* Introduce third-party auth provider classes that generate `AuthCredential`s +* **Breaking Change** Signing in, linking, and reauthenticating now require an `AuthCredential` +* **Breaking Change** Unlinking now uses providerId +* **Breaking Change** Moved reauthentication to FirebaseUser + +## 0.6.7 + +* `FirebaseAuth` and `FirebaseUser` are now fully documented. +* `PlatformExceptions` now report error codes as stated in docs. +* Credentials can now be unlinked from Accounts with new methods on `FirebaseUser`. + +## 0.6.6 + +* Users can now reauthenticate in response to operations that require a recent sign-in. + +## 0.6.5 + +* Fixing async method `verifyPhoneNumber`, that would never return even in a successful call. + +## 0.6.4 + +* Added support for Github signin and linking Github accounts to existing users. + +## 0.6.3 + +* Add multi app support. + +## 0.6.2+1 + +* Bump Android dependencies to latest. + +## 0.6.2 + +* Add access to user metadata. + +## 0.6.1 + +* Adding support for linkWithTwitterCredential in FirebaseAuth. + +## 0.6.0 + +* Added support for `updatePassword` in `FirebaseUser`. +* **Breaking Change** Moved `updateEmail` and `updateProfile` to `FirebaseUser`. + This brings the `firebase_auth` package inline with other implementations and documentation. + +## 0.5.20 + +* Replaced usages of guava's: ImmutableList and ImmutableMap with platform +Collections.unmodifiableList() and Collections.unmodifiableMap(). + +## 0.5.19 + +* Update test package dependency to pick up Dart 2 support. +* Modified dependency on google_sign_in to point to a published + version instead of a relative path. + +## 0.5.18 + +* Adding support for updateEmail in FirebaseAuth. + +## 0.5.17 + +* Adding support for FirebaseUser.delete. + +## 0.5.16 + +* Adding support for setLanguageCode in FirebaseAuth. + +## 0.5.15 + +* Bump Android and Firebase dependency versions. + +## 0.5.14 + +* Fixed handling of auto phone number verification. + +## 0.5.13 + +* Add support for phone number authentication. + +## 0.5.12 + +* Fixed ArrayIndexOutOfBoundsException in handleStopListeningAuthState + +## 0.5.11 + +* Updated Gradle tooling to match Android Studio 3.1.2. + +## 0.5.10 + +* Updated iOS implementation to reflect Firebase API changes. + +## 0.5.9 + +* Added support for signing in with a Twitter account. + +## 0.5.8 + +* Added support to reload firebase user + +## 0.5.7 + +* Added support to sendEmailVerification + +## 0.5.6 + +* Added support for linkWithFacebookCredential + +## 0.5.5 + +* Updated Google Play Services dependencies to version 15.0.0. + +## 0.5.4 + +* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. + +## 0.5.3 + +* Secure fetchProvidersForEmail (no providers) + +## 0.5.2 + +* Fixed Dart 2 type error in fetchProvidersForEmail. + +## 0.5.1 + +* Added support to fetchProvidersForEmail + +## 0.5.0 + +* **Breaking change**. Set SDK constraints to match the Flutter beta release. + +## 0.4.7 + +* Fixed Dart 2 type errors. + +## 0.4.6 + +* Fixed Dart 2 type errors. + +## 0.4.5 + +* Enabled use in Swift projects. + +## 0.4.4 + +* Added support for sendPasswordResetEmail + +## 0.4.3 + +* Moved to the io.flutter.plugins organization. + +## 0.4.2 + +* Added support for changing user data + +## 0.4.1 + +* Simplified and upgraded Android project template to Android SDK 27. +* Updated package description. + +## 0.4.0 + +* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin + 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in + order to use this version of the plugin. Instructions can be found + [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). +* Relaxed GMS dependency to [11.4.0,12.0[ + +## 0.3.2 + +* Added FLT prefix to iOS types +* Change GMS dependency to 11.4.+ + +## 0.3.1 + +* Change GMS dependency to 11.+ + +## 0.3.0 + +* **Breaking Change**: Method FirebaseUser getToken was renamed to getIdToken. + +## 0.2.5 + +* Added support for linkWithCredential with Google credential + +## 0.2.4 + +* Added support for `signInWithCustomToken` +* Added `Stream onAuthStateChanged` event to listen when the user change + +## 0.2.3+1 + +* Aligned author name with rest of repo. + +## 0.2.3 + +* Remove dependency on Google/SignIn + +## 0.2.2 + +* Remove dependency on FirebaseUI + +## 0.2.1 + +* Added support for linkWithEmailAndPassword + +## 0.2.0 + +* **Breaking Change**: Method currentUser is async now. + +## 0.1.2 + +* Added support for signInWithFacebook + +## 0.1.1 + +* Updated to Firebase SDK to always use latest patch version for 11.0.x builds + +## 0.1.0 + +* Updated to Firebase SDK Version 11.0.1 +* **Breaking Change**: You need to add a maven section with the "https://maven.google.com" endpoint to the repository section of your `android/build.gradle`. For example: +```gradle +allprojects { + repositories { + jcenter() + maven { // NEW + url "https://maven.google.com" // NEW + } // NEW + } +} +``` + +## 0.0.4 + +* Add method getToken() to FirebaseUser + +## 0.0.3+1 + +* Updated README.md + +## 0.0.3 + +* Added support for createUserWithEmailAndPassword, signInWithEmailAndPassword, and signOut Firebase methods + +## 0.0.2+1 + +* Updated README.md + +## 0.0.2 + +* Bump buildToolsVersion to 25.0.3 + +## 0.0.1 + +* Initial Release diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/LICENSE b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/LICENSE new file mode 100644 index 00000000..000b4618 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/README.md new file mode 100755 index 00000000..230c522d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/README.md @@ -0,0 +1,26 @@ +[](https://flutter.dev/docs/development/packages-and-plugins/favorites) + +# Firebase Auth for Flutter +[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) + +A Flutter plugin to use the [Firebase Authentication API](https://firebase.google.com/products/auth/). + +To learn more about Firebase Auth, please visit the [Firebase website](https://firebase.google.com/products/auth) + +## Getting Started + +To get started with Firebase Auth for Flutter, please [see the documentation](https://firebase.google.com/docs/auth/flutter/start). + +## Usage + +To use this plugin, please visit the [Authentication Usage documentation](https://firebase.google.com/docs/auth/flutter/manage-users) + +## Issues and feedback + +Please file FlutterFire specific issues, bugs, or feature requests in our [issue tracker](https://github.com/firebase/flutterfire/issues/new). + +Plugin issues that are not specific to FlutterFire can be filed in the [Flutter issue tracker](https://github.com/flutter/flutter/issues/new). + +To contribute a change to this plugin, +please review our [contribution guide](https://github.com/firebase/flutterfire/blob/main/CONTRIBUTING.md) +and open a [pull request](https://github.com/firebase/flutterfire/pulls). diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/build.gradle new file mode 100755 index 00000000..1004a0e7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/build.gradle @@ -0,0 +1,66 @@ +group 'io.flutter.plugins.firebase.auth' +version '1.0-SNAPSHOT' + +apply plugin: 'com.android.library' + +buildscript { + repositories { + google() + mavenCentral() + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +def firebaseCoreProject = findProject(':firebase_core') +if (firebaseCoreProject == null) { + throw new GradleException('Could not find the firebase_core FlutterFire plugin, have you added it as a dependency in your pubspec?') +} else if (!firebaseCoreProject.properties['FirebaseSDKVersion']) { + throw new GradleException('A newer version of the firebase_core FlutterFire plugin is required, please update your firebase_core pubspec dependency.') +} + +def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { + if (!rootProject.ext.has('FlutterFire')) return firebaseCoreProject.properties[name] + if (!rootProject.ext.get('FlutterFire')[name]) return firebaseCoreProject.properties[name] + return rootProject.ext.get('FlutterFire').get(name) +} + +android { + // Conditional for compatibility with AGP <4.2. + if (project.android.hasProperty("namespace")) { + namespace 'io.flutter.plugins.firebase.auth' + } + + compileSdkVersion 34 + + defaultConfig { + minSdkVersion 23 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion(17) + targetCompatibility JavaVersion.toVersion(17) + } + + buildFeatures { + buildConfig true + } + + lintOptions { + disable 'InvalidPackage' + } + dependencies { + api firebaseCoreProject + implementation platform("com.google.firebase:firebase-bom:${getRootProjectExtOrCoreProperty("FirebaseSDKVersion", firebaseCoreProject)}") + implementation 'com.google.firebase:firebase-auth' + implementation 'androidx.annotation:annotation:1.7.0' + } +} + +apply from: file("./user-agent.gradle") diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle.properties b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle.properties new file mode 100755 index 00000000..8bd86f68 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/settings.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/settings.gradle new file mode 100755 index 00000000..ec51773d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/settings.gradle @@ -0,0 +1,8 @@ +rootProject.name = 'firebase_auth' + +pluginManagement { + plugins { + id "com.android.application" version "8.3.0" + id "com.android.library" version "8.3.0" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml new file mode 100755 index 00000000..087541c2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java new file mode 100644 index 00000000..e4147bee --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuth.AuthStateListener; +import com.google.firebase.auth.FirebaseUser; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class AuthStateChannelStreamHandler implements StreamHandler { + + private final FirebaseAuth firebaseAuth; + private AuthStateListener authStateListener; + + public AuthStateChannelStreamHandler(FirebaseAuth firebaseAuth) { + this.firebaseAuth = firebaseAuth; + } + + @Override + public void onListen(Object arguments, EventSink events) { + Map event = new HashMap<>(); + event.put(Constants.APP_NAME, firebaseAuth.getApp().getName()); + + final AtomicBoolean initialAuthState = new AtomicBoolean(true); + + authStateListener = + auth -> { + if (initialAuthState.get()) { + initialAuthState.set(false); + return; + } + + FirebaseUser user = auth.getCurrentUser(); + + if (user == null) { + event.put(Constants.USER, null); + } else { + event.put( + Constants.USER, PigeonParser.manuallyToList(PigeonParser.parseFirebaseUser(user))); + } + + events.success(event); + }; + + firebaseAuth.addAuthStateListener(authStateListener); + } + + @Override + public void onCancel(Object arguments) { + if (authStateListener != null) { + firebaseAuth.removeAuthStateListener(authStateListener); + authStateListener = null; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java new file mode 100644 index 00000000..2dd8df20 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java @@ -0,0 +1,46 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +public class Constants { + + public static final String APP_NAME = "appName"; + + // Providers + public static final String SIGN_IN_METHOD_PASSWORD = "password"; + public static final String SIGN_IN_METHOD_EMAIL_LINK = "emailLink"; + public static final String SIGN_IN_METHOD_FACEBOOK = "facebook.com"; + public static final String SIGN_IN_METHOD_GOOGLE = "google.com"; + public static final String SIGN_IN_METHOD_TWITTER = "twitter.com"; + public static final String SIGN_IN_METHOD_GITHUB = "github.com"; + public static final String SIGN_IN_METHOD_PHONE = "phone"; + public static final String SIGN_IN_METHOD_OAUTH = "oauth"; + public static final String SIGN_IN_METHOD_PLAY_GAMES = "playgames.google.com"; + // User + public static final String USER = "user"; + public static final String EMAIL = "email"; + + public static final String PROVIDER_ID = "providerId"; + public static final String CREDENTIAL = "credential"; + public static final String SECRET = "secret"; + public static final String ID_TOKEN = "idToken"; + public static final String TOKEN = "token"; + public static final String ACCESS_TOKEN = "accessToken"; + public static final String RAW_NONCE = "rawNonce"; + public static final String EMAIL_LINK = "emailLink"; + public static final String VERIFICATION_ID = "verificationId"; + public static final String SMS_CODE = "smsCode"; + public static final String SIGN_IN_METHOD = "signInMethod"; + public static final String FORCE_RESENDING_TOKEN = "forceResendingToken"; + public static final String NAME = "name"; + public static final String SERVER_AUTH_CODE = "serverAuthCode"; + + // MultiFactor + public static final String MULTI_FACTOR_HINTS = "multiFactorHints"; + public static final String MULTI_FACTOR_SESSION_ID = "multiFactorSessionId"; + public static final String MULTI_FACTOR_RESOLVER_ID = "multiFactorResolverId"; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java new file mode 100755 index 00000000..a122221c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java @@ -0,0 +1,782 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.firebase.auth; + +import static io.flutter.plugins.firebase.auth.FlutterFirebaseMultiFactor.multiFactorUserMap; +import static io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry.registerPlugin; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.TaskCompletionSource; +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.ActionCodeResult; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.MultiFactor; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import com.google.firebase.auth.SignInMethodQueryResult; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin; +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** Flutter plugin for Firebase Auth. */ +public class FlutterFirebaseAuthPlugin + implements FlutterFirebasePlugin, + FlutterPlugin, + ActivityAware, + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi { + + private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_auth"; + + // Stores the instances of native AuthCredentials by their hashCode + static final HashMap authCredentials = new HashMap<>(); + + @Nullable private BinaryMessenger messenger; + + private MethodChannel channel; + private Activity activity; + + private final Map streamHandlers = new HashMap<>(); + + private final FlutterFirebaseAuthUser firebaseAuthUser = new FlutterFirebaseAuthUser(); + private final FlutterFirebaseMultiFactor firebaseMultiFactor = new FlutterFirebaseMultiFactor(); + + private final FlutterFirebaseTotpMultiFactor firebaseTotpMultiFactor = + new FlutterFirebaseTotpMultiFactor(); + private final FlutterFirebaseTotpSecret firebaseTotpSecret = new FlutterFirebaseTotpSecret(); + + private void initInstance(BinaryMessenger messenger) { + registerPlugin(METHOD_CHANNEL_NAME, this); + channel = new MethodChannel(messenger, METHOD_CHANNEL_NAME); + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi.setUp(messenger, this); + GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi.setUp(messenger, firebaseAuthUser); + GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi.setUp(messenger, firebaseMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi.setUp(messenger, firebaseMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi.setUp(messenger, firebaseTotpMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi.setUp(messenger, firebaseTotpSecret); + + this.messenger = messenger; + } + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + initInstance(binding.getBinaryMessenger()); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + + assert messenger != null; + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi.setUp(messenger, null); + + channel = null; + messenger = null; + + removeEventListeners(); + } + + @Override + public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) { + activity = activityPluginBinding.getActivity(); + firebaseAuthUser.setActivity(activity); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + activity = null; + firebaseAuthUser.setActivity(null); + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) { + activity = activityPluginBinding.getActivity(); + firebaseAuthUser.setActivity(activity); + } + + @Override + public void onDetachedFromActivity() { + activity = null; + firebaseAuthUser.setActivity(null); + } + + // Only access activity with this method. + @Nullable + private Activity getActivity() { + return activity; + } + + static FirebaseAuth getAuthFromPigeon( + GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp pigeonApp) { + FirebaseApp app = FirebaseApp.getInstance(pigeonApp.getAppName()); + FirebaseAuth auth = FirebaseAuth.getInstance(app); + if (pigeonApp.getTenantId() != null) { + auth.setTenantId(pigeonApp.getTenantId()); + } + String customDomain = FlutterFirebaseCorePlugin.customAuthDomain.get(pigeonApp.getAppName()); + if (customDomain != null) { + auth.setCustomAuthDomain(customDomain); + } + + // Auth's `getCustomAuthDomain` supersedes value from `customAuthDomain` map set by + // `initializeApp` + if (pigeonApp.getCustomAuthDomain() != null) { + auth.setCustomAuthDomain(pigeonApp.getCustomAuthDomain()); + } + + return auth; + } + + @Override + public void registerIdTokenListener( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + final FirebaseAuth auth = getAuthFromPigeon(app); + final IdTokenChannelStreamHandler handler = new IdTokenChannelStreamHandler(auth); + final String name = METHOD_CHANNEL_NAME + "/id-token/" + auth.getApp().getName(); + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + result.success(name); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void registerAuthStateListener( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + final FirebaseAuth auth = getAuthFromPigeon(app); + final AuthStateChannelStreamHandler handler = new AuthStateChannelStreamHandler(auth); + final String name = METHOD_CHANNEL_NAME + "/auth-state/" + auth.getApp().getName(); + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + result.success(name); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void useEmulator( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String host, + @NonNull Long port, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth.useEmulator(host, port.intValue()); + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void applyActionCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .applyActionCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void checkActionCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .checkActionCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + ActionCodeResult actionCodeInfo = task.getResult(); + result.success(PigeonParser.parseActionCodeResult(actionCodeInfo)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void confirmPasswordReset( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull String newPassword, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .confirmPasswordReset(code, newPassword) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void createUserWithEmailAndPassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .createUserWithEmailAndPassword(email, password) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInAnonymously( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInAnonymously() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (credential == null) { + throw FlutterFirebaseAuthPluginException.invalidCredential(); + } + firebaseAuth + .signInWithCredential(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithCustomToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String token, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .signInWithCustomToken(token) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithEmailAndPassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInWithEmailAndPassword(email, password) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithEmailLink( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String emailLink, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInWithEmailLink(email, emailLink) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + OAuthProvider.Builder provider = + OAuthProvider.newBuilder(signInProvider.getProviderId(), firebaseAuth); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseAuth + .startActivityForSignInWithProvider(getActivity(), provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signOut( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + if (firebaseAuth.getCurrentUser() != null) { + final Map appMultiFactorUser = + multiFactorUserMap.get(app.getAppName()); + if (appMultiFactorUser != null) { + appMultiFactorUser.remove(firebaseAuth.getCurrentUser().getUid()); + } + } + firebaseAuth.signOut(); + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void fetchSignInMethodsForEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull GeneratedAndroidFirebaseAuth.Result> result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .fetchSignInMethodsForEmail(email) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + SignInMethodQueryResult signInMethodQueryResult = task.getResult(); + result.success(signInMethodQueryResult.getSignInMethods()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendPasswordResetEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + if (actionCodeSettings == null) { + firebaseAuth + .sendPasswordResetEmail(email) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseAuth + .sendPasswordResetEmail(email, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendSignInLinkToEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .sendSignInLinkToEmail(email, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void setLanguageCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @Nullable String languageCode, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + if (languageCode == null) { + firebaseAuth.useAppLanguage(); + } else { + firebaseAuth.setLanguageCode(languageCode); + } + + result.success(firebaseAuth.getLanguageCode()); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void setSettings( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalFirebaseAuthSettings settings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .getFirebaseAuthSettings() + .setAppVerificationDisabledForTesting(settings.getAppVerificationDisabledForTesting()); + + if (settings.getForceRecaptchaFlow() != null) { + firebaseAuth + .getFirebaseAuthSettings() + .forceRecaptchaFlowForTesting(settings.getForceRecaptchaFlow()); + } + + if (settings.getPhoneNumber() != null && settings.getSmsCode() != null) { + firebaseAuth + .getFirebaseAuthSettings() + .setAutoRetrievedSmsCodeForPhoneNumber( + settings.getPhoneNumber(), settings.getSmsCode()); + } + + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void verifyPasswordResetCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .verifyPasswordResetCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void verifyPhoneNumber( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalVerifyPhoneNumberRequest request, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + String eventChannelName = METHOD_CHANNEL_NAME + "/phone/" + UUID.randomUUID().toString(); + EventChannel channel = new EventChannel(messenger, eventChannelName); + + MultiFactorSession multiFactorSession = null; + + if (request.getMultiFactorSessionId() != null) { + multiFactorSession = + FlutterFirebaseMultiFactor.multiFactorSessionMap.get(request.getMultiFactorSessionId()); + } + + final String multiFactorInfoId = request.getMultiFactorInfoId(); + PhoneMultiFactorInfo multiFactorInfo = null; + + if (multiFactorInfoId != null) { + for (String resolverId : FlutterFirebaseMultiFactor.multiFactorResolverMap.keySet()) { + for (MultiFactorInfo info : + FlutterFirebaseMultiFactor.multiFactorResolverMap.get(resolverId).getHints()) { + if (info.getUid().equals(multiFactorInfoId) && info instanceof PhoneMultiFactorInfo) { + multiFactorInfo = (PhoneMultiFactorInfo) info; + break; + } + } + } + } + + PhoneNumberVerificationStreamHandler handler = + new PhoneNumberVerificationStreamHandler( + getActivity(), + app, + request, + multiFactorSession, + multiFactorInfo, + credential -> { + int hashCode = credential.hashCode(); + authCredentials.put(hashCode, credential); + }); + + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + + result.success(eventChannelName); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void revokeTokenWithAuthorizationCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String authorizationCode, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + // Should never get here as we throw Exception on Dart side. + result.success(); + } + + @Override + public void revokeAccessToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String accessToken, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .revokeAccessToken(accessToken) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void initializeRecaptchaConfig( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .initializeRecaptchaConfig() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( + () -> { + try { + Map constants = new HashMap<>(); + FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); + FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); + String languageCode = firebaseAuth.getLanguageCode(); + + GeneratedAndroidFirebaseAuth.InternalUserDetails user = + firebaseUser == null ? null : PigeonParser.parseFirebaseUser(firebaseUser); + + if (languageCode != null) { + constants.put("APP_LANGUAGE_CODE", languageCode); + } + + if (user != null) { + constants.put("APP_CURRENT_USER", PigeonParser.manuallyToList(user)); + } + + taskCompletionSource.setResult(constants); + } catch (Exception e) { + taskCompletionSource.setException(e); + } + }); + + return taskCompletionSource.getTask(); + } + + @Override + public Task didReinitializeFirebaseCore() { + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( + () -> { + try { + removeEventListeners(); + authCredentials.clear(); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } + }); + + return taskCompletionSource.getTask(); + } + + private void removeEventListeners() { + for (EventChannel eventChannel : streamHandlers.keySet()) { + StreamHandler streamHandler = streamHandlers.get(eventChannel); + if (streamHandler != null) { + streamHandler.onCancel(null); + } + eventChannel.setStreamHandler(null); + } + streamHandlers.clear(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java new file mode 100644 index 00000000..a42bcb56 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java @@ -0,0 +1,157 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.Nullable; +import com.google.firebase.FirebaseApiNotAvailableException; +import com.google.firebase.FirebaseNetworkException; +import com.google.firebase.FirebaseTooManyRequestsException; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.FirebaseAuthException; +import com.google.firebase.auth.FirebaseAuthMultiFactorException; +import com.google.firebase.auth.FirebaseAuthUserCollisionException; +import com.google.firebase.auth.FirebaseAuthWeakPasswordException; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorResolver; +import com.google.firebase.auth.MultiFactorSession; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseAuthPluginException { + + static GeneratedAndroidFirebaseAuth.FlutterError parserExceptionToFlutter( + @Nullable Exception nativeException) { + if (nativeException == null) { + return new GeneratedAndroidFirebaseAuth.FlutterError("UNKNOWN", null, null); + } + String code = "UNKNOWN"; + + String message = nativeException.getMessage(); + Map additionalData = new HashMap<>(); + + if (nativeException instanceof FirebaseAuthMultiFactorException) { + final FirebaseAuthMultiFactorException multiFactorException = + (FirebaseAuthMultiFactorException) nativeException; + Map output = new HashMap<>(); + + MultiFactorResolver multiFactorResolver = multiFactorException.getResolver(); + final List hints = multiFactorResolver.getHints(); + + final MultiFactorSession session = multiFactorResolver.getSession(); + final String sessionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorSessionMap.put(sessionId, session); + + final String resolverId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorResolverMap.put(resolverId, multiFactorResolver); + + final List> pigeonHints = PigeonParser.multiFactorInfoToMap(hints); + + output.put( + Constants.APP_NAME, + multiFactorException.getResolver().getFirebaseAuth().getApp().getName()); + + output.put(Constants.MULTI_FACTOR_HINTS, pigeonHints); + + output.put(Constants.MULTI_FACTOR_SESSION_ID, sessionId); + output.put(Constants.MULTI_FACTOR_RESOLVER_ID, resolverId); + + return new GeneratedAndroidFirebaseAuth.FlutterError( + multiFactorException.getErrorCode(), multiFactorException.getLocalizedMessage(), output); + } + + if (nativeException instanceof FirebaseNetworkException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseNetworkException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "network-request-failed", + "A network error (such as timeout, interrupted connection or unreachable host) has" + + " occurred.", + null); + } + + if (nativeException instanceof FirebaseApiNotAvailableException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseApiNotAvailableException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "api-not-available", "The requested API is not available.", null); + } + + if (nativeException instanceof FirebaseTooManyRequestsException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseTooManyRequestsException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "too-many-requests", + "We have blocked all requests from this device due to unusual activity. Try again later.", + null); + } + + // Manual message overrides to match other platforms. + if (nativeException.getMessage() != null + && nativeException + .getMessage() + .startsWith("Cannot create PhoneAuthCredential without either verificationProof")) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "invalid-verification-code", + "The verification ID used to create the phone auth credential is invalid.", + null); + } + + if (message != null + && message.contains("User has already been linked to the given provider.")) { + return FlutterFirebaseAuthPluginException.alreadyLinkedProvider(); + } + + if (nativeException instanceof FirebaseAuthException) { + code = ((FirebaseAuthException) nativeException).getErrorCode(); + } + + if (nativeException instanceof FirebaseAuthWeakPasswordException) { + message = ((FirebaseAuthWeakPasswordException) nativeException).getReason(); + } + + if (nativeException instanceof FirebaseAuthUserCollisionException) { + String email = ((FirebaseAuthUserCollisionException) nativeException).getEmail(); + + if (email != null) { + additionalData.put("email", email); + } + + AuthCredential authCredential = + ((FirebaseAuthUserCollisionException) nativeException).getUpdatedCredential(); + + if (authCredential != null) { + additionalData.put("authCredential", PigeonParser.parseAuthCredential(authCredential)); + } + } + + return new GeneratedAndroidFirebaseAuth.FlutterError(code, message, additionalData); + } + + static GeneratedAndroidFirebaseAuth.FlutterError noUser() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "NO_CURRENT_USER", "No user currently signed in.", null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError invalidCredential() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "INVALID_CREDENTIAL", + "The supplied auth credential is malformed, has expired or is not currently supported.", + null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError noSuchProvider() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "NO_SUCH_PROVIDER", "User was not linked to an account with the given provider.", null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError alreadyLinkedProvider() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "PROVIDER_ALREADY_LINKED", "User has already been linked to the given provider.", null); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java new file mode 100644 index 00000000..1476a9bd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java @@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.Keep; +import com.google.firebase.components.Component; +import com.google.firebase.components.ComponentRegistrar; +import com.google.firebase.platforminfo.LibraryVersionComponent; +import java.util.Collections; +import java.util.List; + +@Keep +public class FlutterFirebaseAuthRegistrar implements ComponentRegistrar { + @Override + public List> getComponents() { + return Collections.>singletonList( + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java new file mode 100644 index 00000000..7039a38f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java @@ -0,0 +1,548 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import static io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool; + +import android.app.Activity; +import android.net.Uri; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.tasks.Tasks; +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.GetTokenResult; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.UserProfileChangeRequest; +import java.util.Map; + +public class FlutterFirebaseAuthUser + implements GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi { + + private Activity activity; + + public void setActivity(Activity activity) { + this.activity = activity; + } + + public static FirebaseUser getCurrentUserFromPigeon( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp pigeonApp) { + FirebaseApp app = FirebaseApp.getInstance(pigeonApp.getAppName()); + FirebaseAuth auth = FirebaseAuth.getInstance(app); + if (pigeonApp.getTenantId() != null) { + auth.setTenantId(pigeonApp.getTenantId()); + } + + return auth.getCurrentUser(); + } + + @Override + public void delete( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .delete() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getIdToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Boolean forceRefresh, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + cachedThreadPool.execute( + () -> { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + try { + GetTokenResult response = Tasks.await(firebaseUser.getIdToken(forceRefresh)); + result.success(PigeonParser.parseTokenResult(response)); + } catch (Exception exception) { + result.error(FlutterFirebaseAuthPluginException.parserExceptionToFlutter(exception)); + } + }); + } + + @Override + public void linkWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (credential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .linkWithCredential(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void linkWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + OAuthProvider.Builder provider = OAuthProvider.newBuilder(signInProvider.getProviderId()); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseUser + .startActivityForLinkWithProvider(activity, provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reauthenticateWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (credential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .reauthenticateAndRetrieveData(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reauthenticateWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + OAuthProvider.Builder provider = OAuthProvider.newBuilder(signInProvider.getProviderId()); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseUser + .startActivityForReauthenticateWithProvider(activity, provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reload( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .reload() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendEmailVerification( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (actionCodeSettings == null) { + firebaseUser + .sendEmailVerification() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseUser + .sendEmailVerification(PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void unlink( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String providerId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .unlink(providerId) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + Exception exception = task.getException(); + if (exception + .getMessage() + .contains("User was not linked to an account with the given provider.")) { + result.error(FlutterFirebaseAuthPluginException.noSuchProvider()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter(exception)); + } + } + }); + } + + @Override + public void updateEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .updateEmail(newEmail) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updatePassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newPassword, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .updatePassword(newPassword) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updatePhoneNumber( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + PhoneAuthCredential phoneAuthCredential = + (PhoneAuthCredential) PigeonParser.getCredential(input); + + if (phoneAuthCredential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .updatePhoneNumber(phoneAuthCredential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updateProfile( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalUserProfile profile, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder(); + + if (profile.getDisplayNameChanged()) { + builder.setDisplayName(profile.getDisplayName()); + } + + if (profile.getPhotoUrlChanged()) { + if (profile.getPhotoUrl() != null) { + builder.setPhotoUri(Uri.parse(profile.getPhotoUrl())); + } else { + builder.setPhotoUri(null); + } + } + + firebaseUser + .updateProfile(builder.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void verifyBeforeUpdateEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (actionCodeSettings == null) { + firebaseUser + .verifyBeforeUpdateEmail(newEmail) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseUser + .verifyBeforeUpdateEmail(newEmail, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java new file mode 100644 index 00000000..1ba51914 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java @@ -0,0 +1,252 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.MultiFactor; +import com.google.firebase.auth.MultiFactorAssertion; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorResolver; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorGenerator; +import com.google.firebase.internal.api.FirebaseNoSignedInUserException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseMultiFactor + implements GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi, + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi { + + // Map an app id to a map of user id to a MultiFactorUser object. + static final Map> multiFactorUserMap = new HashMap<>(); + + // Map an id to a MultiFactorSession object. + static final Map multiFactorSessionMap = new HashMap<>(); + + // Map an id to a MultiFactorResolver object. + static final Map multiFactorResolverMap = new HashMap<>(); + + static final Map multiFactorAssertionMap = new HashMap<>(); + + MultiFactor getAppMultiFactor(@NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app) + throws FirebaseNoSignedInUserException { + final FirebaseUser currentUser = FlutterFirebaseAuthUser.getCurrentUserFromPigeon(app); + if (currentUser == null) { + throw new FirebaseNoSignedInUserException("No user is signed in"); + } + if (multiFactorUserMap.get(app.getAppName()) == null) { + multiFactorUserMap.put(app.getAppName(), new HashMap<>()); + } + + final Map appMultiFactorUser = multiFactorUserMap.get(app.getAppName()); + if (appMultiFactorUser.get(currentUser.getUid()) == null) { + appMultiFactorUser.put(currentUser.getUid(), currentUser.getMultiFactor()); + } + + return appMultiFactorUser.get(currentUser.getUid()); + } + + @Override + public void enrollPhone( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalPhoneMultiFactorAssertion assertion, + @Nullable String displayName, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + PhoneAuthCredential credential = + PhoneAuthProvider.getCredential( + assertion.getVerificationId(), assertion.getVerificationCode()); + + MultiFactorAssertion multiFactorAssertion = PhoneMultiFactorGenerator.getAssertion(credential); + + multiFactor + .enroll(multiFactorAssertion, displayName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void enrollTotp( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String assertionId, + @Nullable String displayName, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + final MultiFactorAssertion multiFactorAssertion = multiFactorAssertionMap.get(assertionId); + + assert multiFactorAssertion != null; + multiFactor + .enroll(multiFactorAssertion, displayName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getSession( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result< + GeneratedAndroidFirebaseAuth.InternalMultiFactorSession> + result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + multiFactor + .getSession() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + final MultiFactorSession sessionResult = task.getResult(); + final String id = UUID.randomUUID().toString(); + multiFactorSessionMap.put(id, sessionResult); + result.success( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorSession.Builder() + .setId(id) + .build()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void unenroll( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String factorUid, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(FlutterFirebaseAuthPluginException.parserExceptionToFlutter(e)); + return; + } + + multiFactor + .unenroll(factorUid) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getEnrolledFactors( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result< + List> + result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + final List factors = multiFactor.getEnrolledFactors(); + + final List resultFactors = + PigeonParser.multiFactorInfoToPigeon(factors); + + result.success(resultFactors); + } + + @Override + public void resolveSignIn( + @NonNull String resolverId, + @Nullable GeneratedAndroidFirebaseAuth.InternalPhoneMultiFactorAssertion assertion, + @Nullable String totpAssertionId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + final MultiFactorResolver resolver = multiFactorResolverMap.get(resolverId); + + if (resolver == null) { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + new Exception("Resolver not found"))); + return; + } + + MultiFactorAssertion multiFactorAssertion; + + if (assertion != null) { + PhoneAuthCredential credential = + PhoneAuthProvider.getCredential( + assertion.getVerificationId(), assertion.getVerificationCode()); + multiFactorAssertion = PhoneMultiFactorGenerator.getAssertion(credential); + } else { + multiFactorAssertion = multiFactorAssertionMap.get(totpAssertionId); + } + + resolver + .resolveSignIn(multiFactorAssertion) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + final AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java new file mode 100644 index 00000000..9761a5df --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java @@ -0,0 +1,82 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.TotpMultiFactorAssertion; +import com.google.firebase.auth.TotpMultiFactorGenerator; +import com.google.firebase.auth.TotpSecret; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseTotpMultiFactor + implements GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi { + + // Map an app id to a map of user id to a TotpSecret object. + static final Map multiFactorSecret = new HashMap<>(); + + @Override + public void generateSecret( + @NonNull String sessionId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + MultiFactorSession multiFactorSession = + FlutterFirebaseMultiFactor.multiFactorSessionMap.get(sessionId); + + assert multiFactorSession != null; + TotpMultiFactorGenerator.generateSecret(multiFactorSession) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + TotpSecret secret = task.getResult(); + multiFactorSecret.put(secret.getSharedSecretKey(), secret); + result.success( + new GeneratedAndroidFirebaseAuth.InternalTotpSecret.Builder() + .setCodeIntervalSeconds((long) secret.getCodeIntervalSeconds()) + .setCodeLength((long) secret.getCodeLength()) + .setSecretKey(secret.getSharedSecretKey()) + .setHashingAlgorithm(secret.getHashAlgorithm()) + .setEnrollmentCompletionDeadline(secret.getEnrollmentCompletionDeadline()) + .build()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getAssertionForEnrollment( + @NonNull String secretKey, + @NonNull String oneTimePassword, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + final TotpSecret secret = multiFactorSecret.get(secretKey); + + assert secret != null; + TotpMultiFactorAssertion assertion = + TotpMultiFactorGenerator.getAssertionForEnrollment(secret, oneTimePassword); + String assertionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorAssertionMap.put(assertionId, assertion); + result.success(assertionId); + } + + @Override + public void getAssertionForSignIn( + @NonNull String enrollmentId, + @NonNull String oneTimePassword, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + TotpMultiFactorAssertion assertion = + TotpMultiFactorGenerator.getAssertionForSignIn(enrollmentId, oneTimePassword); + String assertionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorAssertionMap.put(assertionId, assertion); + result.success(assertionId); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java new file mode 100644 index 00000000..5b32f828 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.auth.TotpSecret; + +public class FlutterFirebaseTotpSecret + implements GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi { + + @Override + public void generateQrCodeUrl( + @NonNull String secretKey, + @Nullable String accountName, + @Nullable String issuer, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + final TotpSecret secret = FlutterFirebaseTotpMultiFactor.multiFactorSecret.get(secretKey); + + assert secret != null; + if (accountName == null || issuer == null) { + result.success(secret.generateQrCodeUrl()); + return; + } + result.success(secret.generateQrCodeUrl(accountName, issuer)); + } + + @Override + public void openInOtpApp( + @NonNull String secretKey, + @NonNull String qrCodeUrl, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final TotpSecret secret = FlutterFirebaseTotpMultiFactor.multiFactorSecret.get(secretKey); + assert secret != null; + secret.openInOtpApp(qrCodeUrl); + result.success(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java new file mode 100644 index 00000000..5aaa168b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java @@ -0,0 +1,5308 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +package io.flutter.plugins.firebase.auth; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BasicMessageChannel; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MessageCodec; +import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** Generated class from Pigeon. */ +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) +public class GeneratedAndroidFirebaseAuth { + static boolean pigeonDoubleEquals(double a, double b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == 0.0 ? 0.0 : a) == (b == 0.0 ? 0.0 : b) || (Double.isNaN(a) && Double.isNaN(b)); + } + + static boolean pigeonFloatEquals(float a, float b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == 0.0f ? 0.0f : a) == (b == 0.0f ? 0.0f : b) || (Float.isNaN(a) && Float.isNaN(b)); + } + + static int pigeonDoubleHashCode(double d) { + // Normalize -0.0 to 0.0 and handle NaN to ensure consistent hash codes. + if (d == 0.0) { + d = 0.0; + } + long bits = Double.doubleToLongBits(d); + return (int) (bits ^ (bits >>> 32)); + } + + static int pigeonFloatHashCode(float f) { + // Normalize -0.0 to 0.0 and handle NaN to ensure consistent hash codes. + if (f == 0.0f) { + f = 0.0f; + } + return Float.floatToIntBits(f); + } + + static boolean pigeonDeepEquals(Object a, Object b) { + if (a == b) { + return true; + } + if (a == null || b == null) { + return false; + } + if (a instanceof byte[] && b instanceof byte[]) { + return Arrays.equals((byte[]) a, (byte[]) b); + } + if (a instanceof int[] && b instanceof int[]) { + return Arrays.equals((int[]) a, (int[]) b); + } + if (a instanceof long[] && b instanceof long[]) { + return Arrays.equals((long[]) a, (long[]) b); + } + if (a instanceof double[] && b instanceof double[]) { + double[] da = (double[]) a; + double[] db = (double[]) b; + if (da.length != db.length) { + return false; + } + for (int i = 0; i < da.length; i++) { + if (!pigeonDoubleEquals(da[i], db[i])) { + return false; + } + } + return true; + } + if (a instanceof List && b instanceof List) { + List listA = (List) a; + List listB = (List) b; + if (listA.size() != listB.size()) { + return false; + } + for (int i = 0; i < listA.size(); i++) { + if (!pigeonDeepEquals(listA.get(i), listB.get(i))) { + return false; + } + } + return true; + } + if (a instanceof Map && b instanceof Map) { + Map mapA = (Map) a; + Map mapB = (Map) b; + if (mapA.size() != mapB.size()) { + return false; + } + for (Map.Entry entryA : mapA.entrySet()) { + Object keyA = entryA.getKey(); + Object valueA = entryA.getValue(); + boolean found = false; + for (Map.Entry entryB : mapB.entrySet()) { + Object keyB = entryB.getKey(); + if (pigeonDeepEquals(keyA, keyB)) { + Object valueB = entryB.getValue(); + if (pigeonDeepEquals(valueA, valueB)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; + } + if (a instanceof Double && b instanceof Double) { + return pigeonDoubleEquals((double) a, (double) b); + } + if (a instanceof Float && b instanceof Float) { + return pigeonFloatEquals((float) a, (float) b); + } + return a.equals(b); + } + + static int pigeonDeepHashCode(Object value) { + if (value == null) { + return 0; + } + if (value instanceof byte[]) { + return Arrays.hashCode((byte[]) value); + } + if (value instanceof int[]) { + return Arrays.hashCode((int[]) value); + } + if (value instanceof long[]) { + return Arrays.hashCode((long[]) value); + } + if (value instanceof double[]) { + double[] da = (double[]) value; + int result = 1; + for (double d : da) { + result = 31 * result + pigeonDoubleHashCode(d); + } + return result; + } + if (value instanceof List) { + int result = 1; + for (Object item : (List) value) { + result = 31 * result + pigeonDeepHashCode(item); + } + return result; + } + if (value instanceof Map) { + int result = 0; + for (Map.Entry entry : ((Map) value).entrySet()) { + result += + ((pigeonDeepHashCode(entry.getKey()) * 31) ^ pigeonDeepHashCode(entry.getValue())); + } + return result; + } + if (value instanceof Object[]) { + int result = 1; + for (Object item : (Object[]) value) { + result = 31 * result + pigeonDeepHashCode(item); + } + return result; + } + if (value instanceof Double) { + return pigeonDoubleHashCode((double) value); + } + if (value instanceof Float) { + return pigeonFloatHashCode((float) value); + } + return value.hashCode(); + } + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + super(message); + this.code = code; + this.details = details; + } + } + + @NonNull + protected static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList<>(3); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } + return errorList; + } + + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + + /** The type of operation that generated the action code from calling [checkActionCode]. */ + public enum ActionCodeInfoOperation { + /** Unknown operation. */ + UNKNOWN(0), + /** Password reset code generated via [sendPasswordResetEmail]. */ + PASSWORD_RESET(1), + /** Email verification code generated via [User.sendEmailVerification]. */ + VERIFY_EMAIL(2), + /** Email change revocation code generated via [User.updateEmail]. */ + RECOVER_EMAIL(3), + /** Email sign in code generated via [sendSignInLinkToEmail]. */ + EMAIL_SIGN_IN(4), + /** Verify and change email code generated via [User.verifyBeforeUpdateEmail]. */ + VERIFY_AND_CHANGE_EMAIL(5), + /** Action code for reverting second factor addition. */ + REVERT_SECOND_FACTOR_ADDITION(6); + + final int index; + + ActionCodeInfoOperation(final int index) { + this.index = index; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalMultiFactorSession { + private @NonNull String id; + + public @NonNull String getId() { + return id; + } + + public void setId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"id\" is null."); + } + this.id = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalMultiFactorSession() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalMultiFactorSession that = (InternalMultiFactorSession) o; + return pigeonDeepEquals(id, that.id); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), id}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String id; + + @CanIgnoreReturnValue + public @NonNull Builder setId(@NonNull String setterArg) { + this.id = setterArg; + return this; + } + + public @NonNull InternalMultiFactorSession build() { + InternalMultiFactorSession pigeonReturn = new InternalMultiFactorSession(); + pigeonReturn.setId(id); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(1); + toListResult.add(id); + return toListResult; + } + + static @NonNull InternalMultiFactorSession fromList(@NonNull ArrayList pigeonVar_list) { + InternalMultiFactorSession pigeonResult = new InternalMultiFactorSession(); + Object id = pigeonVar_list.get(0); + pigeonResult.setId((String) id); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalPhoneMultiFactorAssertion { + private @NonNull String verificationId; + + public @NonNull String getVerificationId() { + return verificationId; + } + + public void setVerificationId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"verificationId\" is null."); + } + this.verificationId = setterArg; + } + + private @NonNull String verificationCode; + + public @NonNull String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"verificationCode\" is null."); + } + this.verificationCode = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalPhoneMultiFactorAssertion() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalPhoneMultiFactorAssertion that = (InternalPhoneMultiFactorAssertion) o; + return pigeonDeepEquals(verificationId, that.verificationId) + && pigeonDeepEquals(verificationCode, that.verificationCode); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), verificationId, verificationCode}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String verificationId; + + @CanIgnoreReturnValue + public @NonNull Builder setVerificationId(@NonNull String setterArg) { + this.verificationId = setterArg; + return this; + } + + private @Nullable String verificationCode; + + @CanIgnoreReturnValue + public @NonNull Builder setVerificationCode(@NonNull String setterArg) { + this.verificationCode = setterArg; + return this; + } + + public @NonNull InternalPhoneMultiFactorAssertion build() { + InternalPhoneMultiFactorAssertion pigeonReturn = new InternalPhoneMultiFactorAssertion(); + pigeonReturn.setVerificationId(verificationId); + pigeonReturn.setVerificationCode(verificationCode); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(verificationId); + toListResult.add(verificationCode); + return toListResult; + } + + static @NonNull InternalPhoneMultiFactorAssertion fromList( + @NonNull ArrayList pigeonVar_list) { + InternalPhoneMultiFactorAssertion pigeonResult = new InternalPhoneMultiFactorAssertion(); + Object verificationId = pigeonVar_list.get(0); + pigeonResult.setVerificationId((String) verificationId); + Object verificationCode = pigeonVar_list.get(1); + pigeonResult.setVerificationCode((String) verificationCode); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalMultiFactorInfo { + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @NonNull Double enrollmentTimestamp; + + public @NonNull Double getEnrollmentTimestamp() { + return enrollmentTimestamp; + } + + public void setEnrollmentTimestamp(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"enrollmentTimestamp\" is null."); + } + this.enrollmentTimestamp = setterArg; + } + + private @Nullable String factorId; + + public @Nullable String getFactorId() { + return factorId; + } + + public void setFactorId(@Nullable String setterArg) { + this.factorId = setterArg; + } + + private @NonNull String uid; + + public @NonNull String getUid() { + return uid; + } + + public void setUid(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"uid\" is null."); + } + this.uid = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalMultiFactorInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalMultiFactorInfo that = (InternalMultiFactorInfo) o; + return pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(enrollmentTimestamp, that.enrollmentTimestamp) + && pigeonDeepEquals(factorId, that.factorId) + && pigeonDeepEquals(uid, that.uid) + && pigeonDeepEquals(phoneNumber, that.phoneNumber); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), displayName, enrollmentTimestamp, factorId, uid, phoneNumber}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable Double enrollmentTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setEnrollmentTimestamp(@NonNull Double setterArg) { + this.enrollmentTimestamp = setterArg; + return this; + } + + private @Nullable String factorId; + + @CanIgnoreReturnValue + public @NonNull Builder setFactorId(@Nullable String setterArg) { + this.factorId = setterArg; + return this; + } + + private @Nullable String uid; + + @CanIgnoreReturnValue + public @NonNull Builder setUid(@NonNull String setterArg) { + this.uid = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + public @NonNull InternalMultiFactorInfo build() { + InternalMultiFactorInfo pigeonReturn = new InternalMultiFactorInfo(); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setEnrollmentTimestamp(enrollmentTimestamp); + pigeonReturn.setFactorId(factorId); + pigeonReturn.setUid(uid); + pigeonReturn.setPhoneNumber(phoneNumber); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(displayName); + toListResult.add(enrollmentTimestamp); + toListResult.add(factorId); + toListResult.add(uid); + toListResult.add(phoneNumber); + return toListResult; + } + + static @NonNull InternalMultiFactorInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalMultiFactorInfo pigeonResult = new InternalMultiFactorInfo(); + Object displayName = pigeonVar_list.get(0); + pigeonResult.setDisplayName((String) displayName); + Object enrollmentTimestamp = pigeonVar_list.get(1); + pigeonResult.setEnrollmentTimestamp((Double) enrollmentTimestamp); + Object factorId = pigeonVar_list.get(2); + pigeonResult.setFactorId((String) factorId); + Object uid = pigeonVar_list.get(3); + pigeonResult.setUid((String) uid); + Object phoneNumber = pigeonVar_list.get(4); + pigeonResult.setPhoneNumber((String) phoneNumber); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class AuthPigeonFirebaseApp { + private @NonNull String appName; + + public @NonNull String getAppName() { + return appName; + } + + public void setAppName(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"appName\" is null."); + } + this.appName = setterArg; + } + + private @Nullable String tenantId; + + public @Nullable String getTenantId() { + return tenantId; + } + + public void setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + } + + private @Nullable String customAuthDomain; + + public @Nullable String getCustomAuthDomain() { + return customAuthDomain; + } + + public void setCustomAuthDomain(@Nullable String setterArg) { + this.customAuthDomain = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + AuthPigeonFirebaseApp() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuthPigeonFirebaseApp that = (AuthPigeonFirebaseApp) o; + return pigeonDeepEquals(appName, that.appName) + && pigeonDeepEquals(tenantId, that.tenantId) + && pigeonDeepEquals(customAuthDomain, that.customAuthDomain); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), appName, tenantId, customAuthDomain}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String appName; + + @CanIgnoreReturnValue + public @NonNull Builder setAppName(@NonNull String setterArg) { + this.appName = setterArg; + return this; + } + + private @Nullable String tenantId; + + @CanIgnoreReturnValue + public @NonNull Builder setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + return this; + } + + private @Nullable String customAuthDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setCustomAuthDomain(@Nullable String setterArg) { + this.customAuthDomain = setterArg; + return this; + } + + public @NonNull AuthPigeonFirebaseApp build() { + AuthPigeonFirebaseApp pigeonReturn = new AuthPigeonFirebaseApp(); + pigeonReturn.setAppName(appName); + pigeonReturn.setTenantId(tenantId); + pigeonReturn.setCustomAuthDomain(customAuthDomain); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(appName); + toListResult.add(tenantId); + toListResult.add(customAuthDomain); + return toListResult; + } + + static @NonNull AuthPigeonFirebaseApp fromList(@NonNull ArrayList pigeonVar_list) { + AuthPigeonFirebaseApp pigeonResult = new AuthPigeonFirebaseApp(); + Object appName = pigeonVar_list.get(0); + pigeonResult.setAppName((String) appName); + Object tenantId = pigeonVar_list.get(1); + pigeonResult.setTenantId((String) tenantId); + Object customAuthDomain = pigeonVar_list.get(2); + pigeonResult.setCustomAuthDomain((String) customAuthDomain); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeInfoData { + private @Nullable String email; + + public @Nullable String getEmail() { + return email; + } + + public void setEmail(@Nullable String setterArg) { + this.email = setterArg; + } + + private @Nullable String previousEmail; + + public @Nullable String getPreviousEmail() { + return previousEmail; + } + + public void setPreviousEmail(@Nullable String setterArg) { + this.previousEmail = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeInfoData that = (InternalActionCodeInfoData) o; + return pigeonDeepEquals(email, that.email) + && pigeonDeepEquals(previousEmail, that.previousEmail); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), email, previousEmail}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String email; + + @CanIgnoreReturnValue + public @NonNull Builder setEmail(@Nullable String setterArg) { + this.email = setterArg; + return this; + } + + private @Nullable String previousEmail; + + @CanIgnoreReturnValue + public @NonNull Builder setPreviousEmail(@Nullable String setterArg) { + this.previousEmail = setterArg; + return this; + } + + public @NonNull InternalActionCodeInfoData build() { + InternalActionCodeInfoData pigeonReturn = new InternalActionCodeInfoData(); + pigeonReturn.setEmail(email); + pigeonReturn.setPreviousEmail(previousEmail); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(email); + toListResult.add(previousEmail); + return toListResult; + } + + static @NonNull InternalActionCodeInfoData fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeInfoData pigeonResult = new InternalActionCodeInfoData(); + Object email = pigeonVar_list.get(0); + pigeonResult.setEmail((String) email); + Object previousEmail = pigeonVar_list.get(1); + pigeonResult.setPreviousEmail((String) previousEmail); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeInfo { + private @NonNull ActionCodeInfoOperation operation; + + public @NonNull ActionCodeInfoOperation getOperation() { + return operation; + } + + public void setOperation(@NonNull ActionCodeInfoOperation setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"operation\" is null."); + } + this.operation = setterArg; + } + + private @NonNull InternalActionCodeInfoData data; + + public @NonNull InternalActionCodeInfoData getData() { + return data; + } + + public void setData(@NonNull InternalActionCodeInfoData setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"data\" is null."); + } + this.data = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalActionCodeInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeInfo that = (InternalActionCodeInfo) o; + return pigeonDeepEquals(operation, that.operation) && pigeonDeepEquals(data, that.data); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), operation, data}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable ActionCodeInfoOperation operation; + + @CanIgnoreReturnValue + public @NonNull Builder setOperation(@NonNull ActionCodeInfoOperation setterArg) { + this.operation = setterArg; + return this; + } + + private @Nullable InternalActionCodeInfoData data; + + @CanIgnoreReturnValue + public @NonNull Builder setData(@NonNull InternalActionCodeInfoData setterArg) { + this.data = setterArg; + return this; + } + + public @NonNull InternalActionCodeInfo build() { + InternalActionCodeInfo pigeonReturn = new InternalActionCodeInfo(); + pigeonReturn.setOperation(operation); + pigeonReturn.setData(data); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(operation); + toListResult.add(data); + return toListResult; + } + + static @NonNull InternalActionCodeInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeInfo pigeonResult = new InternalActionCodeInfo(); + Object operation = pigeonVar_list.get(0); + pigeonResult.setOperation((ActionCodeInfoOperation) operation); + Object data = pigeonVar_list.get(1); + pigeonResult.setData((InternalActionCodeInfoData) data); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAdditionalUserInfo { + private @NonNull Boolean isNewUser; + + public @NonNull Boolean getIsNewUser() { + return isNewUser; + } + + public void setIsNewUser(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isNewUser\" is null."); + } + this.isNewUser = setterArg; + } + + private @Nullable String providerId; + + public @Nullable String getProviderId() { + return providerId; + } + + public void setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + } + + private @Nullable String username; + + public @Nullable String getUsername() { + return username; + } + + public void setUsername(@Nullable String setterArg) { + this.username = setterArg; + } + + private @Nullable String authorizationCode; + + public @Nullable String getAuthorizationCode() { + return authorizationCode; + } + + public void setAuthorizationCode(@Nullable String setterArg) { + this.authorizationCode = setterArg; + } + + private @Nullable Map profile; + + public @Nullable Map getProfile() { + return profile; + } + + public void setProfile(@Nullable Map setterArg) { + this.profile = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAdditionalUserInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAdditionalUserInfo that = (InternalAdditionalUserInfo) o; + return pigeonDeepEquals(isNewUser, that.isNewUser) + && pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(username, that.username) + && pigeonDeepEquals(authorizationCode, that.authorizationCode) + && pigeonDeepEquals(profile, that.profile); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), isNewUser, providerId, username, authorizationCode, profile}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Boolean isNewUser; + + @CanIgnoreReturnValue + public @NonNull Builder setIsNewUser(@NonNull Boolean setterArg) { + this.isNewUser = setterArg; + return this; + } + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String username; + + @CanIgnoreReturnValue + public @NonNull Builder setUsername(@Nullable String setterArg) { + this.username = setterArg; + return this; + } + + private @Nullable String authorizationCode; + + @CanIgnoreReturnValue + public @NonNull Builder setAuthorizationCode(@Nullable String setterArg) { + this.authorizationCode = setterArg; + return this; + } + + private @Nullable Map profile; + + @CanIgnoreReturnValue + public @NonNull Builder setProfile(@Nullable Map setterArg) { + this.profile = setterArg; + return this; + } + + public @NonNull InternalAdditionalUserInfo build() { + InternalAdditionalUserInfo pigeonReturn = new InternalAdditionalUserInfo(); + pigeonReturn.setIsNewUser(isNewUser); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setUsername(username); + pigeonReturn.setAuthorizationCode(authorizationCode); + pigeonReturn.setProfile(profile); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(isNewUser); + toListResult.add(providerId); + toListResult.add(username); + toListResult.add(authorizationCode); + toListResult.add(profile); + return toListResult; + } + + static @NonNull InternalAdditionalUserInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalAdditionalUserInfo pigeonResult = new InternalAdditionalUserInfo(); + Object isNewUser = pigeonVar_list.get(0); + pigeonResult.setIsNewUser((Boolean) isNewUser); + Object providerId = pigeonVar_list.get(1); + pigeonResult.setProviderId((String) providerId); + Object username = pigeonVar_list.get(2); + pigeonResult.setUsername((String) username); + Object authorizationCode = pigeonVar_list.get(3); + pigeonResult.setAuthorizationCode((String) authorizationCode); + Object profile = pigeonVar_list.get(4); + pigeonResult.setProfile((Map) profile); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAuthCredential { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @NonNull String signInMethod; + + public @NonNull String getSignInMethod() { + return signInMethod; + } + + public void setSignInMethod(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"signInMethod\" is null."); + } + this.signInMethod = setterArg; + } + + private @NonNull Long nativeId; + + public @NonNull Long getNativeId() { + return nativeId; + } + + public void setNativeId(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"nativeId\" is null."); + } + this.nativeId = setterArg; + } + + private @Nullable String accessToken; + + public @Nullable String getAccessToken() { + return accessToken; + } + + public void setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAuthCredential() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAuthCredential that = (InternalAuthCredential) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(signInMethod, that.signInMethod) + && pigeonDeepEquals(nativeId, that.nativeId) + && pigeonDeepEquals(accessToken, that.accessToken); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, signInMethod, nativeId, accessToken}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String signInMethod; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInMethod(@NonNull String setterArg) { + this.signInMethod = setterArg; + return this; + } + + private @Nullable Long nativeId; + + @CanIgnoreReturnValue + public @NonNull Builder setNativeId(@NonNull Long setterArg) { + this.nativeId = setterArg; + return this; + } + + private @Nullable String accessToken; + + @CanIgnoreReturnValue + public @NonNull Builder setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + return this; + } + + public @NonNull InternalAuthCredential build() { + InternalAuthCredential pigeonReturn = new InternalAuthCredential(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setSignInMethod(signInMethod); + pigeonReturn.setNativeId(nativeId); + pigeonReturn.setAccessToken(accessToken); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(providerId); + toListResult.add(signInMethod); + toListResult.add(nativeId); + toListResult.add(accessToken); + return toListResult; + } + + static @NonNull InternalAuthCredential fromList(@NonNull ArrayList pigeonVar_list) { + InternalAuthCredential pigeonResult = new InternalAuthCredential(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object signInMethod = pigeonVar_list.get(1); + pigeonResult.setSignInMethod((String) signInMethod); + Object nativeId = pigeonVar_list.get(2); + pigeonResult.setNativeId((Long) nativeId); + Object accessToken = pigeonVar_list.get(3); + pigeonResult.setAccessToken((String) accessToken); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserInfo { + private @NonNull String uid; + + public @NonNull String getUid() { + return uid; + } + + public void setUid(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"uid\" is null."); + } + this.uid = setterArg; + } + + private @Nullable String email; + + public @Nullable String getEmail() { + return email; + } + + public void setEmail(@Nullable String setterArg) { + this.email = setterArg; + } + + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @Nullable String photoUrl; + + public @Nullable String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @NonNull Boolean isAnonymous; + + public @NonNull Boolean getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isAnonymous\" is null."); + } + this.isAnonymous = setterArg; + } + + private @NonNull Boolean isEmailVerified; + + public @NonNull Boolean getIsEmailVerified() { + return isEmailVerified; + } + + public void setIsEmailVerified(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isEmailVerified\" is null."); + } + this.isEmailVerified = setterArg; + } + + private @Nullable String providerId; + + public @Nullable String getProviderId() { + return providerId; + } + + public void setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + } + + private @Nullable String tenantId; + + public @Nullable String getTenantId() { + return tenantId; + } + + public void setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + } + + private @Nullable String refreshToken; + + public @Nullable String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(@Nullable String setterArg) { + this.refreshToken = setterArg; + } + + private @Nullable Long creationTimestamp; + + public @Nullable Long getCreationTimestamp() { + return creationTimestamp; + } + + public void setCreationTimestamp(@Nullable Long setterArg) { + this.creationTimestamp = setterArg; + } + + private @Nullable Long lastSignInTimestamp; + + public @Nullable Long getLastSignInTimestamp() { + return lastSignInTimestamp; + } + + public void setLastSignInTimestamp(@Nullable Long setterArg) { + this.lastSignInTimestamp = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserInfo that = (InternalUserInfo) o; + return pigeonDeepEquals(uid, that.uid) + && pigeonDeepEquals(email, that.email) + && pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(photoUrl, that.photoUrl) + && pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(isAnonymous, that.isAnonymous) + && pigeonDeepEquals(isEmailVerified, that.isEmailVerified) + && pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(tenantId, that.tenantId) + && pigeonDeepEquals(refreshToken, that.refreshToken) + && pigeonDeepEquals(creationTimestamp, that.creationTimestamp) + && pigeonDeepEquals(lastSignInTimestamp, that.lastSignInTimestamp); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + uid, + email, + displayName, + photoUrl, + phoneNumber, + isAnonymous, + isEmailVerified, + providerId, + tenantId, + refreshToken, + creationTimestamp, + lastSignInTimestamp + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String uid; + + @CanIgnoreReturnValue + public @NonNull Builder setUid(@NonNull String setterArg) { + this.uid = setterArg; + return this; + } + + private @Nullable String email; + + @CanIgnoreReturnValue + public @NonNull Builder setEmail(@Nullable String setterArg) { + this.email = setterArg; + return this; + } + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable String photoUrl; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable Boolean isAnonymous; + + @CanIgnoreReturnValue + public @NonNull Builder setIsAnonymous(@NonNull Boolean setterArg) { + this.isAnonymous = setterArg; + return this; + } + + private @Nullable Boolean isEmailVerified; + + @CanIgnoreReturnValue + public @NonNull Builder setIsEmailVerified(@NonNull Boolean setterArg) { + this.isEmailVerified = setterArg; + return this; + } + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String tenantId; + + @CanIgnoreReturnValue + public @NonNull Builder setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + return this; + } + + private @Nullable String refreshToken; + + @CanIgnoreReturnValue + public @NonNull Builder setRefreshToken(@Nullable String setterArg) { + this.refreshToken = setterArg; + return this; + } + + private @Nullable Long creationTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setCreationTimestamp(@Nullable Long setterArg) { + this.creationTimestamp = setterArg; + return this; + } + + private @Nullable Long lastSignInTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setLastSignInTimestamp(@Nullable Long setterArg) { + this.lastSignInTimestamp = setterArg; + return this; + } + + public @NonNull InternalUserInfo build() { + InternalUserInfo pigeonReturn = new InternalUserInfo(); + pigeonReturn.setUid(uid); + pigeonReturn.setEmail(email); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setPhotoUrl(photoUrl); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setIsAnonymous(isAnonymous); + pigeonReturn.setIsEmailVerified(isEmailVerified); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setTenantId(tenantId); + pigeonReturn.setRefreshToken(refreshToken); + pigeonReturn.setCreationTimestamp(creationTimestamp); + pigeonReturn.setLastSignInTimestamp(lastSignInTimestamp); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(12); + toListResult.add(uid); + toListResult.add(email); + toListResult.add(displayName); + toListResult.add(photoUrl); + toListResult.add(phoneNumber); + toListResult.add(isAnonymous); + toListResult.add(isEmailVerified); + toListResult.add(providerId); + toListResult.add(tenantId); + toListResult.add(refreshToken); + toListResult.add(creationTimestamp); + toListResult.add(lastSignInTimestamp); + return toListResult; + } + + static @NonNull InternalUserInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserInfo pigeonResult = new InternalUserInfo(); + Object uid = pigeonVar_list.get(0); + pigeonResult.setUid((String) uid); + Object email = pigeonVar_list.get(1); + pigeonResult.setEmail((String) email); + Object displayName = pigeonVar_list.get(2); + pigeonResult.setDisplayName((String) displayName); + Object photoUrl = pigeonVar_list.get(3); + pigeonResult.setPhotoUrl((String) photoUrl); + Object phoneNumber = pigeonVar_list.get(4); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object isAnonymous = pigeonVar_list.get(5); + pigeonResult.setIsAnonymous((Boolean) isAnonymous); + Object isEmailVerified = pigeonVar_list.get(6); + pigeonResult.setIsEmailVerified((Boolean) isEmailVerified); + Object providerId = pigeonVar_list.get(7); + pigeonResult.setProviderId((String) providerId); + Object tenantId = pigeonVar_list.get(8); + pigeonResult.setTenantId((String) tenantId); + Object refreshToken = pigeonVar_list.get(9); + pigeonResult.setRefreshToken((String) refreshToken); + Object creationTimestamp = pigeonVar_list.get(10); + pigeonResult.setCreationTimestamp((Long) creationTimestamp); + Object lastSignInTimestamp = pigeonVar_list.get(11); + pigeonResult.setLastSignInTimestamp((Long) lastSignInTimestamp); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserDetails { + private @NonNull InternalUserInfo userInfo; + + public @NonNull InternalUserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(@NonNull InternalUserInfo setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"userInfo\" is null."); + } + this.userInfo = setterArg; + } + + private @NonNull List> providerData; + + public @NonNull List> getProviderData() { + return providerData; + } + + public void setProviderData(@NonNull List> setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerData\" is null."); + } + this.providerData = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserDetails() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserDetails that = (InternalUserDetails) o; + return pigeonDeepEquals(userInfo, that.userInfo) + && pigeonDeepEquals(providerData, that.providerData); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), userInfo, providerData}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable InternalUserInfo userInfo; + + @CanIgnoreReturnValue + public @NonNull Builder setUserInfo(@NonNull InternalUserInfo setterArg) { + this.userInfo = setterArg; + return this; + } + + private @Nullable List> providerData; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderData(@NonNull List> setterArg) { + this.providerData = setterArg; + return this; + } + + public @NonNull InternalUserDetails build() { + InternalUserDetails pigeonReturn = new InternalUserDetails(); + pigeonReturn.setUserInfo(userInfo); + pigeonReturn.setProviderData(providerData); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(userInfo); + toListResult.add(providerData); + return toListResult; + } + + static @NonNull InternalUserDetails fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserDetails pigeonResult = new InternalUserDetails(); + Object userInfo = pigeonVar_list.get(0); + pigeonResult.setUserInfo((InternalUserInfo) userInfo); + Object providerData = pigeonVar_list.get(1); + pigeonResult.setProviderData((List>) providerData); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserCredential { + private @Nullable InternalUserDetails user; + + public @Nullable InternalUserDetails getUser() { + return user; + } + + public void setUser(@Nullable InternalUserDetails setterArg) { + this.user = setterArg; + } + + private @Nullable InternalAdditionalUserInfo additionalUserInfo; + + public @Nullable InternalAdditionalUserInfo getAdditionalUserInfo() { + return additionalUserInfo; + } + + public void setAdditionalUserInfo(@Nullable InternalAdditionalUserInfo setterArg) { + this.additionalUserInfo = setterArg; + } + + private @Nullable InternalAuthCredential credential; + + public @Nullable InternalAuthCredential getCredential() { + return credential; + } + + public void setCredential(@Nullable InternalAuthCredential setterArg) { + this.credential = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserCredential that = (InternalUserCredential) o; + return pigeonDeepEquals(user, that.user) + && pigeonDeepEquals(additionalUserInfo, that.additionalUserInfo) + && pigeonDeepEquals(credential, that.credential); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), user, additionalUserInfo, credential}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable InternalUserDetails user; + + @CanIgnoreReturnValue + public @NonNull Builder setUser(@Nullable InternalUserDetails setterArg) { + this.user = setterArg; + return this; + } + + private @Nullable InternalAdditionalUserInfo additionalUserInfo; + + @CanIgnoreReturnValue + public @NonNull Builder setAdditionalUserInfo( + @Nullable InternalAdditionalUserInfo setterArg) { + this.additionalUserInfo = setterArg; + return this; + } + + private @Nullable InternalAuthCredential credential; + + @CanIgnoreReturnValue + public @NonNull Builder setCredential(@Nullable InternalAuthCredential setterArg) { + this.credential = setterArg; + return this; + } + + public @NonNull InternalUserCredential build() { + InternalUserCredential pigeonReturn = new InternalUserCredential(); + pigeonReturn.setUser(user); + pigeonReturn.setAdditionalUserInfo(additionalUserInfo); + pigeonReturn.setCredential(credential); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(user); + toListResult.add(additionalUserInfo); + toListResult.add(credential); + return toListResult; + } + + static @NonNull InternalUserCredential fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserCredential pigeonResult = new InternalUserCredential(); + Object user = pigeonVar_list.get(0); + pigeonResult.setUser((InternalUserDetails) user); + Object additionalUserInfo = pigeonVar_list.get(1); + pigeonResult.setAdditionalUserInfo((InternalAdditionalUserInfo) additionalUserInfo); + Object credential = pigeonVar_list.get(2); + pigeonResult.setCredential((InternalAuthCredential) credential); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAuthCredentialInput { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @NonNull String signInMethod; + + public @NonNull String getSignInMethod() { + return signInMethod; + } + + public void setSignInMethod(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"signInMethod\" is null."); + } + this.signInMethod = setterArg; + } + + private @Nullable String token; + + public @Nullable String getToken() { + return token; + } + + public void setToken(@Nullable String setterArg) { + this.token = setterArg; + } + + private @Nullable String accessToken; + + public @Nullable String getAccessToken() { + return accessToken; + } + + public void setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAuthCredentialInput() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAuthCredentialInput that = (InternalAuthCredentialInput) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(signInMethod, that.signInMethod) + && pigeonDeepEquals(token, that.token) + && pigeonDeepEquals(accessToken, that.accessToken); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, signInMethod, token, accessToken}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String signInMethod; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInMethod(@NonNull String setterArg) { + this.signInMethod = setterArg; + return this; + } + + private @Nullable String token; + + @CanIgnoreReturnValue + public @NonNull Builder setToken(@Nullable String setterArg) { + this.token = setterArg; + return this; + } + + private @Nullable String accessToken; + + @CanIgnoreReturnValue + public @NonNull Builder setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + return this; + } + + public @NonNull InternalAuthCredentialInput build() { + InternalAuthCredentialInput pigeonReturn = new InternalAuthCredentialInput(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setSignInMethod(signInMethod); + pigeonReturn.setToken(token); + pigeonReturn.setAccessToken(accessToken); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(providerId); + toListResult.add(signInMethod); + toListResult.add(token); + toListResult.add(accessToken); + return toListResult; + } + + static @NonNull InternalAuthCredentialInput fromList( + @NonNull ArrayList pigeonVar_list) { + InternalAuthCredentialInput pigeonResult = new InternalAuthCredentialInput(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object signInMethod = pigeonVar_list.get(1); + pigeonResult.setSignInMethod((String) signInMethod); + Object token = pigeonVar_list.get(2); + pigeonResult.setToken((String) token); + Object accessToken = pigeonVar_list.get(3); + pigeonResult.setAccessToken((String) accessToken); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeSettings { + private @NonNull String url; + + public @NonNull String getUrl() { + return url; + } + + public void setUrl(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"url\" is null."); + } + this.url = setterArg; + } + + private @Nullable String dynamicLinkDomain; + + public @Nullable String getDynamicLinkDomain() { + return dynamicLinkDomain; + } + + public void setDynamicLinkDomain(@Nullable String setterArg) { + this.dynamicLinkDomain = setterArg; + } + + private @NonNull Boolean handleCodeInApp; + + public @NonNull Boolean getHandleCodeInApp() { + return handleCodeInApp; + } + + public void setHandleCodeInApp(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"handleCodeInApp\" is null."); + } + this.handleCodeInApp = setterArg; + } + + private @Nullable String iOSBundleId; + + public @Nullable String getIOSBundleId() { + return iOSBundleId; + } + + public void setIOSBundleId(@Nullable String setterArg) { + this.iOSBundleId = setterArg; + } + + private @Nullable String androidPackageName; + + public @Nullable String getAndroidPackageName() { + return androidPackageName; + } + + public void setAndroidPackageName(@Nullable String setterArg) { + this.androidPackageName = setterArg; + } + + private @NonNull Boolean androidInstallApp; + + public @NonNull Boolean getAndroidInstallApp() { + return androidInstallApp; + } + + public void setAndroidInstallApp(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"androidInstallApp\" is null."); + } + this.androidInstallApp = setterArg; + } + + private @Nullable String androidMinimumVersion; + + public @Nullable String getAndroidMinimumVersion() { + return androidMinimumVersion; + } + + public void setAndroidMinimumVersion(@Nullable String setterArg) { + this.androidMinimumVersion = setterArg; + } + + private @Nullable String linkDomain; + + public @Nullable String getLinkDomain() { + return linkDomain; + } + + public void setLinkDomain(@Nullable String setterArg) { + this.linkDomain = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalActionCodeSettings() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeSettings that = (InternalActionCodeSettings) o; + return pigeonDeepEquals(url, that.url) + && pigeonDeepEquals(dynamicLinkDomain, that.dynamicLinkDomain) + && pigeonDeepEquals(handleCodeInApp, that.handleCodeInApp) + && pigeonDeepEquals(iOSBundleId, that.iOSBundleId) + && pigeonDeepEquals(androidPackageName, that.androidPackageName) + && pigeonDeepEquals(androidInstallApp, that.androidInstallApp) + && pigeonDeepEquals(androidMinimumVersion, that.androidMinimumVersion) + && pigeonDeepEquals(linkDomain, that.linkDomain); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + url, + dynamicLinkDomain, + handleCodeInApp, + iOSBundleId, + androidPackageName, + androidInstallApp, + androidMinimumVersion, + linkDomain + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String url; + + @CanIgnoreReturnValue + public @NonNull Builder setUrl(@NonNull String setterArg) { + this.url = setterArg; + return this; + } + + private @Nullable String dynamicLinkDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setDynamicLinkDomain(@Nullable String setterArg) { + this.dynamicLinkDomain = setterArg; + return this; + } + + private @Nullable Boolean handleCodeInApp; + + @CanIgnoreReturnValue + public @NonNull Builder setHandleCodeInApp(@NonNull Boolean setterArg) { + this.handleCodeInApp = setterArg; + return this; + } + + private @Nullable String iOSBundleId; + + @CanIgnoreReturnValue + public @NonNull Builder setIOSBundleId(@Nullable String setterArg) { + this.iOSBundleId = setterArg; + return this; + } + + private @Nullable String androidPackageName; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidPackageName(@Nullable String setterArg) { + this.androidPackageName = setterArg; + return this; + } + + private @Nullable Boolean androidInstallApp; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidInstallApp(@NonNull Boolean setterArg) { + this.androidInstallApp = setterArg; + return this; + } + + private @Nullable String androidMinimumVersion; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidMinimumVersion(@Nullable String setterArg) { + this.androidMinimumVersion = setterArg; + return this; + } + + private @Nullable String linkDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setLinkDomain(@Nullable String setterArg) { + this.linkDomain = setterArg; + return this; + } + + public @NonNull InternalActionCodeSettings build() { + InternalActionCodeSettings pigeonReturn = new InternalActionCodeSettings(); + pigeonReturn.setUrl(url); + pigeonReturn.setDynamicLinkDomain(dynamicLinkDomain); + pigeonReturn.setHandleCodeInApp(handleCodeInApp); + pigeonReturn.setIOSBundleId(iOSBundleId); + pigeonReturn.setAndroidPackageName(androidPackageName); + pigeonReturn.setAndroidInstallApp(androidInstallApp); + pigeonReturn.setAndroidMinimumVersion(androidMinimumVersion); + pigeonReturn.setLinkDomain(linkDomain); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(8); + toListResult.add(url); + toListResult.add(dynamicLinkDomain); + toListResult.add(handleCodeInApp); + toListResult.add(iOSBundleId); + toListResult.add(androidPackageName); + toListResult.add(androidInstallApp); + toListResult.add(androidMinimumVersion); + toListResult.add(linkDomain); + return toListResult; + } + + static @NonNull InternalActionCodeSettings fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeSettings pigeonResult = new InternalActionCodeSettings(); + Object url = pigeonVar_list.get(0); + pigeonResult.setUrl((String) url); + Object dynamicLinkDomain = pigeonVar_list.get(1); + pigeonResult.setDynamicLinkDomain((String) dynamicLinkDomain); + Object handleCodeInApp = pigeonVar_list.get(2); + pigeonResult.setHandleCodeInApp((Boolean) handleCodeInApp); + Object iOSBundleId = pigeonVar_list.get(3); + pigeonResult.setIOSBundleId((String) iOSBundleId); + Object androidPackageName = pigeonVar_list.get(4); + pigeonResult.setAndroidPackageName((String) androidPackageName); + Object androidInstallApp = pigeonVar_list.get(5); + pigeonResult.setAndroidInstallApp((Boolean) androidInstallApp); + Object androidMinimumVersion = pigeonVar_list.get(6); + pigeonResult.setAndroidMinimumVersion((String) androidMinimumVersion); + Object linkDomain = pigeonVar_list.get(7); + pigeonResult.setLinkDomain((String) linkDomain); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalFirebaseAuthSettings { + private @NonNull Boolean appVerificationDisabledForTesting; + + public @NonNull Boolean getAppVerificationDisabledForTesting() { + return appVerificationDisabledForTesting; + } + + public void setAppVerificationDisabledForTesting(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException( + "Nonnull field \"appVerificationDisabledForTesting\" is null."); + } + this.appVerificationDisabledForTesting = setterArg; + } + + private @Nullable String userAccessGroup; + + public @Nullable String getUserAccessGroup() { + return userAccessGroup; + } + + public void setUserAccessGroup(@Nullable String setterArg) { + this.userAccessGroup = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @Nullable String smsCode; + + public @Nullable String getSmsCode() { + return smsCode; + } + + public void setSmsCode(@Nullable String setterArg) { + this.smsCode = setterArg; + } + + private @Nullable Boolean forceRecaptchaFlow; + + public @Nullable Boolean getForceRecaptchaFlow() { + return forceRecaptchaFlow; + } + + public void setForceRecaptchaFlow(@Nullable Boolean setterArg) { + this.forceRecaptchaFlow = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalFirebaseAuthSettings() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalFirebaseAuthSettings that = (InternalFirebaseAuthSettings) o; + return pigeonDeepEquals( + appVerificationDisabledForTesting, that.appVerificationDisabledForTesting) + && pigeonDeepEquals(userAccessGroup, that.userAccessGroup) + && pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(smsCode, that.smsCode) + && pigeonDeepEquals(forceRecaptchaFlow, that.forceRecaptchaFlow); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + appVerificationDisabledForTesting, + userAccessGroup, + phoneNumber, + smsCode, + forceRecaptchaFlow + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Boolean appVerificationDisabledForTesting; + + @CanIgnoreReturnValue + public @NonNull Builder setAppVerificationDisabledForTesting(@NonNull Boolean setterArg) { + this.appVerificationDisabledForTesting = setterArg; + return this; + } + + private @Nullable String userAccessGroup; + + @CanIgnoreReturnValue + public @NonNull Builder setUserAccessGroup(@Nullable String setterArg) { + this.userAccessGroup = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable String smsCode; + + @CanIgnoreReturnValue + public @NonNull Builder setSmsCode(@Nullable String setterArg) { + this.smsCode = setterArg; + return this; + } + + private @Nullable Boolean forceRecaptchaFlow; + + @CanIgnoreReturnValue + public @NonNull Builder setForceRecaptchaFlow(@Nullable Boolean setterArg) { + this.forceRecaptchaFlow = setterArg; + return this; + } + + public @NonNull InternalFirebaseAuthSettings build() { + InternalFirebaseAuthSettings pigeonReturn = new InternalFirebaseAuthSettings(); + pigeonReturn.setAppVerificationDisabledForTesting(appVerificationDisabledForTesting); + pigeonReturn.setUserAccessGroup(userAccessGroup); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setSmsCode(smsCode); + pigeonReturn.setForceRecaptchaFlow(forceRecaptchaFlow); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(appVerificationDisabledForTesting); + toListResult.add(userAccessGroup); + toListResult.add(phoneNumber); + toListResult.add(smsCode); + toListResult.add(forceRecaptchaFlow); + return toListResult; + } + + static @NonNull InternalFirebaseAuthSettings fromList( + @NonNull ArrayList pigeonVar_list) { + InternalFirebaseAuthSettings pigeonResult = new InternalFirebaseAuthSettings(); + Object appVerificationDisabledForTesting = pigeonVar_list.get(0); + pigeonResult.setAppVerificationDisabledForTesting( + (Boolean) appVerificationDisabledForTesting); + Object userAccessGroup = pigeonVar_list.get(1); + pigeonResult.setUserAccessGroup((String) userAccessGroup); + Object phoneNumber = pigeonVar_list.get(2); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object smsCode = pigeonVar_list.get(3); + pigeonResult.setSmsCode((String) smsCode); + Object forceRecaptchaFlow = pigeonVar_list.get(4); + pigeonResult.setForceRecaptchaFlow((Boolean) forceRecaptchaFlow); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalSignInProvider { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @Nullable List scopes; + + public @Nullable List getScopes() { + return scopes; + } + + public void setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + } + + private @Nullable Map customParameters; + + public @Nullable Map getCustomParameters() { + return customParameters; + } + + public void setCustomParameters(@Nullable Map setterArg) { + this.customParameters = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalSignInProvider() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalSignInProvider that = (InternalSignInProvider) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(scopes, that.scopes) + && pigeonDeepEquals(customParameters, that.customParameters); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, scopes, customParameters}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable List scopes; + + @CanIgnoreReturnValue + public @NonNull Builder setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + return this; + } + + private @Nullable Map customParameters; + + @CanIgnoreReturnValue + public @NonNull Builder setCustomParameters(@Nullable Map setterArg) { + this.customParameters = setterArg; + return this; + } + + public @NonNull InternalSignInProvider build() { + InternalSignInProvider pigeonReturn = new InternalSignInProvider(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setScopes(scopes); + pigeonReturn.setCustomParameters(customParameters); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(providerId); + toListResult.add(scopes); + toListResult.add(customParameters); + return toListResult; + } + + static @NonNull InternalSignInProvider fromList(@NonNull ArrayList pigeonVar_list) { + InternalSignInProvider pigeonResult = new InternalSignInProvider(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object scopes = pigeonVar_list.get(1); + pigeonResult.setScopes((List) scopes); + Object customParameters = pigeonVar_list.get(2); + pigeonResult.setCustomParameters((Map) customParameters); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalVerifyPhoneNumberRequest { + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @NonNull Long timeout; + + public @NonNull Long getTimeout() { + return timeout; + } + + public void setTimeout(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"timeout\" is null."); + } + this.timeout = setterArg; + } + + private @Nullable Long forceResendingToken; + + public @Nullable Long getForceResendingToken() { + return forceResendingToken; + } + + public void setForceResendingToken(@Nullable Long setterArg) { + this.forceResendingToken = setterArg; + } + + private @Nullable String autoRetrievedSmsCodeForTesting; + + public @Nullable String getAutoRetrievedSmsCodeForTesting() { + return autoRetrievedSmsCodeForTesting; + } + + public void setAutoRetrievedSmsCodeForTesting(@Nullable String setterArg) { + this.autoRetrievedSmsCodeForTesting = setterArg; + } + + private @Nullable String multiFactorInfoId; + + public @Nullable String getMultiFactorInfoId() { + return multiFactorInfoId; + } + + public void setMultiFactorInfoId(@Nullable String setterArg) { + this.multiFactorInfoId = setterArg; + } + + private @Nullable String multiFactorSessionId; + + public @Nullable String getMultiFactorSessionId() { + return multiFactorSessionId; + } + + public void setMultiFactorSessionId(@Nullable String setterArg) { + this.multiFactorSessionId = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalVerifyPhoneNumberRequest() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalVerifyPhoneNumberRequest that = (InternalVerifyPhoneNumberRequest) o; + return pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(timeout, that.timeout) + && pigeonDeepEquals(forceResendingToken, that.forceResendingToken) + && pigeonDeepEquals(autoRetrievedSmsCodeForTesting, that.autoRetrievedSmsCodeForTesting) + && pigeonDeepEquals(multiFactorInfoId, that.multiFactorInfoId) + && pigeonDeepEquals(multiFactorSessionId, that.multiFactorSessionId); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + phoneNumber, + timeout, + forceResendingToken, + autoRetrievedSmsCodeForTesting, + multiFactorInfoId, + multiFactorSessionId + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable Long timeout; + + @CanIgnoreReturnValue + public @NonNull Builder setTimeout(@NonNull Long setterArg) { + this.timeout = setterArg; + return this; + } + + private @Nullable Long forceResendingToken; + + @CanIgnoreReturnValue + public @NonNull Builder setForceResendingToken(@Nullable Long setterArg) { + this.forceResendingToken = setterArg; + return this; + } + + private @Nullable String autoRetrievedSmsCodeForTesting; + + @CanIgnoreReturnValue + public @NonNull Builder setAutoRetrievedSmsCodeForTesting(@Nullable String setterArg) { + this.autoRetrievedSmsCodeForTesting = setterArg; + return this; + } + + private @Nullable String multiFactorInfoId; + + @CanIgnoreReturnValue + public @NonNull Builder setMultiFactorInfoId(@Nullable String setterArg) { + this.multiFactorInfoId = setterArg; + return this; + } + + private @Nullable String multiFactorSessionId; + + @CanIgnoreReturnValue + public @NonNull Builder setMultiFactorSessionId(@Nullable String setterArg) { + this.multiFactorSessionId = setterArg; + return this; + } + + public @NonNull InternalVerifyPhoneNumberRequest build() { + InternalVerifyPhoneNumberRequest pigeonReturn = new InternalVerifyPhoneNumberRequest(); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setTimeout(timeout); + pigeonReturn.setForceResendingToken(forceResendingToken); + pigeonReturn.setAutoRetrievedSmsCodeForTesting(autoRetrievedSmsCodeForTesting); + pigeonReturn.setMultiFactorInfoId(multiFactorInfoId); + pigeonReturn.setMultiFactorSessionId(multiFactorSessionId); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(6); + toListResult.add(phoneNumber); + toListResult.add(timeout); + toListResult.add(forceResendingToken); + toListResult.add(autoRetrievedSmsCodeForTesting); + toListResult.add(multiFactorInfoId); + toListResult.add(multiFactorSessionId); + return toListResult; + } + + static @NonNull InternalVerifyPhoneNumberRequest fromList( + @NonNull ArrayList pigeonVar_list) { + InternalVerifyPhoneNumberRequest pigeonResult = new InternalVerifyPhoneNumberRequest(); + Object phoneNumber = pigeonVar_list.get(0); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object timeout = pigeonVar_list.get(1); + pigeonResult.setTimeout((Long) timeout); + Object forceResendingToken = pigeonVar_list.get(2); + pigeonResult.setForceResendingToken((Long) forceResendingToken); + Object autoRetrievedSmsCodeForTesting = pigeonVar_list.get(3); + pigeonResult.setAutoRetrievedSmsCodeForTesting((String) autoRetrievedSmsCodeForTesting); + Object multiFactorInfoId = pigeonVar_list.get(4); + pigeonResult.setMultiFactorInfoId((String) multiFactorInfoId); + Object multiFactorSessionId = pigeonVar_list.get(5); + pigeonResult.setMultiFactorSessionId((String) multiFactorSessionId); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalIdTokenResult { + private @Nullable String token; + + public @Nullable String getToken() { + return token; + } + + public void setToken(@Nullable String setterArg) { + this.token = setterArg; + } + + private @Nullable Long expirationTimestamp; + + public @Nullable Long getExpirationTimestamp() { + return expirationTimestamp; + } + + public void setExpirationTimestamp(@Nullable Long setterArg) { + this.expirationTimestamp = setterArg; + } + + private @Nullable Long authTimestamp; + + public @Nullable Long getAuthTimestamp() { + return authTimestamp; + } + + public void setAuthTimestamp(@Nullable Long setterArg) { + this.authTimestamp = setterArg; + } + + private @Nullable Long issuedAtTimestamp; + + public @Nullable Long getIssuedAtTimestamp() { + return issuedAtTimestamp; + } + + public void setIssuedAtTimestamp(@Nullable Long setterArg) { + this.issuedAtTimestamp = setterArg; + } + + private @Nullable String signInProvider; + + public @Nullable String getSignInProvider() { + return signInProvider; + } + + public void setSignInProvider(@Nullable String setterArg) { + this.signInProvider = setterArg; + } + + private @Nullable Map claims; + + public @Nullable Map getClaims() { + return claims; + } + + public void setClaims(@Nullable Map setterArg) { + this.claims = setterArg; + } + + private @Nullable String signInSecondFactor; + + public @Nullable String getSignInSecondFactor() { + return signInSecondFactor; + } + + public void setSignInSecondFactor(@Nullable String setterArg) { + this.signInSecondFactor = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalIdTokenResult that = (InternalIdTokenResult) o; + return pigeonDeepEquals(token, that.token) + && pigeonDeepEquals(expirationTimestamp, that.expirationTimestamp) + && pigeonDeepEquals(authTimestamp, that.authTimestamp) + && pigeonDeepEquals(issuedAtTimestamp, that.issuedAtTimestamp) + && pigeonDeepEquals(signInProvider, that.signInProvider) + && pigeonDeepEquals(claims, that.claims) + && pigeonDeepEquals(signInSecondFactor, that.signInSecondFactor); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + token, + expirationTimestamp, + authTimestamp, + issuedAtTimestamp, + signInProvider, + claims, + signInSecondFactor + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String token; + + @CanIgnoreReturnValue + public @NonNull Builder setToken(@Nullable String setterArg) { + this.token = setterArg; + return this; + } + + private @Nullable Long expirationTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setExpirationTimestamp(@Nullable Long setterArg) { + this.expirationTimestamp = setterArg; + return this; + } + + private @Nullable Long authTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setAuthTimestamp(@Nullable Long setterArg) { + this.authTimestamp = setterArg; + return this; + } + + private @Nullable Long issuedAtTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setIssuedAtTimestamp(@Nullable Long setterArg) { + this.issuedAtTimestamp = setterArg; + return this; + } + + private @Nullable String signInProvider; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInProvider(@Nullable String setterArg) { + this.signInProvider = setterArg; + return this; + } + + private @Nullable Map claims; + + @CanIgnoreReturnValue + public @NonNull Builder setClaims(@Nullable Map setterArg) { + this.claims = setterArg; + return this; + } + + private @Nullable String signInSecondFactor; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInSecondFactor(@Nullable String setterArg) { + this.signInSecondFactor = setterArg; + return this; + } + + public @NonNull InternalIdTokenResult build() { + InternalIdTokenResult pigeonReturn = new InternalIdTokenResult(); + pigeonReturn.setToken(token); + pigeonReturn.setExpirationTimestamp(expirationTimestamp); + pigeonReturn.setAuthTimestamp(authTimestamp); + pigeonReturn.setIssuedAtTimestamp(issuedAtTimestamp); + pigeonReturn.setSignInProvider(signInProvider); + pigeonReturn.setClaims(claims); + pigeonReturn.setSignInSecondFactor(signInSecondFactor); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(7); + toListResult.add(token); + toListResult.add(expirationTimestamp); + toListResult.add(authTimestamp); + toListResult.add(issuedAtTimestamp); + toListResult.add(signInProvider); + toListResult.add(claims); + toListResult.add(signInSecondFactor); + return toListResult; + } + + static @NonNull InternalIdTokenResult fromList(@NonNull ArrayList pigeonVar_list) { + InternalIdTokenResult pigeonResult = new InternalIdTokenResult(); + Object token = pigeonVar_list.get(0); + pigeonResult.setToken((String) token); + Object expirationTimestamp = pigeonVar_list.get(1); + pigeonResult.setExpirationTimestamp((Long) expirationTimestamp); + Object authTimestamp = pigeonVar_list.get(2); + pigeonResult.setAuthTimestamp((Long) authTimestamp); + Object issuedAtTimestamp = pigeonVar_list.get(3); + pigeonResult.setIssuedAtTimestamp((Long) issuedAtTimestamp); + Object signInProvider = pigeonVar_list.get(4); + pigeonResult.setSignInProvider((String) signInProvider); + Object claims = pigeonVar_list.get(5); + pigeonResult.setClaims((Map) claims); + Object signInSecondFactor = pigeonVar_list.get(6); + pigeonResult.setSignInSecondFactor((String) signInSecondFactor); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserProfile { + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @Nullable String photoUrl; + + public @Nullable String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + } + + private @NonNull Boolean displayNameChanged; + + public @NonNull Boolean getDisplayNameChanged() { + return displayNameChanged; + } + + public void setDisplayNameChanged(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"displayNameChanged\" is null."); + } + this.displayNameChanged = setterArg; + } + + private @NonNull Boolean photoUrlChanged; + + public @NonNull Boolean getPhotoUrlChanged() { + return photoUrlChanged; + } + + public void setPhotoUrlChanged(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"photoUrlChanged\" is null."); + } + this.photoUrlChanged = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserProfile() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserProfile that = (InternalUserProfile) o; + return pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(photoUrl, that.photoUrl) + && pigeonDeepEquals(displayNameChanged, that.displayNameChanged) + && pigeonDeepEquals(photoUrlChanged, that.photoUrlChanged); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), displayName, photoUrl, displayNameChanged, photoUrlChanged}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable String photoUrl; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + return this; + } + + private @Nullable Boolean displayNameChanged; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayNameChanged(@NonNull Boolean setterArg) { + this.displayNameChanged = setterArg; + return this; + } + + private @Nullable Boolean photoUrlChanged; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrlChanged(@NonNull Boolean setterArg) { + this.photoUrlChanged = setterArg; + return this; + } + + public @NonNull InternalUserProfile build() { + InternalUserProfile pigeonReturn = new InternalUserProfile(); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setPhotoUrl(photoUrl); + pigeonReturn.setDisplayNameChanged(displayNameChanged); + pigeonReturn.setPhotoUrlChanged(photoUrlChanged); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(displayName); + toListResult.add(photoUrl); + toListResult.add(displayNameChanged); + toListResult.add(photoUrlChanged); + return toListResult; + } + + static @NonNull InternalUserProfile fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserProfile pigeonResult = new InternalUserProfile(); + Object displayName = pigeonVar_list.get(0); + pigeonResult.setDisplayName((String) displayName); + Object photoUrl = pigeonVar_list.get(1); + pigeonResult.setPhotoUrl((String) photoUrl); + Object displayNameChanged = pigeonVar_list.get(2); + pigeonResult.setDisplayNameChanged((Boolean) displayNameChanged); + Object photoUrlChanged = pigeonVar_list.get(3); + pigeonResult.setPhotoUrlChanged((Boolean) photoUrlChanged); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalTotpSecret { + private @Nullable Long codeIntervalSeconds; + + public @Nullable Long getCodeIntervalSeconds() { + return codeIntervalSeconds; + } + + public void setCodeIntervalSeconds(@Nullable Long setterArg) { + this.codeIntervalSeconds = setterArg; + } + + private @Nullable Long codeLength; + + public @Nullable Long getCodeLength() { + return codeLength; + } + + public void setCodeLength(@Nullable Long setterArg) { + this.codeLength = setterArg; + } + + private @Nullable Long enrollmentCompletionDeadline; + + public @Nullable Long getEnrollmentCompletionDeadline() { + return enrollmentCompletionDeadline; + } + + public void setEnrollmentCompletionDeadline(@Nullable Long setterArg) { + this.enrollmentCompletionDeadline = setterArg; + } + + private @Nullable String hashingAlgorithm; + + public @Nullable String getHashingAlgorithm() { + return hashingAlgorithm; + } + + public void setHashingAlgorithm(@Nullable String setterArg) { + this.hashingAlgorithm = setterArg; + } + + private @NonNull String secretKey; + + public @NonNull String getSecretKey() { + return secretKey; + } + + public void setSecretKey(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"secretKey\" is null."); + } + this.secretKey = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalTotpSecret() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalTotpSecret that = (InternalTotpSecret) o; + return pigeonDeepEquals(codeIntervalSeconds, that.codeIntervalSeconds) + && pigeonDeepEquals(codeLength, that.codeLength) + && pigeonDeepEquals(enrollmentCompletionDeadline, that.enrollmentCompletionDeadline) + && pigeonDeepEquals(hashingAlgorithm, that.hashingAlgorithm) + && pigeonDeepEquals(secretKey, that.secretKey); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + codeIntervalSeconds, + codeLength, + enrollmentCompletionDeadline, + hashingAlgorithm, + secretKey + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Long codeIntervalSeconds; + + @CanIgnoreReturnValue + public @NonNull Builder setCodeIntervalSeconds(@Nullable Long setterArg) { + this.codeIntervalSeconds = setterArg; + return this; + } + + private @Nullable Long codeLength; + + @CanIgnoreReturnValue + public @NonNull Builder setCodeLength(@Nullable Long setterArg) { + this.codeLength = setterArg; + return this; + } + + private @Nullable Long enrollmentCompletionDeadline; + + @CanIgnoreReturnValue + public @NonNull Builder setEnrollmentCompletionDeadline(@Nullable Long setterArg) { + this.enrollmentCompletionDeadline = setterArg; + return this; + } + + private @Nullable String hashingAlgorithm; + + @CanIgnoreReturnValue + public @NonNull Builder setHashingAlgorithm(@Nullable String setterArg) { + this.hashingAlgorithm = setterArg; + return this; + } + + private @Nullable String secretKey; + + @CanIgnoreReturnValue + public @NonNull Builder setSecretKey(@NonNull String setterArg) { + this.secretKey = setterArg; + return this; + } + + public @NonNull InternalTotpSecret build() { + InternalTotpSecret pigeonReturn = new InternalTotpSecret(); + pigeonReturn.setCodeIntervalSeconds(codeIntervalSeconds); + pigeonReturn.setCodeLength(codeLength); + pigeonReturn.setEnrollmentCompletionDeadline(enrollmentCompletionDeadline); + pigeonReturn.setHashingAlgorithm(hashingAlgorithm); + pigeonReturn.setSecretKey(secretKey); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(codeIntervalSeconds); + toListResult.add(codeLength); + toListResult.add(enrollmentCompletionDeadline); + toListResult.add(hashingAlgorithm); + toListResult.add(secretKey); + return toListResult; + } + + static @NonNull InternalTotpSecret fromList(@NonNull ArrayList pigeonVar_list) { + InternalTotpSecret pigeonResult = new InternalTotpSecret(); + Object codeIntervalSeconds = pigeonVar_list.get(0); + pigeonResult.setCodeIntervalSeconds((Long) codeIntervalSeconds); + Object codeLength = pigeonVar_list.get(1); + pigeonResult.setCodeLength((Long) codeLength); + Object enrollmentCompletionDeadline = pigeonVar_list.get(2); + pigeonResult.setEnrollmentCompletionDeadline((Long) enrollmentCompletionDeadline); + Object hashingAlgorithm = pigeonVar_list.get(3); + pigeonResult.setHashingAlgorithm((String) hashingAlgorithm); + Object secretKey = pigeonVar_list.get(4); + pigeonResult.setSecretKey((String) secretKey); + return pigeonResult; + } + } + + private static class PigeonCodec extends StandardMessageCodec { + public static final PigeonCodec INSTANCE = new PigeonCodec(); + + private PigeonCodec() {} + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + case (byte) 129: + { + Object value = readValue(buffer); + return value == null + ? null + : ActionCodeInfoOperation.values()[((Long) value).intValue()]; + } + case (byte) 130: + return InternalMultiFactorSession.fromList((ArrayList) readValue(buffer)); + case (byte) 131: + return InternalPhoneMultiFactorAssertion.fromList((ArrayList) readValue(buffer)); + case (byte) 132: + return InternalMultiFactorInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 133: + return AuthPigeonFirebaseApp.fromList((ArrayList) readValue(buffer)); + case (byte) 134: + return InternalActionCodeInfoData.fromList((ArrayList) readValue(buffer)); + case (byte) 135: + return InternalActionCodeInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 136: + return InternalAdditionalUserInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 137: + return InternalAuthCredential.fromList((ArrayList) readValue(buffer)); + case (byte) 138: + return InternalUserInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 139: + return InternalUserDetails.fromList((ArrayList) readValue(buffer)); + case (byte) 140: + return InternalUserCredential.fromList((ArrayList) readValue(buffer)); + case (byte) 141: + return InternalAuthCredentialInput.fromList((ArrayList) readValue(buffer)); + case (byte) 142: + return InternalActionCodeSettings.fromList((ArrayList) readValue(buffer)); + case (byte) 143: + return InternalFirebaseAuthSettings.fromList((ArrayList) readValue(buffer)); + case (byte) 144: + return InternalSignInProvider.fromList((ArrayList) readValue(buffer)); + case (byte) 145: + return InternalVerifyPhoneNumberRequest.fromList((ArrayList) readValue(buffer)); + case (byte) 146: + return InternalIdTokenResult.fromList((ArrayList) readValue(buffer)); + case (byte) 147: + return InternalUserProfile.fromList((ArrayList) readValue(buffer)); + case (byte) 148: + return InternalTotpSecret.fromList((ArrayList) readValue(buffer)); + default: + return super.readValueOfType(type, buffer); + } + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { + if (value instanceof ActionCodeInfoOperation) { + stream.write(129); + writeValue(stream, value == null ? null : ((ActionCodeInfoOperation) value).index); + } else if (value instanceof InternalMultiFactorSession) { + stream.write(130); + writeValue(stream, ((InternalMultiFactorSession) value).toList()); + } else if (value instanceof InternalPhoneMultiFactorAssertion) { + stream.write(131); + writeValue(stream, ((InternalPhoneMultiFactorAssertion) value).toList()); + } else if (value instanceof InternalMultiFactorInfo) { + stream.write(132); + writeValue(stream, ((InternalMultiFactorInfo) value).toList()); + } else if (value instanceof AuthPigeonFirebaseApp) { + stream.write(133); + writeValue(stream, ((AuthPigeonFirebaseApp) value).toList()); + } else if (value instanceof InternalActionCodeInfoData) { + stream.write(134); + writeValue(stream, ((InternalActionCodeInfoData) value).toList()); + } else if (value instanceof InternalActionCodeInfo) { + stream.write(135); + writeValue(stream, ((InternalActionCodeInfo) value).toList()); + } else if (value instanceof InternalAdditionalUserInfo) { + stream.write(136); + writeValue(stream, ((InternalAdditionalUserInfo) value).toList()); + } else if (value instanceof InternalAuthCredential) { + stream.write(137); + writeValue(stream, ((InternalAuthCredential) value).toList()); + } else if (value instanceof InternalUserInfo) { + stream.write(138); + writeValue(stream, ((InternalUserInfo) value).toList()); + } else if (value instanceof InternalUserDetails) { + stream.write(139); + writeValue(stream, ((InternalUserDetails) value).toList()); + } else if (value instanceof InternalUserCredential) { + stream.write(140); + writeValue(stream, ((InternalUserCredential) value).toList()); + } else if (value instanceof InternalAuthCredentialInput) { + stream.write(141); + writeValue(stream, ((InternalAuthCredentialInput) value).toList()); + } else if (value instanceof InternalActionCodeSettings) { + stream.write(142); + writeValue(stream, ((InternalActionCodeSettings) value).toList()); + } else if (value instanceof InternalFirebaseAuthSettings) { + stream.write(143); + writeValue(stream, ((InternalFirebaseAuthSettings) value).toList()); + } else if (value instanceof InternalSignInProvider) { + stream.write(144); + writeValue(stream, ((InternalSignInProvider) value).toList()); + } else if (value instanceof InternalVerifyPhoneNumberRequest) { + stream.write(145); + writeValue(stream, ((InternalVerifyPhoneNumberRequest) value).toList()); + } else if (value instanceof InternalIdTokenResult) { + stream.write(146); + writeValue(stream, ((InternalIdTokenResult) value).toList()); + } else if (value instanceof InternalUserProfile) { + stream.write(147); + writeValue(stream, ((InternalUserProfile) value).toList()); + } else if (value instanceof InternalTotpSecret) { + stream.write(148); + writeValue(stream, ((InternalTotpSecret) value).toList()); + } else { + super.writeValue(stream, value); + } + } + } + + /** Asynchronous error handling return type for non-nullable API method returns. */ + public interface Result { + /** Success case callback method for handling returns. */ + void success(@NonNull T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Asynchronous error handling return type for nullable API method returns. */ + public interface NullableResult { + /** Success case callback method for handling returns. */ + void success(@Nullable T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Asynchronous error handling return type for void API method returns. */ + public interface VoidResult { + /** Success case callback method for handling returns. */ + void success(); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface FirebaseAuthHostApi { + + void registerIdTokenListener( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void registerAuthStateListener( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void useEmulator( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String host, + @NonNull Long port, + @NonNull VoidResult result); + + void applyActionCode( + @NonNull AuthPigeonFirebaseApp app, @NonNull String code, @NonNull VoidResult result); + + void checkActionCode( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull Result result); + + void confirmPasswordReset( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull String newPassword, + @NonNull VoidResult result); + + void createUserWithEmailAndPassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull Result result); + + void signInAnonymously( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void signInWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void signInWithCustomToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String token, + @NonNull Result result); + + void signInWithEmailAndPassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull Result result); + + void signInWithEmailLink( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String emailLink, + @NonNull Result result); + + void signInWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void signOut(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + void fetchSignInMethodsForEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull Result> result); + + void sendPasswordResetEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void sendSignInLinkToEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void setLanguageCode( + @NonNull AuthPigeonFirebaseApp app, + @Nullable String languageCode, + @NonNull Result result); + + void setSettings( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalFirebaseAuthSettings settings, + @NonNull VoidResult result); + + void verifyPasswordResetCode( + @NonNull AuthPigeonFirebaseApp app, @NonNull String code, @NonNull Result result); + + void verifyPhoneNumber( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalVerifyPhoneNumberRequest request, + @NonNull Result result); + + void revokeTokenWithAuthorizationCode( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String authorizationCode, + @NonNull VoidResult result); + + void revokeAccessToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String accessToken, + @NonNull VoidResult result); + + void initializeRecaptchaConfig(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + /** The codec used by FirebaseAuthHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `FirebaseAuthHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseAuthHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable FirebaseAuthHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerIdTokenListener" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.registerIdTokenListener(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerAuthStateListener" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.registerAuthStateListener(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.useEmulator" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String hostArg = (String) args.get(1); + Long portArg = (Long) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.useEmulator(appArg, hostArg, portArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.applyActionCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.applyActionCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.checkActionCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalActionCodeInfo result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.checkActionCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.confirmPasswordReset" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + String newPasswordArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.confirmPasswordReset(appArg, codeArg, newPasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.createUserWithEmailAndPassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String passwordArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.createUserWithEmailAndPassword(appArg, emailArg, passwordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInAnonymously" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInAnonymously(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithCustomToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String tokenArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithCustomToken(appArg, tokenArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithEmailAndPassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String passwordArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithEmailAndPassword(appArg, emailArg, passwordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithEmailLink" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String emailLinkArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithEmailLink(appArg, emailArg, emailLinkArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signOut" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signOut(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.fetchSignInMethodsForEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.fetchSignInMethodsForEmail(appArg, emailArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.sendPasswordResetEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendPasswordResetEmail(appArg, emailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.sendSignInLinkToEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendSignInLinkToEmail(appArg, emailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.setLanguageCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String languageCodeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.setLanguageCode(appArg, languageCodeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.setSettings" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalFirebaseAuthSettings settingsArg = + (InternalFirebaseAuthSettings) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.setSettings(appArg, settingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.verifyPasswordResetCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyPasswordResetCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.verifyPhoneNumber" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalVerifyPhoneNumberRequest requestArg = + (InternalVerifyPhoneNumberRequest) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyPhoneNumber(appArg, requestArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.revokeTokenWithAuthorizationCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String authorizationCodeArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.revokeTokenWithAuthorizationCode(appArg, authorizationCodeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.revokeAccessToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String accessTokenArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.revokeAccessToken(appArg, accessTokenArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.initializeRecaptchaConfig" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.initializeRecaptchaConfig(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface FirebaseAuthUserHostApi { + + void delete(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + void getIdToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Boolean forceRefresh, + @NonNull Result result); + + void linkWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void linkWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void reauthenticateWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void reauthenticateWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void reload(@NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void sendEmailVerification( + @NonNull AuthPigeonFirebaseApp app, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void unlink( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String providerId, + @NonNull Result result); + + void updateEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @NonNull Result result); + + void updatePassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newPassword, + @NonNull Result result); + + void updatePhoneNumber( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void updateProfile( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalUserProfile profile, + @NonNull Result result); + + void verifyBeforeUpdateEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + /** The codec used by FirebaseAuthUserHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseAuthUserHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable FirebaseAuthUserHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.delete" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.delete(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.getIdToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Boolean forceRefreshArg = (Boolean) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalIdTokenResult result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getIdToken(appArg, forceRefreshArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.linkWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.linkWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.linkWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.linkWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reauthenticateWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reauthenticateWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reauthenticateWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reauthenticateWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reload" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reload(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.sendEmailVerification" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendEmailVerification(appArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.unlink" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String providerIdArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.unlink(appArg, providerIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updateEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newEmailArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updateEmail(appArg, newEmailArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updatePassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newPasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updatePassword(appArg, newPasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updatePhoneNumber" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updatePhoneNumber(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updateProfile" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalUserProfile profileArg = (InternalUserProfile) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updateProfile(appArg, profileArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.verifyBeforeUpdateEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newEmailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyBeforeUpdateEmail( + appArg, newEmailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorUserHostApi { + + void enrollPhone( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalPhoneMultiFactorAssertion assertion, + @Nullable String displayName, + @NonNull VoidResult result); + + void enrollTotp( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String assertionId, + @Nullable String displayName, + @NonNull VoidResult result); + + void getSession( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void unenroll( + @NonNull AuthPigeonFirebaseApp app, @NonNull String factorUid, @NonNull VoidResult result); + + void getEnrolledFactors( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result> result); + + /** The codec used by MultiFactorUserHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorUserHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorUserHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorUserHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.enrollPhone" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalPhoneMultiFactorAssertion assertionArg = + (InternalPhoneMultiFactorAssertion) args.get(1); + String displayNameArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.enrollPhone(appArg, assertionArg, displayNameArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.enrollTotp" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String assertionIdArg = (String) args.get(1); + String displayNameArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.enrollTotp(appArg, assertionIdArg, displayNameArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.getSession" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalMultiFactorSession result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getSession(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.unenroll" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String factorUidArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.unenroll(appArg, factorUidArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.getEnrolledFactors" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getEnrolledFactors(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactoResolverHostApi { + + void resolveSignIn( + @NonNull String resolverId, + @Nullable InternalPhoneMultiFactorAssertion assertion, + @Nullable String totpAssertionId, + @NonNull Result result); + + /** The codec used by MultiFactoResolverHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactoResolverHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactoResolverHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactoResolverHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactoResolverHostApi.resolveSignIn" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String resolverIdArg = (String) args.get(0); + InternalPhoneMultiFactorAssertion assertionArg = + (InternalPhoneMultiFactorAssertion) args.get(1); + String totpAssertionIdArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.resolveSignIn(resolverIdArg, assertionArg, totpAssertionIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorTotpHostApi { + + void generateSecret(@NonNull String sessionId, @NonNull Result result); + + void getAssertionForEnrollment( + @NonNull String secretKey, @NonNull String oneTimePassword, @NonNull Result result); + + void getAssertionForSignIn( + @NonNull String enrollmentId, + @NonNull String oneTimePassword, + @NonNull Result result); + + /** The codec used by MultiFactorTotpHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorTotpHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorTotpHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorTotpHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.generateSecret" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String sessionIdArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalTotpSecret result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.generateSecret(sessionIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.getAssertionForEnrollment" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String oneTimePasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getAssertionForEnrollment(secretKeyArg, oneTimePasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.getAssertionForSignIn" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String enrollmentIdArg = (String) args.get(0); + String oneTimePasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getAssertionForSignIn(enrollmentIdArg, oneTimePasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorTotpSecretHostApi { + + void generateQrCodeUrl( + @NonNull String secretKey, + @Nullable String accountName, + @Nullable String issuer, + @NonNull Result result); + + void openInOtpApp( + @NonNull String secretKey, @NonNull String qrCodeUrl, @NonNull VoidResult result); + + /** The codec used by MultiFactorTotpSecretHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorTotpSecretHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorTotpSecretHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpSecretHostApi.generateQrCodeUrl" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String accountNameArg = (String) args.get(1); + String issuerArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.generateQrCodeUrl(secretKeyArg, accountNameArg, issuerArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpSecretHostApi.openInOtpApp" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String qrCodeUrlArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.openInOtpApp(secretKeyArg, qrCodeUrlArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** + * Only used to generate the object interface that are use outside of the Pigeon interface + * + *

Generated interface from Pigeon that represents a handler of messages from Flutter. + */ + public interface GenerateInterfaces { + + void pigeonInterface(@NonNull InternalMultiFactorInfo info); + + /** The codec used by GenerateInterfaces. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `GenerateInterfaces` to handle messages through the `binaryMessenger`. + */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable GenerateInterfaces api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable GenerateInterfaces api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.GenerateInterfaces.pigeonInterface" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + InternalMultiFactorInfo infoArg = (InternalMultiFactorInfo) args.get(0); + try { + api.pigeonInterface(infoArg); + wrapped.add(0, null); + } catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java new file mode 100644 index 00000000..ae413a40 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuth.IdTokenListener; +import com.google.firebase.auth.FirebaseUser; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class IdTokenChannelStreamHandler implements StreamHandler { + + private final FirebaseAuth firebaseAuth; + private IdTokenListener idTokenListener; + + public IdTokenChannelStreamHandler(FirebaseAuth firebaseAuth) { + this.firebaseAuth = firebaseAuth; + } + + @Override + public void onListen(Object arguments, EventSink events) { + Map event = new HashMap<>(); + event.put(Constants.APP_NAME, firebaseAuth.getApp().getName()); + + final AtomicBoolean initialAuthState = new AtomicBoolean(true); + + idTokenListener = + auth -> { + if (initialAuthState.get()) { + initialAuthState.set(false); + return; + } + + FirebaseUser user = auth.getCurrentUser(); + + if (user == null) { + event.put(Constants.USER, null); + } else { + event.put( + Constants.USER, PigeonParser.manuallyToList(PigeonParser.parseFirebaseUser(user))); + } + + events.success(event); + }; + + firebaseAuth.addIdTokenListener(idTokenListener); + } + + @Override + public void onCancel(Object arguments) { + if (idTokenListener != null) { + firebaseAuth.removeIdTokenListener(idTokenListener); + idTokenListener = null; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java new file mode 100644 index 00000000..a227be99 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java @@ -0,0 +1,197 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.FirebaseException; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.PhoneAuthOptions; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +public class PhoneNumberVerificationStreamHandler implements StreamHandler { + + interface OnCredentialsListener { + void onCredentialsReceived(PhoneAuthCredential credential); + } + + final AtomicReference activityRef = new AtomicReference<>(null); + final FirebaseAuth firebaseAuth; + final String phoneNumber; + final PhoneMultiFactorInfo multiFactorInfo; + final int timeout; + final OnCredentialsListener onCredentialsListener; + + final MultiFactorSession multiFactorSession; + + String autoRetrievedSmsCodeForTesting; + Integer forceResendingToken; + + private static final HashMap forceResendingTokens = new HashMap<>(); + + @Nullable private EventSink eventSink; + + public PhoneNumberVerificationStreamHandler( + Activity activity, + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalVerifyPhoneNumberRequest request, + @Nullable MultiFactorSession multiFactorSession, + @Nullable PhoneMultiFactorInfo multiFactorInfo, + OnCredentialsListener onCredentialsListener) { + this.activityRef.set(activity); + + this.multiFactorSession = multiFactorSession; + this.multiFactorInfo = multiFactorInfo; + firebaseAuth = FlutterFirebaseAuthPlugin.getAuthFromPigeon(app); + phoneNumber = request.getPhoneNumber(); + timeout = Math.toIntExact(request.getTimeout()); + + if (request.getAutoRetrievedSmsCodeForTesting() != null) { + autoRetrievedSmsCodeForTesting = request.getAutoRetrievedSmsCodeForTesting(); + } + + if (request.getForceResendingToken() != null) { + forceResendingToken = Math.toIntExact(request.getForceResendingToken()); + } + + this.onCredentialsListener = onCredentialsListener; + } + + @Override + public void onListen(Object arguments, EventSink events) { + eventSink = events; + + PhoneAuthProvider.OnVerificationStateChangedCallbacks callbacks = + new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { + @Override + public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) { + int phoneAuthCredentialHashCode = phoneAuthCredential.hashCode(); + onCredentialsListener.onCredentialsReceived(phoneAuthCredential); + + Map event = new HashMap<>(); + event.put(Constants.TOKEN, phoneAuthCredentialHashCode); + + if (phoneAuthCredential.getSmsCode() != null) { + event.put(Constants.SMS_CODE, phoneAuthCredential.getSmsCode()); + } + + event.put(Constants.NAME, "Auth#phoneVerificationCompleted"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onVerificationFailed(@NonNull FirebaseException e) { + Map event = new HashMap<>(); + Map error = new HashMap<>(); + GeneratedAndroidFirebaseAuth.FlutterError flutterError = + FlutterFirebaseAuthPluginException.parserExceptionToFlutter(e); + error.put( + "code", + flutterError + .code + .replaceAll("ERROR_", "") + .toLowerCase(Locale.ROOT) + .replaceAll("_", "-")); + error.put("message", flutterError.getMessage()); + error.put("details", flutterError.details); + event.put("error", error); + + event.put(Constants.NAME, "Auth#phoneVerificationFailed"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onCodeSent( + @NonNull String verificationId, + @NonNull PhoneAuthProvider.ForceResendingToken token) { + int forceResendingTokenHashCode = token.hashCode(); + forceResendingTokens.put(forceResendingTokenHashCode, token); + + Map event = new HashMap<>(); + event.put(Constants.VERIFICATION_ID, verificationId); + event.put(Constants.FORCE_RESENDING_TOKEN, forceResendingTokenHashCode); + + event.put(Constants.NAME, "Auth#phoneCodeSent"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onCodeAutoRetrievalTimeOut(@NonNull String verificationId) { + Map event = new HashMap<>(); + event.put(Constants.VERIFICATION_ID, verificationId); + + event.put(Constants.NAME, "Auth#phoneCodeAutoRetrievalTimeout"); + + if (eventSink != null) { + eventSink.success(event); + } + } + }; + + // Allows the auto-retrieval flow to be tested. + // See https://firebase.google.com/docs/auth/android/phone-auth#integration-testing + if (autoRetrievedSmsCodeForTesting != null) { + firebaseAuth + .getFirebaseAuthSettings() + .setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, autoRetrievedSmsCodeForTesting); + } + + PhoneAuthOptions.Builder phoneAuthOptionsBuilder = new PhoneAuthOptions.Builder(firebaseAuth); + phoneAuthOptionsBuilder.setActivity(activityRef.get()); + phoneAuthOptionsBuilder.setCallbacks(callbacks); + + if (phoneNumber != null) { + phoneAuthOptionsBuilder.setPhoneNumber(phoneNumber); + } + if (multiFactorSession != null) { + phoneAuthOptionsBuilder.setMultiFactorSession(multiFactorSession); + } + if (multiFactorInfo != null) { + phoneAuthOptionsBuilder.setMultiFactorHint(multiFactorInfo); + } + phoneAuthOptionsBuilder.setTimeout((long) timeout, TimeUnit.MILLISECONDS); + + if (forceResendingToken != null) { + PhoneAuthProvider.ForceResendingToken forceResendingToken = + forceResendingTokens.get(this.forceResendingToken); + + if (forceResendingToken != null) { + phoneAuthOptionsBuilder.setForceResendingToken(forceResendingToken); + } + } + + PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptionsBuilder.build()); + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + + activityRef.set(null); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java new file mode 100644 index 00000000..4c9e102a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java @@ -0,0 +1,382 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import android.net.Uri; +import androidx.annotation.NonNull; +import com.google.firebase.auth.ActionCodeEmailInfo; +import com.google.firebase.auth.ActionCodeInfo; +import com.google.firebase.auth.ActionCodeResult; +import com.google.firebase.auth.ActionCodeSettings; +import com.google.firebase.auth.AdditionalUserInfo; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.EmailAuthProvider; +import com.google.firebase.auth.FacebookAuthProvider; +import com.google.firebase.auth.FirebaseAuthProvider; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.FirebaseUserMetadata; +import com.google.firebase.auth.GetTokenResult; +import com.google.firebase.auth.GithubAuthProvider; +import com.google.firebase.auth.GoogleAuthProvider; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.OAuthCredential; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import com.google.firebase.auth.PlayGamesAuthProvider; +import com.google.firebase.auth.TwitterAuthProvider; +import com.google.firebase.auth.UserInfo; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PigeonParser { + static List manuallyToList( + GeneratedAndroidFirebaseAuth.InternalUserDetails pigeonUserDetails) { + List output = new ArrayList<>(); + output.add(pigeonUserDetails.getUserInfo().toList()); + output.add(pigeonUserDetails.getProviderData()); + return output; + } + + static GeneratedAndroidFirebaseAuth.InternalUserCredential parseAuthResult( + @NonNull AuthResult authResult) { + GeneratedAndroidFirebaseAuth.InternalUserCredential.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalUserCredential.Builder(); + + builder.setAdditionalUserInfo(parseAdditionalUserInfo(authResult.getAdditionalUserInfo())); + builder.setCredential(parseAuthCredential(authResult.getCredential())); + builder.setUser(parseFirebaseUser(authResult.getUser())); + + return builder.build(); + } + + private static GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo parseAdditionalUserInfo( + AdditionalUserInfo additionalUserInfo) { + if (additionalUserInfo == null) { + return null; + } + + GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo.Builder(); + + builder.setIsNewUser(additionalUserInfo.isNewUser()); + builder.setProfile(additionalUserInfo.getProfile()); + builder.setProviderId(additionalUserInfo.getProviderId()); + builder.setUsername(additionalUserInfo.getUsername()); + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalAuthCredential parseAuthCredential( + AuthCredential authCredential) { + if (authCredential == null) { + return null; + } + + int authCredentialHashCode = authCredential.hashCode(); + FlutterFirebaseAuthPlugin.authCredentials.put(authCredentialHashCode, authCredential); + + GeneratedAndroidFirebaseAuth.InternalAuthCredential.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalAuthCredential.Builder(); + + builder.setProviderId(authCredential.getProvider()); + builder.setSignInMethod(authCredential.getSignInMethod()); + builder.setNativeId((long) authCredentialHashCode); + if (authCredential instanceof OAuthCredential) { + builder.setAccessToken(((OAuthCredential) authCredential).getAccessToken()); + } + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalUserDetails parseFirebaseUser( + FirebaseUser firebaseUser) { + if (firebaseUser == null) { + return null; + } + + GeneratedAndroidFirebaseAuth.InternalUserDetails.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalUserDetails.Builder(); + + GeneratedAndroidFirebaseAuth.InternalUserInfo.Builder builderInfo = + new GeneratedAndroidFirebaseAuth.InternalUserInfo.Builder(); + + builderInfo.setDisplayName(firebaseUser.getDisplayName()); + builderInfo.setEmail(firebaseUser.getEmail()); + builderInfo.setIsEmailVerified(firebaseUser.isEmailVerified()); + builderInfo.setIsAnonymous(firebaseUser.isAnonymous()); + + final FirebaseUserMetadata userMetadata = firebaseUser.getMetadata(); + if (userMetadata != null) { + builderInfo.setCreationTimestamp(firebaseUser.getMetadata().getCreationTimestamp()); + builderInfo.setLastSignInTimestamp(firebaseUser.getMetadata().getLastSignInTimestamp()); + } + builderInfo.setPhoneNumber(firebaseUser.getPhoneNumber()); + builderInfo.setPhotoUrl(parsePhotoUrl(firebaseUser.getPhotoUrl())); + builderInfo.setUid(firebaseUser.getUid()); + builderInfo.setTenantId(firebaseUser.getTenantId()); + + builder.setUserInfo(builderInfo.build()); + builder.setProviderData(parseUserInfoList(firebaseUser.getProviderData())); + + return builder.build(); + } + + private static List> parseUserInfoList( + List userInfoList) { + List> output = new ArrayList<>(); + + if (userInfoList == null) { + return null; + } + + for (UserInfo userInfo : new ArrayList(userInfoList)) { + if (userInfo == null) { + continue; + } + if (!FirebaseAuthProvider.PROVIDER_ID.equals(userInfo.getProviderId())) { + output.add(parseUserInfoToMap(userInfo)); + } + } + + return output; + } + + private static Map parseUserInfoToMap(UserInfo userInfo) { + Map output = new HashMap<>(); + output.put("displayName", userInfo.getDisplayName()); + output.put("email", userInfo.getEmail()); + output.put("isEmailVerified", userInfo.isEmailVerified()); + output.put("phoneNumber", userInfo.getPhoneNumber()); + output.put("photoUrl", parsePhotoUrl(userInfo.getPhotoUrl())); + // Can be null on Emulator + output.put("uid", userInfo.getUid() == null ? "" : userInfo.getUid()); + output.put("providerId", userInfo.getProviderId()); + output.put("isAnonymous", false); + return output; + } + + private static String parsePhotoUrl(Uri photoUri) { + if (photoUri == null) { + return null; + } + + String photoUrl = photoUri.toString(); + + // Return null if the URL is an empty string + return "".equals(photoUrl) ? null : photoUrl; + } + + @SuppressWarnings("ConstantConditions") + static AuthCredential getCredential(Map credentialMap) { + // If the credential map contains a token, it means a native one has been stored + if (credentialMap.get(Constants.TOKEN) != null) { + int token = ((Number) credentialMap.get(Constants.TOKEN)).intValue(); + AuthCredential credential = FlutterFirebaseAuthPlugin.authCredentials.get(token); + + if (credential == null) { + throw FlutterFirebaseAuthPluginException.invalidCredential(); + } + + return credential; + } + + String signInMethod = + (String) Objects.requireNonNull(credentialMap.get(Constants.SIGN_IN_METHOD)); + String secret = (String) credentialMap.get(Constants.SECRET); + String idToken = (String) credentialMap.get(Constants.ID_TOKEN); + String accessToken = (String) credentialMap.get(Constants.ACCESS_TOKEN); + String rawNonce = (String) credentialMap.get(Constants.RAW_NONCE); + + switch (signInMethod) { + case Constants.SIGN_IN_METHOD_PASSWORD: + return EmailAuthProvider.getCredential( + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL)), + Objects.requireNonNull(secret)); + case Constants.SIGN_IN_METHOD_EMAIL_LINK: + return EmailAuthProvider.getCredentialWithLink( + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL)), + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL_LINK))); + case Constants.SIGN_IN_METHOD_FACEBOOK: + return FacebookAuthProvider.getCredential(Objects.requireNonNull(accessToken)); + case Constants.SIGN_IN_METHOD_GOOGLE: + return GoogleAuthProvider.getCredential(idToken, accessToken); + case Constants.SIGN_IN_METHOD_TWITTER: + return TwitterAuthProvider.getCredential( + Objects.requireNonNull(accessToken), Objects.requireNonNull(secret)); + case Constants.SIGN_IN_METHOD_GITHUB: + return GithubAuthProvider.getCredential(Objects.requireNonNull(accessToken)); + case Constants.SIGN_IN_METHOD_PHONE: + { + String verificationId = + (String) Objects.requireNonNull(credentialMap.get(Constants.VERIFICATION_ID)); + String smsCode = (String) Objects.requireNonNull(credentialMap.get(Constants.SMS_CODE)); + return PhoneAuthProvider.getCredential(verificationId, smsCode); + } + case Constants.SIGN_IN_METHOD_OAUTH: + { + String providerId = + (String) Objects.requireNonNull(credentialMap.get(Constants.PROVIDER_ID)); + OAuthProvider.CredentialBuilder builder = OAuthProvider.newCredentialBuilder(providerId); + if (accessToken != null) { + builder.setAccessToken(accessToken); + } + if (rawNonce == null) { + builder.setIdToken(Objects.requireNonNull(idToken)); + } else { + builder.setIdTokenWithRawNonce(Objects.requireNonNull(idToken), rawNonce); + } + + return builder.build(); + } + case Constants.SIGN_IN_METHOD_PLAY_GAMES: + { + String serverAuthCode = + (String) Objects.requireNonNull(credentialMap.get(Constants.SERVER_AUTH_CODE)); + return PlayGamesAuthProvider.getCredential(serverAuthCode); + } + default: + return null; + } + } + + static ActionCodeSettings getActionCodeSettings( + @NonNull GeneratedAndroidFirebaseAuth.InternalActionCodeSettings pigeonActionCodeSettings) { + ActionCodeSettings.Builder builder = ActionCodeSettings.newBuilder(); + + builder.setUrl(pigeonActionCodeSettings.getUrl()); + + if (pigeonActionCodeSettings.getDynamicLinkDomain() != null) { + builder.setDynamicLinkDomain(pigeonActionCodeSettings.getDynamicLinkDomain()); + } + + if (pigeonActionCodeSettings.getLinkDomain() != null) { + builder.setLinkDomain(pigeonActionCodeSettings.getLinkDomain()); + } + + builder.setHandleCodeInApp(pigeonActionCodeSettings.getHandleCodeInApp()); + + if (pigeonActionCodeSettings.getAndroidPackageName() != null) { + builder.setAndroidPackageName( + pigeonActionCodeSettings.getAndroidPackageName(), + pigeonActionCodeSettings.getAndroidInstallApp(), + pigeonActionCodeSettings.getAndroidMinimumVersion()); + } + + if (pigeonActionCodeSettings.getIOSBundleId() != null) { + builder.setIOSBundleId(pigeonActionCodeSettings.getIOSBundleId()); + } + + return builder.build(); + } + + static List multiFactorInfoToPigeon( + List hints) { + List pigeonHints = new ArrayList<>(); + for (MultiFactorInfo info : hints) { + if (info instanceof PhoneMultiFactorInfo) { + pigeonHints.add( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo.Builder() + .setPhoneNumber(((PhoneMultiFactorInfo) info).getPhoneNumber()) + .setDisplayName(info.getDisplayName()) + .setEnrollmentTimestamp((double) info.getEnrollmentTimestamp()) + .setUid(info.getUid()) + .setFactorId(info.getFactorId()) + .build()); + + } else { + pigeonHints.add( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo.Builder() + .setDisplayName(info.getDisplayName()) + .setEnrollmentTimestamp((double) info.getEnrollmentTimestamp()) + .setUid(info.getUid()) + .setFactorId(info.getFactorId()) + .build()); + } + } + return pigeonHints; + } + + static List> multiFactorInfoToMap(List hints) { + List> pigeonHints = new ArrayList<>(); + for (GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo info : + multiFactorInfoToPigeon(hints)) { + pigeonHints.add(info.toList()); + } + return pigeonHints; + } + + static GeneratedAndroidFirebaseAuth.InternalActionCodeInfo parseActionCodeResult( + @NonNull ActionCodeResult actionCodeResult) { + GeneratedAndroidFirebaseAuth.InternalActionCodeInfo.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalActionCodeInfo.Builder(); + GeneratedAndroidFirebaseAuth.InternalActionCodeInfoData.Builder builderData = + new GeneratedAndroidFirebaseAuth.InternalActionCodeInfoData.Builder(); + + int operation = actionCodeResult.getOperation(); + + switch (operation) { + case ActionCodeResult.PASSWORD_RESET: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.PASSWORD_RESET); + break; + case ActionCodeResult.VERIFY_EMAIL: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.VERIFY_EMAIL); + break; + case ActionCodeResult.RECOVER_EMAIL: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.RECOVER_EMAIL); + break; + case ActionCodeResult.SIGN_IN_WITH_EMAIL_LINK: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.EMAIL_SIGN_IN); + break; + case ActionCodeResult.VERIFY_BEFORE_CHANGE_EMAIL: + builder.setOperation( + GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.VERIFY_AND_CHANGE_EMAIL); + break; + case ActionCodeResult.REVERT_SECOND_FACTOR_ADDITION: + builder.setOperation( + GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.REVERT_SECOND_FACTOR_ADDITION); + break; + } + + ActionCodeInfo actionCodeInfo = actionCodeResult.getInfo(); + + if (actionCodeInfo != null && operation == ActionCodeResult.VERIFY_EMAIL + || operation == ActionCodeResult.PASSWORD_RESET) { + builderData.setEmail(actionCodeInfo.getEmail()); + } else if (operation == ActionCodeResult.RECOVER_EMAIL + || operation == ActionCodeResult.VERIFY_BEFORE_CHANGE_EMAIL) { + ActionCodeEmailInfo actionCodeEmailInfo = + (ActionCodeEmailInfo) Objects.requireNonNull(actionCodeInfo); + builderData.setEmail(actionCodeEmailInfo.getEmail()); + builderData.setPreviousEmail(actionCodeEmailInfo.getPreviousEmail()); + } + + builder.setData(builderData.build()); + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalIdTokenResult parseTokenResult( + @NonNull GetTokenResult tokenResult) { + final GeneratedAndroidFirebaseAuth.InternalIdTokenResult.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalIdTokenResult.Builder(); + + builder.setToken(tokenResult.getToken()); + builder.setSignInProvider(tokenResult.getSignInProvider()); + builder.setAuthTimestamp(tokenResult.getAuthTimestamp() * 1000); + builder.setExpirationTimestamp(tokenResult.getExpirationTimestamp() * 1000); + builder.setIssuedAtTimestamp(tokenResult.getIssuedAtTimestamp() * 1000); + builder.setClaims(tokenResult.getClaims()); + builder.setSignInSecondFactor(tokenResult.getSignInSecondFactor()); + + return builder.build(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle new file mode 100644 index 00000000..38e5e646 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle @@ -0,0 +1,22 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +String libraryVersionName = "UNKNOWN" +String libraryName = "flutter-fire-auth" +File pubspec = new File(project.projectDir.parentFile, 'pubspec.yaml') + +if (pubspec.exists()) { + String yaml = pubspec.text + // Using \s*['|"]?([^\n|'|"]*)['|"]? to extract version number. + Matcher versionMatcher = Pattern.compile("^version:\\s*['|\"]?([^\\n|'|\"]*)['|\"]?\$", Pattern.MULTILINE).matcher(yaml) + if (versionMatcher.find()) libraryVersionName = versionMatcher.group(1).replaceAll("\\+", "-") +} + +android { + defaultConfig { + // BuildConfig.VERSION_NAME + buildConfigField 'String', 'LIBRARY_VERSION', "\"${libraryVersionName}\"" + // BuildConfig.LIBRARY_NAME + buildConfigField 'String', 'LIBRARY_NAME', "\"${libraryName}\"" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/README.md new file mode 100644 index 00000000..8a9c4d3b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/README.md @@ -0,0 +1,58 @@ +# Firebase Auth Example + +[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) + +Demonstrates how to use the `firebase_auth` plugin and enable multiple auth providers. + +## Phone Auth + +1. Enable phone authentication in the [Firebase console]((https://console.firebase.google.com/u/0/project/_/authentication/providers)). +2. Add test phone number and verification code to the Firebase console. + - For this sample the number `+1 408-555-6969` and verification code `888888` are used. +3. For iOS set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the `GoogleServices-Info.plist` file. +4. Enter the phone number `+1 408-555-6969` and press the `Verify phone number` button. +5. Once the phone number is verified the app displays the test + verification code. +6. Enter the verficication code `888888` and press "Sign in with phone number" +7. Signed in user ID is now displayed in the UI. + +## Google Sign-In + +1. Enable Google authentication in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers). +2. For Android, add your app's package name and SHA-1 fingerprint to the [Settings page](https://console.firebase.google.com/project/_/settings/general) of the Firebase console. Refer to [Authenticating Your Client]('https://developers.google.com/android/guides/client-auth') for details on how to get your app's SHA-1 fingerprint. +3. For iOS set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the `GoogleServices-Info.plist` file (same step for `Phone Auth` above). +4. Select `Google` under `Social Authentication` and click the `Sign In With Google` button. +5. Signed in user's details are displayed in the UI. + +### Running on Web + +Make sure you run the example app on port 5000, since `localhost:5000` is +whitelisted for Google authentication. To do so, run: + +``` +flutter run -d web-server --web-port 5000 +``` + +## GitHub Sign-In +To get your `clientId` and `clientSecret`: +1. Visit https://github.com/settings/developers. +2. Create a new OAuth application. +3. Set **Home Page URL** to `https://react-native-firebase-testing.firebaseapp.com`. +4. Set **Authorization callback URL** to `https://react-native-firebase-testing.firebaseapp.com/__/auth/handler`. +5. After you register your app, add the `clientId` and `clientSecret` to the example app config in [`lib/config.dart`](./lib/config.dart). + +## Twitter Sign-In +Twitter sign in requires you to add keys from Twitter Developer API to Firebase Console, which means you cannot use the provided configurations with the example app, instead, **please create a new Firebase project**, then enable Twitter as an Auth provider (*optionally you can enable the rest of providers supported in this example*). + +To get your `apiKey` and `apiSecretKey` for Twitter: +1. Sign up for a developer account on [Twitter Developer](https://developer.twitter.com). +2. Create a new app and copy your keys. +3. From the dashboard, go to your app settings, then go to OAuth settings and turn on OAuth 1.0a, then add 2 callback URLs: + 1. `flutterfireauth://` + 2. `https://react-native-firebase-testing.firebaseapp.com/__/auth/handler` +4. Add your keys to the example app config in [`lib/config.dart`](./lib/config.dart). + +## Getting Started + +For help getting started with Flutter, view the online +[documentation](https://flutter.dev/). diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml new file mode 100644 index 00000000..201a5ca4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml @@ -0,0 +1,7 @@ +include: ../../../../analysis_options.yaml + +linter: + rules: + avoid_print: false + depend_on_referenced_packages: false + library_private_types_in_public_api: false diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle new file mode 100644 index 00000000..db427be9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle @@ -0,0 +1,62 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "io.flutter.plugins.firebase.auth.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + + defaultConfig { + applicationId = "io.flutter.plugins.firebase.auth.example" + // 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. + minSdkVersion = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json new file mode 100644 index 00000000..348716f0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json @@ -0,0 +1,615 @@ +{ + "project_info": { + "project_number": "406099696497", + "firebase_url": "https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app", + "project_id": "flutterfire-e2e-tests", + "storage_bucket": "flutterfire-e2e-tests.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:d86a91cc7b338b233574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.analytics.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:a241c4b471513a203574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-7bvmqp0fffe24vm2arng0dtdeh2tvkgl.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:21d5142deea38dda3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.auth.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-emmujnd7g2ammh5uu9ni6v04p4ateqac.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-in8bfp0nali85oul1o98huoar6eo1vv1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:3ef965ff044efc0b3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dataconnect.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:40da41183cb3d3ff3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:175ea7a64b2faf5e3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firestore.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:7ca3394493cc601a3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.functions.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-tvtvuiqogct1gs1s6lh114jeps7hpjm5.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:6d1c1fbf4688f39c3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.installations.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:74ebb073d7727cd43574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.messaging.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:f54b85cfa36a39f73574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.remoteconfig.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0d4ed619c031c0ac3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.tests" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ib9hj9281l3343cm3nfvvdotaojrthdc.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-lc54d5l8sp90k39r0bb39ovsgo1s9bek.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:899c6485cfce26c13574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase_ui_example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ltgvphphcckosvqhituel5km2k3aecg8.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase_ui_example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:bc0b12b0605df8633574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecoreexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0f3f7bfe78b8b7103574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:2751af6868a69f073574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasestorageexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74a78b93 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt new file mode 100644 index 00000000..2b88c507 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt @@ -0,0 +1,5 @@ +package io.flutter.plugins.firebase.auth.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle new file mode 100644 index 00000000..d2ffbffa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties new file mode 100644 index 00000000..3b5b324f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle new file mode 100644 index 00000000..a4d924db --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.3.0" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.9.22" apply false +} + +include ":app" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..b3c50a89 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 12.0 + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..88c29144 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile new file mode 100644 index 00000000..3026bae9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile @@ -0,0 +1,48 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end + + installer.generated_projects.each do |project| + project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + end + end + end +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..9da003ec --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,700 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 081BFEF7D2871CF6AC71DD05 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7B49E087B951778510D20936 /* GoogleService-Info.plist */; }; + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 25A01FAE278D905100D1E790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3DBDE9876E1D48FC8ED096A3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E010D242A20C21968D02B7C9 /* Pods_Runner.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 253804AE278DB662003BA2E2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 2FB2202774601424C6393E3D /* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 7B49E087B951778510D20936 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E010D242A20C21968D02B7C9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ED172FD60C3CC14CD005C328 /* 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 = ""; }; + FD585EE39F3F8D58CFCE5419 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + 3DBDE9876E1D48FC8ED096A3 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 9C7F99B73919EAB4FA657D9E /* Pods */, + 7B49E087B951778510D20936 /* GoogleService-Info.plist */, + DE500BC6E74EB524103D00CE /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 253804AE278DB662003BA2E2 /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9C7F99B73919EAB4FA657D9E /* Pods */ = { + isa = PBXGroup; + children = ( + 2FB2202774601424C6393E3D /* Pods-Runner.debug.xcconfig */, + ED172FD60C3CC14CD005C328 /* Pods-Runner.release.xcconfig */, + FD585EE39F3F8D58CFCE5419 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + DE500BC6E74EB524103D00CE /* Frameworks */ = { + isa = PBXGroup; + children = ( + E010D242A20C21968D02B7C9 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + AC2BD8C60F3AA720CEA78FA3 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 3E42446041C78F434168F902 /* [CP] Embed Pods Frameworks */, + 7A855ADEADAAB6F658B535DB /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 25A01FAE278D905100D1E790 /* GoogleService-Info.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 081BFEF7D2871CF6AC71DD05 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 3E42446041C78F434168F902 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuthInterop/FirebaseAuthInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework", + "${BUILT_PRODUCTS_DIR}/flutter_facebook_auth/flutter_facebook_auth.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", + "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework/FBAEMKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/FBSDKCoreKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework/FBSDKLoginKit", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAppCheckInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuthInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreExtension.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RecaptchaInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_facebook_auth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBAEMKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit_Basics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKLoginKit.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7A855ADEADAAB6F658B535DB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/firebase_messaging/firebase_messaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/google_sign_in_ios/google_sign_in_ios_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/firebase_messaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/google_sign_in_ios_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + AC2BD8C60F3AA720CEA78FA3 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fc5ae031 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h new file mode 100644 index 00000000..36e21bbf --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m new file mode 100644 index 00000000..70e83933 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..f325ead9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.auth.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:58cbc26aca8e5cf83574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist new file mode 100644 index 00000000..e1ffa4fe --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist @@ -0,0 +1,98 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Firebase Auth Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + firebase_auth_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + FacebookAppID + 128693022464535 + + FacebookClientToken + 16dbbdf0cfb309034a6ad98ac2a21688 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + fb128693022464535 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIApplicationSupportsIndirectInputEvents + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..16c5d9e0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements @@ -0,0 +1,14 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.game-center + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m new file mode 100644 index 00000000..dff6597e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json new file mode 100644 index 00000000..eaca8edd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:58cbc26aca8e5cf83574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart new file mode 100644 index 00000000..b78c948e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart @@ -0,0 +1,748 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:barcode_widget/barcode_widget.dart'; +import 'package:collection/collection.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_example/main.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; +import 'package:flutter_signin_button/flutter_signin_button.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +typedef OAuthSignIn = void Function(); + +// If set to true, the app will request notification permissions to use +// silent verification for SMS MFA instead of Recaptcha. +const withSilentVerificationSMSMFA = true; + +/// Helper class to show a snackbar using the passed context. +class ScaffoldSnackbar { + // ignore: public_member_api_docs + ScaffoldSnackbar(this._context); + + /// The scaffold of current context. + factory ScaffoldSnackbar.of(BuildContext context) { + return ScaffoldSnackbar(context); + } + + final BuildContext _context; + + /// Helper method to show a SnackBar. + void show(String message) { + ScaffoldMessenger.of(_context) + ..hideCurrentSnackBar() + ..showSnackBar( + SnackBar( + content: Text(message), + behavior: SnackBarBehavior.floating, + ), + ); + } +} + +/// The mode of the current auth session, either [AuthMode.login] or [AuthMode.register]. +// ignore: public_member_api_docs +enum AuthMode { login, register, phone } + +extension on AuthMode { + String get label => this == AuthMode.login + ? 'Sign in' + : this == AuthMode.phone + ? 'Sign in' + : 'Register'; +} + +/// Entrypoint example for various sign-in flows with Firebase. +class AuthGate extends StatefulWidget { + // ignore: public_member_api_docs + const AuthGate({Key? key}) : super(key: key); + static String? appleAuthorizationCode; + @override + State createState() => _AuthGateState(); +} + +class _AuthGateState extends State { + TextEditingController emailController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + + GlobalKey formKey = GlobalKey(); + String error = ''; + String verificationId = ''; + + AuthMode mode = AuthMode.login; + + bool isLoading = false; + + void setIsLoading() { + setState(() { + isLoading = !isLoading; + }); + } + + late Map authButtons; + + @override + void initState() { + super.initState(); + + if (withSilentVerificationSMSMFA && !kIsWeb) { + FirebaseMessaging messaging = FirebaseMessaging.instance; + messaging.requestPermission(); + } + + if (!kIsWeb && Platform.isMacOS) { + authButtons = { + Buttons.Apple: () => _handleMultiFactorException( + _signInWithApple, + ), + }; + } else { + authButtons = { + Buttons.Apple: () => _handleMultiFactorException( + _signInWithApple, + ), + Buttons.Google: () => _handleMultiFactorException( + _signInWithGoogle, + ), + Buttons.GitHub: () => _handleMultiFactorException( + _signInWithGitHub, + ), + Buttons.Microsoft: () => _handleMultiFactorException( + _signInWithMicrosoft, + ), + Buttons.Twitter: () => _handleMultiFactorException( + _signInWithTwitter, + ), + Buttons.Yahoo: () => _handleMultiFactorException( + _signInWithYahoo, + ), + Buttons.Facebook: () => _handleMultiFactorException( + _signInWithFacebook, + ), + }; + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: FocusScope.of(context).unfocus, + child: Scaffold( + body: Center( + child: SingleChildScrollView( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: SafeArea( + child: Form( + key: formKey, + autovalidateMode: AutovalidateMode.onUserInteraction, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Visibility( + visible: error.isNotEmpty, + child: MaterialBanner( + backgroundColor: + Theme.of(context).colorScheme.error, + content: SelectableText(error), + actions: [ + TextButton( + onPressed: () { + setState(() { + error = ''; + }); + }, + child: const Text( + 'dismiss', + style: TextStyle(color: Colors.white), + ), + ), + ], + contentTextStyle: + const TextStyle(color: Colors.white), + padding: const EdgeInsets.all(10), + ), + ), + const SizedBox(height: 20), + if (mode != AuthMode.phone) + Column( + children: [ + TextFormField( + controller: emailController, + decoration: const InputDecoration( + hintText: 'Email', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + const SizedBox(height: 20), + TextFormField( + controller: passwordController, + obscureText: true, + decoration: const InputDecoration( + hintText: 'Password', + border: OutlineInputBorder(), + ), + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + ], + ), + if (mode == AuthMode.phone) + TextFormField( + controller: phoneController, + decoration: const InputDecoration( + hintText: '+12345678910', + labelText: 'Phone number', + border: OutlineInputBorder(), + ), + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: isLoading + ? null + : () => _handleMultiFactorException( + _emailAndPassword, + ), + child: isLoading + ? const CircularProgressIndicator.adaptive() + : Text(mode.label), + ), + ), + TextButton( + onPressed: _resetPassword, + child: const Text('Forgot password?'), + ), + ...authButtons.keys + .map( + (button) => Padding( + padding: + const EdgeInsets.symmetric(vertical: 5), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: isLoading + ? Container( + color: Colors.grey[200], + height: 50, + width: double.infinity, + ) + : SizedBox( + width: double.infinity, + height: 50, + child: SignInButton( + button, + onPressed: authButtons[button], + ), + ), + ), + ), + ) + .toList(), + SizedBox( + width: double.infinity, + height: 50, + child: OutlinedButton( + onPressed: isLoading + ? null + : () { + if (mode != AuthMode.phone) { + setState(() { + mode = AuthMode.phone; + }); + } else { + setState(() { + mode = AuthMode.login; + }); + } + }, + child: isLoading + ? const CircularProgressIndicator.adaptive() + : Text( + mode != AuthMode.phone + ? 'Sign in with Phone Number' + : 'Sign in with Email and Password', + ), + ), + ), + const SizedBox(height: 20), + if (mode != AuthMode.phone) + RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyLarge, + children: [ + TextSpan( + text: mode == AuthMode.login + ? "Don't have an account? " + : 'You have an account? ', + ), + TextSpan( + text: mode == AuthMode.login + ? 'Register now' + : 'Click to login', + style: const TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + setState(() { + mode = mode == AuthMode.login + ? AuthMode.register + : AuthMode.login; + }); + }, + ), + ], + ), + ), + const SizedBox(height: 10), + RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyLarge, + children: [ + const TextSpan(text: 'Or '), + TextSpan( + text: 'continue as guest', + style: const TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = _anonymousAuth, + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ), + ), + ), + ); + } + + Future _resetPassword() async { + String? email; + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Send'), + ), + ], + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text('Enter your email'), + const SizedBox(height: 20), + TextFormField( + onChanged: (value) { + email = value; + }, + ), + ], + ), + ); + }, + ); + + if (email != null) { + try { + await auth.sendPasswordResetEmail(email: email!); + ScaffoldSnackbar.of(context).show('Password reset email is sent'); + } catch (e) { + ScaffoldSnackbar.of(context).show('Error resetting'); + } + } + } + + Future _anonymousAuth() async { + setIsLoading(); + + try { + await auth.signInAnonymously(); + } on FirebaseAuthException catch (e) { + setState(() { + error = '${e.message}'; + }); + } catch (e) { + setState(() { + error = '$e'; + }); + } finally { + setIsLoading(); + } + } + + Future _handleMultiFactorException( + Future Function() authFunction, + ) async { + setIsLoading(); + try { + await authFunction(); + } on FirebaseAuthMultiFactorException catch (e) { + setState(() { + error = '${e.message}'; + }); + final firstTotpHint = e.resolver.hints + .firstWhereOrNull((element) => element is TotpMultiFactorInfo); + if (firstTotpHint != null) { + final code = await getSmsCodeFromUser(context); + final assertion = await TotpMultiFactorGenerator.getAssertionForSignIn( + firstTotpHint.uid, + code!, + ); + await e.resolver.resolveSignIn(assertion); + return; + } + + final firstPhoneHint = e.resolver.hints + .firstWhereOrNull((element) => element is PhoneMultiFactorInfo); + + if (firstPhoneHint is! PhoneMultiFactorInfo) { + return; + } + await auth.verifyPhoneNumber( + multiFactorSession: e.resolver.session, + multiFactorInfo: firstPhoneHint, + verificationCompleted: (_) {}, + verificationFailed: print, + codeSent: (String verificationId, int? resendToken) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + await e.resolver.resolveSignIn( + PhoneMultiFactorGenerator.getAssertion( + credential, + ), + ); + } on FirebaseAuthException catch (e) { + print(e.message); + } + } + }, + codeAutoRetrievalTimeout: print, + ); + } on FirebaseAuthException catch (e) { + setState(() { + error = '${e.message}'; + }); + } catch (e) { + setState(() { + error = '$e'; + }); + } + setIsLoading(); + } + + Future _emailAndPassword() async { + if (formKey.currentState?.validate() ?? false) { + if (mode == AuthMode.login) { + await auth.signInWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + } else if (mode == AuthMode.register) { + await auth.createUserWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + } else { + await _phoneAuth(); + } + } + } + + Future _phoneAuth() async { + if (mode != AuthMode.phone) { + setState(() { + mode = AuthMode.phone; + }); + } else { + if (kIsWeb) { + final confirmationResult = + await auth.signInWithPhoneNumber(phoneController.text); + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + await confirmationResult.confirm(smsCode); + } + } else { + await auth.verifyPhoneNumber( + phoneNumber: phoneController.text, + verificationCompleted: (_) {}, + verificationFailed: (e) { + setState(() { + error = '${e.message}'; + }); + }, + codeSent: (String verificationId, int? resendToken) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + // Sign the user in (or link) with the credential + await auth.signInWithCredential(credential); + } on FirebaseAuthException catch (e) { + setState(() { + error = e.message ?? ''; + }); + } + } + }, + codeAutoRetrievalTimeout: (e) { + setState(() { + error = e; + }); + }, + ); + } + } + } + + Future _signInWithGoogle() async { + // Trigger the authentication flow + final googleUser = await GoogleSignIn().signIn(); + + // Obtain the auth details from the request + final googleAuth = await googleUser?.authentication; + + if (googleAuth != null) { + // Create a new credential + final credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + // Once signed in, return the UserCredential + await auth.signInWithCredential(credential); + } + } + + Future _signInWithFacebook() async { + // Trigger the authentication flow + // by default we request the email and the public profile + final LoginResult result = await FacebookAuth.instance.login(); + + if (result.status == LoginStatus.success) { + // Get access token + final AccessToken accessToken = result.accessToken!; + + // Login with token + await auth.signInWithCredential( + FacebookAuthProvider.credential(accessToken.tokenString), + ); + } else { + print('Facebook login did not succeed'); + print(result.status); + print(result.message); + } + } +} + +Future _signInWithTwitter() async { + TwitterAuthProvider twitterProvider = TwitterAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(twitterProvider); + } else { + await auth.signInWithProvider(twitterProvider); + } +} + +Future _signInWithApple() async { + final appleProvider = AppleAuthProvider(); + appleProvider.addScope('email'); + + if (kIsWeb) { + // Once signed in, return the UserCredential + await auth.signInWithPopup(appleProvider); + } else { + final userCred = await auth.signInWithProvider(appleProvider); + AuthGate.appleAuthorizationCode = + userCred.additionalUserInfo?.authorizationCode; + } +} + +Future _signInWithYahoo() async { + final yahooProvider = YahooAuthProvider(); + + if (kIsWeb) { + // Once signed in, return the UserCredential + await auth.signInWithPopup(yahooProvider); + } else { + await auth.signInWithProvider(yahooProvider); + } +} + +Future _signInWithGitHub() async { + final githubProvider = GithubAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(githubProvider); + } else { + await auth.signInWithProvider(githubProvider); + } +} + +Future _signInWithMicrosoft() async { + final microsoftProvider = MicrosoftAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(microsoftProvider); + } else { + await auth.signInWithProvider(microsoftProvider); + } +} + +Future getSmsCodeFromUser(BuildContext context) async { + String? smsCode; + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('SMS code:'), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Sign in'), + ), + OutlinedButton( + onPressed: () { + smsCode = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + content: Container( + padding: const EdgeInsets.all(20), + child: TextField( + onChanged: (value) { + smsCode = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ), + ); + }, + ); + + return smsCode; +} + +Future getTotpFromUser( + BuildContext context, + TotpSecret totpSecret, +) async { + String? smsCode; + + final qrCodeUrl = await totpSecret.generateQrCodeUrl( + accountName: FirebaseAuth.instance.currentUser!.email, + issuer: 'Firebase', + ); + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('TOTP code:'), + content: Container( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + BarcodeWidget( + barcode: Barcode.qrCode(), + data: qrCodeUrl, + width: 150, + height: 150, + ), + TextField( + onChanged: (value) { + smsCode = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ElevatedButton( + onPressed: () { + totpSecret.openInOtpApp(qrCodeUrl); + }, + child: const Text('Open in OTP App'), + ), + ], + ), + ), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Sign in'), + ), + OutlinedButton( + onPressed: () { + smsCode = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + ); + }, + ); + + return smsCode; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart new file mode 100644 index 00000000..ba1a88dc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart @@ -0,0 +1,98 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return macos; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyB7wZb2tO1-Fs6GbDADUSTs2Qs3w08Hovw', + appId: '1:406099696497:web:87e25e51afe982cd3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + authDomain: 'flutterfire-e2e-tests.firebaseapp.com', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + measurementId: 'G-JN95N1JV2E', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw', + appId: '1:406099696497:android:21d5142deea38dda3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:58cbc26aca8e5cf83574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.auth.example', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:58cbc26aca8e5cf83574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.auth.example', + ); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart new file mode 100755 index 00000000..630c282d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart @@ -0,0 +1,108 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in_dartio/google_sign_in_dartio.dart'; + +import 'auth.dart'; +import 'firebase_options.dart'; +import 'profile.dart'; + +/// Requires that a Firebase local emulator is running locally. +/// See https://firebase.google.com/docs/auth/flutter/start#optional_prototype_and_test_with_firebase_local_emulator_suite +bool shouldUseFirebaseEmulator = false; + +late final FirebaseApp app; +late final FirebaseAuth auth; + +// Requires that the Firebase Auth emulator is running locally +// e.g via `melos run firebase:emulator`. +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + // We're using the manual installation on non-web platforms since Google sign in plugin doesn't yet support Dart initialization. + // See related issue: https://github.com/flutter/flutter/issues/96391 + + // We store the app and auth to make testing with a named instance easier. + app = await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + auth = FirebaseAuth.instanceFor(app: app); + + if (shouldUseFirebaseEmulator) { + await auth.useAuthEmulator('localhost', 9099); + } + + if (!kIsWeb && Platform.isWindows) { + await GoogleSignInDart.register( + clientId: + '406099696497-g5o9l0blii9970bgmfcfv14pioj90djd.apps.googleusercontent.com', + ); + } + + runApp(const AuthExampleApp()); +} + +/// The entry point of the application. +/// +/// Returns a [MaterialApp]. +class AuthExampleApp extends StatelessWidget { + const AuthExampleApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Firebase Example App', + theme: ThemeData(primarySwatch: Colors.amber), + home: Scaffold( + body: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + Visibility( + visible: constraints.maxWidth >= 1200, + child: Expanded( + child: Container( + height: double.infinity, + color: Theme.of(context).colorScheme.primary, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Firebase Auth Desktop', + style: Theme.of(context).textTheme.headlineMedium, + ), + ], + ), + ), + ), + ), + ), + SizedBox( + width: constraints.maxWidth >= 1200 + ? constraints.maxWidth / 2 + : constraints.maxWidth, + child: StreamBuilder( + stream: auth.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return const ProfilePage(); + } + return const AuthGate(); + }, + ), + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart new file mode 100644 index 00000000..3ccbf5db --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart @@ -0,0 +1,391 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:developer'; + +import 'package:collection/collection.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_example/main.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +import 'auth.dart'; + +/// Displayed as a profile image if the user doesn't have one. +const placeholderImage = + 'https://upload.wikimedia.org/wikipedia/commons/c/cd/Portrait_Placeholder_Square.png'; + +/// Profile page shows after sign in or registration. +class ProfilePage extends StatefulWidget { + // ignore: public_member_api_docs + const ProfilePage({Key? key}) : super(key: key); + + @override + // ignore: library_private_types_in_public_api + _ProfilePageState createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + late User user; + late TextEditingController controller; + final phoneController = TextEditingController(); + + String? photoURL; + + bool showSaveButton = false; + bool isLoading = false; + + @override + void initState() { + user = auth.currentUser!; + controller = TextEditingController(text: user.displayName); + + controller.addListener(_onNameChanged); + + auth.userChanges().listen((event) { + if (event != null && mounted) { + setState(() { + user = event; + }); + } + }); + + log(user.toString()); + + super.initState(); + } + + @override + void dispose() { + controller.removeListener(_onNameChanged); + + super.dispose(); + } + + void setIsLoading() { + setState(() { + isLoading = !isLoading; + }); + } + + void _onNameChanged() { + setState(() { + if (controller.text == user.displayName || controller.text.isEmpty) { + showSaveButton = false; + } else { + showSaveButton = true; + } + }); + } + + /// Map User provider data into a list of Provider Ids. + List get userProviders => user.providerData.map((e) => e.providerId).toList(); + + Future updateDisplayName() async { + await user.updateDisplayName(controller.text); + + setState(() { + showSaveButton = false; + }); + + // ignore: use_build_context_synchronously + ScaffoldSnackbar.of(context).show('Name updated'); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: FocusScope.of(context).unfocus, + child: Scaffold( + body: Stack( + children: [ + Center( + child: SizedBox( + width: 400, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + children: [ + CircleAvatar( + maxRadius: 60, + backgroundImage: NetworkImage( + user.photoURL ?? placeholderImage, + ), + ), + Positioned.directional( + textDirection: Directionality.of(context), + end: 0, + bottom: 0, + child: Material( + clipBehavior: Clip.antiAlias, + color: Theme.of(context).colorScheme.secondary, + borderRadius: BorderRadius.circular(40), + child: InkWell( + onTap: () async { + final photoURL = await getPhotoURLFromUser(); + + if (photoURL != null) { + await user.updatePhotoURL(photoURL); + } + }, + radius: 50, + child: const SizedBox( + width: 35, + height: 35, + child: Icon(Icons.edit), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 10), + TextField( + textAlign: TextAlign.center, + controller: controller, + decoration: const InputDecoration( + border: InputBorder.none, + floatingLabelBehavior: FloatingLabelBehavior.never, + alignLabelWithHint: true, + label: Center( + child: Text( + 'Click to add a display name', + ), + ), + ), + ), + Text(user.email ?? user.phoneNumber ?? 'User'), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (userProviders.contains('phone')) + const Icon(Icons.phone), + if (userProviders.contains('password')) + const Icon(Icons.mail), + if (userProviders.contains('google.com')) + SizedBox( + width: 24, + child: Image.network( + 'https://upload.wikimedia.org/wikipedia/commons/0/09/IOS_Google_icon.png', + ), + ), + ], + ), + const SizedBox(height: 20), + TextButton( + onPressed: () { + user.sendEmailVerification(); + }, + child: const Text('Verify Email'), + ), + TextButton( + onPressed: () async { + final a = await user.multiFactor.getEnrolledFactors(); + print(a); + }, + child: const Text('Get enrolled factors'), + ), + TextButton( + onPressed: () async { + if (AuthGate.appleAuthorizationCode != null) { + // The `authorizationCode` is on the user credential. + // e.g. final authorizationCode = userCredential.additionalUserInfo?.authorizationCode; + await FirebaseAuth.instance + .revokeTokenWithAuthorizationCode( + AuthGate.appleAuthorizationCode!, + ); + // You may wish to delete the user at this point + AuthGate.appleAuthorizationCode = null; + } else { + print( + 'Apple `authorizationCode` is null, cannot revoke token.', + ); + } + }, + child: const Text('Revoke Apple auth token'), + ), + TextFormField( + controller: phoneController, + decoration: const InputDecoration( + icon: Icon(Icons.phone), + hintText: '+33612345678', + labelText: 'Phone number', + ), + ), + const SizedBox(height: 20), + TextButton( + onPressed: () async { + final session = await user.multiFactor.getSession(); + await auth.verifyPhoneNumber( + multiFactorSession: session, + phoneNumber: phoneController.text, + verificationCompleted: (_) {}, + verificationFailed: print, + codeSent: ( + String verificationId, + int? resendToken, + ) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + await user.multiFactor.enroll( + PhoneMultiFactorGenerator.getAssertion( + credential, + ), + ); + } on FirebaseAuthException catch (e) { + print(e.message); + } + } + }, + codeAutoRetrievalTimeout: print, + ); + }, + child: const Text('Verify Number For MFA'), + ), + TextButton( + onPressed: () async { + final totp = + (await user.multiFactor.getEnrolledFactors()) + .firstWhereOrNull( + (element) => element.factorId == 'totp', + ); + if (totp != null) { + await user.multiFactor.unenroll( + factorUid: + (await user.multiFactor.getEnrolledFactors()) + .firstWhere( + (element) => element.factorId == 'totp', + ) + .uid, + ); + } + final session = await user.multiFactor.getSession(); + final totpSecret = + await TotpMultiFactorGenerator.generateSecret( + session, + ); + print(totpSecret); + final code = + await getTotpFromUser(context, totpSecret); + print('code: $code'); + if (code == null) { + return; + } + await user.multiFactor.enroll( + await TotpMultiFactorGenerator + .getAssertionForEnrollment( + totpSecret, + code, + ), + displayName: 'TOTP', + ); + }, + child: const Text('Enroll TOTP'), + ), + TextButton( + onPressed: () async { + try { + final enrolledFactors = + await user.multiFactor.getEnrolledFactors(); + + await user.multiFactor.unenroll( + factorUid: enrolledFactors.first.uid, + ); + // Show snackbar + ScaffoldSnackbar.of(context).show('MFA unenrolled'); + } catch (e) { + print(e); + } + }, + child: const Text('Unenroll MFA'), + ), + const Divider(), + TextButton( + onPressed: _signOut, + child: const Text('Sign out'), + ), + ], + ), + ), + ), + ), + Positioned.directional( + textDirection: Directionality.of(context), + end: 40, + top: 40, + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: !showSaveButton + ? SizedBox(key: UniqueKey()) + : TextButton( + onPressed: isLoading ? null : updateDisplayName, + child: const Text('Save changes'), + ), + ), + ), + ], + ), + ), + ); + } + + Future getPhotoURLFromUser() async { + String? photoURL; + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('New image Url:'), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Update'), + ), + OutlinedButton( + onPressed: () { + photoURL = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + content: Container( + padding: const EdgeInsets.all(20), + child: TextField( + onChanged: (value) { + photoURL = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ), + ); + }, + ); + + return photoURL; + } + + /// Example code for sign out. + Future _signOut() async { + await auth.signOut(); + await GoogleSignIn().signOut(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..785633d3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5fba960c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile new file mode 100644 index 00000000..9ec46f8c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..4848b09b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,718 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 25A01FB0278D938300D1E790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + B6036D992F5B77F0D48D7883 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1026236A547BC5196614E954 /* Pods_Runner.framework */; }; + C0151CEAF69E3751D6A8FA78 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0B4CF9B1CA3F6E07FE2F953C /* 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 = ""; }; + 1026236A547BC5196614E954 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1E5E064344044E24673A33BD /* 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 = ""; }; + 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 3D7BD4B06D0869EA1407E048 /* 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 = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + B6036D992F5B77F0D48D7883 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 286E7513A68DD39907D77423 /* Pods */ = { + isa = PBXGroup; + children = ( + 3D7BD4B06D0869EA1407E048 /* Pods-Runner.debug.xcconfig */, + 1E5E064344044E24673A33BD /* Pods-Runner.release.xcconfig */, + 0B4CF9B1CA3F6E07FE2F953C /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 286E7513A68DD39907D77423 /* Pods */, + 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */, + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1026236A547BC5196614E954 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9C4FABD4FD7B8936CFFEAF31 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + E033F9E34514FF7F419D8FF5 /* [CP] Embed Pods Frameworks */, + 91D69FDB92A2BAB6493D7E50 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 25A01FB0278D938300D1E790 /* GoogleService-Info.plist in Resources */, + C0151CEAF69E3751D6A8FA78 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; + }; + 91D69FDB92A2BAB6493D7E50 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/google_sign_in_ios/google_sign_in_ios_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/google_sign_in_ios_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9C4FABD4FD7B8936CFFEAF31 /* [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; + }; + E033F9E34514FF7F419D8FF5 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", + "${BUILT_PRODUCTS_DIR}/facebook_auth_desktop/facebook_auth_desktop.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage_macos/flutter_secure_storage_macos.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/facebook_auth_desktop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage_macos.framework", + ); + 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 */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..764c74b8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..126b4eb8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 zcmZ{Lc|26@`~R6Crm_qwyCLMMh!)vm)F@HWt|+6V6lE=CaHfcnn4;2x(VilEl9-V} zsce-cGK|WaF}4{T=lt&J`Fy_L-|vs#>v^7+XU=`!*L|PszSj43o%o$Dj`9mM7C;ar z@3hrnHw59q|KcHn4EQr~{_70*BYk4yj*SqM&s>NcnFoIBdT-sm1A@YrK@dF#f+SPu z{Sb8441xx|AjtYQ1gQq5z1g(^49Fba=I8)nl7BMGpQeB(^8>dY41u79Dw6+j(A_jO z@K83?X~$;S-ud$gYZfZg5|bdvlI`TMaqs!>e}3%9HXev<6;dZZT8Yx`&;pKnN*iCJ z&x_ycWo9{*O}Gc$JHU`%s*$C%@v73hd+Mf%%9ph_Y1juXamcTAHd9tkwoua7yBu?V zgROzw>LbxAw3^;bZU~ZGnnHW?=7r9ZAK#wxT;0O<*z~_>^uV+VCU9B@)|r z*z^v>$!oH7%WZYrwf)zjGU|(8I%9PoktcsH8`z^%$48u z(O_}1U25s@Q*9{-3O!+t?w*QHo;~P99;6-KTGO{Cb#ADDYWF!eATsx{xh-!YMBiuE z%bJc7j^^B$Sa|27XRxg(XTaxWoFI}VFfV>0py8mMM;b^vH}49j;kwCA+Lw=q8lptk z?Pe`{wHI39A&xYkltf5*y%;-DF>5v`-lm0vydYtmqo0sClh5ueHCLJ+6$0y67Z zO-_LCT|JXi3tN7fB-!0_Kn#I+=tyUj87uR5*0>|SZ zy3x2;aql87`{aPZ@UbBwY0;Z-a*lYL90YApOAMKur7YgOiqA~Cne6%b&{V-t>Am2c z{eyEuKl!GsA*jF2H_gvX?bP~v46%3ax$r~B$HnZQ;UiCmRl`ROK8v>;Zs~upH9}qu1ZA3kn-AY2k2@CaH=Qh7K6`nU z3ib(Bk%H*^_omL6N4_G5NpY20UXGi}a$!}#lf<&J4~nhRwRM5cCB3Zvv#6+N1$g@W zj9?qmQ`zz-G9HTpoNl~bCOaEQqlTVYi7G0WmB5E34;f{SGcLvFpOb`+Zm)C(wjqLA z2;+nmB6~QDXbxZGWKLt38I%X$Q!;h zup9S~byxKv=$x|^YEV;l0l67jH~E8BU45ft_7xomac-48oq4PZpSNJbw<7DTM4mmz z!$)z#04cy%b8w@cOvjmb36o;gwYIOLwy+{I#3dJj#W4QdOWwJQ2#20AL49`hSFUa7 zFNAN3OD==G3_kbr1d96>l`_cI`<=thKNh5>hgg7FV>5TfC6d#u)9BNXi@p1K*;2Is zz+x;l4GbSt#*%>1iq}jGIebXYJY5;PGG0y(^{>SSuZY89aL`sDghOM&&pyP6ABJ#w zYwK~4^1eUQD)4!GL>`zrWeHV z-W!6JZbW*Ngo;Edhp_cOysYr!uhKS}vIg_UC}x z=jXxQfV@4B3`5 z!u#byBVXV5GtrSx_8bnT@iKv=Uc6n)Zpa`<9N>+!J~Loxptl5$Z`!u<3a)-+P)say z#=jc7^mJzPMI2;yMhCmN7YN78E7-^S(t8E}FklC;z|4PL{bO|JieM#p1mBjwyZMEm zkX^A1RXPGeS2YqtPMX~~t^$~oeFfWAU#jVLi%Z@l2hle^3|e(q?(uS=BVauF?VF{j z(owKLJuze;_@5p1OtRyrT`EFXf)NfMYb-)E8RVVdr<@}M>4R&~P=;B`c1L%o|8YfB z-a(LB-i8jc5!&B5cowyI2~M^YID&@Xt(D9v{|DB z959W z*vEA77fh3*w*UJ`4Y(bxsoEy6hm7_Wc5gT0^cvso%Ow>9<&@9Q>mxb6-^pv)5yc>n zQ~^!qY(lPQ1EDGkr%_*y*D8T^YbCa52^MVqYpTLhgJ;N5PfCQ{SXk|plD#Sm+g4c- zFeL2Dih35W4{_qb75U`4Rb#S0FEo%F85dOhXSX0huPOxdAid{&p6P;+9}I)XU7^=3RZu9M(g0dLyz_7$8K{`AddBLOfU&B_QNHtmsnNXq`hy~% zvJ{vtz~Yt9X|o}5vXX)9ZCHaRq8iAb zUDj8%(MpzJN39LferYKvIc!)z^5T-eW@j3h9a6d%WZ!%@2^@4+6%Z9W1GHZbOj|sb z0cU$}*~G$fYvDC|XulSC_;m}?KC2jg5pxES$Bt!hA|@EX*2+O!UEb5sn_^d>z;>;r~ zmO3BivdXboPY*}amsO&`xk|e)S*u=`o67MC(1WTB;OwG+ua4UV7T5Wvy%?U{Pa5cO zMoLG>#@chO{Oc72XPyX8f3jC7P`$j4$)0wc(b50COaDP3_Cm}aPAglUa7kRXAqmo5 z0KDD7G>Gmnpons40WJNYn+pxko92GXy@PvSErKE-Ou3)3UiRr7!L4+0%+5}sD{bf)uj^ounQ-Yn2%%JoZ%FjUv%yjS?Ks4u_88Jh%tNliYW~817IV@fqd1T zi(?;Fv-s3rQEn=9G*E-QzSl%YS|^fe*yn}Aqh!&P<5%#oB?*{wZMa5$PYa*A{VA8! zbOfS1W!W}cTo%g~iP$>WhE_x7#O4?h$jq=>{M77>bTAK_ z6uU0tl6HARboGi}=4krr6WP`9`aAt&P5ON1v(+H{T?jZuJ}B{L-=z3VX)}mZwzrqH zpf?T!k&$?{&{0_p>b`kdJbSb(p~tFcuG4zh6}hfl@ues6CfJu<-P+!>FlYMlD_3!E z9$6VE==tlxNYe(s;@8@+4c4jQ$R2g8t0QwE>Et|)5)@kJj6^yaqFYY?0LEM2C!+7+ z+FN|UxR1GCy1KA`{T_%24U+Vserchr5h`;U7TZPr@43x#MMN{@vV?KSII}R@5k`7cVK}E;c)$f~_{ZLDOoL|-01p~oafxi4F zG$?Wha&a*rTnz-nTI-bAJ*SLb!5(L!#iRdvLEyo>7D_=H78-qZrm=6{hkUR{tR{H! z`ZTOV$Oi6^qX5=_{f}V9h}WJAO%h9)kEUF#*-JyYDbOGZ>Nfs%7L}4p zopIul&&Bbn!C9o83ypC6W4F$X=_|pex$V4!Whm#48Wfm3*oAW0Gc&#&b+oq<8>aZR z2BLpouQQwyf$aHpQUK3pMRj(mS^^t#s$IC3{j*m9&l7sQt@RU{o_}N-xI_lh`rND^ zX~-8$o(;p^wf3_5-WZ^qgW`e8T@37{`J)e2KJdSSCUpX6KZu0Ga&U*+u3*PDAs1uK zpl)40+fROA@Vo#vK?^@Pq%w8DO9HdfmH+~vNinZ$5GRz?sD|k246NepqZd`>81P^P z#x#3kUS-}x4k%&~iEUrsb&-X#_;;?y9oCP4crMkC`=q58#NxQ| z*NXNA;GR4X=GiGXwab5=&M3j04fQw%2UxM`S(aE)_PlgJttBX96$$lY@Q%0xV^IbcHqzw^Uk&E=vFB;EQ@kzVIeM8lDIW_Q_ zrfy)l6s2QBApF;J2xTD_@wuNMlwDfsdfMyzRq)<>qG{M)Yt}9F1{1HaI_X7=F=7>& zYB54VaKlxu0lIgS;Ac&25Aw(tcf@K~(cvPi8(OChzhlYp6}#<_MVhU95sD&)n0FtL zmxm4w$~s(S9jmHOgyovpG!x4uLfJsMsJn^QMraKAa1Ix?{zkV!a7{f%-!u2{NqZ&) zo+^XB`eFQ4 zk-(;_>T#pTKyvW${yL|XXbcv?CE2Tp<3(PjeXhu^Jrp6^Mj}lg_)jamK{g;C+q^Da ztb!gV!q5)B7G1%lVanA2b>Xs?%hzCgJ{Hc!ldr9dnz7k^xG#4pDpr|0ZmxxiUVl}j zbD_rg3yAFQ>nnc)0>71D==715jRj4XsRb2#_lJoSOwky&c4957V-|m)@>b^Nak1!8 z@DsIOS8>Oe^T>tgB)WX3Y^I^65Uae+2M;$RxX_C)Aoo0dltvoRRIVQkpnegWj;D#G z+TwFIRUN%bZW3(K{8yN8!(1i0O!X3YN?Zo08L5D~)_tWQA8&|CvuQb8Od?p_x=GMF z-B@v9iNLYS1lUsbb`!%f5+1ev8RFPk7xyx5*G;ybRw(PW*yEZ$unu2`wpH)7b@ZXEz4Jr{?KZKYl!+3^)Q z)~^g?KlPGtT!{yQU&(Z&^rVjPu>ueeZN86AnhRwc)m|;5NvM&W3xD%n`+Hjg5$e8M zKh1Ju82L~&^ z-IQ5bYhsjqJfr38iwi~8<{oeREh|3l)*Enj4&Q$+mM$15YqwXeufK9P^(O=pj=F-1 zD+&REgwY~!W#ZPccSEi(*jiKJ5)Q|zX;hP}S2T9j_);epH9JQs{n>RG}{Nak)vIbfa zFQm?H;D+tzrBN2)6{?Mo%fzN6;6d_h0Qyn61)+XT63=!T*WQyRUoB_x0_)Ir`$FtS zak07C(mOaWN5m%bk?F9X&@mEVKN%{R6obt(9qw&p>w&p;R*l2th9$D^*`pC}NmB+v z>bk;OJ(C8p$G;jNvRsBbt=a!!tKnjJ`9*yQFgjEN1HcC<&>u9aStT3>Oq=MOQV!#WOZ6{cv$YVmlJdovPRV}<=IZUPeBVh5DC z91-?kimq3JUr;UMQ@0?h52gupvG=~(5AVdP(2(%*sL8!#K1-L$9B7MrWGdt(h&whR@vz~0oEHF8u3U1Q zdGdaIytJj4x@eF*E+^zgi{nPCA8tkjN}UoR8WhDzM3-zLqx0z?2tTdDKyENM={fp8VC@3Dt`AiK$;K#H$K2{08mrHG%jgEOLX3MCsG>afZm_0mLPS4jmYUJp~Dm! z5AUe_vEaOAT3zWdwl#cLvqwd1^lwW?gt7(92wEsOE6c#<0}{szFV4(uO70?3>=((! zQr}1{J?Wx2ZmjxYL_8OB*m&mimfojzYn~PiJ2g8R&ZRx-i^yF#sdhEWXAUIZ@J?T$ zs3PgT2<&Ki>Bob_n(@S>kUIvE+nY~ti9~6j;O9VAG#{oZ!DZCW)}i6iA!Tgsyz+hC z1VVyvbQ_nwgdZSEP=U4d#U`2*`e~d4y8uM4Bcmm%!jidaee#4WqN!ZnlBmbYpuaO! z!rU3`Kl2 z0O7PD&fQ|_b)Ub!g9^s;C2e>1i*2&?1$6yEn?~Y zI)-WIN8N(5s9;grW+J@K@I%g#?G&hzmlgV=L}ZA{f>3YCMx^P{u@c5Z;U1qmdk#)L zvX6z1!sL>+@vxO8qVn#k3YxYi?8ggV){?Rn@j$+Fd4-QkuH1@)j#3-=f82GZ!nl~{ zzZ(?kO`ANttVeHSo%xmH!NmNZECh*{s!-8S>ALoe5xOPs>|P5BbUmP@rlV8`d(c=7 zypcpLaI*FM^;GM%@q`GAb8kO`$oE|R48yn)?p(c1t>5;Wwn5r6ck&uw4}TnT80jI`IS~J%q8CpaVgIze<8IykSpVBg8~E! zW_tGqB;GO47r_er05y+Kwrcn{VLxL*1;HMv@*sd}MB6DH4zaP~u4Y;>@Nw7?F8S?c zfVIY(^ntnGgWlD|idzGz$Y+Oh(Ra=&VIf4!K2W*a)(%5%78s}8qxOknAGtDAq+HMO zM+Nu;0OgQRn36 zA@~a8`uVQ~v9?d!BxnsVaB-z-djypO44BjQAmg7&eVoaew|~)wH$SgefJ2$7_RiY+ z_7ACGoFM6Lhvho+eUG@pU&0X(Uy(*j;9pr?ET?FHTXadlfXC|MReZoU5>AG`mTM<% zc~*I@E*u0|hwVTdFA~4^b2VT7_~}~tCueNY{de3og=ASFQ`)0dhC2~Ne<}}Rc?ptA zi}+bQE%N9o*hpSUMH)9xt%Zlz&^p&5=cW}{m#f85iVX64^{!(vhClT<I)+c)RuiyrZqIw4v`z%YK&;_Fh4_+0B?qAGxMfAM`LzG_bjD>ib4;KGT4_1I>sxvL&&qp40ajgQOqIE^9=Az4w#ymo)bW-Vg{T!n=l&|nR_ zw+wcH|FxUH63)~{M;goHepmD{Fe?W9sO|eJP9L$G<{e_7FxxuXQ+)(Z^@;X8I1=%k zTK$gbHA1^4W<`q~ubQ0M_C^CA5#Z&*nGc(T?4Y_2jLu&FJDQYpCSiRny->$+nC9Jl z?avTW`ZXYT51%SrEq!}dXNM&!pM6nmL^lce=%S7{_TS)ckN8;{p*LT~LMgmlE~dpL zEBQy-jDj%cSK6N3)|CCR0LQ$N6iDM~+-1Oz|LAdkip(VZcO`gqCuJ+(Mm{m6@P%_; zBtF|MMVMP;E`5NJ{&@4j^JE5j&}(Jq{lCGL(P^#uqvbD`2)FVyfNgy|pvT!XY;02Z zZWbgGsvi6#!*$Zxwd{Xk6_M{+^yV_K@%_SAW(x)Lg|*AuG-%g2#GQYk8F?W&8|2dU z;00ppzrQnnYXnT`(S%_qF2#QNz&@Y$zcq+O8p>Gto2&4z8(^#cY?DuQwBQP4Fe?qUK_-yh4xT{8O@gb`uh` z>Q%jrgPAnANn4_)->n;w{Mei#J)F+`12&+-MLKSRzF6bL3;4O~oy~v7 zL0K-=m?>>(^qDCgvFRLBI@`04EGdTxe5}xBg#7#Wb!aUED;?5BLDEvZ@tai4*Rh8& z4V)cOr}DJ0&(FjWH%50Y+&=WtB42^eEVsmaHG)Il#j265oK&Bot(+-IIn`6InmuE# z;)qXs+X{fSb8^rYb#46X5?KCzH9X0>ppBQi(aKS--;4yA%0N|D<#8RZlOS(8n26=u zv~y;KC>`ypW=aqj`&x9 z0Zm>NKp}hPJu1+QDo(_U(Gt0SZ`IJWnp%QK`pye>Bm!w{sG>;VU^2 z4lZhV1}tCE8(?zu#j99|l3-qRBcz3bG+DlyxPGB$^6B^ssc_qYQ6lG0q~EAI?1$?( zahfn%etVvuKwB7R=>JDQluP97nLDM6*5;b0Ox#b{4nIgZA*+?IvyDN{K9WGnlA=Ju z+)6hjr}{;GxQQIDr3*lf32lRp{nHP8uiz^Fa|K+dUc@wD4Kf5RPxVkUZFCdtZH{+=c$AC)G2T-Qn@BPbr zZigIhKhKrVYy`!Mlc#HVr=CURVrhUjExhI~gZ%a=WM9BwvnN?=z!_ZQ$(sP?X;2Jy zyI$}H^^SvH2tf6+Uk$pJww@ngzPp856-l9g6WtW+%Yf>N^A}->#1W2n=WJ%sZ0<){Z&#% z^Kzl$>Km)sIxKLFjtc;}bZeoaZSpL4>`jCmAeRM-NP9sQ&-mi@p0j7Iq>1n&z@8?M z%dM7K^SgE5z)@i5w#rLE4+8%|^J`a6wYr`3BlvdD>7xW?Dd>`0HC0o{w7r_ot~h*G z2gI7Y!AUZ6YN+z$=GNzns@Tu7BxgAb3MBha30-ZG7a%rckU5}y{df`lj@^+34kr5> z988PPbWYdHye~=?>uZ4N&MN@4RBLk_?9W*b$}jqt0j%>yO9QOV(*!#cX~=wRdVL&S zhPQ{${0CGU-rfdS&b@u|IK{hV2Z=(*B2d0?&jwWfT=?Gk`4T9TfMQ)CfNgpLQa#>Q z%6A$w#QNc&qOtrHAbqY>J782@!X{9Y@N(HMSr;PP^;0DlJNxfC`oMB%Ocg zC*hnEsF|p*=CVe^dT)>BTL0yff)uo!U<+_2o3p)CE8quU1JI(=6)9$KxVdJYD*S*~ zzNeSkzFIQyqK}578+qq6X8rrRdgX z4k&R=AGex~a)MoB0pK&|yA<(*J#P&tR?ImBVD)ZTA4VH5L5DxXe<-*s`Aox%H1{-^Qa`kG_DGXD%QX-;l1#&#IVQP6>kir ztO@~ZvJDPnTvKt>fc*(j$W^)JhWk{4kWwbpFIXzuPt2V%M4H19-i5Gn*6(D`4_c1+ zYoI1@yT^~9JF~t>2eVM6p=GP3b*;daJpQOhAMNO|LKnwE2B5n8y9mf;q=)-L_FfD0 z<}YIRBO{k)6AHAn8iG>pYT+3bJ7jvP9}LSMR1nZW$5HR%PD1rFz z{4XE^Vmi-QX#?|Farz=CYS_8!%$E#G%4j2+;Avz|9QBj|YIExYk?y-1(j}0h{$$MnC_*F0U2*ExSi1ZCb_S9aV zTgyGP0Cl=m`emxM4Qih1E{`J{4oJo8K}WnH`@js^pR7Z-vTBK5F5JIFCDN}7pU^_nV>NTz@2$|Kcc5o+L&^Db_AQ);F?)X5BF*QJRCdLI-a%gW z++DZM)x=6*fNrSaUA&hf&CUqC$F*y^CJC-MAm9gd*5#^mh;-dR1?a&<3-hp3@}XN! z&8dcwo6=MQua%0KFvYbi>O{j)RrbDQo3S*y!oEJ~2=}^-v%zn~@hnmKGOvX6JLr;>DNC3)={8OM9n5Zs*(DlS*|%JTniJX2Uav7sOFT0vdIiUOC5pEtY?EF)@Fh9pCfD%N zXskZ8b^ldI{HHj{-l?iWo@IW6Nr`hAS>f8S*8FGc*gmcK^f2JS+>I&r#Gcewy=-JM zv0*w<5qBa6UQB@`esOG*4*t@7c9AkrTpM`v=eY?cO#z17H9B%Xy4m!}LhW}*iZ27w1?HrevgB1SZ1q2X$mm@FK@Qt7o z!s~Lio^IRdwzyvQ80{5iYeTV@mAo=2o5>KepRH0d{*Szlg~n%w2)S5v2|K8}pj;c{ zoDRLvYJO1@?x-=mq+LVhD{l-1-Dw4`7M?3@+ z`fu7?1#9W++6Y46N=H0+bD|CJH~q*CdEBm8D##VS7`cXy4~+x=ZC17rJeBh zI~qW^&FU`+e!{AKO3(>z5Ghh14bUT$=4B>@DVm(cj* zSLA*j!?z!=SLuVvAPh_EFKx}JE8T8;Gx)LH^H136=#Jn3Bo*@?=S`5M{WJPY&~ODs z+^V57DhJ2kD^Z|&;H}eoN~sxS8~cN5u1eW{t&y{!ouH`%p4(yDZaqw$%dlm4A0f0| z8H}XZFDs?3QuqI^PEy}T;r!5+QpfKEt&V|D)Z*xoJ?XXZ+k!sU2X!rcTF4tg8vWPM zr-JE>iu9DZK`#R5gQO{nyGDALY!l@M&eZsc*j*H~l4lD)8S?R*nrdxn?ELUR4kxK? zH(t9IM~^mfPs9WxR>J{agadQg@N6%=tUQ8Bn++TC|Hbqn*q;WydeNIS@gt|3j!P`w zxCKoeKQ*WBlF%l4-apIhERKl(hXS1vVk$U?Wifi)&lL6vF@bmFXmQEe{=$iG)Zt*l z0df@_)B-P_^K2P7h=>OIQ6f0Q-E@|M?$Z5n^oN>2_sBCpN>q(LnqUoef{tm^5^L$# z{<SL zKmH78cHX`4cBKIY8u1x*lwrgP^fJ%E&&AmHrRY7^hH*=2OA9K?!+|~Aeia=nAA`5~ z#zI=h#I>@FXaGk(n)0uqelNY;A5I9obE~OjsuW!%^NxK*52CfBPWYuw--v<1v|B>h z8R=#$TS-Pt3?d@P+xqmYpL4oB8- z>w99}%xqy9W!A^ODfLq8iA@z}10u?o#nG#MXumSaybi(S{`wIM z&nE3n2gWWMu93EvtofWzvG2{v;$ysuw^8q?3n}y=pB1vUr5gi++PjiyBH3jzKBRny zSO~O++1ZLdy7v7VzS&$yY;^Z7*j_#BI`PK`dAzJa9G1{9ahPqPi1C}ti+L)WHii*= z+RZ^+at-tlatc4|akPa&9H;%gn9aS`X_kfb>n>#NTyUVM6m4NCIfLm(28>qaYv7}t zn`M;XcONtXoa3#u3{L-ytd_&g z2mO$8CnE?460w#eSm|smlnNwFHM;A&IxSKLzVkV7nNVqZ*A`)eI{Nbg6WxsarAFuc=FFf1z|%#eTvBgUhY}N zsCT>`_YO>14i^vFX0KXbARLItzT{TeD%N~=ovGtZ6j{>PxkuYlHNTe0!u>rgw#?td z{)n=QrGvgCDE6BUem$Rh(1y!$@(Bn!k3E0|>PQ(8O==zN`?yBhAqlWyq+c%+h?p^- zE&OtLind}^_=>pbhxOgOIC0q9{cLK6p6*eg_|S+p9$W~_u4wzx@N?$QmFg2S)m~^R znni$X{U*!lHgdS@fI;|Owl=9Gwi?dr0m#>yL<8<}bLW_Kpl| zSGesADX&n?qmHC`2GyIev^hi~ka}ISZ^Y4w-yUzyPxaJB0mm%ww^>if3<;P^U+L5=s+cifT-ct*;!dOOk#SOZNv@a^J|DrS3YtSn8EEAlabX1NV3RfHwZn_41Xa z4;$taa6JJR()-FQ<#0G~WlML<l5I+IPnqDpW(PP>hRcQ+S2zU?tbG^(y z1K_?1R){jF;OKGw0WYjnm>aPxnmr5?bP?^B-|Fv`TT4ecH3O`Z3`X_r;vgFn>t1tE zGE6W2PODPKUj+@a%3lB;lS?srE5lp(tZ;uvzrPb){f~n7v_^z! z=16!Vdm!Q0q#?jy0qY%#0d^J8D9o)A;Rj!~j%u>KPs-tB08{4s1ry9VS>gW~5o^L; z7vyjmfXDGRVFa@-mis2!a$GI@9kE*pe3y_C3-$iVGUTQzZE+%>vT0=r|2%xMDBC@>WlkGU4CjoWs@D(rZ zS1NB#e69fvI^O#5r$Hj;bhHPEE4)4q5*t5Gyjzyc{)o459VkEhJ$%hJUC&67k z7gdo`Q*Jm3R&?ueqBezPTa}OI9wqcc;FRTcfVXob^z|dNIB0hMkHV26$zA%YgR$sM zTKM61S}#wJ#u+0UDE3N+U*~Tz1nnV;W<8Akz&6M7-6mIF(Pq`wJ1A%loYL( zIS;&2((xbyL7zoyaY2Sa%BBYBxo6Aa*53`~e@|RA`MP+?iI4KZ+y4EU&I zS_|(#*&j2hxpELa3r0O7ok&5!ijRiRu9i-_3cdnydZU9Mp6Y);skv%!$~`i-J7e-g zj@EoHf+gtcrKf;tY5`4iLnWSHa)9brUM$XmEzG3T0BXTG_+0}p7uGLs^(uYh0j$;~ zT1&~S%_Y5VImvf1EkD7vP-@F%hRlBe{a@T!SW(4WEQd1!O47*Crf@u-TS==48iR5x z!*`Ul4AJI^vIVaN3u5UifXBX{fJ@z>4Q2#1?jpcdLocwymBgKrZ+^Cb@QuIxl58B* zD{t-W3;M;{MGHm_@&n(6A-AsD;JO#>J3o4ru{hy;k;8?=rkp0tadEEcHNECoTI(W31`El-CI0eWQ zWD4&2ehvACkLCjG`82T`L^cNNC4Oo2IH(T4e;C75IwkJ&`|ArqSKD}TX_-E*eeiU& ziUuAC)A?d>-;@9Jcmsdca>@q1`6vzo^3etEH%1Gco&gvC{;Y-qyJ$Re`#A!5Kd((5 z6sSiKnA20uPX0**Mu&6tNgTunUR1sodoNmDst1&wz8v7AG3=^huypTi`S7+GrO$D6 z)0Ja-y5r?QQ+&jVQBjitIZ`z2Ia}iXWf#=#>nU+ zL29$)Q>f#o<#4deo!Kuo@WX{G(`eLaf%(_Nc}E`q=BXHMS(Os{!g%(|&tTDIczE_# z5y%wjCp9S?&*8bS3imJi_9_COC)-_;6D9~8Om@?U2PGQpM^7LKG7Q~(AoSRgP#tZfVDF_zr;_U*!F9qsbVQ@un9O2>T4M5tr0B~~v_@a=w^8h510a#=L z;8+9zhV}57uajb+9DbZm1G`_NqOuKN`bQ2fw9A*v*Kdb_E-SA`?2 z)OFIY-%uD`JZUZg?D4lHtNegKgWr!1m%hOpu5`R+bZ2K#&)*R-7ElKYo0$0xYxIL8 zLg%u|4oZixz}ILB-@aS4=XOe)z!VL6@?dX{LW^YCPjKtyw44)xT=H;h(fmFr>R?p%r5*}W z7_bo0drVDRq9V9QL4_!dazughK6t}tVVvBq={T0+3(1zmb>f+|;{D%J?^xnZcqio5 z%H?@L+L-CIdO=x6QrALL9&PwvjrZi5NS)1e<*%V8ntw~S2PF}zH}B5f_DHyB=I3m@ z_;^TpN|sesCU}qxQ`~jIwF>#8wGvxg9kdMT$}us8BM&W>OzZ|ry2BB)+UY*_yH+&L zl_=Jy9BNzIZs}D~Yv_H%HPjVGNV=xT3xpIW!Np1F^G#9Y8X zl)c_V1(DhYu-v%H3-m&n%M_}}c{E5Wu+6*>R24gW_A7$(U=9D|H$r;;;@o zJ)c_CmVf9l*;4SyJ}E{+4)}^C>SIJ*_bul7OJ{v&0oO>jG(5xzYP0$I%*YH|Mwu#r zubNW5VZ9^X#Phw<;?=^G?Kg&C)^x1FVsKGZ*n+{C1znj~YHSP?6PS(k5e9qGvS4X* z=1kA_27(iV65a(i+Sicmd@Vzf^2@*Wed-`aYQ~em=-h%Pu`gHfz)&@$hpr<&mNO={ zl^kI0HP0wTbbh{d(>5a#;zT2_=ppef?;D4;2^}&kZjB^yl%LBJ;|> zkLc)JEg*5rpQ;_)w?PnKynWtv!@ z>}+am{@(g$KKM+e$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..f653d202 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2020 io.flutter.plugins. All rights reserved. diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..c34fc0a4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..f325ead9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.auth.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:58cbc26aca8e5cf83574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist new file mode 100644 index 00000000..de633ff2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.448618578101-ja1be10uicsa2dvss16gh4hkqks0vq61 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..cd2171f4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json new file mode 100644 index 00000000..eaca8edd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:58cbc26aca8e5cf83574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml new file mode 100644 index 00000000..5068e961 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml @@ -0,0 +1,26 @@ +name: firebase_auth_example +description: Demonstrates how to use the firebase_auth plugin. +resolution: workspace + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + barcode_widget: ^2.0.4 + firebase_auth: ^6.5.4 + firebase_core: ^4.11.0 + firebase_messaging: ^16.4.1 + flutter: + sdk: flutter + flutter_facebook_auth: ^7.1.5 + flutter_signin_button: ^2.0.0 + font_awesome_flutter: ^10.8.0 + google_sign_in: ^6.1.0 + google_sign_in_dartio: ^0.3.0 + +dev_dependencies: + http: ^1.0.0 + +flutter: + uses-material-design: true diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 zcmd5=2T+s!lYZ%-(h(2@5fr2dC?F^$C=i-}R6$UX8af(!je;W5yC_|HmujSgN*6?W z3knF*TL1$|?oD*=zPbBVex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/index.html b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/index.html new file mode 100644 index 00000000..0168402a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + flutterfire_auth + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json new file mode 100644 index 00000000..88044af3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutterfire_auth", + "short_name": "flutterfire_auth", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt new file mode 100644 index 00000000..13786727 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc new file mode 100644 index 00000000..4477b011 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "io.flutter.plugins.firebase.auth" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 io.flutter.plugins.firebase.auth. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..227a2489 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp @@ -0,0 +1,68 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..2b30f421 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h @@ -0,0 +1,39 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp new file mode 100644 index 00000000..7a451dd2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp @@ -0,0 +1,46 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t* command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h new file mode 100644 index 00000000..3b8e4da1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h @@ -0,0 +1,22 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 zcmeHQc|26z|35SKE&G-*mXah&B~fFkXr)DEO&hIfqby^T&>|8^_Ub8Vp#`BLl3lbZ zvPO!8k!2X>cg~Elr=IVxo~J*a`+9wR=A83c-k-DFd(XM&UI1VKCqM@V;DDtJ09WB} zRaHKiW(GT00brH|0EeTeKVbpbGZg?nK6-j827q-+NFM34gXjqWxJ*a#{b_apGN<-L_m3#8Z26atkEn& ze87Bvv^6vVmM+p+cQ~{u%=NJF>#(d;8{7Q{^rWKWNtf14H}>#&y7$lqmY6xmZryI& z($uy?c5-+cPnt2%)R&(KIWEXww>Cnz{OUpT>W$CbO$h1= z#4BPMkFG1Y)x}Ui+WXr?Z!w!t_hjRq8qTaWpu}FH{MsHlU{>;08goVLm{V<&`itk~ zE_Ys=D(hjiy+5=?=$HGii=Y5)jMe9|wWoD_K07(}edAxh`~LBorOJ!Cf@f{_gNCC| z%{*04ViE!#>@hc1t5bb+NO>ncf@@Dv01K!NxH$3Eg1%)|wLyMDF8^d44lV!_Sr}iEWefOaL z8f?ud3Q%Sen39u|%00W<#!E=-RpGa+H8}{ulxVl4mwpjaU+%2pzmi{3HM)%8vb*~-M9rPUAfGCSos8GUXp02|o~0BTV2l#`>>aFV&_P$ejS;nGwSVP8 zMbOaG7<7eKD>c12VdGH;?2@q7535sa7MN*L@&!m?L`ASG%boY7(&L5imY#EQ$KrBB z4@_tfP5m50(T--qv1BJcD&aiH#b-QC>8#7Fx@3yXlonJI#aEIi=8&ChiVpc#N=5le zM*?rDIdcpawoc5kizv$GEjnveyrp3sY>+5_R5;>`>erS%JolimF=A^EIsAK zsPoVyyUHCgf0aYr&alx`<)eb6Be$m&`JYSuBu=p8j%QlNNp$-5C{b4#RubPb|CAIS zGE=9OFLP7?Hgc{?k45)84biT0k&-C6C%Q}aI~q<(7BL`C#<6HyxaR%!dFx7*o^laG z=!GBF^cwK$IA(sn9y6>60Rw{mYRYkp%$jH z*xQM~+bp)G$_RhtFPYx2HTsWk80+p(uqv9@I9)y{b$7NK53rYL$ezbmRjdXS?V}fj zWxX_feWoLFNm3MG7pMUuFPs$qrQWO9!l2B(SIuy2}S|lHNbHzoE+M2|Zxhjq9+Ws8c{*}x^VAib7SbxJ*Q3EnY5lgI9 z=U^f3IW6T=TWaVj+2N%K3<%Un;CF(wUp`TC&Y|ZjyFu6co^uqDDB#EP?DV5v_dw~E zIRK*BoY9y-G_ToU2V_XCX4nJ32~`czdjT!zwme zGgJ0nOk3U4@IE5JwtM}pwimLjk{ln^*4HMU%Fl4~n(cnsLB}Ja-jUM>xIB%aY;Nq8 z)Fp8dv1tkqKanv<68o@cN|%thj$+f;zGSO7H#b+eMAV8xH$hLggtt?O?;oYEgbq@= zV(u9bbd12^%;?nyk6&$GPI%|+<_mEpJGNfl*`!KV;VfmZWw{n{rnZ51?}FDh8we_L z8OI9nE31skDqJ5Oa_ybn7|5@ui>aC`s34p4ZEu6-s!%{uU45$Zd1=p$^^dZBh zu<*pDDPLW+c>iWO$&Z_*{VSQKg7=YEpS3PssPn1U!lSm6eZIho*{@&20e4Y_lRklKDTUCKI%o4Pc<|G^Xgu$J^Q|B87U;`c1zGwf^-zH*VQ^x+i^OUWE0yd z;{FJq)2w!%`x7yg@>uGFFf-XJl4H`YtUG%0slGKOlXV`q?RP>AEWg#x!b{0RicxGhS!3$p7 zij;{gm!_u@D4$Ox%>>bPtLJ> zwKtYz?T_DR1jN>DkkfGU^<#6sGz|~p*I{y`aZ>^Di#TC|Z!7j_O1=Wo8thuit?WxR zh9_S>kw^{V^|g}HRUF=dcq>?q(pHxw!8rx4dC6vbQVmIhmICF#zU!HkHpQ>9S%Uo( zMw{eC+`&pb=GZRou|3;Po1}m46H6NGd$t<2mQh}kaK-WFfmj_66_17BX0|j-E2fe3Jat}ijpc53 zJV$$;PC<5aW`{*^Z6e5##^`Ed#a0nwJDT#Qq~^e8^JTA=z^Kl>La|(UQ!bI@#ge{Dzz@61p-I)kc2?ZxFt^QQ}f%ldLjO*GPj(5)V9IyuUakJX=~GnTgZ4$5!3E=V#t`yOG4U z(gphZB6u2zsj=qNFLYShhg$}lNpO`P9xOSnO*$@@UdMYES*{jJVj|9z-}F^riksLK zbsU+4-{281P9e2UjY6tse^&a)WM1MFw;p#_dHhWI7p&U*9TR0zKdVuQed%6{otTsq z$f~S!;wg#Bd9kez=Br{m|66Wv z#g1xMup<0)H;c2ZO6su_ii&m8j&+jJz4iKnGZ&wxoQX|5a>v&_e#6WA!MB_4asTxLRGQCC5cI(em z%$ZfeqP>!*q5kU>a+BO&ln=4Jm>Ef(QE8o&RgLkk%2}4Tf}U%IFP&uS7}&|Q-)`5< z+e>;s#4cJ-z%&-^&!xsYx777Wt(wZY9(3(avmr|gRe4cD+a8&!LY`1^T?7x{E<=kdY9NYw>A;FtTvQ=Y&1M%lyZPl$ss1oY^Sl8we}n}Aob#6 zl4jERwnt9BlSoWb@3HxYgga(752Vu6Y)k4yk9u~Kw>cA5&LHcrvn1Y-HoIuFWg~}4 zEw4bR`mXZQIyOAzo)FYqg?$5W<;^+XX%Uz61{-L6@eP|lLH%|w?g=rFc;OvEW;^qh z&iYXGhVt(G-q<+_j}CTbPS_=K>RKN0&;dubh0NxJyDOHFF;<1k!{k#7b{|Qok9hac z;gHz}6>H6C6RnB`Tt#oaSrX0p-j-oRJ;_WvS-qS--P*8}V943RT6kou-G=A+7QPGQ z!ze^UGxtW3FC0$|(lY9^L!Lx^?Q8cny(rR`es5U;-xBhphF%_WNu|aO<+e9%6LuZq zt(0PoagJG<%hyuf;te}n+qIl_Ej;czWdc{LX^pS>77s9t*2b4s5dvP_!L^3cwlc)E!(!kGrg~FescVT zZCLeua3f4;d;Tk4iXzt}g}O@nlK3?_o91_~@UMIl?@77Qc$IAlLE95#Z=TES>2E%z zxUKpK{_HvGF;5%Q7n&vA?`{%8ohlYT_?(3A$cZSi)MvIJygXD}TS-3UwyUxGLGiJP znblO~G|*uA^|ac8E-w#}uBtg|s_~s&t>-g0X%zIZ@;o_wNMr_;{KDg^O=rg`fhDZu zFp(VKd1Edj%F zWHPl+)FGj%J1BO3bOHVfH^3d1F{)*PL&sRX`~(-Zy3&9UQX)Z;c51tvaI2E*E7!)q zcz|{vpK7bjxix(k&6=OEIBJC!9lTkUbgg?4-yE{9+pFS)$Ar@vrIf`D0Bnsed(Cf? zObt2CJ>BKOl>q8PyFO6w)+6Iz`LW%T5^R`U_NIW0r1dWv6OY=TVF?N=EfA(k(~7VBW(S;Tu5m4Lg8emDG-(mOSSs=M9Q&N8jc^Y4&9RqIsk(yO_P(mcCr}rCs%1MW1VBrn=0-oQN(Xj!k%iKV zb%ricBF3G4S1;+8lzg5PbZ|$Se$)I=PwiK=cDpHYdov2QO1_a-*dL4KUi|g&oh>(* zq$<`dQ^fat`+VW?m)?_KLn&mp^-@d=&7yGDt<=XwZZC=1scwxO2^RRI7n@g-1o8ps z)&+et_~)vr8aIF1VY1Qrq~Xe``KJrQSnAZ{CSq3yP;V*JC;mmCT6oRLSs7=GA?@6g zUooM}@tKtx(^|aKK8vbaHlUQqwE0}>j&~YlN3H#vKGm@u)xxS?n9XrOWUfCRa< z`20Fld2f&;gg7zpo{Adh+mqNntMc-D$N^yWZAZRI+u1T1zWHPxk{+?vcS1D>08>@6 zLhE@`gt1Y9mAK6Z4p|u(5I%EkfU7rKFSM=E4?VG9tI;a*@?6!ey{lzN5=Y-!$WFSe z&2dtO>^0@V4WRc#L&P%R(?@KfSblMS+N+?xUN$u3K4Ys%OmEh+tq}fnU}i>6YHM?< zlnL2gl~sF!j!Y4E;j3eIU-lfa`RsOL*Tt<%EFC0gPzoHfNWAfKFIKZN8}w~(Yi~=q z>=VNLO2|CjkxP}RkutxjV#4fWYR1KNrPYq5ha9Wl+u>ipsk*I(HS@iLnmGH9MFlTU zaFZ*KSR0px>o+pL7BbhB2EC1%PJ{67_ z#kY&#O4@P=OV#-79y_W>Gv2dxL*@G7%LksNSqgId9v;2xJ zrh8uR!F-eU$NMx@S*+sk=C~Dxr9Qn7TfWnTupuHKuQ$;gGiBcU>GF5sWx(~4IP3`f zWE;YFO*?jGwYh%C3X<>RKHC-DZ!*r;cIr}GLOno^3U4tFSSoJp%oHPiSa%nh=Zgn% z14+8v@ygy0>UgEN1bczD6wK45%M>psM)y^)IfG*>3ItX|TzV*0i%@>L(VN!zdKb8S?Qf7BhjNpziA zR}?={-eu>9JDcl*R=OP9B8N$IcCETXah9SUDhr{yrld{G;PnCWRsPD7!eOOFBTWUQ=LrA_~)mFf&!zJX!Oc-_=kT<}m|K52 z)M=G#;p;Rdb@~h5D{q^K;^fX-m5V}L%!wVC2iZ1uu401Ll}#rocTeK|7FAeBRhNdQ zCc2d^aQnQp=MpOmak60N$OgS}a;p(l9CL`o4r(e-nN}mQ?M&isv-P&d$!8|1D1I(3-z!wi zTgoo)*Mv`gC?~bm?S|@}I|m-E2yqPEvYybiD5azInexpK8?9q*$9Yy9-t%5jU8~ym zgZDx>!@ujQ=|HJnwp^wv-FdD{RtzO9SnyfB{mH_(c!jHL*$>0o-(h(eqe*ZwF6Lvu z{7rkk%PEqaA>o+f{H02tzZ@TWy&su?VNw43! z-X+rN`6llvpUms3ZiSt)JMeztB~>9{J8SPmYs&qohxdYFi!ra8KR$35Zp9oR)eFC4 zE;P31#3V)n`w$fZ|4X-|%MX`xZDM~gJyl2W;O$H25*=+1S#%|53>|LyH za@yh+;325%Gq3;J&a)?%7X%t@WXcWL*BaaR*7UEZad4I8iDt7^R_Fd`XeUo256;sAo2F!HcIQKk;h})QxEsPE5BcKc7WyerTchgKmrfRX z!x#H_%cL#B9TWAqkA4I$R^8{%do3Y*&(;WFmJ zU7Dih{t1<{($VtJRl9|&EB?|cJ)xse!;}>6mSO$o5XIx@V|AA8ZcoD88ZM?C*;{|f zZVmf94_l1OmaICt`2sTyG!$^UeTHx9YuUP!omj(r|7zpm5475|yXI=rR>>fteLI+| z)MoiGho0oEt=*J(;?VY0QzwCqw@cVm?d7Y!z0A@u#H?sCJ*ecvyhj& z-F77lO;SH^dmf?L>3i>?Z*U}Em4ZYV_CjgfvzYsRZ+1B!Uo6H6mbS<-FFL`ytqvb& zE7+)2ahv-~dz(Hs+f})z{*4|{)b=2!RZK;PWwOnO=hG7xG`JU5>bAvUbdYd_CjvtHBHgtGdlO+s^9ca^Bv3`t@VRX2_AD$Ckg36OcQRF zXD6QtGfHdw*hx~V(MV-;;ZZF#dJ-piEF+s27z4X1qi5$!o~xBnvf=uopcn7ftfsZc zy@(PuOk`4GL_n(H9(E2)VUjqRCk9kR?w)v@xO6Jm_Mx})&WGEl=GS0#)0FAq^J*o! zAClhvoTsNP*-b~rN{8Yym3g{01}Ep^^Omf=SKqvN?{Q*C4HNNAcrowIa^mf+3PRy! z*_G-|3i8a;+q;iP@~Of_$(vtFkB8yOyWt2*K)vAn9El>=D;A$CEx6b*XF@4y_6M+2 zpeW`RHoI_p(B{%(&jTHI->hmNmZjHUj<@;7w0mx3&koy!2$@cfX{sN19Y}euYJFn& z1?)+?HCkD0MRI$~uB2UWri})0bru_B;klFdwsLc!ne4YUE;t41JqfG# zZJq6%vbsdx!wYeE<~?>o4V`A3?lN%MnKQ`z=uUivQN^vzJ|C;sdQ37Qn?;lpzg})y z)_2~rUdH}zNwX;Tp0tJ78+&I=IwOQ-fl30R79O8@?Ub8IIA(6I`yHn%lARVL`%b8+ z4$8D-|MZZWxc_)vu6@VZN!HsI$*2NOV&uMxBNzIbRgy%ob_ zhwEH{J9r$!dEix9XM7n&c{S(h>nGm?el;gaX0@|QnzFD@bne`el^CO$yXC?BDJ|Qg z+y$GRoR`?ST1z^e*>;!IS@5Ovb7*RlN>BV_UC!7E_F;N#ky%1J{+iixp(dUJj93aK zzHNN>R-oN7>kykHClPnoPTIj7zc6KM(Pnlb(|s??)SMb)4!sMHU^-ntJwY5Big7xv zb1Ew`Xj;|D2kzGja*C$eS44(d&RMU~c_Y14V9_TLTz0J#uHlsx`S6{nhsA0dWZ#cG zJ?`fO50E>*X4TQLv#nl%3GOk*UkAgt=IY+u0LNXqeln3Z zv$~&Li`ZJOKkFuS)dJRA>)b_Da%Q~axwA_8zNK{BH{#}#m}zGcuckz}riDE-z_Ms> zR8-EqAMcfyGJCtvTpaUVQtajhUS%c@Yj}&6Zz;-M7MZzqv3kA7{SuW$oW#=0az2wQ zg-WG@Vb4|D`pl~Il54N7Hmsauc_ne-a!o5#j3WaBBh@Wuefb!QJIOn5;d)%A#s+5% zuD$H=VNux9bE-}1&bcYGZ+>1Fo;3Z@e&zX^n!?JK*adSbONm$XW9z;Q^L>9U!}Toj2WdafJ%oL#h|yWWwyAGxzfrAWdDTtaKl zK4`5tDpPg5>z$MNv=X0LZ0d6l%D{(D8oT@+w0?ce$DZ6pv>{1&Ok67Ix1 zH}3=IEhPJEhItCC8E=`T`N5(k?G=B4+xzZ?<4!~ ze~z6Wk9!CHTI(0rLJ4{JU?E-puc;xusR?>G?;4vt;q~iI9=kDL=z0Rr%O$vU`30X$ zDZRFyZ`(omOy@u|i6h;wtJlP;+}$|Ak|k2dea7n?U1*$T!sXqqOjq^NxLPMmk~&qI zYg0W?yK8T(6+Ea+$YyspKK?kP$+B`~t3^Pib_`!6xCs32!i@pqXfFV6PmBIR<-QW= zN8L{pt0Vap0x`Gzn#E@zh@H)0FfVfA_Iu4fjYZ+umO1LXIbVc$pY+E234u)ttcrl$ z>s92z4vT%n6cMb>=XT6;l0+9e(|CZG)$@C7t7Z7Ez@a)h)!hyuV&B5K%%)P5?Lk|C zZZSVzdXp{@OXSP0hoU-gF8s8Um(#xzjP2Vem zec#-^JqTa&Y#QJ>-FBxd7tf`XB6e^JPUgagB8iBSEps;92KG`!#mvVcPQ5yNC-GEG zTiHEDYfH+0O15}r^+ z#jxj=@x8iNHWALe!P3R67TwmhItn**0JwnzSV2O&KE8KcT+0hWH^OPD1pwiuyx=b@ zNf5Jh0{9X)8;~Es)$t@%(3!OnbY+`@?i{mGX7Yy}8T_*0a6g;kaFPq;*=px5EhO{Cp%1kI<0?*|h8v!6WnO3cCJRF2-CRrU3JiLJnj@6;L)!0kWYAc_}F{2P))3HmCrz zQ&N&gE70;`!6*eJ4^1IR{f6j4(-l&X!tjHxkbHA^Zhrnhr9g{exN|xrS`5Pq=#Xf& zG%P=#ra-TyVFfgW%cZo5OSIwFL9WtXAlFOa+ubmI5t*3=g#Y zF%;70p5;{ZeFL}&}yOY1N1*Q;*<(kTB!7vM$QokF)yr2FlIU@$Ph58$Bz z0J?xQG=MlS4L6jA22eS42g|9*9pX@$#*sUeM(z+t?hr@r5J&D1rx}2pW&m*_`VDCW zUYY@v-;bAO0HqoAgbbiGGC<=ryf96}3pouhy3XJrX+!!u*O_>Si38V{uJmQ&USptX zKp#l(?>%^7;2%h(q@YWS#9;a!JhKlkR#Vd)ERILlgu!Hr@jA@V;sk4BJ-H#p*4EqC zDGjC*tl=@3Oi6)Bn^QwFpul18fpkbpg0+peH$xyPBqb%`$OUhPKyWb32o7clB*9Z< zN=i~NLjavrLtwgJ01bufP+>p-jR2I95|TpmKpQL2!oV>g(4RvS2pK4*ou%m(h6r3A zX#s&`9LU1ZG&;{CkOK!4fLDTnBys`M!vuz>Q&9OZ0hGQl!~!jSDg|~s*w52opC{sB ze|Cf2luD(*G13LcOAGA!s2FjSK8&IE5#W%J25w!vM0^VyQM!t)inj&RTiJ!wXzFgz z3^IqzB7I0L$llljsGq})thBy9UOyjtFO_*hYM_sgcMk>44jeH0V1FDyELc{S1F-;A zS;T^k^~4biG&V*Irq}O;e}j$$+E_#G?HKIn05iP3j|87TkGK~SqG!-KBg5+mN(aLm z8ybhIM`%C19UX$H$KY6JgXbY$0AT%rEpHC;u`rQ$Y=rxUdsc5*Kvc8jaYaO$^)cI6){P6K0r)I6DY4Wr4&B zLQUBraey#0HV|&c4v7PVo3n$zHj99(TZO^3?Ly%C4nYvJTL9eLBLHsM3WKKD>5!B` zQ=BsR3aR6PD(Fa>327E2HAu5TM~Wusc!)>~(gM)+3~m;92Jd;FnSib=M5d6;;5{%R zb4V7DEJ0V!CP-F*oU?gkc>ksUtAYP&V4ND5J>J2^jt*vcFflQWCrB&fLdT%O59PVJ zhid#toR=FNgD!q3&r8#wEBr`!wzvQu5zX?Q>nlSJ4i@WC*CN*-xU66F^V5crWevQ9gsq$I@z1o(a=k7LL~ z7m_~`o;_Ozha1$8Q}{WBehvAlO4EL60y5}8GDrZ< zXh&F}71JbW2A~8KfEWj&UWV#4+Z4p`b{uAj4&WC zha`}X@3~+Iz^WRlOHU&KngK>#j}+_o@LdBC1H-`gT+krWX3-;!)6?{FBp~%20a}FL zFP9%Emqcwa#(`=G>BBZ0qZDQhmZKJg_g8<=bBFKWr!dyg(YkpE+|R*SGpDVU!+VlU zFC54^DLv}`qa%49T>nNiA9Q7Ips#!Xx90tCU2gvK`(F+GPcL=J^>No{)~we#o@&mUb6c$ zCc*<|NJBk-#+{j9xkQ&ujB zI~`#kN~7W!f*-}wkG~Ld!JqZ@tK}eeSnsS5J1fMFXm|`LJx&}5`@dK3W^7#Wnm+_P zBZkp&j1fa2Y=eIjJ0}gh85jt43kaIXXv?xmo@eHrka!Z|vQv12HN#+!I5E z`(fbuW>gFiJL|uXJ!vKt#z3e3HlVdboH7;e#i3(2<)Fg-I@BR!qY#eof3MFZ&*Y@l zI|KJf&ge@p2Dq09Vu$$Qxb7!}{m-iRk@!)%KL)txi3;~Z4Pb}u@GsW;ELiWeG9V51 znX#}B&4Y2E7-H=OpNE@q{%hFLxwIpBF2t{vPREa8_{linXT;#1vMRWjOzLOP$-hf( z>=?$0;~~PnkqY;~K{EM6Vo-T(0K{A0}VUGmu*hR z{tw3hvBN%N3G3Yw`X5Te+F{J`(3w1s3-+1EbnFQKcrgrX1Jqvs@ADGe%M0s$EbK$$ zK)=y=upBc6SjGYAACCcI=Y*6Fi8_jgwZlLxD26fnQfJmb8^gHRN5(TemhX@0e=vr> zg`W}6U>x6VhoA3DqsGGD9uL1DhB3!OXO=k}59TqD@(0Nb{)Ut_luTioK_>7wjc!5C zIr@w}b`Fez3)0wQfKl&bae7;PcTA7%?f2xucM0G)wt_KO!Ewx>F~;=BI0j=Fb4>pp zv}0R^xM4eti~+^+gE$6b81p(kwzuDti(-K9bc|?+pJEl@H+jSYuxZQV8rl8 zjp@M{#%qItIUFN~KcO9Hed*`$5A-2~pAo~K&<-Q+`9`$CK>rzqAI4w~$F%vs9s{~x zg4BP%Gy*@m?;D6=SRX?888Q6peF@_4Z->8wAH~Cn!R$|Hhq2cIzFYqT_+cDourHbY z0qroxJnrZ4Gh+Ay+F`_c%+KRT>y3qw{)89?=hJ@=KO=@ep)aBJ$c!JHfBMJpsP*3G za7|)VJJ8B;4?n{~ldJF7%jmb`-ftIvNd~ekoufG(`K(3=LNc;HBY& z(lp#q8XAD#cIf}k49zX_i`*fO+#!zKA&%T3j@%)R+#yag067CU%yUEe47>wzGU8^` z1EXFT^@I!{J!F8!X?S6ph8J=gUi5tl93*W>7}_uR<2N2~e}FaG?}KPyugQ=-OGEZs z!GBoyYY+H*ANn4?Z)X4l+7H%`17i5~zRlRIX?t)6_eu=g2Q`3WBhxSUeea+M-S?RL zX9oBGKn%a!H+*hx4d2(I!gsi+@SQK%<{X22M~2tMulJoa)0*+z9=-YO+;DFEm5eE1U9b^B(Z}2^9!Qk`!A$wUE z7$Ar5?NRg2&G!AZqnmE64eh^Anss3i!{}%6@Et+4rr!=}!SBF8eZ2*J3ujCWbl;3; z48H~goPSv(8X61fKKdpP!Z7$88NL^Z?j`!^*I?-P4X^pMxyWz~@$(UeAcTSDd(`vO z{~rc;9|GfMJcApU3k}22a!&)k4{CU!e_ny^Y3cO;tOvOMKEyWz!vG(Kp*;hB?d|R3`2X~=5a6#^o5@qn?J-bI8Ppip{-yG z!k|VcGsq!jF~}7DMr49Wap-s&>o=U^T0!Lcy}!(bhtYsPQy z4|EJe{12QL#=c(suQ89Mhw9<`bui%nx7Nep`C&*M3~vMEACmcRYYRGtANq$F%zh&V zc)cEVeHz*Z1N)L7k-(k3np#{GcDh2Q@ya0YHl*n7fl*ZPAsbU-a94MYYtA#&!c`xGIaV;yzsmrjfieTEtqB_WgZp2*NplHx=$O{M~2#i_vJ{ps-NgK zQsxKK_CBM2PP_je+Xft`(vYfXXgIUr{=PA=7a8`2EHk)Ym2QKIforz# tySWtj{oF3N9@_;i*Fv5S)9x^z=nlWP>jpp-9)52ZmLVA=i*%6g{{fxOO~wEK literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp new file mode 100644 index 00000000..9f01ff8b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp @@ -0,0 +1,69 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE* unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = + ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, + nullptr, 0, nullptr, nullptr) - + 1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, + utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h new file mode 100644 index 00000000..67b5c48b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h @@ -0,0 +1,25 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..45d150e7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp @@ -0,0 +1,284 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: +/// https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = + L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { ++g_active_window_count; } + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { return window_handle_; } + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = + RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, + &light_mode, &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h new file mode 100644 index 00000000..32aab58c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h @@ -0,0 +1,106 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec new file mode 100755 index 00000000..eba26315 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec @@ -0,0 +1,43 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_auth/Sources/firebase_auth/**/*.{h,m}' + s.public_header_files = 'firebase_auth/Sources/firebase_auth/include/Public/**/*.h' + s.private_header_files = 'firebase_auth/Sources/firebase_auth/include/Private/**/*.h' + + s.ios.deployment_target = '15.0' + s.dependency 'Flutter' + + s.dependency 'firebase_core' + s.dependency 'Firebase/Auth', firebase_sdk_version + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-auth\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift new file mode 100644 index 00000000..b53cc1ad --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift @@ -0,0 +1,43 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let libraryVersion = "6.5.4" +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_auth", + platforms: [ + .iOS("15.0") + ], + products: [ + .library(name: "firebase-auth", targets: ["firebase_auth"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core-4.11.0"), + ], + targets: [ + .target( + name: "firebase_auth", + dependencies: [ + .product(name: "FirebaseAuth", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ], + cSettings: [ + .headerSearchPath("include/Private"), + .headerSearchPath("include/Public"), + .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), + .define("LIBRARY_NAME", to: "\"flutter-fire-auth\""), + ] + ) + ] +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m new file mode 100644 index 00000000..5ef9adaf --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m @@ -0,0 +1,56 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTAuthStateChannelStreamHandler { + FIRAuth *_auth; + FIRAuthStateDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{ + @"user" : [NSNull null], + }); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeAuthStateDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m new file mode 100644 index 00000000..606dda68 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -0,0 +1,2376 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; +#import +#import +#if __has_include() +#import +#else +#import +#endif + +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Private/PigeonParser.h" + +#import "include/Public/CustomPigeonHeader.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" +@import CommonCrypto; +#import + +#if __has_include() +#import +#else +#import +#endif + +NSString *const kFLTFirebaseAuthChannelName = @"plugins.flutter.io/firebase_auth"; + +// Argument Keys +NSString *const kAppName = @"appName"; + +// Provider type keys. +NSString *const kSignInMethodPassword = @"password"; +NSString *const kSignInMethodEmailLink = @"emailLink"; +NSString *const kSignInMethodFacebook = @"facebook.com"; +NSString *const kSignInMethodGoogle = @"google.com"; +NSString *const kSignInMethodGameCenter = @"gc.apple.com"; +NSString *const kSignInMethodTwitter = @"twitter.com"; +NSString *const kSignInMethodGithub = @"github.com"; +NSString *const kSignInMethodApple = @"apple.com"; +NSString *const kSignInMethodPhone = @"phone"; +NSString *const kSignInMethodOAuth = @"oauth"; + +// Credential argument keys. +NSString *const kArgumentCredential = @"credential"; +NSString *const kArgumentProviderId = @"providerId"; +NSString *const kArgumentProviderScope = @"scopes"; +NSString *const kArgumentProviderCustomParameters = @"customParameters"; +NSString *const kArgumentSignInMethod = @"signInMethod"; +NSString *const kArgumentSecret = @"secret"; +NSString *const kArgumentIdToken = @"idToken"; +NSString *const kArgumentAccessToken = @"accessToken"; +NSString *const kArgumentRawNonce = @"rawNonce"; +NSString *const kArgumentEmail = @"email"; +NSString *const kArgumentCode = @"code"; +NSString *const kArgumentNewEmail = @"newEmail"; +NSString *const kArgumentEmailLink = kSignInMethodEmailLink; +NSString *const kArgumentToken = @"token"; +NSString *const kArgumentVerificationId = @"verificationId"; +NSString *const kArgumentSmsCode = @"smsCode"; +NSString *const kArgumentActionCodeSettings = @"actionCodeSettings"; +NSString *const kArgumentFamilyName = @"familyName"; +NSString *const kArgumentGivenName = @"givenName"; +NSString *const kArgumentMiddleName = @"middleName"; +NSString *const kArgumentNickname = @"nickname"; +NSString *const kArgumentNamePrefix = @"namePrefix"; +NSString *const kArgumentNameSuffix = @"nameSuffix"; + +// MultiFactor +NSString *const kArgumentMultiFactorHints = @"multiFactorHints"; +NSString *const kArgumentMultiFactorSessionId = @"multiFactorSessionId"; +NSString *const kArgumentMultiFactorResolverId = @"multiFactorResolverId"; +NSString *const kArgumentMultiFactorInfo = @"multiFactorInfo"; + +// Manual error codes & messages. +NSString *const kErrCodeNoCurrentUser = @"no-current-user"; +NSString *const kErrMsgNoCurrentUser = @"No user currently signed in."; +NSString *const kErrCodeInvalidCredential = @"invalid-credential"; +NSString *const kErrMsgInvalidCredential = + @"The supplied auth credential is malformed, has expired or is not " + @"currently supported."; + +// Used for caching credentials between Method Channel method calls. +static NSMutableDictionary *credentialsMap; + +@interface FLTFirebaseAuthPlugin () +@property(nonatomic, retain) NSObject *messenger; +@property(strong, nonatomic) FIROAuthProvider *authProvider; +// Used to keep the user who wants to link with Apple Sign In +@property(strong, nonatomic) FIRUser *linkWithAppleUser; +@property(strong, nonatomic) FIRAuth *signInWithAppleAuth; +@property BOOL isReauthenticatingWithApple; +@property(strong, nonatomic) NSString *currentNonce; +@property(strong, nonatomic) void (^appleCompletion) + (InternalUserCredential *_Nullable, FlutterError *_Nullable); +@property(strong, nonatomic) AuthPigeonFirebaseApp *appleArguments; +/// YES while an `ASAuthorizationController` Sign in with Apple flow is active. +@property(nonatomic, assign) BOOL appleSignInRequestInFlight; + +@end + +@implementation FLTFirebaseAuthPlugin { + // Map an id to a MultiFactorSession object. + NSMutableDictionary *_multiFactorSessionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorResolverMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorAssertionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorTotpSecretMap; + + // Emulator host/port per app, used to build REST URLs for workarounds. + NSMutableDictionary *_emulatorConfigs; + + NSObject *_binaryMessenger; + NSMutableDictionary *_eventChannels; + NSMutableDictionary *> *_streamHandlers; + NSData *_apnsToken; +} + +#pragma mark - FlutterPlugin + +- (instancetype)init:(NSObject *)messenger { + self = [super init]; + if (self) { + [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:self]; + credentialsMap = [NSMutableDictionary dictionary]; + _binaryMessenger = messenger; + _eventChannels = [NSMutableDictionary dictionary]; + _streamHandlers = [NSMutableDictionary dictionary]; + + _multiFactorSessionMap = [NSMutableDictionary dictionary]; + _multiFactorResolverMap = [NSMutableDictionary dictionary]; + _multiFactorAssertionMap = [NSMutableDictionary dictionary]; + _multiFactorTotpSecretMap = [NSMutableDictionary dictionary]; + _emulatorConfigs = [NSMutableDictionary dictionary]; + } + return self; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:kFLTFirebaseAuthChannelName + binaryMessenger:[registrar messenger]]; + FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init:registrar.messenger]; + + [registrar addMethodCallDelegate:instance channel:channel]; + + [registrar publish:instance]; + [registrar addApplicationDelegate:instance]; +#if !TARGET_OS_OSX + if (@available(iOS 13.0, *)) { + if ([registrar respondsToSelector:@selector(addSceneDelegate:)]) { + [registrar performSelector:@selector(addSceneDelegate:) withObject:instance]; + } + } +#endif + SetUpFirebaseAuthHostApi(registrar.messenger, instance); + SetUpFirebaseAuthUserHostApi(registrar.messenger, instance); + SetUpMultiFactorUserHostApi(registrar.messenger, instance); + SetUpMultiFactoResolverHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpSecretHostApi(registrar.messenger, instance); +} + ++ (FlutterError *)convertToFlutterError:(NSError *)error { + NSString *code = @"unknown"; + NSString *message = @"An unknown error has occurred."; + + if (error == nil) { + return [FlutterError errorWithCode:code message:message details:@{}]; + } + + // code + if ([error userInfo][FIRAuthErrorUserInfoNameKey] != nil) { + // See [FIRAuthErrorCodeString] for list of codes. + // Codes are in the format "ERROR_SOME_NAME", converting below to the format + // required in Dart. ERROR_SOME_NAME -> SOME_NAME + NSString *firebaseErrorCode = [error userInfo][FIRAuthErrorUserInfoNameKey]; + code = [firebaseErrorCode stringByReplacingOccurrencesOfString:@"ERROR_" withString:@""]; + // SOME_NAME -> SOME-NAME + code = [code stringByReplacingOccurrencesOfString:@"_" withString:@"-"]; + // SOME-NAME -> some-name + code = [code lowercaseString]; + } + + // message + if ([error userInfo][NSLocalizedDescriptionKey] != nil) { + message = [error userInfo][NSLocalizedDescriptionKey]; + } + + NSMutableDictionary *additionalData = [NSMutableDictionary dictionary]; + // additionalData.email + if ([error userInfo][FIRAuthErrorUserInfoEmailKey] != nil) { + additionalData[kArgumentEmail] = [error userInfo][FIRAuthErrorUserInfoEmailKey]; + } + // We want to store the credential if present for future sign in if the exception contains a + // credential, we pass a token back to Flutter to allow retrieval of the credential. + NSNumber *token = [FLTFirebaseAuthPlugin storeAuthCredentialIfPresent:error]; + + // additionalData.authCredential + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + additionalData[@"authCredential"] = [PigeonParser getPigeonAuthCredential:authCredential + token:token]; + } + + // Manual message overrides to ensure messages/codes matches other platforms. + if ([message isEqual:@"The password must be 6 characters long or more."]) { + message = @"Password should be at least 6 characters"; + } + + return [FlutterError errorWithCode:code message:message details:additionalData]; +} + ++ (id)getNSDictionaryFromAuthCredential:(FIRAuthCredential *)authCredential { + if (authCredential == nil) { + return [NSNull null]; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + return @{ + kArgumentProviderId : authCredential.provider, + // Note: "signInMethod" does not exist on iOS SDK, so using provider + // instead. + kArgumentSignInMethod : authCredential.provider, + kArgumentToken : @([authCredential hash]), + kArgumentAccessToken : accessToken ?: [NSNull null], + }; +} + +- (void)cleanupWithCompletion:(void (^)(void))completion { + // Cleanup credentials. + [credentialsMap removeAllObjects]; + + for (FlutterEventChannel *channel in self->_eventChannels.allValues) { + [channel setStreamHandler:nil]; + } + [self->_eventChannels removeAllObjects]; + for (NSObject *handler in self->_streamHandlers.allValues) { + [handler onCancelWithArguments:nil]; + } + [self->_streamHandlers removeAllObjects]; + + if (completion != nil) completion(); +} + +- (void)detachFromEngineForRegistrar:(NSObject *)registrar { + [self cleanupWithCompletion:nil]; +} + +#pragma mark - AppDelegate + +#if TARGET_OS_IPHONE +#if !__has_include() +- (BOOL)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if ([[FIRAuth auth] canHandleNotification:notification]) { + completionHandler(UIBackgroundFetchResultNoData); + return YES; + } + return NO; +} +#endif + +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + _apnsToken = deviceToken; +} + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + return [[FIRAuth auth] canHandleURL:url]; +} + +#pragma mark - SceneDelegate + +- (BOOL)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0)) { + for (UIOpenURLContext *urlContext in URLContexts) { + if ([[FIRAuth auth] canHandleURL:urlContext.URL]) { + return YES; + } + } + return NO; +} +#endif + +#pragma mark - FLTFirebasePlugin + +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + [self cleanupWithCompletion:completion]; +} + +- (NSString *_Nonnull)firebaseLibraryName { + return @LIBRARY_NAME; +} + +- (NSString *_Nonnull)firebaseLibraryVersion { + return @LIBRARY_VERSION; +} + +- (NSString *_Nonnull)flutterChannelName { + return kFLTFirebaseAuthChannelName; +} + +- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp { + FIRAuth *auth = [FIRAuth authWithApp:firebaseApp]; + return @{ + @"APP_LANGUAGE_CODE" : (id)[auth languageCode] ?: [NSNull null], + @"APP_CURRENT_USER" : [auth currentUser] + ? [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + : [NSNull null], + }; +} + +#pragma mark - Firebase Auth API + +// Adapted from +// https://auth0.com/docs/api-auth/tutorials/nonce#generate-a-cryptographically-random-nonce Used +// for Apple Sign In +- (NSString *)randomNonce:(NSInteger)length { + NSAssert(length > 0, @"Expected nonce to have positive length"); + NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; + NSMutableString *result = [NSMutableString string]; + NSInteger remainingLength = length; + + while (remainingLength > 0) { + NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; + for (NSInteger i = 0; i < 16; i++) { + uint8_t random = 0; + int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); + NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); + + [randoms addObject:@(random)]; + } + + for (NSNumber *random in randoms) { + if (remainingLength == 0) { + break; + } + + if (random.unsignedIntValue < characterSet.length) { + unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; + [result appendFormat:@"%C", character]; + remainingLength--; + } + } + } + + return [result copy]; +} + +- (NSString *)stringBySha256HashingString:(NSString *)input { + const char *string = [input UTF8String]; + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(string, (CC_LONG)strlen(string), result); + + NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hashed appendFormat:@"%02x", result[i]]; + } + return hashed; +} + +static void handleSignInWithApple(FLTFirebaseAuthPlugin *object, FIRAuthDataResult *authResult, + NSString *authorizationCode, NSError *error) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + object.appleCompletion; + if (completion == nil) { + object.appleSignInRequestInFlight = NO; + return; + } + + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + [object handleMultiFactorError:object.appleArguments completion:completion withError:error]; + } else { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:authorizationCode], + nil); +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithAuthorization:(ASAuthorization *)authorization + API_AVAILABLE(macos(10.15), ios(13.0)) { + if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { + ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; + NSString *rawNonce = self.currentNonce; + NSAssert(rawNonce != nil, + @"Invalid state: A login callback was received, but no login request was sent."); + + if (appleIDCredential.identityToken == nil) { + NSLog(@"Unable to fetch identity token."); + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + return; + } + + NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken + encoding:NSUTF8StringEncoding]; + if (idToken == nil) { + NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); + } + + NSString *authorizationCode = nil; + if (appleIDCredential.authorizationCode != nil) { + authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode + encoding:NSUTF8StringEncoding]; + } + + FIROAuthCredential *credential = + [FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:appleIDCredential.fullName]; + + if (self.isReauthenticatingWithApple == YES) { + self.isReauthenticatingWithApple = NO; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [[FIRAuth.auth currentUser] + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else if (self.linkWithAppleUser != nil) { + FIRUser *userToLink = self.linkWithAppleUser; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [userToLink linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, NSError *error) { + self.linkWithAppleUser = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else { + FIRAuth *signInAuth = + self.signInWithAppleAuth != nil ? self.signInWithAppleAuth : FIRAuth.auth; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [signInAuth signInWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + self.signInWithAppleAuth = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + } + } else { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + } +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithError:(NSError *)error API_AVAILABLE(macos(10.15), ios(13.0)) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + + NSLog(@"Sign in with Apple errored: %@", error); + if (completion == nil) { + return; + } + + switch (error.code) { + case ASAuthorizationErrorCanceled: + completion(nil, [FlutterError errorWithCode:@"canceled" + message:@"The user canceled the authorization attempt." + details:nil]); + break; + + case ASAuthorizationErrorInvalidResponse: + completion(nil, [FlutterError + errorWithCode:@"invalid-response" + message:@"The authorization request received an invalid response." + details:nil]); + break; + + case ASAuthorizationErrorNotHandled: + completion(nil, [FlutterError errorWithCode:@"not-handled" + message:@"The authorization request wasn’t handled." + details:nil]); + break; + + case ASAuthorizationErrorFailed: + completion(nil, [FlutterError errorWithCode:@"failed" + message:@"The authorization attempt failed." + details:nil]); + break; + + case ASAuthorizationErrorUnknown: + default: + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + break; + } +} + +- (void)handleInternalError:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *)error { + const NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; + if (underlyingError != nil) { + const NSDictionary *details = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDeserializedResponseKey"]; + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:details]); + return; + } + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:nil]); +} + +- (void)handleMultiFactorError:(AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *_Nullable)error { + FIRMultiFactorResolver *resolver = + (FIRMultiFactorResolver *)error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; + + NSArray *hints = resolver.hints; + FIRMultiFactorSession *session = resolver.session; + + NSString *sessionId = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[sessionId] = session; + + NSString *resolverId = [[NSUUID UUID] UUIDString]; + self->_multiFactorResolverMap[resolverId] = resolver; + + NSMutableArray *pigeonHints = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in hints) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + InternalMultiFactorInfo *object = [InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]; + + [pigeonHints addObject:object.toList]; + } + + NSDictionary *output = @{ + kAppName : app.appName, + kArgumentMultiFactorHints : pigeonHints, + kArgumentMultiFactorSessionId : sessionId, + kArgumentMultiFactorResolverId : resolverId, + }; + completion(nil, [FlutterError errorWithCode:@"second-factor-required" + message:error.description + details:output]); +} + +static void launchAppleSignInRequest(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + InternalSignInProvider *signInProvider, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (@available(iOS 13.0, macOS 10.15, *)) { + if (object.appleSignInRequestInFlight) { + completion(nil, + [FlutterError errorWithCode:@"operation-not-allowed" + message:@"A Sign in with Apple request is already in progress." + details:nil]); + return; + } + + NSString *nonce = [object randomNonce:32]; + object.currentNonce = nonce; + object.appleCompletion = completion; + object.appleArguments = app; + object.appleSignInRequestInFlight = YES; + + ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; + + ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; + NSMutableArray *requestedScopes = [NSMutableArray arrayWithCapacity:2]; + if ([signInProvider.scopes containsObject:@"name"]) { + [requestedScopes addObject:ASAuthorizationScopeFullName]; + } + if ([signInProvider.scopes containsObject:@"email"]) { + [requestedScopes addObject:ASAuthorizationScopeEmail]; + } + request.requestedScopes = [requestedScopes copy]; + request.nonce = [object stringBySha256HashingString:nonce]; + + ASAuthorizationController *authorizationController = + [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[ request ]]; + authorizationController.delegate = object; + authorizationController.presentationContextProvider = object; + [authorizationController performRequests]; + } else { + NSLog(@"Sign in with Apple was introduced in iOS 13, update your Podfile with platform :ios, " + @"'13.0'"); + } +} + +static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + FIRAuth *auth, FIRAuthCredential *credentials, NSError *error, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (error) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [object handleMultiFactorError:app completion:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + if (credentials) { + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; + + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + // Removing since it's not parsed and causing issue when sending back the + // object to Flutter + NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; + [mutableUserInfo + removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + NSError *modifiedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:mutableUserInfo]; + + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:userInfo[@"NSLocalizedDescription"] + details:modifiedError.userInfo]); + + } else if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is + // buried in underlying error. + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:firebaseDictionary[@"message"]]); + } else { + completion(nil, [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:error.userInfo]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; + } +} + +#pragma mark - Utilities + ++ (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + // We temporarily store the non-serializable credential so the + // Dart API can consume these at a later time. + NSNumber *authCredentialHash = @([authCredential hash]); + credentialsMap[authCredentialHash] = authCredential; + return authCredentialHash; + } + return nil; +} + +- (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { + FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; + FIRAuth *auth = [FIRAuth authWithApp:app]; + + auth.tenantID = pigeonApp.tenantId; + auth.customAuthDomain = [FLTFirebaseCorePlugin getCustomDomain:app.name]; + // Auth's `customAuthDomain` supersedes value from `getCustomDomain` set by `initializeApp` + if (pigeonApp.customAuthDomain != nil) { + auth.customAuthDomain = pigeonApp.customAuthDomain; + } + + return auth; +} + +- (void)getFIRAuthCredentialFromArguments:(NSDictionary *)arguments + app:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FIRAuthCredential *credential, + NSError *error))completion { + // If the credential dictionary contains a token, it means a native one has + // been stored for later usage, so we'll attempt to retrieve it here. + if (arguments[kArgumentToken] != nil && ![arguments[kArgumentToken] isEqual:[NSNull null]]) { + NSNumber *credentialHashCode = arguments[kArgumentToken]; + if (credentialsMap[credentialHashCode] != nil) { + completion(credentialsMap[credentialHashCode], nil); + return; + } + } + + NSString *signInMethod = arguments[kArgumentSignInMethod]; + + if ([signInMethod isEqualToString:kSignInMethodGameCenter]) { + // Game Center Games is different to other providers, it requires below callback to get a + // credential. This is why getFIRAuthCredentialFromArguments now requires a completion() + // callback + [FIRGameCenterAuthProvider + getCredentialWithCompletion:^(FIRAuthCredential *credential, NSError *error) { + if (error) { + completion(nil, error); + } else { + completion(credential, nil); + } + }]; + return; + } + + NSString *secret = arguments[kArgumentSecret] == [NSNull null] ? nil : arguments[kArgumentSecret]; + NSString *idToken = + arguments[kArgumentIdToken] == [NSNull null] ? nil : arguments[kArgumentIdToken]; + NSString *accessToken = + arguments[kArgumentAccessToken] == [NSNull null] ? nil : arguments[kArgumentAccessToken]; + NSString *rawNonce = + arguments[kArgumentRawNonce] == [NSNull null] ? nil : arguments[kArgumentRawNonce]; + + // Password Auth + if ([signInMethod isEqualToString:kSignInMethodPassword]) { + NSString *email = arguments[kArgumentEmail]; + completion([FIREmailAuthProvider credentialWithEmail:email password:secret], nil); + return; + } + + // Email Link Auth + if ([signInMethod isEqualToString:kSignInMethodEmailLink]) { + NSString *email = arguments[kArgumentEmail]; + NSString *emailLink = arguments[kArgumentEmailLink]; + completion([FIREmailAuthProvider credentialWithEmail:email link:emailLink], nil); + return; + } + + // Facebook Auth + if ([signInMethod isEqualToString:kSignInMethodFacebook]) { + completion([FIRFacebookAuthProvider credentialWithAccessToken:accessToken], nil); + return; + } + + // Google Auth + if ([signInMethod isEqualToString:kSignInMethodGoogle]) { + completion([FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken], nil); + return; + } + + // Twitter Auth + if ([signInMethod isEqualToString:kSignInMethodTwitter]) { + completion([FIRTwitterAuthProvider credentialWithToken:accessToken secret:secret], nil); + return; + } + + // GitHub Auth + if ([signInMethod isEqualToString:kSignInMethodGithub]) { + completion([FIRGitHubAuthProvider credentialWithToken:accessToken], nil); + return; + } + + // Phone Auth - Only supported on iOS + if ([signInMethod isEqualToString:kSignInMethodPhone]) { +#if TARGET_OS_IPHONE + NSString *verificationId = arguments[kArgumentVerificationId]; + NSString *smsCode = arguments[kArgumentSmsCode]; + completion([[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:verificationId + verificationCode:smsCode], + nil); + return; +#else + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); + return; +#endif + } + // Apple Auth + if ([signInMethod isEqualToString:kSignInMethodApple]) { + if (idToken && rawNonce) { + // Credential with idToken, rawNonce and fullName + NSPersonNameComponents *fullName = [[NSPersonNameComponents alloc] init]; + fullName.givenName = + arguments[kArgumentGivenName] == [NSNull null] ? nil : arguments[kArgumentGivenName]; + fullName.familyName = + arguments[kArgumentFamilyName] == [NSNull null] ? nil : arguments[kArgumentFamilyName]; + fullName.nickname = + arguments[kArgumentNickname] == [NSNull null] ? nil : arguments[kArgumentNickname]; + fullName.namePrefix = + arguments[kArgumentNamePrefix] == [NSNull null] ? nil : arguments[kArgumentNamePrefix]; + fullName.nameSuffix = + arguments[kArgumentNameSuffix] == [NSNull null] ? nil : arguments[kArgumentNameSuffix]; + fullName.middleName = + arguments[kArgumentMiddleName] == [NSNull null] ? nil : arguments[kArgumentMiddleName]; + + completion([FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:fullName], + nil); + return; + } + } + // OAuth + if ([signInMethod isEqualToString:kSignInMethodOAuth]) { + NSString *providerId = arguments[kArgumentProviderId]; + completion([FIROAuthProvider credentialWithProviderID:providerId + IDToken:idToken + rawNonce:rawNonce + accessToken:accessToken], + nil); + return; + } + + NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", signInMethod); + completion(nil, nil); + return; +} + +- (void)ensureAPNSTokenSetting { +#if !TARGET_OS_OSX + FIRApp *defaultApp = [FIRApp defaultApp]; + if (defaultApp) { + if ([FIRAuth auth].APNSToken == nil && _apnsToken != nil) { + [[FIRAuth auth] setAPNSToken:_apnsToken type:FIRAuthAPNSTokenTypeUnknown]; + _apnsToken = nil; + } + } +#endif +} + +- (FIRMultiFactor *)getAppMultiFactorFromPigeon:(nonnull AuthPigeonFirebaseApp *)app { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + return currentUser.multiFactor; +} + +- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController: + (nonnull ASAuthorizationController *)controller API_AVAILABLE(macos(10.15), ios(13.0)) { +#if TARGET_OS_OSX + return [[NSApplication sharedApplication] keyWindow]; +#else + // UIApplication.keyWindow is deprecated in iOS 13+ with UIScene lifecycle. + // Walk the connected scenes to find the foreground active window. + if (@available(iOS 15.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.keyWindow) { + return windowScene.keyWindow; + } + } + } + } else if (@available(iOS 13.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + return window; + } + } + } + } + } + return [[UIApplication sharedApplication] keyWindow]; +#endif +} + +- (void)enrollPhoneApp:(nonnull AuthPigeonFirebaseApp *)app + assertion:(nonnull InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + completion([FlutterError errorWithCode:@"unsupported-platform" + message:@"Phone authentication is not supported on macOS" + details:nil]); +#else + + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + + FIRMultiFactorAssertion *multiFactorAssertion = + [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; + + [multiFactor enrollWithAssertion:multiFactorAssertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +#endif +} + +- (void)getEnrolledFactorsApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + NSArray *enrolledFactors = [multiFactor enrolledFactors]; + + NSMutableArray *results = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in enrolledFactors) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + [results addObject:[InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]]; + } + + completion(results, nil); +} + +- (void)getSessionApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalMultiFactorSession *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session, + NSError *_Nullable error) { + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[UUID] = session; + + InternalMultiFactorSession *pigeonSession = [InternalMultiFactorSession makeWithId:UUID]; + completion(pigeonSession, nil); + }]; +} + +- (void)unenrollApp:(nonnull AuthPigeonFirebaseApp *)app + factorUid:(nonnull NSString *)factorUid + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor unenrollWithFactorUID:factorUid + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"unenroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)enrollTotpApp:(nonnull AuthPigeonFirebaseApp *)app + assertionId:(nonnull NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRMultiFactorAssertion *assertion = _multiFactorAssertionMap[assertionId]; + + [multiFactor enrollWithAssertion:assertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)resolveSignInResolverId:(nonnull NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorResolver *resolver = _multiFactorResolverMap[resolverId]; + + FIRMultiFactorAssertion *multiFactorAssertion; + + if (assertion != nil) { +#if TARGET_OS_IPHONE + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider provider] credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + multiFactorAssertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; +#endif + } else if (totpAssertionId != nil) { + multiFactorAssertion = _multiFactorAssertionMap[totpAssertionId]; + } else { + completion(nil, + [FlutterError errorWithCode:@"resolve-signin-failed" + message:@"Neither assertion nor totpAssertionId were provided" + details:nil]); + return; + } + + [resolver + resolveSignInWithAssertion:multiFactorAssertion + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error == nil) { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } else { + completion(nil, [FlutterError errorWithCode:@"resolve-signin-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)generateSecretSessionId:(nonnull NSString *)sessionId + completion:(nonnull void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorSession *multiFactorSession = _multiFactorSessionMap[sessionId]; + + [FIRTOTPMultiFactorGenerator + generateSecretWithMultiFactorSession:multiFactorSession + completion:^(FIRTOTPSecret *_Nullable secret, + NSError *_Nullable error) { + if (error == nil) { + self->_multiFactorTotpSecretMap[secret.sharedSecretKey] = + secret; + completion([PigeonParser getPigeonTotpSecret:secret], nil); + } else { + completion( + nil, [FlutterError errorWithCode:@"generate-secret-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)getAssertionForEnrollmentSecretKey:(nonnull NSString *)secretKey + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForEnrollmentWithSecret:totpSecret + oneTimePassword:oneTimePassword]; + + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)getAssertionForSignInEnrollmentId:(nonnull NSString *)enrollmentId + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForSignInWithEnrollmentID:enrollmentId + oneTimePassword:oneTimePassword]; + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)generateQrCodeUrlSecretKey:(nonnull NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + completion([totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer], nil); +} + +- (void)openInOtpAppSecretKey:(nonnull NSString *)secretKey + qrCodeUrl:(nonnull NSString *)qrCodeUrl + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + [totpSecret openInOTPAppWithQRCodeURL:qrCodeUrl]; + completion(nil); +} + +- (void)applyActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth applyActionCode:code + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeTokenWithAuthorizationCodeApp:(nonnull AuthPigeonFirebaseApp *)app + authorizationCode:(nonnull NSString *)authorizationCode + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth revokeTokenWithAuthorizationCode:authorizationCode + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeAccessTokenApp:(nonnull AuthPigeonFirebaseApp *)app + accessToken:(nonnull NSString *)accessToken + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + // `revokeAccessToken(_:)` is currently Android-only on the Firebase SDK. + // On Apple platforms use `revokeTokenWithAuthorizationCode:` instead. + completion([FlutterError errorWithCode:@"unsupported-platform-operation" + message:@"revokeAccessToken is not supported on iOS/macOS. " + @"Use revokeTokenWithAuthorizationCode instead." + details:nil]); +} + +- (void)checkActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth checkActionCode:code + completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + InternalActionCodeInfo *result = [self parseActionCode:info]; + if (result.operation == ActionCodeInfoOperationUnknown) { + // Workaround: Firebase iOS SDK >=11.12.0 returns .unknown because + // actionCodeOperation(forRequestType:) only matches camelCase but the + // REST API returns SCREAMING_SNAKE_CASE (e.g. "VERIFY_EMAIL"). + // Re-fetch the raw requestType via REST to resolve the operation. + // See: https://github.com/firebase/flutterfire/issues/17452 + [self resolveActionCodeOperationForApp:app + code:code + fallbackInfo:result + completion:completion]; + } else { + completion(result, nil); + } + } + }]; +} + +- (InternalActionCodeInfo *_Nullable)parseActionCode:(nonnull FIRActionCodeInfo *)info { + InternalActionCodeInfoData *data = [InternalActionCodeInfoData makeWithEmail:info.email + previousEmail:info.previousEmail]; + + ActionCodeInfoOperation operation; + + if (info.operation == FIRActionCodeOperationPasswordReset) { + operation = ActionCodeInfoOperationPasswordReset; + } else if (info.operation == FIRActionCodeOperationVerifyEmail) { + operation = ActionCodeInfoOperationVerifyEmail; + } else if (info.operation == FIRActionCodeOperationRecoverEmail) { + operation = ActionCodeInfoOperationRecoverEmail; + } else if (info.operation == FIRActionCodeOperationEmailLink) { + operation = ActionCodeInfoOperationEmailSignIn; + } else if (info.operation == FIRActionCodeOperationVerifyAndChangeEmail) { + operation = ActionCodeInfoOperationVerifyAndChangeEmail; + } else if (info.operation == FIRActionCodeOperationRevertSecondFactorAddition) { + operation = ActionCodeInfoOperationRevertSecondFactorAddition; + } else { + operation = ActionCodeInfoOperationUnknown; + } + + return [InternalActionCodeInfo makeWithOperation:operation data:data]; +} + +/// Maps a raw requestType string (either camelCase or SCREAMING_SNAKE_CASE) to +/// the corresponding Pigeon enum value. ++ (ActionCodeInfoOperation)operationFromRequestType:(nullable NSString *)requestType { + static NSDictionary *mapping; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mapping = @{ + @"PASSWORD_RESET" : @(ActionCodeInfoOperationPasswordReset), + @"resetPassword" : @(ActionCodeInfoOperationPasswordReset), + @"VERIFY_EMAIL" : @(ActionCodeInfoOperationVerifyEmail), + @"verifyEmail" : @(ActionCodeInfoOperationVerifyEmail), + @"RECOVER_EMAIL" : @(ActionCodeInfoOperationRecoverEmail), + @"recoverEmail" : @(ActionCodeInfoOperationRecoverEmail), + @"EMAIL_SIGNIN" : @(ActionCodeInfoOperationEmailSignIn), + @"signIn" : @(ActionCodeInfoOperationEmailSignIn), + @"VERIFY_AND_CHANGE_EMAIL" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"verifyAndChangeEmail" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"REVERT_SECOND_FACTOR_ADDITION" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + @"revertSecondFactorAddition" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + }; + }); + + NSNumber *value = mapping[requestType]; + return value ? (ActionCodeInfoOperation)value.integerValue : ActionCodeInfoOperationUnknown; +} + +/// Calls the Identity Toolkit REST API directly to retrieve the raw requestType +/// string, which the iOS SDK fails to parse correctly. Falls back to the original +/// result if the REST call fails for any reason. +- (void)resolveActionCodeOperationForApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + fallbackInfo:(nonnull InternalActionCodeInfo *)fallbackInfo + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:app.appName]; + NSString *apiKey = firebaseApp.options.APIKey; + + NSString *baseURL; + NSDictionary *emulatorConfig = _emulatorConfigs[app.appName]; + if (emulatorConfig) { + baseURL = [NSString stringWithFormat:@"http://%@:%@/identitytoolkit.googleapis.com", + emulatorConfig[@"host"], emulatorConfig[@"port"]]; + } else { + baseURL = @"https://identitytoolkit.googleapis.com"; + } + + NSString *urlString = + [NSString stringWithFormat:@"%@/v1/accounts:resetPassword?key=%@", baseURL, apiKey]; + NSURL *url = [NSURL URLWithString:urlString]; + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = @"POST"; + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + request.HTTPBody = [NSJSONSerialization dataWithJSONObject:@{@"oobCode" : code} + options:0 + error:nil]; + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error || !data) { + completion(fallbackInfo, nil); + return; + } + + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (!json || json[@"error"]) { + completion(fallbackInfo, nil); + return; + } + + ActionCodeInfoOperation operation = + [FLTFirebaseAuthPlugin operationFromRequestType:json[@"requestType"]]; + + if (operation != ActionCodeInfoOperationUnknown) { + completion([InternalActionCodeInfo makeWithOperation:operation data:fallbackInfo.data], + nil); + } else { + completion(fallbackInfo, nil); + } + }]; + [task resume]; +} + +- (void)confirmPasswordResetApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth confirmPasswordResetWithCode:code + newPassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)createUserWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth createUserWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)fetchSignInMethodsForEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth fetchSignInMethodsForEmail:email + completion:^(NSArray *_Nullable providers, + NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + if (providers == nil) { + completion(@[], nil); + } else { + completion(providers, nil); + } + } + }]; +} + +- (void)registerAuthStateListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/auth-state/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTAuthStateChannelStreamHandler *handler = + [[FLTAuthStateChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)registerIdTokenListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/id-token/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTIdTokenChannelStreamHandler *handler = + [[FLTIdTokenChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)sendPasswordResetEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + if (actionCodeSettings != nil) { + FIRActionCodeSettings *settings = [PigeonParser parseActionCodeSettings:actionCodeSettings]; + [auth sendPasswordResetWithEmail:email + actionCodeSettings:settings + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } else { + [auth sendPasswordResetWithEmail:email + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } +} + +- (void)sendSignInLinkToEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nonnull InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth sendSignInLinkToEmail:email + actionCodeSettings:[PigeonParser parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeInternalError) { + [self + handleInternalError:^(InternalUserCredential *_Nullable creds, + FlutterError *_Nullable internalError) { + completion(internalError); + } + withError:error]; + } else { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion(nil); + } + }]; +} + +- (void)setLanguageCodeApp:(nonnull AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (languageCode != nil && ![languageCode isEqual:[NSNull null]]) { + auth.languageCode = languageCode; + } else { + [auth useAppLanguage]; + } + + completion(auth.languageCode, nil); +} + +- (void)setSettingsApp:(nonnull AuthPigeonFirebaseApp *)app + settings:(nonnull InternalFirebaseAuthSettings *)settings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (settings.userAccessGroup != nil) { + BOOL useUserAccessGroupSuccessful; + NSError *useUserAccessGroupErrorPtr; + useUserAccessGroupSuccessful = [auth useUserAccessGroup:settings.userAccessGroup + error:&useUserAccessGroupErrorPtr]; + if (!useUserAccessGroupSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:useUserAccessGroupErrorPtr]); + return; + } + } + +#if TARGET_OS_IPHONE + if (settings.appVerificationDisabledForTesting) { + auth.settings.appVerificationDisabledForTesting = settings.appVerificationDisabledForTesting; + } +#else + NSLog(@"FIRAuthSettings.appVerificationDisabledForTesting is not supported " + @"on MacOS."); +#endif + + completion(nil); +} + +- (void)signInAnonymouslyApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [auth + signInWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = + [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError + .userInfo[@"FIRAuthErrorUserInfoDeserializ" + @"edResponseKey"]; + + if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is buried in + // underlying error. + if ([firebaseDictionary[@"code"] + isKindOfClass:[NSNumber class]]) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FlutterError + errorWithCode:firebaseDictionary + [@"code"] + message:firebaseDictionary + [@"message"] + details:nil]); + } + } else { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else if (error.code == + FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)signInWithCustomTokenApp:(nonnull AuthPigeonFirebaseApp *)app + token:(nonnull NSString *)token + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth signInWithCustomToken:token + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailLinkApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + emailLink:(nonnull NSString *)emailLink + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + link:emailLink + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"sign-in-failure" + message: + @"Game Center sign-in requires signing in with 'signInWithCredential()' API." + details:@{}]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.signInWithAppleAuth = auth; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"signInWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId auth:auth]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [self.authProvider + getCredentialWithUIDelegate:nil + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + handleAppleAuthResult(self, app, auth, credential, error, completion); + }]; +#endif +} + +- (void)signOutApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (auth.currentUser == nil) { + completion(nil); + return; + } + + NSError *signOutErrorPtr; + BOOL signOutSuccessful = [auth signOut:&signOutErrorPtr]; + + if (!signOutSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:signOutErrorPtr]); + } else { + completion(nil); + } +} + +- (void)useEmulatorApp:(nonnull AuthPigeonFirebaseApp *)app + host:(nonnull NSString *)host + port:(long)port + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth useEmulatorWithHost:host port:port]; + _emulatorConfigs[app.appName] = @{@"host" : host, @"port" : @(port)}; + completion(nil); +} + +- (void)verifyPasswordResetCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth verifyPasswordResetCode:code + completion:^(NSString *_Nullable email, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(email, nil); + } + }]; +} + +- (void)verifyPhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + request:(nonnull InternalVerifyPhoneNumberRequest *)request + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = [NSString + stringWithFormat:@"%@/phone/%@", kFLTFirebaseAuthChannelName, [NSUUID UUID].UUIDString]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + NSString *multiFactorSessionId = request.multiFactorSessionId; + FIRMultiFactorSession *multiFactorSession = nil; + + if (multiFactorSessionId != nil) { + multiFactorSession = _multiFactorSessionMap[multiFactorSessionId]; + } + + NSString *multiFactorInfoId = request.multiFactorInfoId; + + FIRPhoneMultiFactorInfo *multiFactorInfo = nil; + if (multiFactorInfoId != nil) { + for (NSString *resolverId in _multiFactorResolverMap) { + for (FIRMultiFactorInfo *info in _multiFactorResolverMap[resolverId].hints) { + if ([info.UID isEqualToString:multiFactorInfoId] && + [info class] == [FIRPhoneMultiFactorInfo class]) { + multiFactorInfo = (FIRPhoneMultiFactorInfo *)info; + break; + } + } + } + } + +#if TARGET_OS_OSX + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth]; +#else + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth + request:request + session:multiFactorSession + factorInfo:multiFactorInfo]; +#endif + + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +#endif +} + +- (void)deleteApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser deleteWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)getIdTokenApp:(nonnull AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion:(nonnull void (^)(InternalIdTokenResult *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + getIDTokenResultForcingRefresh:forceRefresh + completion:^(FIRAuthTokenResult *tokenResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + completion([PigeonParser parseIdTokenResult:tokenResult], nil); + }]; +} + +- (void)linkWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)linkWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"provider-link-failure" + message:@"Game Center provider requires linking with 'linkWithCredential()' API." + details:@{}]); + return; + } + + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.linkWithAppleUser = currentUser; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"linkWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser + linkWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, error, completion); + }]; +#endif +} + +- (void)reauthenticateWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion( + nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode: + nil], + nil); + } + }]; + }]; +} + +- (void)reauthenticateWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.isReauthenticatingWithApple = YES; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"reauthenticateWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser reauthenticateWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, + error, completion); + }]; +#endif +} + +- (void)reloadApp:(nonnull AuthPigeonFirebaseApp *)app + completion: + (nonnull void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser reloadWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; +} + +- (void)sendEmailVerificationApp:(nonnull AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationWithActionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)unlinkApp:(nonnull AuthPigeonFirebaseApp *)app + providerId:(nonnull NSString *)providerId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser unlinkFromProvider:providerId + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromFIRUser:user], nil); + } + }]; +} + +- (void)updateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser updateEmail:newEmail + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePasswordApp:(nonnull AuthPigeonFirebaseApp *)app + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + updatePassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { +#if TARGET_OS_IPHONE + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } else { + [currentUser + reloadWithCompletion:^( + NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError: + reloadError]); + } else { + completion( + [PigeonParser getPigeonDetails: + currentUser], + nil); + } + }]; + } + }]; + }]; +#else + NSLog(@"Updating a users phone number via Firebase Authentication is only " + @"supported on the iOS " + @"platform."); + completion(nil, nil); +#endif +} + +- (void)updateProfileApp:(nonnull AuthPigeonFirebaseApp *)app + profile:(nonnull InternalUserProfile *)profile + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + FIRUserProfileChangeRequest *changeRequest = [currentUser profileChangeRequest]; + + if (profile.displayNameChanged) { + changeRequest.displayName = profile.displayName; + } + + if (profile.photoUrlChanged) { + if (profile.photoUrl == nil) { + // We apparently cannot set photoURL to nil/NULL to remove it. + // Instead, setting it to empty string appears to work. + // When doing so, Dart will properly receive `null` anyway. + changeRequest.photoURL = [NSURL URLWithString:@""]; + } else { + changeRequest.photoURL = [NSURL URLWithString:profile.photoUrl]; + } + } + + [changeRequest commitChangesWithCompletion:^(NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)verifyBeforeUpdateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationBeforeUpdatingEmail:newEmail + actionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"initializeRecaptchaConfigWithCompletion is not supported on the " + @"MacOS platform."); + completion(nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth initializeRecaptchaConfigWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +#endif +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m new file mode 100644 index 00000000..315bc5ec --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m @@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTIdTokenChannelStreamHandler { + FIRAuth *_auth; + FIRIDTokenDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{@"user" : [NSNull null]}); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeIDTokenDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m new file mode 100644 index 00000000..511d2caa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m @@ -0,0 +1,98 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTPhoneNumberVerificationStreamHandler { + FIRAuth *_auth; + NSString *_phoneNumber; +#if TARGET_OS_OSX +#else + FIRMultiFactorSession *_session; + FIRPhoneMultiFactorInfo *_factorInfo; +#endif +} + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(id)auth request:(InternalVerifyPhoneNumberRequest *)request { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + } + return self; +} +#else +- (instancetype)initWithAuth:(id)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + _session = session; + _factorInfo = factorInfo; + } + return self; +} +#endif + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { +#if TARGET_OS_IPHONE + id completer = ^(NSString *verificationID, NSError *error) { + if (error != nil) { + FlutterError *errorDetails = [FLTFirebaseAuthPlugin convertToFlutterError:error]; + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"code" : errorDetails.code, + @"message" : errorDetails.message, + @"details" : errorDetails.details, + } + }); + } else { + events(@{ + @"name" : @"Auth#phoneCodeSent", + @"verificationId" : verificationID, + }); + } + }; + + // Try catch to capture 'missing URL scheme' error. + @try { + if (_factorInfo != nil) { + [[FIRPhoneAuthProvider providerWithAuth:_auth] + verifyPhoneNumberWithMultiFactorInfo:_factorInfo + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + + } else { + [[FIRPhoneAuthProvider providerWithAuth:_auth] verifyPhoneNumber:_phoneNumber + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + } + } @catch (NSException *exception) { + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"message" : exception.reason, + } + }); + } +#endif + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m new file mode 100644 index 00000000..8d7a7b1c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m @@ -0,0 +1,171 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/PigeonParser.h" +#import +#import "include/Public/CustomPigeonHeader.h" + +@implementation PigeonParser + ++ (InternalUserCredential *) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalUserCredential + makeWithUser:[self getPigeonDetails:authResult.user] + additionalUserInfo:[self getPigeonAdditionalUserInfo:authResult.additionalUserInfo + authorizationCode:authorizationCode] + credential:[self getPigeonAuthCredential:authResult.credential token:nil]]; +} + ++ (InternalUserCredential *)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user { + return [InternalUserCredential makeWithUser:[self getPigeonDetails:user] + additionalUserInfo:nil + credential:nil]; +} + ++ (InternalUserDetails *)getPigeonDetails:(nonnull FIRUser *)user { + return [InternalUserDetails makeWithUserInfo:[self getPigeonUserInfo:user] + providerData:[self getProviderData:user.providerData]]; +} + ++ (InternalUserInfo *)getPigeonUserInfo:(nonnull FIRUser *)user { + NSString *photoUrlString = user.photoURL.absoluteString; + return [InternalUserInfo + makeWithUid:user.uid + email:user.email + displayName:user.displayName + photoUrl:(photoUrlString.length > 0) ? photoUrlString : nil + phoneNumber:user.phoneNumber + isAnonymous:user.isAnonymous + isEmailVerified:user.emailVerified + providerId:user.providerID + tenantId:user.tenantID + refreshToken:user.refreshToken + creationTimestamp:@((long)([user.metadata.creationDate timeIntervalSince1970] * 1000)) + lastSignInTimestamp:@((long)([user.metadata.lastSignInDate timeIntervalSince1970] * 1000))]; +} + ++ (NSArray *> *)getProviderData: + (nonnull NSArray> *)providerData { + NSMutableArray *> *dataArray = + [NSMutableArray arrayWithCapacity:providerData.count]; + + for (id userInfo in providerData) { + NSString *photoUrlStr = userInfo.photoURL.absoluteString; + NSDictionary *dataDict = @{ + @"providerId" : userInfo.providerID, + // Can be null on emulator + @"uid" : userInfo.uid ?: @"", + @"displayName" : userInfo.displayName ?: [NSNull null], + @"email" : userInfo.email ?: [NSNull null], + @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], + @"photoURL" : photoUrlStr ?: [NSNull null], + // isAnonymous is always false on in a providerData object (the user is not anonymous) + @"isAnonymous" : @NO, + // isEmailVerified is always true on in a providerData object (the email is verified by the + // provider) + @"isEmailVerified" : @YES, + }; + [dataArray addObject:dataDict]; + } + return [dataArray copy]; +} + ++ (InternalAdditionalUserInfo *)getPigeonAdditionalUserInfo: + (nonnull FIRAdditionalUserInfo *)userInfo + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalAdditionalUserInfo makeWithIsNewUser:userInfo.isNewUser + providerId:userInfo.providerID + username:userInfo.username + authorizationCode:authorizationCode + profile:userInfo.profile]; +} + ++ (InternalTotpSecret *)getPigeonTotpSecret:(FIRTOTPSecret *)secret { + return [InternalTotpSecret makeWithCodeIntervalSeconds:nil + codeLength:nil + enrollmentCompletionDeadline:nil + hashingAlgorithm:nil + secretKey:secret.sharedSecretKey]; +} + ++ (InternalAuthCredential *)getPigeonAuthCredential:(FIRAuthCredential *)authCredential + token:(NSNumber *_Nullable)token { + if (authCredential == nil) { + return nil; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + NSUInteger nativeId = + token != nil ? [token unsignedLongValue] : (NSUInteger)[authCredential hash]; + + return [InternalAuthCredential makeWithProviderId:authCredential.provider + signInMethod:authCredential.provider + nativeId:nativeId + accessToken:accessToken ?: nil]; +} + ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings { + if (settings == nil) { + return nil; + } + + FIRActionCodeSettings *codeSettings = [[FIRActionCodeSettings alloc] init]; + + if (settings.url != nil) { + codeSettings.URL = [NSURL URLWithString:settings.url]; + } + + if (settings.linkDomain != nil) { + codeSettings.linkDomain = settings.linkDomain; + } + + codeSettings.handleCodeInApp = settings.handleCodeInApp; + + if (settings.iOSBundleId != nil) { + codeSettings.iOSBundleID = settings.iOSBundleId; + } + + return codeSettings; +} + ++ (InternalIdTokenResult *)parseIdTokenResult:(FIRAuthTokenResult *)tokenResult { + long expirationTimestamp = (long)[tokenResult.expirationDate timeIntervalSince1970] * 1000; + long authTimestamp = (long)[tokenResult.authDate timeIntervalSince1970] * 1000; + long issuedAtTimestamp = (long)[tokenResult.issuedAtDate timeIntervalSince1970] * 1000; + + return [InternalIdTokenResult makeWithToken:tokenResult.token + expirationTimestamp:@(expirationTimestamp) + authTimestamp:@(authTimestamp) + issuedAtTimestamp:@(issuedAtTimestamp) + signInProvider:tokenResult.signInProvider + claims:tokenResult.claims + signInSecondFactor:tokenResult.signInSecondFactor]; +} + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails { + NSMutableArray *output = [NSMutableArray array]; + + id userInfoList = [[userDetails userInfo] toList]; + [output addObject:userInfoList]; + + id providerData = [userDetails providerData]; + [output addObject:providerData]; + + return [output copy]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m new file mode 100644 index 00000000..82ae8cfc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m @@ -0,0 +1,3005 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#import "include/Public/firebase_auth_messages.g.h" + +#if TARGET_OS_OSX +@import FlutterMacOS; +#else +@import Flutter; +#endif + +static BOOL __attribute__((unused)) FLTPigeonDeepEquals(id _Nullable a, id _Nullable b) { + if (a == b) { + return YES; + } + if (a == nil) { + return b == [NSNull null]; + } + if (b == nil) { + return a == [NSNull null]; + } + if ([a isKindOfClass:[NSNumber class]] && [b isKindOfClass:[NSNumber class]]) { + return + [a isEqual:b] || (isnan([(NSNumber *)a doubleValue]) && isnan([(NSNumber *)b doubleValue])); + } + if ([a isKindOfClass:[NSArray class]] && [b isKindOfClass:[NSArray class]]) { + NSArray *arrayA = (NSArray *)a; + NSArray *arrayB = (NSArray *)b; + if (arrayA.count != arrayB.count) { + return NO; + } + for (NSUInteger i = 0; i < arrayA.count; i++) { + if (!FLTPigeonDeepEquals(arrayA[i], arrayB[i])) { + return NO; + } + } + return YES; + } + if ([a isKindOfClass:[NSDictionary class]] && [b isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictA = (NSDictionary *)a; + NSDictionary *dictB = (NSDictionary *)b; + if (dictA.count != dictB.count) { + return NO; + } + for (id keyA in dictA) { + id valueA = dictA[keyA]; + BOOL found = NO; + for (id keyB in dictB) { + if (FLTPigeonDeepEquals(keyA, keyB)) { + id valueB = dictB[keyB]; + if (FLTPigeonDeepEquals(valueA, valueB)) { + found = YES; + break; + } else { + return NO; + } + } + } + if (!found) { + return NO; + } + } + return YES; + } + return [a isEqual:b]; +} + +static NSUInteger __attribute__((unused)) FLTPigeonDeepHash(id _Nullable value) { + if (value == nil || value == (id)[NSNull null]) { + return 0; + } + if ([value isKindOfClass:[NSNumber class]]) { + NSNumber *n = (NSNumber *)value; + double d = n.doubleValue; + if (isnan(d)) { + // Normalize NaN to a consistent hash. + return (NSUInteger)0x7FF8000000000000; + } + if (d == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + d = 0.0; + } + return @(d).hash; + } + if ([value isKindOfClass:[NSArray class]]) { + NSUInteger result = 1; + for (id item in (NSArray *)value) { + result = result * 31 + FLTPigeonDeepHash(item); + } + return result; + } + if ([value isKindOfClass:[NSDictionary class]]) { + NSUInteger result = 0; + NSDictionary *dict = (NSDictionary *)value; + for (id key in dict) { + result += ((FLTPigeonDeepHash(key) * 31) ^ FLTPigeonDeepHash(dict[key])); + } + return result; + } + return [value hash]; +} + +static NSArray *wrapResult(id result, FlutterError *error) { + if (error) { + return @[ + error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] + ]; + } + return @[ result ?: [NSNull null] ]; +} + +static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { + id result = array[key]; + return (result == [NSNull null]) ? nil : result; +} + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +@implementation ActionCodeInfoOperationBox +- (instancetype)initWithValue:(ActionCodeInfoOperation)value { + self = [super init]; + if (self) { + _value = value; + } + return self; +} +@end + +@interface InternalMultiFactorSession () ++ (InternalMultiFactorSession *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalPhoneMultiFactorAssertion () ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list; ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalMultiFactorInfo () ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface AuthPigeonFirebaseApp () ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list; ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfoData () ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfo () ++ (InternalActionCodeInfo *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAdditionalUserInfo () ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredential () ++ (InternalAuthCredential *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserInfo () ++ (InternalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserDetails () ++ (InternalUserDetails *)fromList:(NSArray *)list; ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserCredential () ++ (InternalUserCredential *)fromList:(NSArray *)list; ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredentialInput () ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeSettings () ++ (InternalActionCodeSettings *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalFirebaseAuthSettings () ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list; ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalSignInProvider () ++ (InternalSignInProvider *)fromList:(NSArray *)list; ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalVerifyPhoneNumberRequest () ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list; ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalIdTokenResult () ++ (InternalIdTokenResult *)fromList:(NSArray *)list; ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserProfile () ++ (InternalUserProfile *)fromList:(NSArray *)list; ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalTotpSecret () ++ (InternalTotpSecret *)fromList:(NSArray *)list; ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@implementation InternalMultiFactorSession ++ (instancetype)makeWithId:(NSString *)id { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = id; + return pigeonResult; +} ++ (InternalMultiFactorSession *)fromList:(NSArray *)list { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = GetNullableObjectAtIndex(list, 0); + return pigeonResult; +} ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorSession fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.id ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorSession *other = (InternalMultiFactorSession *)object; + return FLTPigeonDeepEquals(self.id, other.id); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.id); + return result; +} +@end + +@implementation InternalPhoneMultiFactorAssertion ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = verificationId; + pigeonResult.verificationCode = verificationCode; + return pigeonResult; +} ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = GetNullableObjectAtIndex(list, 0); + pigeonResult.verificationCode = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list { + return (list) ? [InternalPhoneMultiFactorAssertion fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.verificationId ?: [NSNull null], + self.verificationCode ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalPhoneMultiFactorAssertion *other = (InternalPhoneMultiFactorAssertion *)object; + return FLTPigeonDeepEquals(self.verificationId, other.verificationId) && + FLTPigeonDeepEquals(self.verificationCode, other.verificationCode); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.verificationId); + result = result * 31 + FLTPigeonDeepHash(self.verificationCode); + return result; +} +@end + +@implementation InternalMultiFactorInfo ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.enrollmentTimestamp = enrollmentTimestamp; + pigeonResult.factorId = factorId; + pigeonResult.uid = uid; + pigeonResult.phoneNumber = phoneNumber; + return pigeonResult; +} ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.enrollmentTimestamp = [GetNullableObjectAtIndex(list, 1) doubleValue]; + pigeonResult.factorId = GetNullableObjectAtIndex(list, 2); + pigeonResult.uid = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + @(self.enrollmentTimestamp), + self.factorId ?: [NSNull null], + self.uid ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorInfo *other = (InternalMultiFactorInfo *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + (self.enrollmentTimestamp == other.enrollmentTimestamp || + (isnan(self.enrollmentTimestamp) && isnan(other.enrollmentTimestamp))) && + FLTPigeonDeepEquals(self.factorId, other.factorId) && + FLTPigeonDeepEquals(self.uid, other.uid) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + (isnan(self.enrollmentTimestamp) ? (NSUInteger)0x7FF8000000000000 + : @(self.enrollmentTimestamp).hash); + result = result * 31 + FLTPigeonDeepHash(self.factorId); + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + return result; +} +@end + +@implementation AuthPigeonFirebaseApp ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = appName; + pigeonResult.tenantId = tenantId; + pigeonResult.customAuthDomain = customAuthDomain; + return pigeonResult; +} ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = GetNullableObjectAtIndex(list, 0); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 1); + pigeonResult.customAuthDomain = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list { + return (list) ? [AuthPigeonFirebaseApp fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.appName ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.customAuthDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + AuthPigeonFirebaseApp *other = (AuthPigeonFirebaseApp *)object; + return FLTPigeonDeepEquals(self.appName, other.appName) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.customAuthDomain, other.customAuthDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.appName); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.customAuthDomain); + return result; +} +@end + +@implementation InternalActionCodeInfoData ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = email; + pigeonResult.previousEmail = previousEmail; + return pigeonResult; +} ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = GetNullableObjectAtIndex(list, 0); + pigeonResult.previousEmail = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfoData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.email ?: [NSNull null], + self.previousEmail ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfoData *other = (InternalActionCodeInfoData *)object; + return FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.previousEmail, other.previousEmail); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.previousEmail); + return result; +} +@end + +@implementation InternalActionCodeInfo ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + pigeonResult.operation = operation; + pigeonResult.data = data; + return pigeonResult; +} ++ (InternalActionCodeInfo *)fromList:(NSArray *)list { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + ActionCodeInfoOperationBox *boxedActionCodeInfoOperation = GetNullableObjectAtIndex(list, 0); + pigeonResult.operation = boxedActionCodeInfoOperation.value; + pigeonResult.data = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + [[ActionCodeInfoOperationBox alloc] initWithValue:self.operation], + self.data ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfo *other = (InternalActionCodeInfo *)object; + return self.operation == other.operation && FLTPigeonDeepEquals(self.data, other.data); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.operation).hash; + result = result * 31 + FLTPigeonDeepHash(self.data); + return result; +} +@end + +@implementation InternalAdditionalUserInfo ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = isNewUser; + pigeonResult.providerId = providerId; + pigeonResult.username = username; + pigeonResult.authorizationCode = authorizationCode; + pigeonResult.profile = profile; + return pigeonResult; +} ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 1); + pigeonResult.username = GetNullableObjectAtIndex(list, 2); + pigeonResult.authorizationCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.profile = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAdditionalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.isNewUser), + self.providerId ?: [NSNull null], + self.username ?: [NSNull null], + self.authorizationCode ?: [NSNull null], + self.profile ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAdditionalUserInfo *other = (InternalAdditionalUserInfo *)object; + return self.isNewUser == other.isNewUser && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.username, other.username) && + FLTPigeonDeepEquals(self.authorizationCode, other.authorizationCode) && + FLTPigeonDeepEquals(self.profile, other.profile); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.isNewUser).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.username); + result = result * 31 + FLTPigeonDeepHash(self.authorizationCode); + result = result * 31 + FLTPigeonDeepHash(self.profile); + return result; +} +@end + +@implementation InternalAuthCredential ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.nativeId = nativeId; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredential *)fromList:(NSArray *)list { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.nativeId = [GetNullableObjectAtIndex(list, 2) integerValue]; + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + @(self.nativeId), + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredential *other = (InternalAuthCredential *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + self.nativeId == other.nativeId && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + @(self.nativeId).hash; + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalUserInfo ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = uid; + pigeonResult.email = email; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.isAnonymous = isAnonymous; + pigeonResult.isEmailVerified = isEmailVerified; + pigeonResult.providerId = providerId; + pigeonResult.tenantId = tenantId; + pigeonResult.refreshToken = refreshToken; + pigeonResult.creationTimestamp = creationTimestamp; + pigeonResult.lastSignInTimestamp = lastSignInTimestamp; + return pigeonResult; +} ++ (InternalUserInfo *)fromList:(NSArray *)list { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = GetNullableObjectAtIndex(list, 0); + pigeonResult.email = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayName = GetNullableObjectAtIndex(list, 2); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + pigeonResult.isAnonymous = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.isEmailVerified = [GetNullableObjectAtIndex(list, 6) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 7); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 8); + pigeonResult.refreshToken = GetNullableObjectAtIndex(list, 9); + pigeonResult.creationTimestamp = GetNullableObjectAtIndex(list, 10); + pigeonResult.lastSignInTimestamp = GetNullableObjectAtIndex(list, 11); + return pigeonResult; +} ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.uid ?: [NSNull null], + self.email ?: [NSNull null], + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + @(self.isAnonymous), + @(self.isEmailVerified), + self.providerId ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.refreshToken ?: [NSNull null], + self.creationTimestamp ?: [NSNull null], + self.lastSignInTimestamp ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserInfo *other = (InternalUserInfo *)object; + return FLTPigeonDeepEquals(self.uid, other.uid) && FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.isAnonymous == other.isAnonymous && self.isEmailVerified == other.isEmailVerified && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.refreshToken, other.refreshToken) && + FLTPigeonDeepEquals(self.creationTimestamp, other.creationTimestamp) && + FLTPigeonDeepEquals(self.lastSignInTimestamp, other.lastSignInTimestamp); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.isAnonymous).hash; + result = result * 31 + @(self.isEmailVerified).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.refreshToken); + result = result * 31 + FLTPigeonDeepHash(self.creationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.lastSignInTimestamp); + return result; +} +@end + +@implementation InternalUserDetails ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = userInfo; + pigeonResult.providerData = providerData; + return pigeonResult; +} ++ (InternalUserDetails *)fromList:(NSArray *)list { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = GetNullableObjectAtIndex(list, 0); + pigeonResult.providerData = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserDetails fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.userInfo ?: [NSNull null], + self.providerData ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserDetails *other = (InternalUserDetails *)object; + return FLTPigeonDeepEquals(self.userInfo, other.userInfo) && + FLTPigeonDeepEquals(self.providerData, other.providerData); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.userInfo); + result = result * 31 + FLTPigeonDeepHash(self.providerData); + return result; +} +@end + +@implementation InternalUserCredential ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = user; + pigeonResult.additionalUserInfo = additionalUserInfo; + pigeonResult.credential = credential; + return pigeonResult; +} ++ (InternalUserCredential *)fromList:(NSArray *)list { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = GetNullableObjectAtIndex(list, 0); + pigeonResult.additionalUserInfo = GetNullableObjectAtIndex(list, 1); + pigeonResult.credential = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.user ?: [NSNull null], + self.additionalUserInfo ?: [NSNull null], + self.credential ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserCredential *other = (InternalUserCredential *)object; + return FLTPigeonDeepEquals(self.user, other.user) && + FLTPigeonDeepEquals(self.additionalUserInfo, other.additionalUserInfo) && + FLTPigeonDeepEquals(self.credential, other.credential); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.user); + result = result * 31 + FLTPigeonDeepHash(self.additionalUserInfo); + result = result * 31 + FLTPigeonDeepHash(self.credential); + return result; +} +@end + +@implementation InternalAuthCredentialInput ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.token = token; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.token = GetNullableObjectAtIndex(list, 2); + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredentialInput fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + self.token ?: [NSNull null], + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredentialInput *other = (InternalAuthCredentialInput *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalActionCodeSettings ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = url; + pigeonResult.dynamicLinkDomain = dynamicLinkDomain; + pigeonResult.handleCodeInApp = handleCodeInApp; + pigeonResult.iOSBundleId = iOSBundleId; + pigeonResult.androidPackageName = androidPackageName; + pigeonResult.androidInstallApp = androidInstallApp; + pigeonResult.androidMinimumVersion = androidMinimumVersion; + pigeonResult.linkDomain = linkDomain; + return pigeonResult; +} ++ (InternalActionCodeSettings *)fromList:(NSArray *)list { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = GetNullableObjectAtIndex(list, 0); + pigeonResult.dynamicLinkDomain = GetNullableObjectAtIndex(list, 1); + pigeonResult.handleCodeInApp = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.iOSBundleId = GetNullableObjectAtIndex(list, 3); + pigeonResult.androidPackageName = GetNullableObjectAtIndex(list, 4); + pigeonResult.androidInstallApp = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.androidMinimumVersion = GetNullableObjectAtIndex(list, 6); + pigeonResult.linkDomain = GetNullableObjectAtIndex(list, 7); + return pigeonResult; +} ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.url ?: [NSNull null], + self.dynamicLinkDomain ?: [NSNull null], + @(self.handleCodeInApp), + self.iOSBundleId ?: [NSNull null], + self.androidPackageName ?: [NSNull null], + @(self.androidInstallApp), + self.androidMinimumVersion ?: [NSNull null], + self.linkDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeSettings *other = (InternalActionCodeSettings *)object; + return FLTPigeonDeepEquals(self.url, other.url) && + FLTPigeonDeepEquals(self.dynamicLinkDomain, other.dynamicLinkDomain) && + self.handleCodeInApp == other.handleCodeInApp && + FLTPigeonDeepEquals(self.iOSBundleId, other.iOSBundleId) && + FLTPigeonDeepEquals(self.androidPackageName, other.androidPackageName) && + self.androidInstallApp == other.androidInstallApp && + FLTPigeonDeepEquals(self.androidMinimumVersion, other.androidMinimumVersion) && + FLTPigeonDeepEquals(self.linkDomain, other.linkDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.url); + result = result * 31 + FLTPigeonDeepHash(self.dynamicLinkDomain); + result = result * 31 + @(self.handleCodeInApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.iOSBundleId); + result = result * 31 + FLTPigeonDeepHash(self.androidPackageName); + result = result * 31 + @(self.androidInstallApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.androidMinimumVersion); + result = result * 31 + FLTPigeonDeepHash(self.linkDomain); + return result; +} +@end + +@implementation InternalFirebaseAuthSettings ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = appVerificationDisabledForTesting; + pigeonResult.userAccessGroup = userAccessGroup; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.smsCode = smsCode; + pigeonResult.forceRecaptchaFlow = forceRecaptchaFlow; + return pigeonResult; +} ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.userAccessGroup = GetNullableObjectAtIndex(list, 1); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 2); + pigeonResult.smsCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.forceRecaptchaFlow = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalFirebaseAuthSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.appVerificationDisabledForTesting), + self.userAccessGroup ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + self.smsCode ?: [NSNull null], + self.forceRecaptchaFlow ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalFirebaseAuthSettings *other = (InternalFirebaseAuthSettings *)object; + return self.appVerificationDisabledForTesting == other.appVerificationDisabledForTesting && + FLTPigeonDeepEquals(self.userAccessGroup, other.userAccessGroup) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + FLTPigeonDeepEquals(self.smsCode, other.smsCode) && + FLTPigeonDeepEquals(self.forceRecaptchaFlow, other.forceRecaptchaFlow); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.appVerificationDisabledForTesting).hash; + result = result * 31 + FLTPigeonDeepHash(self.userAccessGroup); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + FLTPigeonDeepHash(self.smsCode); + result = result * 31 + FLTPigeonDeepHash(self.forceRecaptchaFlow); + return result; +} +@end + +@implementation InternalSignInProvider ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.scopes = scopes; + pigeonResult.customParameters = customParameters; + return pigeonResult; +} ++ (InternalSignInProvider *)fromList:(NSArray *)list { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.scopes = GetNullableObjectAtIndex(list, 1); + pigeonResult.customParameters = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list { + return (list) ? [InternalSignInProvider fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.scopes ?: [NSNull null], + self.customParameters ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalSignInProvider *other = (InternalSignInProvider *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.scopes, other.scopes) && + FLTPigeonDeepEquals(self.customParameters, other.customParameters); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.scopes); + result = result * 31 + FLTPigeonDeepHash(self.customParameters); + return result; +} +@end + +@implementation InternalVerifyPhoneNumberRequest ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.timeout = timeout; + pigeonResult.forceResendingToken = forceResendingToken; + pigeonResult.autoRetrievedSmsCodeForTesting = autoRetrievedSmsCodeForTesting; + pigeonResult.multiFactorInfoId = multiFactorInfoId; + pigeonResult.multiFactorSessionId = multiFactorSessionId; + return pigeonResult; +} ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 0); + pigeonResult.timeout = [GetNullableObjectAtIndex(list, 1) integerValue]; + pigeonResult.forceResendingToken = GetNullableObjectAtIndex(list, 2); + pigeonResult.autoRetrievedSmsCodeForTesting = GetNullableObjectAtIndex(list, 3); + pigeonResult.multiFactorInfoId = GetNullableObjectAtIndex(list, 4); + pigeonResult.multiFactorSessionId = GetNullableObjectAtIndex(list, 5); + return pigeonResult; +} ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list { + return (list) ? [InternalVerifyPhoneNumberRequest fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.phoneNumber ?: [NSNull null], + @(self.timeout), + self.forceResendingToken ?: [NSNull null], + self.autoRetrievedSmsCodeForTesting ?: [NSNull null], + self.multiFactorInfoId ?: [NSNull null], + self.multiFactorSessionId ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalVerifyPhoneNumberRequest *other = (InternalVerifyPhoneNumberRequest *)object; + return FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.timeout == other.timeout && + FLTPigeonDeepEquals(self.forceResendingToken, other.forceResendingToken) && + FLTPigeonDeepEquals(self.autoRetrievedSmsCodeForTesting, + other.autoRetrievedSmsCodeForTesting) && + FLTPigeonDeepEquals(self.multiFactorInfoId, other.multiFactorInfoId) && + FLTPigeonDeepEquals(self.multiFactorSessionId, other.multiFactorSessionId); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.timeout).hash; + result = result * 31 + FLTPigeonDeepHash(self.forceResendingToken); + result = result * 31 + FLTPigeonDeepHash(self.autoRetrievedSmsCodeForTesting); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorInfoId); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorSessionId); + return result; +} +@end + +@implementation InternalIdTokenResult ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = token; + pigeonResult.expirationTimestamp = expirationTimestamp; + pigeonResult.authTimestamp = authTimestamp; + pigeonResult.issuedAtTimestamp = issuedAtTimestamp; + pigeonResult.signInProvider = signInProvider; + pigeonResult.claims = claims; + pigeonResult.signInSecondFactor = signInSecondFactor; + return pigeonResult; +} ++ (InternalIdTokenResult *)fromList:(NSArray *)list { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = GetNullableObjectAtIndex(list, 0); + pigeonResult.expirationTimestamp = GetNullableObjectAtIndex(list, 1); + pigeonResult.authTimestamp = GetNullableObjectAtIndex(list, 2); + pigeonResult.issuedAtTimestamp = GetNullableObjectAtIndex(list, 3); + pigeonResult.signInProvider = GetNullableObjectAtIndex(list, 4); + pigeonResult.claims = GetNullableObjectAtIndex(list, 5); + pigeonResult.signInSecondFactor = GetNullableObjectAtIndex(list, 6); + return pigeonResult; +} ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list { + return (list) ? [InternalIdTokenResult fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.token ?: [NSNull null], + self.expirationTimestamp ?: [NSNull null], + self.authTimestamp ?: [NSNull null], + self.issuedAtTimestamp ?: [NSNull null], + self.signInProvider ?: [NSNull null], + self.claims ?: [NSNull null], + self.signInSecondFactor ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalIdTokenResult *other = (InternalIdTokenResult *)object; + return FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.expirationTimestamp, other.expirationTimestamp) && + FLTPigeonDeepEquals(self.authTimestamp, other.authTimestamp) && + FLTPigeonDeepEquals(self.issuedAtTimestamp, other.issuedAtTimestamp) && + FLTPigeonDeepEquals(self.signInProvider, other.signInProvider) && + FLTPigeonDeepEquals(self.claims, other.claims) && + FLTPigeonDeepEquals(self.signInSecondFactor, other.signInSecondFactor); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.expirationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.authTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.issuedAtTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.signInProvider); + result = result * 31 + FLTPigeonDeepHash(self.claims); + result = result * 31 + FLTPigeonDeepHash(self.signInSecondFactor); + return result; +} +@end + +@implementation InternalUserProfile ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.displayNameChanged = displayNameChanged; + pigeonResult.photoUrlChanged = photoUrlChanged; + return pigeonResult; +} ++ (InternalUserProfile *)fromList:(NSArray *)list { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayNameChanged = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.photoUrlChanged = [GetNullableObjectAtIndex(list, 3) boolValue]; + return pigeonResult; +} ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserProfile fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + @(self.displayNameChanged), + @(self.photoUrlChanged), + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserProfile *other = (InternalUserProfile *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + self.displayNameChanged == other.displayNameChanged && + self.photoUrlChanged == other.photoUrlChanged; +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + @(self.displayNameChanged).hash; + result = result * 31 + @(self.photoUrlChanged).hash; + return result; +} +@end + +@implementation InternalTotpSecret ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = codeIntervalSeconds; + pigeonResult.codeLength = codeLength; + pigeonResult.enrollmentCompletionDeadline = enrollmentCompletionDeadline; + pigeonResult.hashingAlgorithm = hashingAlgorithm; + pigeonResult.secretKey = secretKey; + return pigeonResult; +} ++ (InternalTotpSecret *)fromList:(NSArray *)list { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = GetNullableObjectAtIndex(list, 0); + pigeonResult.codeLength = GetNullableObjectAtIndex(list, 1); + pigeonResult.enrollmentCompletionDeadline = GetNullableObjectAtIndex(list, 2); + pigeonResult.hashingAlgorithm = GetNullableObjectAtIndex(list, 3); + pigeonResult.secretKey = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list { + return (list) ? [InternalTotpSecret fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.codeIntervalSeconds ?: [NSNull null], + self.codeLength ?: [NSNull null], + self.enrollmentCompletionDeadline ?: [NSNull null], + self.hashingAlgorithm ?: [NSNull null], + self.secretKey ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalTotpSecret *other = (InternalTotpSecret *)object; + return FLTPigeonDeepEquals(self.codeIntervalSeconds, other.codeIntervalSeconds) && + FLTPigeonDeepEquals(self.codeLength, other.codeLength) && + FLTPigeonDeepEquals(self.enrollmentCompletionDeadline, + other.enrollmentCompletionDeadline) && + FLTPigeonDeepEquals(self.hashingAlgorithm, other.hashingAlgorithm) && + FLTPigeonDeepEquals(self.secretKey, other.secretKey); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.codeIntervalSeconds); + result = result * 31 + FLTPigeonDeepHash(self.codeLength); + result = result * 31 + FLTPigeonDeepHash(self.enrollmentCompletionDeadline); + result = result * 31 + FLTPigeonDeepHash(self.hashingAlgorithm); + result = result * 31 + FLTPigeonDeepHash(self.secretKey); + return result; +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReader : FlutterStandardReader +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReader +- (nullable id)readValueOfType:(UInt8)type { + switch (type) { + case 129: { + NSNumber *enumAsNumber = [self readValue]; + return enumAsNumber == nil + ? nil + : [[ActionCodeInfoOperationBox alloc] initWithValue:[enumAsNumber integerValue]]; + } + case 130: + return [InternalMultiFactorSession fromList:[self readValue]]; + case 131: + return [InternalPhoneMultiFactorAssertion fromList:[self readValue]]; + case 132: + return [InternalMultiFactorInfo fromList:[self readValue]]; + case 133: + return [AuthPigeonFirebaseApp fromList:[self readValue]]; + case 134: + return [InternalActionCodeInfoData fromList:[self readValue]]; + case 135: + return [InternalActionCodeInfo fromList:[self readValue]]; + case 136: + return [InternalAdditionalUserInfo fromList:[self readValue]]; + case 137: + return [InternalAuthCredential fromList:[self readValue]]; + case 138: + return [InternalUserInfo fromList:[self readValue]]; + case 139: + return [InternalUserDetails fromList:[self readValue]]; + case 140: + return [InternalUserCredential fromList:[self readValue]]; + case 141: + return [InternalAuthCredentialInput fromList:[self readValue]]; + case 142: + return [InternalActionCodeSettings fromList:[self readValue]]; + case 143: + return [InternalFirebaseAuthSettings fromList:[self readValue]]; + case 144: + return [InternalSignInProvider fromList:[self readValue]]; + case 145: + return [InternalVerifyPhoneNumberRequest fromList:[self readValue]]; + case 146: + return [InternalIdTokenResult fromList:[self readValue]]; + case 147: + return [InternalUserProfile fromList:[self readValue]]; + case 148: + return [InternalTotpSecret fromList:[self readValue]]; + default: + return [super readValueOfType:type]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecWriter : FlutterStandardWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecWriter +- (void)writeValue:(id)value { + if ([value isKindOfClass:[ActionCodeInfoOperationBox class]]) { + ActionCodeInfoOperationBox *box = (ActionCodeInfoOperationBox *)value; + [self writeByte:129]; + [self writeValue:(value == nil ? [NSNull null] : [NSNumber numberWithInteger:box.value])]; + } else if ([value isKindOfClass:[InternalMultiFactorSession class]]) { + [self writeByte:130]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalPhoneMultiFactorAssertion class]]) { + [self writeByte:131]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalMultiFactorInfo class]]) { + [self writeByte:132]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[AuthPigeonFirebaseApp class]]) { + [self writeByte:133]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfoData class]]) { + [self writeByte:134]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfo class]]) { + [self writeByte:135]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAdditionalUserInfo class]]) { + [self writeByte:136]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredential class]]) { + [self writeByte:137]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserInfo class]]) { + [self writeByte:138]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserDetails class]]) { + [self writeByte:139]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserCredential class]]) { + [self writeByte:140]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredentialInput class]]) { + [self writeByte:141]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeSettings class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalFirebaseAuthSettings class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalSignInProvider class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalVerifyPhoneNumberRequest class]]) { + [self writeByte:145]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalIdTokenResult class]]) { + [self writeByte:146]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserProfile class]]) { + [self writeByte:147]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalTotpSecret class]]) { + [self writeByte:148]; + [self writeValue:[value toList]]; + } else { + [super writeValue:value]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReaderWriter : FlutterStandardReaderWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecWriter alloc] initWithData:data]; +} +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecReader alloc] initWithData:data]; +} +@end + +NSObject *nullGetFirebaseAuthMessagesCodec(void) { + static FlutterStandardMessageCodec *sSharedObject = nil; + static dispatch_once_t sPred = 0; + dispatch_once(&sPred, ^{ + nullFirebaseAuthMessagesPigeonCodecReaderWriter *readerWriter = + [[nullFirebaseAuthMessagesPigeonCodecReaderWriter alloc] init]; + sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; + }); + return sSharedObject; +} +void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerIdTokenListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerIdTokenListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerIdTokenListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerIdTokenListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerAuthStateListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerAuthStateListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerAuthStateListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerAuthStateListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.useEmulator", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(useEmulatorApp:host:port:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(useEmulatorApp:host:port:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_host = GetNullableObjectAtIndex(args, 1); + NSInteger arg_port = [GetNullableObjectAtIndex(args, 2) integerValue]; + [api useEmulatorApp:arg_app + host:arg_host + port:arg_port + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.applyActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(applyActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(applyActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api applyActionCodeApp:arg_app + code:arg_code + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.checkActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(checkActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(checkActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api checkActionCodeApp:arg_app + code:arg_code + completion:^(InternalActionCodeInfo *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.confirmPasswordReset", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(confirmPasswordResetApp:code:newPassword:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(confirmPasswordResetApp:code:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 2); + [api confirmPasswordResetApp:arg_app + code:arg_code + newPassword:arg_newPassword + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.createUserWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api + respondsToSelector:@selector( + createUserWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(createUserWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api createUserWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInAnonymously", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInAnonymouslyApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInAnonymouslyApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signInAnonymouslyApp:arg_app + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCredentialApp:input:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api signInWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCustomToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCustomTokenApp:token:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCustomTokenApp:token:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_token = GetNullableObjectAtIndex(args, 1); + [api signInWithCustomTokenApp:arg_app + token:arg_token + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + signInWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailLink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithEmailLinkApp:email:emailLink:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailLinkApp:email:emailLink:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_emailLink = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailLinkApp:arg_app + email:arg_email + emailLink:arg_emailLink + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api signInWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.signOut", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signOutApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to @selector(signOutApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signOutApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.fetchSignInMethodsForEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(fetchSignInMethodsForEmailApp:email:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(fetchSignInMethodsForEmailApp:email:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + [api fetchSignInMethodsForEmailApp:arg_app + email:arg_email + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendPasswordResetEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendPasswordResetEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendSignInLinkToEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendSignInLinkToEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setLanguageCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setLanguageCodeApp:languageCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setLanguageCodeApp:languageCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_languageCode = GetNullableObjectAtIndex(args, 1); + [api setLanguageCodeApp:arg_app + languageCode:arg_languageCode + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setSettings", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setSettingsApp:settings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setSettingsApp:settings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalFirebaseAuthSettings *arg_settings = GetNullableObjectAtIndex(args, 1); + [api setSettingsApp:arg_app + settings:arg_settings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPasswordResetCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPasswordResetCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPasswordResetCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api verifyPasswordResetCodeApp:arg_app + code:arg_code + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPhoneNumberApp:request:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPhoneNumberApp:request:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalVerifyPhoneNumberRequest *arg_request = GetNullableObjectAtIndex(args, 1); + [api verifyPhoneNumberApp:arg_app + request:arg_request + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeTokenWithAuthorizationCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeTokenWithAuthorizationCodeApp: + authorizationCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeTokenWithAuthorizationCodeApp:authorizationCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_authorizationCode = GetNullableObjectAtIndex(args, 1); + [api revokeTokenWithAuthorizationCodeApp:arg_app + authorizationCode:arg_authorizationCode + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeAccessToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeAccessTokenApp:accessToken:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeAccessTokenApp:accessToken:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_accessToken = GetNullableObjectAtIndex(args, 1); + [api revokeAccessTokenApp:arg_app + accessToken:arg_accessToken + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.initializeRecaptchaConfig", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(initializeRecaptchaConfigApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(initializeRecaptchaConfigApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api initializeRecaptchaConfigApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.delete", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(deleteApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(deleteApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api deleteApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.getIdToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getIdTokenApp:forceRefresh:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(getIdTokenApp:forceRefresh:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + BOOL arg_forceRefresh = [GetNullableObjectAtIndex(args, 1) boolValue]; + [api getIdTokenApp:arg_app + forceRefresh:arg_forceRefresh + completion:^(InternalIdTokenResult *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api linkWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api linkWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reauthenticateWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + reauthenticateWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.reload", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reloadApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(reloadApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api reloadApp:arg_app + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.sendEmailVerification", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + sendEmailVerificationApp:actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(sendEmailVerificationApp:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 1); + [api sendEmailVerificationApp:arg_app + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.unlink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unlinkApp:providerId:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(unlinkApp:providerId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_providerId = GetNullableObjectAtIndex(args, 1); + [api unlinkApp:arg_app + providerId:arg_providerId + completion:^(InternalUserCredential *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.updateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateEmailApp:newEmail:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateEmailApp:newEmail:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + [api + updateEmailApp:arg_app + newEmail:arg_newEmail + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePasswordApp:newPassword:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePasswordApp:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 1); + [api updatePasswordApp:arg_app + newPassword:arg_newPassword + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePhoneNumberApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePhoneNumberApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api updatePhoneNumberApp:arg_app + input:arg_input + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updateProfile", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateProfileApp:profile:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateProfileApp:profile:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalUserProfile *arg_profile = GetNullableObjectAtIndex(args, 1); + [api updateProfileApp:arg_app + profile:arg_profile + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.verifyBeforeUpdateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyBeforeUpdateEmailApp:newEmail: + actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(verifyBeforeUpdateEmailApp:newEmail:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api verifyBeforeUpdateEmailApp:arg_app + newEmail:arg_newEmail + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollPhone", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollPhoneApp:assertion:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollPhoneApp:assertion:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollPhoneApp:arg_app + assertion:arg_assertion + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollTotp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollTotpApp:assertionId:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollTotpApp:assertionId:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_assertionId = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollTotpApp:arg_app + assertionId:arg_assertionId + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.getSession", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getSessionApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getSessionApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getSessionApp:arg_app + completion:^(InternalMultiFactorSession *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.unenroll", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unenrollApp:factorUid:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(unenrollApp:factorUid:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_factorUid = GetNullableObjectAtIndex(args, 1); + [api unenrollApp:arg_app + factorUid:arg_factorUid + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorUserHostApi.getEnrolledFactors", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getEnrolledFactorsApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getEnrolledFactorsApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getEnrolledFactorsApp:arg_app + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactoResolverHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactoResolverHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactoResolverHostApi.resolveSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)], + @"MultiFactoResolverHostApi api (%@) doesn't respond to " + @"@selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_resolverId = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_totpAssertionId = GetNullableObjectAtIndex(args, 2); + [api resolveSignInResolverId:arg_resolverId + assertion:arg_assertion + totpAssertionId:arg_totpAssertionId + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.generateSecret", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(generateSecretSessionId:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(generateSecretSessionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_sessionId = GetNullableObjectAtIndex(args, 0); + [api generateSecretSessionId:arg_sessionId + completion:^(InternalTotpSecret *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForEnrollment", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForEnrollmentSecretKey:arg_secretKey + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_enrollmentId = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForSignInEnrollmentId:arg_enrollmentId + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpSecretHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpSecretHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpSecretHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.generateQrCodeUrl", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + generateQrCodeUrlSecretKey:accountName:issuer:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(generateQrCodeUrlSecretKey:accountName:issuer:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_accountName = GetNullableObjectAtIndex(args, 1); + NSString *arg_issuer = GetNullableObjectAtIndex(args, 2); + [api generateQrCodeUrlSecretKey:arg_secretKey + accountName:arg_accountName + issuer:arg_issuer + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.openInOtpApp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_qrCodeUrl = GetNullableObjectAtIndex(args, 1); + [api openInOtpAppSecretKey:arg_secretKey + qrCodeUrl:arg_qrCodeUrl + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *api) { + SetUpGenerateInterfacesWithSuffix(binaryMessenger, api, @""); +} + +void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.GenerateInterfaces.pigeonInterface", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(pigeonInterfaceInfo:error:)], + @"GenerateInterfaces api (%@) doesn't respond to @selector(pigeonInterfaceInfo:error:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + InternalMultiFactorInfo *arg_info = GetNullableObjectAtIndex(args, 0); + FlutterError *error; + [api pigeonInterfaceInfo:arg_info error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h new file mode 100644 index 00000000..7b7efae7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h @@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import "../Public/CustomPigeonHeader.h" + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTAuthStateChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h new file mode 100644 index 00000000..c1660499 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/CustomPigeonHeader.h" + +#import + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTIdTokenChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h new file mode 100644 index 00000000..53e5f28c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/firebase_auth_messages.g.h" + +#import + +@class FIRAuth; +@class FIRMultiFactorSession; +@class FIRPhoneMultiFactorInfo; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTPhoneNumberVerificationStreamHandler : NSObject + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(FIRAuth *)auth arguments:(NSDictionary *)arguments; +#else +- (instancetype)initWithAuth:(FIRAuth *)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo; +#endif + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h new file mode 100644 index 00000000..b500fd2c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h @@ -0,0 +1,33 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#import +#import "../Public/firebase_auth_messages.g.h" + +@class FIRAuthDataResult; +@class FIRUser; +@class FIRActionCodeSettings; +@class FIRAuthTokenResult; +@class FIRTOTPSecret; +@class FIRAuthCredential; + +@interface PigeonParser : NSObject + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails; ++ (InternalUserCredential *_Nullable) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode; ++ (InternalUserDetails *_Nullable)getPigeonDetails:(nonnull FIRUser *)user; ++ (InternalUserInfo *_Nullable)getPigeonUserInfo:(nonnull FIRUser *)user; ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings; ++ (InternalUserCredential *_Nullable)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user; ++ (InternalIdTokenResult *_Nonnull)parseIdTokenResult:(nonnull FIRAuthTokenResult *)tokenResult; ++ (InternalTotpSecret *_Nonnull)getPigeonTotpSecret:(nonnull FIRTOTPSecret *)secret; ++ (InternalAuthCredential *_Nullable)getPigeonAuthCredential: + (FIRAuthCredential *_Nullable)authCredentialToken + token:(NSNumber *_Nullable)token; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h new file mode 100644 index 00000000..d32a6b45 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h @@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#import "firebase_auth_messages.g.h" + +@interface InternalMultiFactorInfo (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserDetails (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserInfo (Map) +- (NSDictionary *)toList; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h new file mode 100644 index 00000000..53e20eca --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import +#if __has_include() +#import +#else +#import +#endif +#import "firebase_auth_messages.g.h" + +#if !TARGET_OS_OSX +@protocol FlutterSceneLifeCycleDelegate; +#endif + +@interface FLTFirebaseAuthPlugin + : FLTFirebasePlugin ) + , + FlutterSceneLifeCycleDelegate +#endif +#endif + > + ++ (FlutterError *)convertToFlutterError:(NSError *)error; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h new file mode 100644 index 00000000..f83da7e3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h @@ -0,0 +1,571 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +@import Foundation; + +@protocol FlutterBinaryMessenger; +@protocol FlutterMessageCodec; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +typedef NS_ENUM(NSUInteger, ActionCodeInfoOperation) { + /// Unknown operation. + ActionCodeInfoOperationUnknown = 0, + /// Password reset code generated via [sendPasswordResetEmail]. + ActionCodeInfoOperationPasswordReset = 1, + /// Email verification code generated via [User.sendEmailVerification]. + ActionCodeInfoOperationVerifyEmail = 2, + /// Email change revocation code generated via [User.updateEmail]. + ActionCodeInfoOperationRecoverEmail = 3, + /// Email sign in code generated via [sendSignInLinkToEmail]. + ActionCodeInfoOperationEmailSignIn = 4, + /// Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + ActionCodeInfoOperationVerifyAndChangeEmail = 5, + /// Action code for reverting second factor addition. + ActionCodeInfoOperationRevertSecondFactorAddition = 6, +}; + +/// Wrapper for ActionCodeInfoOperation to allow for nullability. +@interface ActionCodeInfoOperationBox : NSObject +@property(nonatomic, assign) ActionCodeInfoOperation value; +- (instancetype)initWithValue:(ActionCodeInfoOperation)value; +@end + +@class InternalMultiFactorSession; +@class InternalPhoneMultiFactorAssertion; +@class InternalMultiFactorInfo; +@class AuthPigeonFirebaseApp; +@class InternalActionCodeInfoData; +@class InternalActionCodeInfo; +@class InternalAdditionalUserInfo; +@class InternalAuthCredential; +@class InternalUserInfo; +@class InternalUserDetails; +@class InternalUserCredential; +@class InternalAuthCredentialInput; +@class InternalActionCodeSettings; +@class InternalFirebaseAuthSettings; +@class InternalSignInProvider; +@class InternalVerifyPhoneNumberRequest; +@class InternalIdTokenResult; +@class InternalUserProfile; +@class InternalTotpSecret; + +@interface InternalMultiFactorSession : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithId:(NSString *)id; +@property(nonatomic, copy) NSString *id; +@end + +@interface InternalPhoneMultiFactorAssertion : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode; +@property(nonatomic, copy) NSString *verificationId; +@property(nonatomic, copy) NSString *verificationCode; +@end + +@interface InternalMultiFactorInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, assign) double enrollmentTimestamp; +@property(nonatomic, copy, nullable) NSString *factorId; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@end + +@interface AuthPigeonFirebaseApp : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain; +@property(nonatomic, copy) NSString *appName; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *customAuthDomain; +@end + +@interface InternalActionCodeInfoData : NSObject ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *previousEmail; +@end + +@interface InternalActionCodeInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data; +@property(nonatomic, assign) ActionCodeInfoOperation operation; +@property(nonatomic, strong) InternalActionCodeInfoData *data; +@end + +@interface InternalAdditionalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile; +@property(nonatomic, assign) BOOL isNewUser; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *username; +@property(nonatomic, copy, nullable) NSString *authorizationCode; +@property(nonatomic, copy, nullable) NSDictionary *profile; +@end + +@interface InternalAuthCredential : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, assign) NSInteger nativeId; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) BOOL isAnonymous; +@property(nonatomic, assign) BOOL isEmailVerified; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *refreshToken; +@property(nonatomic, strong, nullable) NSNumber *creationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *lastSignInTimestamp; +@end + +@interface InternalUserDetails : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData; +@property(nonatomic, strong) InternalUserInfo *userInfo; +@property(nonatomic, copy) NSArray *> *providerData; +@end + +@interface InternalUserCredential : NSObject ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential; +@property(nonatomic, strong, nullable) InternalUserDetails *user; +@property(nonatomic, strong, nullable) InternalAdditionalUserInfo *additionalUserInfo; +@property(nonatomic, strong, nullable) InternalAuthCredential *credential; +@end + +@interface InternalAuthCredentialInput : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalActionCodeSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain; +@property(nonatomic, copy) NSString *url; +@property(nonatomic, copy, nullable) NSString *dynamicLinkDomain; +@property(nonatomic, assign) BOOL handleCodeInApp; +@property(nonatomic, copy, nullable) NSString *iOSBundleId; +@property(nonatomic, copy, nullable) NSString *androidPackageName; +@property(nonatomic, assign) BOOL androidInstallApp; +@property(nonatomic, copy, nullable) NSString *androidMinimumVersion; +@property(nonatomic, copy, nullable) NSString *linkDomain; +@end + +@interface InternalFirebaseAuthSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow; +@property(nonatomic, assign) BOOL appVerificationDisabledForTesting; +@property(nonatomic, copy, nullable) NSString *userAccessGroup; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, copy, nullable) NSString *smsCode; +@property(nonatomic, strong, nullable) NSNumber *forceRecaptchaFlow; +@end + +@interface InternalSignInProvider : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy, nullable) NSArray *scopes; +@property(nonatomic, copy, nullable) NSDictionary *customParameters; +@end + +@interface InternalVerifyPhoneNumberRequest : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) NSInteger timeout; +@property(nonatomic, strong, nullable) NSNumber *forceResendingToken; +@property(nonatomic, copy, nullable) NSString *autoRetrievedSmsCodeForTesting; +@property(nonatomic, copy, nullable) NSString *multiFactorInfoId; +@property(nonatomic, copy, nullable) NSString *multiFactorSessionId; +@end + +@interface InternalIdTokenResult : NSObject ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, strong, nullable) NSNumber *expirationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *authTimestamp; +@property(nonatomic, strong, nullable) NSNumber *issuedAtTimestamp; +@property(nonatomic, copy, nullable) NSString *signInProvider; +@property(nonatomic, copy, nullable) NSDictionary *claims; +@property(nonatomic, copy, nullable) NSString *signInSecondFactor; +@end + +@interface InternalUserProfile : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, assign) BOOL displayNameChanged; +@property(nonatomic, assign) BOOL photoUrlChanged; +@end + +@interface InternalTotpSecret : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey; +@property(nonatomic, strong, nullable) NSNumber *codeIntervalSeconds; +@property(nonatomic, strong, nullable) NSNumber *codeLength; +@property(nonatomic, strong, nullable) NSNumber *enrollmentCompletionDeadline; +@property(nonatomic, copy, nullable) NSString *hashingAlgorithm; +@property(nonatomic, copy) NSString *secretKey; +@end + +/// The codec used by all APIs. +NSObject *nullGetFirebaseAuthMessagesCodec(void); + +@protocol FirebaseAuthHostApi +- (void)registerIdTokenListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)registerAuthStateListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)useEmulatorApp:(AuthPigeonFirebaseApp *)app + host:(NSString *)host + port:(NSInteger)port + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)applyActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)checkActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion; +- (void)confirmPasswordResetApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + newPassword:(NSString *)newPassword + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)createUserWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInAnonymouslyApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCustomTokenApp:(AuthPigeonFirebaseApp *)app + token:(NSString *)token + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailLinkApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + emailLink:(NSString *)emailLink + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signOutApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)fetchSignInMethodsForEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)sendPasswordResetEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)sendSignInLinkToEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)setLanguageCodeApp:(AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)setSettingsApp:(AuthPigeonFirebaseApp *)app + settings:(InternalFirebaseAuthSettings *)settings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)verifyPasswordResetCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyPhoneNumberApp:(AuthPigeonFirebaseApp *)app + request:(InternalVerifyPhoneNumberRequest *)request + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)revokeTokenWithAuthorizationCodeApp:(AuthPigeonFirebaseApp *)app + authorizationCode:(NSString *)authorizationCode + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)revokeAccessTokenApp:(AuthPigeonFirebaseApp *)app + accessToken:(NSString *)accessToken + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol FirebaseAuthUserHostApi +- (void)deleteApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getIdTokenApp:(AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion: + (void (^)(InternalIdTokenResult *_Nullable, FlutterError *_Nullable))completion; +- (void)linkWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)linkWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reloadApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)sendEmailVerificationApp:(AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)unlinkApp:(AuthPigeonFirebaseApp *)app + providerId:(NSString *)providerId + completion:(void (^)(InternalUserCredential *_Nullable, FlutterError *_Nullable))completion; +- (void)updateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePasswordApp:(AuthPigeonFirebaseApp *)app + newPassword:(NSString *)newPassword + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePhoneNumberApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updateProfileApp:(AuthPigeonFirebaseApp *)app + profile:(InternalUserProfile *)profile + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyBeforeUpdateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorUserHostApi +- (void)enrollPhoneApp:(AuthPigeonFirebaseApp *)app + assertion:(InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)enrollTotpApp:(AuthPigeonFirebaseApp *)app + assertionId:(NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getSessionApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(InternalMultiFactorSession *_Nullable, FlutterError *_Nullable))completion; +- (void)unenrollApp:(AuthPigeonFirebaseApp *)app + factorUid:(NSString *)factorUid + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getEnrolledFactorsApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactoResolverHostApi +- (void)resolveSignInResolverId:(NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactoResolverHostApiWithSuffix( + id binaryMessenger, NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpHostApi +- (void)generateSecretSessionId:(NSString *)sessionId + completion:(void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForEnrollmentSecretKey:(NSString *)secretKey + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForSignInEnrollmentId:(NSString *)enrollmentId + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpSecretHostApi +- (void)generateQrCodeUrlSecretKey:(NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)openInOtpAppSecretKey:(NSString *)secretKey + qrCodeUrl:(NSString *)qrCodeUrl + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpSecretHostApi( + id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpSecretHostApiWithSuffix( + id binaryMessenger, + NSObject *_Nullable api, NSString *messageChannelSuffix); + +/// Only used to generate the object interface that are use outside of the Pigeon interface +@protocol GenerateInterfaces +- (void)pigeonInterfaceInfo:(InternalMultiFactorInfo *)info + error:(FlutterError *_Nullable *_Nonnull)error; +@end + +extern void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart new file mode 100755 index 00000000..61e60561 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart @@ -0,0 +1,72 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:flutter/foundation.dart'; + +export 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart' + show + FirebaseAuthException, + MultiFactorInfo, + MultiFactorSession, + PhoneMultiFactorInfo, + TotpMultiFactorInfo, + IdTokenResult, + UserMetadata, + UserInfo, + ActionCodeInfo, + ActionCodeSettings, + AdditionalUserInfo, + ActionCodeInfoOperation, + Persistence, + PhoneVerificationCompleted, + PhoneVerificationFailed, + PhoneCodeSent, + PhoneCodeAutoRetrievalTimeout, + AuthCredential, + AuthProvider, + AppleAuthProvider, + AppleFullPersonName, + AppleAuthCredential, + EmailAuthProvider, + EmailAuthCredential, + FacebookAuthProvider, + FacebookAuthCredential, + GameCenterAuthProvider, + GameCenterAuthCredential, + PlayGamesAuthProvider, + PlayGamesAuthCredential, + GithubAuthProvider, + GithubAuthCredential, + GoogleAuthProvider, + GoogleAuthCredential, + YahooAuthProvider, + YahooAuthCredential, + MicrosoftAuthProvider, + OAuthProvider, + OAuthCredential, + PhoneAuthProvider, + PhoneAuthCredential, + SAMLAuthProvider, + TwitterAuthProvider, + TwitterAuthCredential, + RecaptchaVerifierOnSuccess, + RecaptchaVerifierOnExpired, + RecaptchaVerifierOnError, + RecaptchaVerifierSize, + RecaptchaVerifierTheme, + PasswordValidationStatus; +export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' + show FirebaseException; + +part 'src/confirmation_result.dart'; +part 'src/firebase_auth.dart'; +part 'src/multi_factor.dart'; +part 'src/recaptcha_verifier.dart'; +part 'src/user.dart'; +part 'src/user_credential.dart'; diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart new file mode 100644 index 00000000..c039cd79 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart @@ -0,0 +1,36 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A result from a phone number sign-in, link, or reauthenticate call. +/// +/// This class is only usable on web based platforms. +class ConfirmationResult { + ConfirmationResultPlatform _delegate; + + final FirebaseAuth _auth; + + ConfirmationResult._(this._auth, this._delegate) { + ConfirmationResultPlatform.verify(_delegate); + } + + /// The phone number authentication operation's verification ID. + /// + /// This can be used along with the verification code to initialize a phone + /// auth credential. + String get verificationId { + return _delegate.verificationId; + } + + /// Finishes a phone number sign-in, link, or reauthentication, given the code + /// that was sent to the user's mobile device. + Future confirm(String verificationCode) async { + return UserCredential._( + _auth, + await _delegate.confirm(verificationCode), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart new file mode 100644 index 00000000..2f4ebe42 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart @@ -0,0 +1,893 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// The entry point of the Firebase Authentication SDK. +class FirebaseAuth extends FirebasePluginPlatform implements FirebaseService { + // Cached instances of [FirebaseAuth]. + static Map _firebaseAuthInstances = {}; + + // Cached and lazily loaded instance of [FirebaseAuthPlatform] to avoid + // creating a [MethodChannelFirebaseAuth] when not needed or creating an + // instance with the default app before a user specifies an app. + FirebaseAuthPlatform? _delegatePackingProperty; + + /// Returns the underlying delegate implementation. + /// + /// If called and no [_delegatePackingProperty] exists, it will first be + /// created and assigned before returning the delegate. + FirebaseAuthPlatform get _delegate { + _delegatePackingProperty ??= FirebaseAuthPlatform.instanceFor( + app: app, + pluginConstants: pluginConstants, + ); + return _delegatePackingProperty!; + } + + /// The [FirebaseApp] for this current Auth instance. + FirebaseApp app; + + FirebaseAuth._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_auth'); + + /// Returns an instance using the default [FirebaseApp]. + static FirebaseAuth get instance { + FirebaseApp defaultAppInstance = Firebase.app(); + + return FirebaseAuth.instanceFor(app: defaultAppInstance); + } + + /// Returns an instance using a specified [FirebaseApp]. + factory FirebaseAuth.instanceFor({ + required FirebaseApp app, + }) { + return _firebaseAuthInstances.putIfAbsent(app.name, () { + final instance = FirebaseAuth._(app: app); + app.registerService( + instance, + dispose: (auth) => auth._dispose(), + ); + return instance; + }); + } + + Future _dispose() async { + _firebaseAuthInstances.remove(app.name); + final delegate = _delegatePackingProperty; + _delegatePackingProperty = null; + await delegate?.dispose(); + } + + /// Returns the current [User] if they are currently signed-in, or `null` if + /// not. + /// + /// This getter only provides a snapshot of user state. Applications that need + /// to react to changes in user state should instead use [authStateChanges], + /// [idTokenChanges] or [userChanges] to subscribe to updates. + User? get currentUser { + if (_delegate.currentUser != null) { + return User._(this, _delegate.currentUser!); + } + + return null; + } + + /// The current Auth instance's language code. + /// + /// See [setLanguageCode] to update the language code. + String? get languageCode { + return _delegate.languageCode; + } + + /// Changes this instance to point to an Auth emulator running locally. + /// + /// Set the [host] of the local emulator, such as "localhost" + /// Set the [port] of the local emulator, such as "9099" (port 9099 is default for auth package) + /// + /// Note: Must be called immediately, prior to accessing auth methods. + /// Do not use with production credentials as emulator traffic is not encrypted. + Future useAuthEmulator(String host, int port, + {bool automaticHostMapping = true}) async { + String mappedHost = automaticHostMapping ? getMappedHost(host) : host; + + await _delegate.useAuthEmulator(mappedHost, port); + } + + /// The current Auth instance's tenant ID. + String? get tenantId { + return _delegate.tenantId; + } + + /// Set the current Auth instance's tenant ID. + /// + /// When you set the tenant ID of an Auth instance, all future sign-in/sign-up + /// operations will pass this tenant ID and sign in or sign up users to the + /// specified tenant project. When set to null, users are signed in to the + /// parent project. By default, this is set to `null`. + set tenantId(String? tenantId) { + _delegate.tenantId = tenantId; + } + + /// The current Auth instance's custom auth domain. + /// The auth domain used to handle redirects from OAuth provides, for example + /// "my-awesome-app.firebaseapp.com". By default, this is set to `null` and + /// default auth domain is used. + /// + /// If not `null`, this value will supersede `authDomain` property set in `initializeApp`. + String? get customAuthDomain { + return _delegate.customAuthDomain; + } + + /// Set the current Auth instance's auth domain for apple and android platforms. + /// The auth domain used to handle redirects from OAuth provides, for example + /// "my-awesome-app.firebaseapp.com". By default, this is set to `null` and + /// default auth domain is used. + /// + /// If not `null`, this value will supersede `authDomain` property set in `initializeApp`. + set customAuthDomain(String? customAuthDomain) { + // Web and windows do not support setting custom auth domains on the auth instance + if (defaultTargetPlatform == TargetPlatform.windows || kIsWeb) { + final message = defaultTargetPlatform == TargetPlatform.windows + ? 'Cannot set custom auth domain on a FirebaseAuth instance for windows platform' + : 'Cannot set custom auth domain on a FirebaseAuth instance. Set the custom auth domain on `FirebaseOptions.authDomain` instance and pass into `Firebase.initializeApp()` instead.'; + throw UnimplementedError( + message, + ); + } + _delegate.customAuthDomain = customAuthDomain; + } + + /// Applies a verification code sent to the user by email or other out-of-band + /// mechanism. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + Future applyActionCode(String code) async { + await _delegate.applyActionCode(code); + } + + /// Checks a verification code sent to the user by email or other out-of-band + /// mechanism. + /// + /// Returns [ActionCodeInfo] about the code. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + Future checkActionCode(String code) { + return _delegate.checkActionCode(code); + } + + /// Completes the password reset process, given a confirmation code and new + /// password. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + /// - **weak-password**: + /// - Thrown if the new password is not strong enough. + Future confirmPasswordReset({ + required String code, + required String newPassword, + }) async { + await _delegate.confirmPasswordReset(code, newPassword); + } + + /// Tries to create a new user account with the given email address and + /// password. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **email-already-in-use**: + /// - Thrown if there already exists an account with the given email address. + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + /// - **weak-password**: + /// - Thrown if the password is not strong enough. + /// - **too-many-requests**: + /// - Thrown if the user sent too many requests at the same time, for security + /// the api will not allow too many attempts at the same time, user will have + /// to wait for some time + /// - **user-token-expired**: + /// - Thrown if the user is no longer authenticated since his refresh token + /// has been expired + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future createUserWithEmailAndPassword({ + required String email, + required String password, + }) async { + return UserCredential._( + this, + await _delegate.createUserWithEmailAndPassword(email, password), + ); + } + + /// Returns a UserCredential from the redirect-based sign-in flow. + /// + /// If sign-in succeeded, returns the signed in user. If sign-in was + /// unsuccessful, fails with an error. If no redirect operation was called, + /// returns a [UserCredential] with a null User. + /// + /// This method is only support on web platforms. + Future getRedirectResult() async { + return UserCredential._(this, await _delegate.getRedirectResult()); + } + + /// Checks if an incoming link is a sign-in with email link. + bool isSignInWithEmailLink(String emailLink) { + return _delegate.isSignInWithEmailLink(emailLink); + } + + /// Internal helper which pipes internal [Stream] events onto + /// a users own Stream. + Stream _pipeStreamChanges(Stream stream) { + return stream.map((delegateUser) { + if (delegateUser == null) { + return null; + } + + return User._(this, delegateUser); + }).asBroadcastStream(onCancel: (sub) => sub.cancel()); + } + + /// Notifies about changes to the user's sign-in state (such as sign-in or + /// sign-out). + Stream authStateChanges() => + _pipeStreamChanges(_delegate.authStateChanges()); + + /// Notifies about changes to the user's sign-in state (such as sign-in or + /// sign-out) and also token refresh events. + Stream idTokenChanges() => + _pipeStreamChanges(_delegate.idTokenChanges()); + + /// Notifies about changes to any user updates. + /// + /// This is a superset of both [authStateChanges] and [idTokenChanges]. It + /// provides events on all user changes, such as when credentials are linked, + /// unlinked and when updates to the user profile are made. The purpose of + /// this Stream is for listening to realtime updates to the user state + /// (signed-in, signed-out, different user & token refresh) without + /// manually having to call [reload] and then rehydrating changes to your + /// application. + Stream userChanges() => _pipeStreamChanges(_delegate.userChanges()); + + /// Sends a password reset email to the given email address. + /// + /// To complete the password reset, call [confirmPasswordReset] with the code supplied + /// in the email sent to the user, along with the new password specified by the user. + /// + /// If email enumeration protection is enabled for the Firebase project, this + /// method may complete successfully even when the email does not correspond + /// to an existing user. + /// + /// May throw a [FirebaseAuthException] with the following error codes: + /// + /// - **auth/invalid-email**\ + /// Thrown if the email address is not valid. + /// - **auth/missing-android-pkg-name**\ + /// An Android package name must be provided if the Android app is required to be installed. + /// - **auth/missing-continue-uri**\ + /// A continue URL must be provided in the request. + /// - **auth/missing-ios-bundle-id**\ + /// An iOS Bundle ID must be provided if an App Store ID is provided. + /// - **auth/invalid-continue-uri**\ + /// The continue URL provided in the request is invalid. + /// - **auth/unauthorized-continue-uri**\ + /// The domain of the continue URL is not whitelisted. Whitelist the domain in the Firebase console. + /// - **auth/user-not-found**\ + /// Thrown if there is no user corresponding to the email address. Note: This + /// exception is not thrown when email enumeration protection is enabled. + Future sendPasswordResetEmail({ + required String email, + ActionCodeSettings? actionCodeSettings, + }) { + return _delegate.sendPasswordResetEmail(email, actionCodeSettings); + } + + /// Sends a sign in with email link to provided email address. + /// + /// To complete the password reset, call [confirmPasswordReset] with the code + /// supplied in the email sent to the user, along with the new password + /// specified by the user. + /// + /// The [handleCodeInApp] of [actionCodeSettings] must be set to `true` + /// otherwise an [ArgumentError] will be thrown. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + Future sendSignInLinkToEmail({ + required String email, + required ActionCodeSettings actionCodeSettings, + }) async { + if (actionCodeSettings.handleCodeInApp != true) { + throw ArgumentError( + 'The [handleCodeInApp] value of [ActionCodeSettings] must be `true`.', + ); + } + + await _delegate.sendSignInLinkToEmail(email, actionCodeSettings); + } + + /// When set to null, sets the user-facing language code to be the default app language. + /// + /// The language code will propagate to email action templates (password + /// reset, email verification and email change revocation), SMS templates for + /// phone authentication, reCAPTCHA verifier and OAuth popup/redirect + /// operations provided the specified providers support localization with the + /// language code specified. + Future setLanguageCode(String? languageCode) { + return _delegate.setLanguageCode(languageCode); + } + + /// Updates the current instance with the provided settings. + /// + /// [appVerificationDisabledForTesting] This setting applies to Android, iOS and + /// web platforms. When set to `true`, this property disables app + /// verification for the purpose of testing phone authentication. For this + /// property to take effect, it needs to be set before handling a reCAPTCHA + /// app verifier. When this is disabled, a mock reCAPTCHA is rendered + /// instead. This is useful for manual testing during development or for + /// automated integration tests. + /// + /// In order to use this feature, you will need to + /// [whitelist your phone number](https://firebase.google.com/docs/auth/web/phone-auth?authuser=0#test-with-whitelisted-phone-numbers) + /// via the Firebase Console. + /// + /// The default value is `false` (app verification is enabled). + /// + /// [forceRecaptchaFlow] This setting applies to Android only. When set to 'true', + /// it forces the application verification to use the web reCAPTCHA flow for Phone Authentication. + /// Once this has been called, every call to PhoneAuthProvider#verifyPhoneNumber() will skip the SafetyNet verification flow and use the reCAPTCHA flow instead. + /// Calling this method a second time will overwrite the previously passed parameter. + /// + /// [phoneNumber] & [smsCode] These settings apply to Android only. The phone number and SMS code here must have been configured in the Firebase Console (Authentication > Sign In Method > Phone). + /// Once this has been called, every call to PhoneAuthProvider#verifyPhoneNumber() with the same phone number as the one that is configured here will have onVerificationCompleted() triggered as the callback. + /// Calling this method a second time will overwrite the previously passed parameters. Only one number can be configured at a given time. + /// Calling this method with either parameter set to null removes this functionality until valid parameters are passed. + /// Verifying a phone number other than the one configured here will trigger normal behavior. If the phone number is configured as a test phone number in the console, the regular testing flow occurs. Otherwise, normal phone number verification will take place. + /// When this is set and PhoneAuthProvider#verifyPhoneNumber() is called with a matching phone number, PhoneAuthProvider.OnVerificationStateChangedCallbacks.onCodeAutoRetrievalTimeOut(String) will never be called. + /// + /// [userAccessGroup] This setting only applies to iOS and MacOS platforms. + /// When set, it allows you to share authentication state between + /// applications. Set the property to your team group ID or set to `null` + /// to remove sharing capabilities. + /// + /// Key Sharing capabilities must be enabled for your app via XCode (Project + /// settings > Capabilities). To learn more, visit the + /// [Apple documentation](https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps). + Future setSettings({ + bool appVerificationDisabledForTesting = false, + String? userAccessGroup, + String? phoneNumber, + String? smsCode, + bool? forceRecaptchaFlow, + }) { + return _delegate.setSettings( + appVerificationDisabledForTesting: appVerificationDisabledForTesting, + userAccessGroup: userAccessGroup, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + ); + } + + /// Changes the current type of persistence on the current Auth instance for + /// the currently saved Auth session and applies this type of persistence for + /// future sign-in requests, including sign-in with redirect requests. + /// + /// This will return a promise that will resolve once the state finishes + /// copying from one type of storage to the other. Calling a sign-in method + /// after changing persistence will wait for that persistence change to + /// complete before applying it on the new Auth state. + /// + /// This makes it easy for a user signing in to specify whether their session + /// should be remembered or not. It also makes it easier to never persist the + /// Auth state for applications that are shared by other users or have + /// sensitive data. + /// + /// This is only supported on web based platforms. + Future setPersistence(Persistence persistence) async { + return _delegate.setPersistence(persistence); + } + + /// Asynchronously creates and becomes an anonymous user. + /// + /// If there is already an anonymous user signed in, that user will be + /// returned instead. If there is any other existing user signed in, that + /// user will be signed out. + /// + /// **Important**: You must enable Anonymous accounts in the Auth section + /// of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **operation-not-allowed**: + /// - Thrown if anonymous accounts are not enabled. Enable anonymous accounts + /// in the Firebase Console, under the Auth tab. + Future signInAnonymously() async { + return UserCredential._(this, await _delegate.signInAnonymously()); + } + + /// Asynchronously signs in to Firebase with the given 3rd-party credentials + /// (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, + /// etc.) and returns additional identity provider data. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// If the user doesn't have an account already, one will be created + /// automatically. + /// + /// **Important**: You must enable the relevant accounts in the Auth section + /// of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **account-exists-with-different-credential**: + /// - Thrown if there already exists an account with the email address + /// asserted by the credential. + // ignore: deprecated_member_use_from_same_package + /// Resolve this by asking + /// the user to sign in using one of the returned providers. + /// Once the user is signed in, the original credential can be linked to + /// the user with [linkWithCredential]. + /// - **invalid-credential**: + /// - Thrown if the credential is malformed or has expired. + /// - **operation-not-allowed**: + /// - Thrown if the type of account corresponding to the credential is not + /// enabled. Enable the account type in the Firebase Console, under the + /// Auth tab. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given credential has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if signing in with a credential from [EmailAuthProvider.credential] + /// and there is no user corresponding to the given email. + /// - **wrong-password**: + /// - Thrown if signing in with a credential from [EmailAuthProvider.credential] + /// and the password is invalid for the given email, or if the account + /// corresponding to the email does not have a password set. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future signInWithCredential(AuthCredential credential) async { + try { + return UserCredential._( + this, + await _delegate.signInWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Tries to sign in a user with a given custom token. + /// + /// Custom tokens are used to integrate Firebase Auth with existing auth + /// systems, and must be generated by the auth backend. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// If the user identified by the [uid] specified in the token doesn't + /// have an account already, one will be created automatically. + /// + /// Read how to use Custom Token authentication and the cases where it is + /// useful in [the guides](https://firebase.google.com/docs/auth/android/custom-auth). + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **custom-token-mismatch**: + /// - Thrown if the custom token is for a different Firebase App. + /// - **invalid-custom-token**: + /// - Thrown if the custom token format is incorrect. + Future signInWithCustomToken(String token) async { + try { + return UserCredential._( + this, await _delegate.signInWithCustomToken(token)); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Attempts to sign in a user with the given email address and password. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// **Important**: You must enable Email & Password accounts in the Auth + /// section of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + /// - **user-not-found** _(deprecated)_: + /// - Thrown if there is no user corresponding to the given email. + /// **Note:** This code is no longer returned on projects that have + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default for new projects since September 2023). + /// Use **invalid-credential** instead. + /// - **wrong-password** _(deprecated)_: + /// - Thrown if the password is invalid for the given email, or the account + /// corresponding to the email does not have a password set. + /// **Note:** This code is no longer returned on projects that have + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default for new projects since September 2023). + /// Use **invalid-credential** instead. + /// - **too-many-requests**: + /// - Thrown if the user sent too many requests at the same time, for security + /// the api will not allow too many attempts at the same time, user will have + /// to wait for some time + /// - **user-token-expired**: + /// - Thrown if the user is no longer authenticated since his refresh token + /// has been expired + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **invalid-credential**: + /// - Thrown if the email or password is incorrect. On projects with + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default since September 2023), this replaces + /// **user-not-found** and **wrong-password** to prevent revealing + /// whether an account exists. On the Firebase emulator, the code may + /// appear as **INVALID_LOGIN_CREDENTIALS**. + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future signInWithEmailAndPassword({ + required String email, + required String password, + }) async { + try { + return UserCredential._( + this, + await _delegate.signInWithEmailAndPassword(email, password), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Signs in using an email address and email sign-in link. + /// + /// Fails with an error if the email address is invalid or OTP in email link + /// expires. + /// + /// Confirm the link is a sign-in email link before calling this method, + /// using [isSignInWithEmailLink]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if OTP in email link expires. + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + Future signInWithEmailLink({ + required String email, + required String emailLink, + }) async { + try { + return UserCredential._( + this, + await _delegate.signInWithEmailLink(email, emailLink), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Signs in with an AuthProvider using native authentication flow. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + Future signInWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + this, + await _delegate.signInWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Starts a sign-in flow for a phone number. + /// + /// You can optionally provide a [RecaptchaVerifier] instance to control the + /// reCAPTCHA widget appearance and behavior. + /// + /// Once the reCAPTCHA verification has completed, called [ConfirmationResult.confirm] + /// with the users SMS verification code to complete the authentication flow. + /// + /// This method is only available on web based platforms. + Future signInWithPhoneNumber( + String phoneNumber, [ + RecaptchaVerifier? verifier, + ]) async { + assert(phoneNumber.isNotEmpty); + // If we add a recaptcha to the page by creating a new instance, we must + // also clear that instance before proceeding. + bool mustClear = verifier == null; + verifier ??= RecaptchaVerifier(auth: _delegate); + final result = + await _delegate.signInWithPhoneNumber(phoneNumber, verifier.delegate); + if (mustClear) { + verifier.clear(); + } + return ConfirmationResult._(this, result); + } + + /// Authenticates a Firebase client using a popup-based OAuth authentication + /// flow. + /// + /// If succeeds, returns the signed in user along with the provider's + /// credential. + /// + /// This method is only available on web based platforms. + Future signInWithPopup(AuthProvider provider) async { + try { + return UserCredential._(this, await _delegate.signInWithPopup(provider)); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Authenticates a Firebase client using a full-page redirect flow. + /// + /// To handle the results and errors for this operation, refer to + /// [getRedirectResult]. + Future signInWithRedirect(AuthProvider provider) { + try { + return _delegate.signInWithRedirect(provider); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Checks a password reset code sent to the user by email or other + /// out-of-band mechanism. + /// + /// Returns the user's email address if valid. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the password reset code has expired. + /// - **invalid-action-code**: + /// - Thrown if the password reset code is invalid. This can happen if the + /// code is malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the password reset code. + /// This may have happened if the user was deleted between when the code + /// was issued and when this method was called. + Future verifyPasswordResetCode(String code) { + return _delegate.verifyPasswordResetCode(code); + } + + /// Starts a phone number verification process for the given phone number. + /// + /// This method is used to verify that the user-provided phone number belongs + /// to the user. Firebase sends a code via SMS message to the phone number, + /// where you must then prompt the user to enter the code. The code can be + /// combined with the verification ID to create a [PhoneAuthProvider.credential] + /// which you can then use to sign the user in, or link with their account ( + /// see [signInWithCredential] or [linkWithCredential]). + /// + /// On some Android devices, auto-verification can be handled by the device + /// and a [PhoneAuthCredential] will be automatically provided. + /// + /// No duplicated SMS will be sent out unless a [forceResendingToken] is + /// provided. + /// + /// [phoneNumber] The phone number for the account the user is signing up + /// for or signing into. Make sure to pass in a phone number with country + /// code prefixed with plus sign ('+'). + /// Should be null if it's a multi-factor sign in. + /// + /// [multiFactorInfo] The multi factor info you're using to verify the phone number. + /// Should be set if a [multiFactorSession] is provided. + /// + /// [multiFactorSession] The multi factor session you're using to verify the phone number. + /// Should be set if a [multiFactorInfo] is provided. + /// + /// [timeout] The maximum amount of time you are willing to wait for SMS + /// auto-retrieval to be completed by the library. Maximum allowed value + /// is 2 minutes. + /// + /// [forceResendingToken] The [forceResendingToken] obtained from [codeSent] + /// callback to force re-sending another verification SMS before the + /// auto-retrieval timeout. + /// + /// [verificationCompleted] Triggered when an SMS is auto-retrieved or the + /// phone number has been instantly verified. The callback will receive an + /// [PhoneAuthCredential] that can be passed to [signInWithCredential] or + /// [linkWithCredential]. + /// + /// [verificationFailed] Triggered when an error occurred during phone number + /// verification. A [FirebaseAuthException] is provided when this is + /// triggered. + /// + /// [codeSent] Triggered when an SMS has been sent to the users phone, and + /// will include a [verificationId] and [forceResendingToken]. + /// + /// [codeAutoRetrievalTimeout] Triggered when SMS auto-retrieval times out and + /// provide a [verificationId]. + Future verifyPhoneNumber({ + String? phoneNumber, + PhoneMultiFactorInfo? multiFactorInfo, + required PhoneVerificationCompleted verificationCompleted, + required PhoneVerificationFailed verificationFailed, + required PhoneCodeSent codeSent, + required PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout, + @visibleForTesting String? autoRetrievedSmsCodeForTesting, + Duration timeout = const Duration(seconds: 30), + int? forceResendingToken, + MultiFactorSession? multiFactorSession, + }) { + assert( + phoneNumber != null || multiFactorInfo != null, + 'Either phoneNumber or multiFactorInfo must be provided.', + ); + return _delegate.verifyPhoneNumber( + phoneNumber: phoneNumber, + multiFactorInfo: multiFactorInfo, + timeout: timeout, + forceResendingToken: forceResendingToken, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, + // ignore: invalid_use_of_visible_for_testing_member + autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, + multiFactorSession: multiFactorSession, + ); + } + + /// Apple only. Users signed in with Apple provider can revoke their token using an authorization code. + /// Authorization code can be retrieved on the user credential i.e. userCredential.additionalUserInfo.authorizationCode + Future revokeTokenWithAuthorizationCode(String authorizationCode) { + return _delegate.revokeTokenWithAuthorizationCode(authorizationCode); + } + + /// Android only. Revokes the provided accessToken. Currently supports revoking Apple-issued accessToken only. + Future revokeAccessToken(String accessToken) { + return _delegate.revokeAccessToken(accessToken); + } + + /// Signs out the current user. + /// + /// If successful, it also updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + Future signOut() async { + await _delegate.signOut(); + } + + /// Initializes the reCAPTCHA Enterprise client proactively to enhance reCAPTCHA signal collection and + /// to complete reCAPTCHA-protected flows in a single attempt. + Future initializeRecaptchaConfig() { + return _delegate.initializeRecaptchaConfig(); + } + + /// Validates a password against the password policy configured for the project or tenant. + /// + /// If no tenant ID is set on the Auth instance, then this method will use the password policy configured for the project. + /// Otherwise, this method will use the policy configured for the tenant. If a password policy has not been configured, + /// then the default policy configured for all projects will be used. + /// + /// If an auth flow fails because a submitted password does not meet the password policy requirements and this method has previously been called, + /// then this method will use the most recent policy available when called again. + /// + /// Returns a map with the following keys: + /// - **status**: A boolean indicating if the password is valid. + /// - **passwordPolicy**: The password policy used to validate the password. + /// - **meetsMinPasswordLength**: A boolean indicating if the password meets the minimum length requirement. + /// - **meetsMaxPasswordLength**: A boolean indicating if the password meets the maximum length requirement. + /// - **meetsLowercaseRequirement**: A boolean indicating if the password meets the lowercase requirement. + /// - **meetsUppercaseRequirement**: A boolean indicating if the password meets the uppercase requirement. + /// - **meetsDigitsRequirement**: A boolean indicating if the password meets the digits requirement. + /// - **meetsSymbolsRequirement**: A boolean indicating if the password meets the symbols requirement. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-password**: + /// - Thrown if the password is invalid. + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **INVALID_LOGIN_CREDENTIALS** or **invalid-credential**: + /// - Thrown if the password is invalid for the given email, or the account + /// corresponding to the email does not have a password set. + /// Depending on if you are using firebase emulator or not the code is + /// different + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future validatePassword( + FirebaseAuth auth, + String? password, + ) async { + if (password == null || password.isEmpty) { + throw FirebaseAuthException( + code: 'invalid-password', + message: 'Password cannot be null or empty', + ); + } + PasswordPolicyApi passwordPolicyApi = + PasswordPolicyApi(auth.app.options.apiKey); + PasswordPolicy passwordPolicy = + await passwordPolicyApi.fetchPasswordPolicy(); + PasswordPolicyImpl passwordPolicyImpl = PasswordPolicyImpl(passwordPolicy); + return passwordPolicyImpl.isPasswordValid(password); + } + + @override + String toString() { + return 'FirebaseAuth(app: ${app.name})'; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart new file mode 100644 index 00000000..4610e284 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart @@ -0,0 +1,213 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// Defines multi-factor related properties and operations pertaining to a [User]. +/// This class acts as the main entry point for enrolling or un-enrolling +/// second factors for a user, and provides access to their currently enrolled factors. +class MultiFactor { + MultiFactorPlatform _delegate; + + MultiFactor._(this._delegate); + + /// Returns a session identifier for a second factor enrollment operation. + Future getSession() { + return _delegate.getSession(); + } + + /// Enrolls a second factor as identified by the [MultiFactorAssertion] parameter for the current user. + /// + /// [displayName] can be used to provide a display name for the second factor. + Future enroll( + MultiFactorAssertion assertion, { + String? displayName, + }) async { + if (assertion._delegate is TotpMultiFactorGeneratorPlatform) { + assert(displayName != null, 'displayName is mandatory for TOTP'); + } + return _delegate.enroll(assertion._delegate, displayName: displayName); + } + + /// Unenrolls a second factor from this user. + /// + /// [factorUid] is the unique identifier of the second factor to unenroll. + /// [multiFactorInfo] is the [MultiFactorInfo] of the second factor to unenroll. + /// Only one of [factorUid] or [multiFactorInfo] should be provided. + Future unenroll({String? factorUid, MultiFactorInfo? multiFactorInfo}) { + assert( + (factorUid != null && multiFactorInfo == null) || + (factorUid == null && multiFactorInfo != null), + 'Exactly one of `factorUid` or `multiFactorInfo` must be provided', + ); + return _delegate.unenroll( + factorUid: factorUid, + multiFactorInfo: multiFactorInfo, + ); + } + + /// Returns a list of the [MultiFactorInfo] already associated with this user. + Future> getEnrolledFactors() { + return _delegate.getEnrolledFactors(); + } +} + +/// Provider for generating a PhoneMultiFactorAssertion. +class PhoneMultiFactorGenerator { + /// Transforms a PhoneAuthCredential into a [MultiFactorAssertion] + /// which can be used to confirm ownership of a phone second factor. + static MultiFactorAssertion getAssertion( + PhoneAuthCredential credential, + ) { + final assertion = + PhoneMultiFactorGeneratorPlatform.instance.getAssertion(credential); + return MultiFactorAssertion._(assertion); + } +} + +/// Provider for generating a PhoneMultiFactorAssertion. +class TotpMultiFactorGenerator { + /// Transforms a PhoneAuthCredential into a [MultiFactorAssertion] + /// which can be used to confirm ownership of a phone second factor. + static Future generateSecret( + MultiFactorSession session, + ) async { + final secret = + await TotpMultiFactorGeneratorPlatform.instance.generateSecret(session); + return TotpSecret._( + secret.codeIntervalSeconds, + secret.codeLength, + secret.enrollmentCompletionDeadline, + secret.hashingAlgorithm, + secret.secretKey, + secret, + ); + } + + /// Get a [MultiFactorAssertion] + /// which can be used to confirm ownership of a TOTP second factor. + static Future getAssertionForEnrollment( + TotpSecret secret, + String oneTimePassword, + ) async { + final assertion = await TotpMultiFactorGeneratorPlatform.instance + .getAssertionForEnrollment( + secret._instance, + oneTimePassword, + ); + + return MultiFactorAssertion._(assertion); + } + + /// Get a [MultiFactorAssertion] + /// which can be used to confirm ownership of a TOTP second factor. + static Future getAssertionForSignIn( + String enrollmentId, + String oneTimePassword, + ) async { + final assertion = + await TotpMultiFactorGeneratorPlatform.instance.getAssertionForSignIn( + enrollmentId, + oneTimePassword, + ); + + return MultiFactorAssertion._(assertion); + } +} + +class TotpSecret { + final TotpSecretPlatform _instance; + + final int? codeIntervalSeconds; + final int? codeLength; + final DateTime? enrollmentCompletionDeadline; + final String? hashingAlgorithm; + final String secretKey; + + TotpSecret._( + this.codeIntervalSeconds, + this.codeLength, + this.enrollmentCompletionDeadline, + this.hashingAlgorithm, + this.secretKey, + this._instance, + ); + + /// Generate a TOTP secret for the authenticated user. + Future generateQrCodeUrl({ + String? accountName, + String? issuer, + }) { + return _instance.generateQrCodeUrl( + accountName: accountName, + issuer: issuer, + ); + } + + /// Opens the specified QR Code URL in a password manager like iCloud Keychain. + Future openInOtpApp( + String qrCodeUrl, + ) async { + await _instance.openInOtpApp( + qrCodeUrl, + ); + } +} + +/// Represents an assertion that the Firebase Authentication server +/// can use to authenticate a user as part of a multi-factor flow. +class MultiFactorAssertion { + final MultiFactorAssertionPlatform _delegate; + + MultiFactorAssertion._(this._delegate) { + MultiFactorAssertionPlatform.verify(_delegate); + } +} + +/// Utility class that contains methods to resolve second factor +/// requirements on users that have opted into two-factor authentication. +class MultiFactorResolver { + final FirebaseAuth _auth; + final MultiFactorResolverPlatform _delegate; + + MultiFactorResolver._(this._auth, this._delegate) { + MultiFactorResolverPlatform.verify(_delegate); + } + + /// List of [MultiFactorInfo] which represents the available + /// second factors that can be used to complete the sign-in for the current session. + List get hints => _delegate.hints; + + /// A MultiFactorSession, an opaque session identifier for the current sign-in flow. + MultiFactorSession get session => _delegate.session; + + /// Completes sign in with a second factor using an MultiFactorAssertion which + /// confirms that the user has successfully completed the second factor challenge. + Future resolveSignIn( + MultiFactorAssertion assertion, + ) async { + final credential = await _delegate.resolveSignIn(assertion._delegate); + return UserCredential._(_auth, credential); + } +} + +/// MultiFactor exception related to Firebase Authentication. Check the error code +/// and message for more details. +class FirebaseAuthMultiFactorException extends FirebaseAuthException { + final FirebaseAuth _auth; + final FirebaseAuthMultiFactorExceptionPlatform _delegate; + + FirebaseAuthMultiFactorException._(this._auth, this._delegate) + : super( + code: _delegate.code, + message: _delegate.message, + email: _delegate.email, + credential: _delegate.credential, + phoneNumber: _delegate.phoneNumber, + tenantId: _delegate.tenantId, + ); + + MultiFactorResolver get resolver => + MultiFactorResolver._(_auth, _delegate.resolver); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart new file mode 100644 index 00000000..8c86d794 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart @@ -0,0 +1,100 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// An [reCAPTCHA](https://www.google.com/recaptcha/?authuser=0)-based +/// application verifier. +class RecaptchaVerifier { + static final RecaptchaVerifierFactoryPlatform _factory = + RecaptchaVerifierFactoryPlatform.instance; + + RecaptchaVerifier._(this._delegate); + + RecaptchaVerifierFactoryPlatform _delegate; + + /// Creates a new [RecaptchaVerifier] instance used to render a reCAPTCHA widget + /// when calling [signInWithPhoneNumber]. + /// + /// It is possible to configure the reCAPTCHA widget with the following arguments, + /// however if no arguments are provided, an "invisible" reCAPTCHA widget with + /// defaults will be created. + /// + /// [container] If a value is provided, the element must exist in the DOM when + /// [render] or [signInWithPhoneNumber] is called. The reCAPTCHA widget will + /// be rendered within the specified DOM element. + /// + /// If no value is provided, an "invisible" reCAPTCHA will be shown when [render] + /// is called. An invisible reCAPTCHA widget is shown a modal on-top of your + /// application. + /// + /// [size] When providing a custom [container], a size (normal or compact) can + /// be provided to change the size of the reCAPTCHA widget. This has no effect + /// when a [container] is not provided. Defaults to [RecaptchaVerifierSize.normal]. + /// + /// [theme] When providing a custom [container], a theme (light or dark) can + /// be provided to change the appearance of the reCAPTCHA widget. This has no + /// effect when a [container] is not provided. Defaults to [RecaptchaVerifierTheme.light]. + /// + /// [onSuccess] An optional callback which is called when the user successfully + /// completes the reCAPTCHA widget. + /// + /// [onError] An optional callback which is called when the reCAPTCHA widget errors + /// (such as a network issue). + /// + /// [onExpired] An optional callback which is called when the reCAPTCHA expires. + factory RecaptchaVerifier({ + required FirebaseAuthPlatform auth, + String? container, + RecaptchaVerifierSize size = RecaptchaVerifierSize.normal, + RecaptchaVerifierTheme theme = RecaptchaVerifierTheme.light, + RecaptchaVerifierOnSuccess? onSuccess, + RecaptchaVerifierOnError? onError, + RecaptchaVerifierOnExpired? onExpired, + }) { + return RecaptchaVerifier._( + _factory.delegateFor( + auth: auth, + container: container, + size: size, + theme: theme, + onSuccess: onSuccess, + onError: onError, + onExpired: onExpired, + ), + ); + } + + /// Returns the underlying factory delegate instance. + @protected + RecaptchaVerifierFactoryPlatform get delegate { + return _delegate; + } + + /// The application verifier type. For a reCAPTCHA verifier, this is + /// 'recaptcha'. + String get type { + return _delegate.type; + } + + /// Clears the reCAPTCHA widget from the page and destroys the current + /// instance. + void clear() { + return _delegate.clear(); + } + + /// Renders the reCAPTCHA widget on the page. + /// + /// Returns a [Future] that resolves with the reCAPTCHA widget ID. + Future render() async { + return _delegate.render(); + } + + /// Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA + /// token. + Future verify() async { + return _delegate.verify(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart new file mode 100644 index 00000000..9b7ccdb7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart @@ -0,0 +1,685 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A user account. +class User { + UserPlatform _delegate; + + final FirebaseAuth _auth; + MultiFactor? _multiFactor; + + User._(this._auth, this._delegate) { + UserPlatform.verify(_delegate); + } + + /// The users display name. + /// + /// Will be `null` if signing in anonymously or via password authentication. + String? get displayName { + return _delegate.displayName; + } + + /// The users email address. + /// + /// Will be `null` if signing in anonymously. + String? get email { + return _delegate.email; + } + + /// Returns whether the users email address has been verified. + /// + /// To send a verification email, see [sendEmailVerification]. + /// + /// Once verified, call [reload] to ensure the latest user information is + /// retrieved from Firebase. + bool get emailVerified { + return _delegate.isEmailVerified; + } + + /// Returns whether the user is a anonymous. + bool get isAnonymous { + return _delegate.isAnonymous; + } + + /// Returns additional metadata about the user, such as their creation time. + UserMetadata get metadata { + return _delegate.metadata; + } + + /// Returns the users phone number. + /// + /// This property will be `null` if the user has not signed in or been has + /// their phone number linked. + String? get phoneNumber { + return _delegate.phoneNumber; + } + + /// Returns a photo URL for the user. + /// + /// This property will be populated if the user has signed in or been linked + /// with a 3rd party OAuth provider (such as Google). + String? get photoURL { + return _delegate.photoURL; + } + + /// Returns a list of user information for each linked provider. + List get providerData { + return _delegate.providerData; + } + + /// Returns a JWT refresh token for the user. + /// + /// This property will be an empty string for native platforms (android, iOS & macOS) as they do not + /// support refresh tokens. + String? get refreshToken { + return _delegate.refreshToken; + } + + /// The current user's tenant ID. + /// + /// This is a read-only property, which indicates the tenant ID used to sign + /// in the current user. This is `null` if the user is signed in from the + /// parent project. + String? get tenantId { + return _delegate.tenantId; + } + + /// The user's unique ID. + String get uid { + return _delegate.uid; + } + + /// Deletes and signs out the user. + /// + /// **Important**: this is a security-sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **requires-recent-login**: + /// - Thrown if the user's last sign-in time does not meet the security + /// threshold. Use [User.reauthenticateWithCredential] to resolve. This + /// does not apply if the user is anonymous. + Future delete() async { + return _delegate.delete(); + } + + /// Returns a JSON Web Token (JWT) used to identify the user to a Firebase + /// service. + /// + /// Returns the current token if it has not expired. Otherwise, this will + /// refresh the token and return a new one. + /// + /// If [forceRefresh] is `true`, the token returned will be refreshed regardless + /// of token expiration. + Future getIdToken([bool forceRefresh = false]) { + return _delegate.getIdToken(forceRefresh); + } + + /// Returns a [IdTokenResult] containing the users JSON Web Token (JWT) and + /// other metadata. + /// + /// Returns the current token if it has not expired. Otherwise, this will + /// refresh the token and return a new one. + /// + /// If [forceRefresh] is `true`, the token returned will be refreshed regardless + /// of token expiration. + Future getIdTokenResult([bool forceRefresh = false]) { + return _delegate.getIdTokenResult(forceRefresh); + } + + /// Links the user account with the given credentials. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. Please note, you will + /// not recover from this error if you're using a [PhoneAuthCredential] to link + /// a provider to an account. Once an attempt to link an account has been made, + /// a new sms code is required to sign in the user. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. To + /// do so, sign in to `email` via one of + /// the providers returned and then [User.linkWithCredential] the original + /// credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **invalid-email**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future linkWithCredential(AuthCredential credential) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links with an AuthProvider using native authentication flow. + /// On web, you should use [linkWithPopup] or [linkWithRedirect] instead. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a Provider. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a popup on Web. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithPopup( + AuthProvider provider, + ) async { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithPopup(provider), + ); + } + + /// Re-authenticates a user using a redirection on Web. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithRedirect( + AuthProvider provider, + ) async { + await _delegate.reauthenticateWithRedirect(provider); + } + + /// Links the user account with the given provider. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithPopup(AuthProvider provider) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithPopup(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links the user account with the given provider. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithRedirect(AuthProvider provider) async { + try { + await _delegate.linkWithRedirect(provider); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links the user account with the given phone number. + /// + /// This method is only supported on web platforms. Use [verifyPhoneNumber] and + /// then [linkWithCredential] on these platforms. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **captcha-check-failed**: + /// - Thrown if the reCAPTCHA response token was invalid, expired, or if this + /// method was called from a non-whitelisted domain. + /// - **invalid-phone-number**: + /// - Thrown if the phone number has an invalid format. + /// - **quota-exceeded**: + /// - Thrown if the SMS quota for the Firebase project has been exceeded. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given phone number has been disabled. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the phone number already exists + /// among your users, or is already linked to a Firebase User. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the phone authentication provider in the + /// Firebase Console. Go to the Firebase Console for your project, in the Auth + /// section and the Sign in Method tab and configure the provider. + Future linkWithPhoneNumber( + String phoneNumber, [ + RecaptchaVerifier? verifier, + ]) async { + assert(phoneNumber.isNotEmpty); + // If we add a recaptcha to the page by creating a new instance, we must + // also clear that instance before proceeding. + bool mustClear = verifier == null; + verifier ??= RecaptchaVerifier(auth: _delegate.auth); + try { + final result = + await _delegate.linkWithPhoneNumber(phoneNumber, verifier.delegate); + if (mustClear) { + verifier.clear(); + } + return ConfirmationResult._(_auth, result); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a fresh credential. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithCredential( + AuthCredential credential, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Refreshes the current user, if signed in. + Future reload() async { + await _delegate.reload(); + } + + /// Sends a verification email to a user. + /// + /// The verification process is completed by calling [applyActionCode]. + Future sendEmailVerification([ + ActionCodeSettings? actionCodeSettings, + ]) async { + await _delegate.sendEmailVerification(actionCodeSettings); + } + + /// Unlinks a provider from a user account. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **no-such-provider**: + /// - Thrown if the user does not have this provider linked or when the + /// provider ID given does not exist. + Future unlink(String providerId) async { + return User._(_auth, await _delegate.unlink(providerId)); + } + + /// Updates the user's email address. + /// + /// An email will be sent to the original email address (if it was set) that + /// allows to revoke the email address change, in order to protect them from + /// account hijacking. + /// + /// **Important**: this is a security sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + + /// Updates the user's password. + /// + /// **Important**: this is a security sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **weak-password**: + /// - Thrown if the password is not strong enough. + /// - **requires-recent-login**: + /// - Thrown if the user's last sign-in time does not meet the security + /// threshold. Use [User.reauthenticateWithCredential] to resolve. This + /// does not apply if the user is anonymous. + Future updatePassword(String newPassword) async { + await _delegate.updatePassword(newPassword); + } + + /// Updates the user's phone number. + /// + /// A credential can be created by verifying a phone number via [verifyPhoneNumber]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-verification-code**: + /// - Thrown if the verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the verification ID of the credential is not valid. + Future updatePhoneNumber(PhoneAuthCredential phoneCredential) async { + await _delegate.updatePhoneNumber(phoneCredential); + } + + /// Update the user name. + Future updateDisplayName(String? displayName) { + return _delegate + .updateProfile({'displayName': displayName}); + } + + /// Update the user's profile picture. + Future updatePhotoURL(String? photoURL) { + return _delegate.updateProfile({'photoURL': photoURL}); + } + + /// Updates a user's profile data. + Future updateProfile({String? displayName, String? photoURL}) { + return _delegate.updateProfile({ + 'displayName': displayName, + 'photoURL': photoURL, + }); + } + + /// Sends a verification email to a new email address. The user's email will + /// be updated to the new one after being verified. + /// + /// If you have a custom email action handler, you can complete the + /// verification process by calling [applyActionCode]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **missing-android-pkg-name**: + /// - An Android package name must be provided if the Android app is required to be installed. + /// - **missing-continue-uri**: + /// - A continue URL must be provided in the request. + /// - **missing-ios-bundle-id**: + /// - An iOS bundle ID must be provided if an App Store ID is provided. + /// - **invalid-continue-uri**: + /// - The continue URL provided in the request is invalid. + /// - **unauthorized-continue-uri**: + /// - The domain of the continue URL is not whitelisted. Whitelist the domain in the Firebase console. + Future verifyBeforeUpdateEmail( + String newEmail, [ + ActionCodeSettings? actionCodeSettings, + ]) async { + await _delegate.verifyBeforeUpdateEmail(newEmail, actionCodeSettings); + } + + MultiFactor get multiFactor { + if (!kIsWeb && (defaultTargetPlatform == TargetPlatform.windows)) { + throw UnimplementedError( + 'MultiFactor Authentication is only supported on web, Android, iOS and macOS.', + ); + } + return _multiFactor ??= MultiFactor._(_delegate.multiFactor); + } + + @override + String toString() { + return '$User(' + 'displayName: $displayName, ' + 'email: $email, ' + 'isEmailVerified: $emailVerified, ' + 'isAnonymous: $isAnonymous, ' + 'metadata: $metadata, ' + 'phoneNumber: $phoneNumber, ' + 'photoURL: $photoURL, ' + 'providerData, $providerData, ' + 'refreshToken: $refreshToken, ' + 'tenantId: $tenantId, ' + 'uid: $uid)'; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart new file mode 100644 index 00000000..3afbbc7d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart @@ -0,0 +1,39 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A UserCredential is returned from authentication requests such as +/// [createUserWithEmailAndPassword]. +class UserCredential { + UserCredential._(this._auth, this._delegate) { + UserCredentialPlatform.verify(_delegate); + } + + final FirebaseAuth _auth; + final UserCredentialPlatform _delegate; + + /// Returns additional information about the user, such as whether they are a + /// newly created one. + AdditionalUserInfo? get additionalUserInfo => _delegate.additionalUserInfo; + + /// The users [AuthCredential]. + AuthCredential? get credential => _delegate.credential; + + /// Returns a [User] containing additional information and user specific + /// methods. + User? get user { + // TODO(rousselGit): cache the `user` instance or override == so that ".user == .user" + return _delegate.user == null ? null : User._(_auth, _delegate.user!); + } + + @override + String toString() { + return 'UserCredential(' + 'additionalUserInfo: $additionalUserInfo, ' + 'credential: $credential, ' + 'user: $user)'; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec new file mode 100755 index 00000000..4e5be544 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec @@ -0,0 +1,65 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +begin + required_macos_version = "10.12" + current_target_definition = Pod::Config.instance.podfile.send(:current_target_definition) + user_osx_target = current_target_definition.to_hash["platform"]["osx"] + if (Gem::Version.new(user_osx_target) < Gem::Version.new(required_macos_version)) + error_message = "The FlutterFire plugin #{pubspec['name']} for macOS requires a macOS deployment target of #{required_macos_version} or later." + Pod::UI.warn error_message, [ + "Update the `platform :osx, '#{user_osx_target}'` line in your macOS/Podfile to version `#{required_macos_version}` and ensure you commit this file.", + "Open your `macos/Runner.xcodeproj` Xcode project and under the 'Runner' target General tab set your Deployment Target to #{required_macos_version} or later." + ] + raise Pod::Informative, error_message + end +rescue Pod::Informative + raise +rescue + # Do nothing for all other errors and let `pod install` deal with any issues. +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_auth/Sources/firebase_auth/**/*.{h,m}' + s.public_header_files = 'firebase_auth/Sources/firebase_auth/include/Public/**/*.h' + s.private_header_files = 'firebase_auth/Sources/firebase_auth/include/Private/**/*.h' + + s.platform = :osx, '10.13' + + # Flutter dependencies + s.dependency 'FlutterMacOS' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'Firebase/Auth', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-auth\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift new file mode 100644 index 00000000..d6451507 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift @@ -0,0 +1,43 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let libraryVersion = "6.5.4" +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_auth", + platforms: [ + .macOS("10.15") + ], + products: [ + .library(name: "firebase-auth", targets: ["firebase_auth"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core"), + ], + targets: [ + .target( + name: "firebase_auth", + dependencies: [ + .product(name: "FirebaseAuth", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ], + cSettings: [ + .headerSearchPath("include/Private"), + .headerSearchPath("include/Public"), + .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), + .define("LIBRARY_NAME", to: "\"flutter-fire-auth\""), + ] + ) + ] +) diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m new file mode 100644 index 00000000..5ef9adaf --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m @@ -0,0 +1,56 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTAuthStateChannelStreamHandler { + FIRAuth *_auth; + FIRAuthStateDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{ + @"user" : [NSNull null], + }); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeAuthStateDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m new file mode 100644 index 00000000..606dda68 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -0,0 +1,2376 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; +#import +#import +#if __has_include() +#import +#else +#import +#endif + +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Private/PigeonParser.h" + +#import "include/Public/CustomPigeonHeader.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" +@import CommonCrypto; +#import + +#if __has_include() +#import +#else +#import +#endif + +NSString *const kFLTFirebaseAuthChannelName = @"plugins.flutter.io/firebase_auth"; + +// Argument Keys +NSString *const kAppName = @"appName"; + +// Provider type keys. +NSString *const kSignInMethodPassword = @"password"; +NSString *const kSignInMethodEmailLink = @"emailLink"; +NSString *const kSignInMethodFacebook = @"facebook.com"; +NSString *const kSignInMethodGoogle = @"google.com"; +NSString *const kSignInMethodGameCenter = @"gc.apple.com"; +NSString *const kSignInMethodTwitter = @"twitter.com"; +NSString *const kSignInMethodGithub = @"github.com"; +NSString *const kSignInMethodApple = @"apple.com"; +NSString *const kSignInMethodPhone = @"phone"; +NSString *const kSignInMethodOAuth = @"oauth"; + +// Credential argument keys. +NSString *const kArgumentCredential = @"credential"; +NSString *const kArgumentProviderId = @"providerId"; +NSString *const kArgumentProviderScope = @"scopes"; +NSString *const kArgumentProviderCustomParameters = @"customParameters"; +NSString *const kArgumentSignInMethod = @"signInMethod"; +NSString *const kArgumentSecret = @"secret"; +NSString *const kArgumentIdToken = @"idToken"; +NSString *const kArgumentAccessToken = @"accessToken"; +NSString *const kArgumentRawNonce = @"rawNonce"; +NSString *const kArgumentEmail = @"email"; +NSString *const kArgumentCode = @"code"; +NSString *const kArgumentNewEmail = @"newEmail"; +NSString *const kArgumentEmailLink = kSignInMethodEmailLink; +NSString *const kArgumentToken = @"token"; +NSString *const kArgumentVerificationId = @"verificationId"; +NSString *const kArgumentSmsCode = @"smsCode"; +NSString *const kArgumentActionCodeSettings = @"actionCodeSettings"; +NSString *const kArgumentFamilyName = @"familyName"; +NSString *const kArgumentGivenName = @"givenName"; +NSString *const kArgumentMiddleName = @"middleName"; +NSString *const kArgumentNickname = @"nickname"; +NSString *const kArgumentNamePrefix = @"namePrefix"; +NSString *const kArgumentNameSuffix = @"nameSuffix"; + +// MultiFactor +NSString *const kArgumentMultiFactorHints = @"multiFactorHints"; +NSString *const kArgumentMultiFactorSessionId = @"multiFactorSessionId"; +NSString *const kArgumentMultiFactorResolverId = @"multiFactorResolverId"; +NSString *const kArgumentMultiFactorInfo = @"multiFactorInfo"; + +// Manual error codes & messages. +NSString *const kErrCodeNoCurrentUser = @"no-current-user"; +NSString *const kErrMsgNoCurrentUser = @"No user currently signed in."; +NSString *const kErrCodeInvalidCredential = @"invalid-credential"; +NSString *const kErrMsgInvalidCredential = + @"The supplied auth credential is malformed, has expired or is not " + @"currently supported."; + +// Used for caching credentials between Method Channel method calls. +static NSMutableDictionary *credentialsMap; + +@interface FLTFirebaseAuthPlugin () +@property(nonatomic, retain) NSObject *messenger; +@property(strong, nonatomic) FIROAuthProvider *authProvider; +// Used to keep the user who wants to link with Apple Sign In +@property(strong, nonatomic) FIRUser *linkWithAppleUser; +@property(strong, nonatomic) FIRAuth *signInWithAppleAuth; +@property BOOL isReauthenticatingWithApple; +@property(strong, nonatomic) NSString *currentNonce; +@property(strong, nonatomic) void (^appleCompletion) + (InternalUserCredential *_Nullable, FlutterError *_Nullable); +@property(strong, nonatomic) AuthPigeonFirebaseApp *appleArguments; +/// YES while an `ASAuthorizationController` Sign in with Apple flow is active. +@property(nonatomic, assign) BOOL appleSignInRequestInFlight; + +@end + +@implementation FLTFirebaseAuthPlugin { + // Map an id to a MultiFactorSession object. + NSMutableDictionary *_multiFactorSessionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorResolverMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorAssertionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorTotpSecretMap; + + // Emulator host/port per app, used to build REST URLs for workarounds. + NSMutableDictionary *_emulatorConfigs; + + NSObject *_binaryMessenger; + NSMutableDictionary *_eventChannels; + NSMutableDictionary *> *_streamHandlers; + NSData *_apnsToken; +} + +#pragma mark - FlutterPlugin + +- (instancetype)init:(NSObject *)messenger { + self = [super init]; + if (self) { + [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:self]; + credentialsMap = [NSMutableDictionary dictionary]; + _binaryMessenger = messenger; + _eventChannels = [NSMutableDictionary dictionary]; + _streamHandlers = [NSMutableDictionary dictionary]; + + _multiFactorSessionMap = [NSMutableDictionary dictionary]; + _multiFactorResolverMap = [NSMutableDictionary dictionary]; + _multiFactorAssertionMap = [NSMutableDictionary dictionary]; + _multiFactorTotpSecretMap = [NSMutableDictionary dictionary]; + _emulatorConfigs = [NSMutableDictionary dictionary]; + } + return self; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:kFLTFirebaseAuthChannelName + binaryMessenger:[registrar messenger]]; + FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init:registrar.messenger]; + + [registrar addMethodCallDelegate:instance channel:channel]; + + [registrar publish:instance]; + [registrar addApplicationDelegate:instance]; +#if !TARGET_OS_OSX + if (@available(iOS 13.0, *)) { + if ([registrar respondsToSelector:@selector(addSceneDelegate:)]) { + [registrar performSelector:@selector(addSceneDelegate:) withObject:instance]; + } + } +#endif + SetUpFirebaseAuthHostApi(registrar.messenger, instance); + SetUpFirebaseAuthUserHostApi(registrar.messenger, instance); + SetUpMultiFactorUserHostApi(registrar.messenger, instance); + SetUpMultiFactoResolverHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpSecretHostApi(registrar.messenger, instance); +} + ++ (FlutterError *)convertToFlutterError:(NSError *)error { + NSString *code = @"unknown"; + NSString *message = @"An unknown error has occurred."; + + if (error == nil) { + return [FlutterError errorWithCode:code message:message details:@{}]; + } + + // code + if ([error userInfo][FIRAuthErrorUserInfoNameKey] != nil) { + // See [FIRAuthErrorCodeString] for list of codes. + // Codes are in the format "ERROR_SOME_NAME", converting below to the format + // required in Dart. ERROR_SOME_NAME -> SOME_NAME + NSString *firebaseErrorCode = [error userInfo][FIRAuthErrorUserInfoNameKey]; + code = [firebaseErrorCode stringByReplacingOccurrencesOfString:@"ERROR_" withString:@""]; + // SOME_NAME -> SOME-NAME + code = [code stringByReplacingOccurrencesOfString:@"_" withString:@"-"]; + // SOME-NAME -> some-name + code = [code lowercaseString]; + } + + // message + if ([error userInfo][NSLocalizedDescriptionKey] != nil) { + message = [error userInfo][NSLocalizedDescriptionKey]; + } + + NSMutableDictionary *additionalData = [NSMutableDictionary dictionary]; + // additionalData.email + if ([error userInfo][FIRAuthErrorUserInfoEmailKey] != nil) { + additionalData[kArgumentEmail] = [error userInfo][FIRAuthErrorUserInfoEmailKey]; + } + // We want to store the credential if present for future sign in if the exception contains a + // credential, we pass a token back to Flutter to allow retrieval of the credential. + NSNumber *token = [FLTFirebaseAuthPlugin storeAuthCredentialIfPresent:error]; + + // additionalData.authCredential + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + additionalData[@"authCredential"] = [PigeonParser getPigeonAuthCredential:authCredential + token:token]; + } + + // Manual message overrides to ensure messages/codes matches other platforms. + if ([message isEqual:@"The password must be 6 characters long or more."]) { + message = @"Password should be at least 6 characters"; + } + + return [FlutterError errorWithCode:code message:message details:additionalData]; +} + ++ (id)getNSDictionaryFromAuthCredential:(FIRAuthCredential *)authCredential { + if (authCredential == nil) { + return [NSNull null]; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + return @{ + kArgumentProviderId : authCredential.provider, + // Note: "signInMethod" does not exist on iOS SDK, so using provider + // instead. + kArgumentSignInMethod : authCredential.provider, + kArgumentToken : @([authCredential hash]), + kArgumentAccessToken : accessToken ?: [NSNull null], + }; +} + +- (void)cleanupWithCompletion:(void (^)(void))completion { + // Cleanup credentials. + [credentialsMap removeAllObjects]; + + for (FlutterEventChannel *channel in self->_eventChannels.allValues) { + [channel setStreamHandler:nil]; + } + [self->_eventChannels removeAllObjects]; + for (NSObject *handler in self->_streamHandlers.allValues) { + [handler onCancelWithArguments:nil]; + } + [self->_streamHandlers removeAllObjects]; + + if (completion != nil) completion(); +} + +- (void)detachFromEngineForRegistrar:(NSObject *)registrar { + [self cleanupWithCompletion:nil]; +} + +#pragma mark - AppDelegate + +#if TARGET_OS_IPHONE +#if !__has_include() +- (BOOL)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if ([[FIRAuth auth] canHandleNotification:notification]) { + completionHandler(UIBackgroundFetchResultNoData); + return YES; + } + return NO; +} +#endif + +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + _apnsToken = deviceToken; +} + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + return [[FIRAuth auth] canHandleURL:url]; +} + +#pragma mark - SceneDelegate + +- (BOOL)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0)) { + for (UIOpenURLContext *urlContext in URLContexts) { + if ([[FIRAuth auth] canHandleURL:urlContext.URL]) { + return YES; + } + } + return NO; +} +#endif + +#pragma mark - FLTFirebasePlugin + +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + [self cleanupWithCompletion:completion]; +} + +- (NSString *_Nonnull)firebaseLibraryName { + return @LIBRARY_NAME; +} + +- (NSString *_Nonnull)firebaseLibraryVersion { + return @LIBRARY_VERSION; +} + +- (NSString *_Nonnull)flutterChannelName { + return kFLTFirebaseAuthChannelName; +} + +- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp { + FIRAuth *auth = [FIRAuth authWithApp:firebaseApp]; + return @{ + @"APP_LANGUAGE_CODE" : (id)[auth languageCode] ?: [NSNull null], + @"APP_CURRENT_USER" : [auth currentUser] + ? [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + : [NSNull null], + }; +} + +#pragma mark - Firebase Auth API + +// Adapted from +// https://auth0.com/docs/api-auth/tutorials/nonce#generate-a-cryptographically-random-nonce Used +// for Apple Sign In +- (NSString *)randomNonce:(NSInteger)length { + NSAssert(length > 0, @"Expected nonce to have positive length"); + NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; + NSMutableString *result = [NSMutableString string]; + NSInteger remainingLength = length; + + while (remainingLength > 0) { + NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; + for (NSInteger i = 0; i < 16; i++) { + uint8_t random = 0; + int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); + NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); + + [randoms addObject:@(random)]; + } + + for (NSNumber *random in randoms) { + if (remainingLength == 0) { + break; + } + + if (random.unsignedIntValue < characterSet.length) { + unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; + [result appendFormat:@"%C", character]; + remainingLength--; + } + } + } + + return [result copy]; +} + +- (NSString *)stringBySha256HashingString:(NSString *)input { + const char *string = [input UTF8String]; + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(string, (CC_LONG)strlen(string), result); + + NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hashed appendFormat:@"%02x", result[i]]; + } + return hashed; +} + +static void handleSignInWithApple(FLTFirebaseAuthPlugin *object, FIRAuthDataResult *authResult, + NSString *authorizationCode, NSError *error) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + object.appleCompletion; + if (completion == nil) { + object.appleSignInRequestInFlight = NO; + return; + } + + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + [object handleMultiFactorError:object.appleArguments completion:completion withError:error]; + } else { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:authorizationCode], + nil); +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithAuthorization:(ASAuthorization *)authorization + API_AVAILABLE(macos(10.15), ios(13.0)) { + if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { + ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; + NSString *rawNonce = self.currentNonce; + NSAssert(rawNonce != nil, + @"Invalid state: A login callback was received, but no login request was sent."); + + if (appleIDCredential.identityToken == nil) { + NSLog(@"Unable to fetch identity token."); + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + return; + } + + NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken + encoding:NSUTF8StringEncoding]; + if (idToken == nil) { + NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); + } + + NSString *authorizationCode = nil; + if (appleIDCredential.authorizationCode != nil) { + authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode + encoding:NSUTF8StringEncoding]; + } + + FIROAuthCredential *credential = + [FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:appleIDCredential.fullName]; + + if (self.isReauthenticatingWithApple == YES) { + self.isReauthenticatingWithApple = NO; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [[FIRAuth.auth currentUser] + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else if (self.linkWithAppleUser != nil) { + FIRUser *userToLink = self.linkWithAppleUser; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [userToLink linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, NSError *error) { + self.linkWithAppleUser = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else { + FIRAuth *signInAuth = + self.signInWithAppleAuth != nil ? self.signInWithAppleAuth : FIRAuth.auth; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [signInAuth signInWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + self.signInWithAppleAuth = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + } + } else { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + } +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithError:(NSError *)error API_AVAILABLE(macos(10.15), ios(13.0)) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + + NSLog(@"Sign in with Apple errored: %@", error); + if (completion == nil) { + return; + } + + switch (error.code) { + case ASAuthorizationErrorCanceled: + completion(nil, [FlutterError errorWithCode:@"canceled" + message:@"The user canceled the authorization attempt." + details:nil]); + break; + + case ASAuthorizationErrorInvalidResponse: + completion(nil, [FlutterError + errorWithCode:@"invalid-response" + message:@"The authorization request received an invalid response." + details:nil]); + break; + + case ASAuthorizationErrorNotHandled: + completion(nil, [FlutterError errorWithCode:@"not-handled" + message:@"The authorization request wasn’t handled." + details:nil]); + break; + + case ASAuthorizationErrorFailed: + completion(nil, [FlutterError errorWithCode:@"failed" + message:@"The authorization attempt failed." + details:nil]); + break; + + case ASAuthorizationErrorUnknown: + default: + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + break; + } +} + +- (void)handleInternalError:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *)error { + const NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; + if (underlyingError != nil) { + const NSDictionary *details = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDeserializedResponseKey"]; + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:details]); + return; + } + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:nil]); +} + +- (void)handleMultiFactorError:(AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *_Nullable)error { + FIRMultiFactorResolver *resolver = + (FIRMultiFactorResolver *)error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; + + NSArray *hints = resolver.hints; + FIRMultiFactorSession *session = resolver.session; + + NSString *sessionId = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[sessionId] = session; + + NSString *resolverId = [[NSUUID UUID] UUIDString]; + self->_multiFactorResolverMap[resolverId] = resolver; + + NSMutableArray *pigeonHints = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in hints) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + InternalMultiFactorInfo *object = [InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]; + + [pigeonHints addObject:object.toList]; + } + + NSDictionary *output = @{ + kAppName : app.appName, + kArgumentMultiFactorHints : pigeonHints, + kArgumentMultiFactorSessionId : sessionId, + kArgumentMultiFactorResolverId : resolverId, + }; + completion(nil, [FlutterError errorWithCode:@"second-factor-required" + message:error.description + details:output]); +} + +static void launchAppleSignInRequest(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + InternalSignInProvider *signInProvider, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (@available(iOS 13.0, macOS 10.15, *)) { + if (object.appleSignInRequestInFlight) { + completion(nil, + [FlutterError errorWithCode:@"operation-not-allowed" + message:@"A Sign in with Apple request is already in progress." + details:nil]); + return; + } + + NSString *nonce = [object randomNonce:32]; + object.currentNonce = nonce; + object.appleCompletion = completion; + object.appleArguments = app; + object.appleSignInRequestInFlight = YES; + + ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; + + ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; + NSMutableArray *requestedScopes = [NSMutableArray arrayWithCapacity:2]; + if ([signInProvider.scopes containsObject:@"name"]) { + [requestedScopes addObject:ASAuthorizationScopeFullName]; + } + if ([signInProvider.scopes containsObject:@"email"]) { + [requestedScopes addObject:ASAuthorizationScopeEmail]; + } + request.requestedScopes = [requestedScopes copy]; + request.nonce = [object stringBySha256HashingString:nonce]; + + ASAuthorizationController *authorizationController = + [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[ request ]]; + authorizationController.delegate = object; + authorizationController.presentationContextProvider = object; + [authorizationController performRequests]; + } else { + NSLog(@"Sign in with Apple was introduced in iOS 13, update your Podfile with platform :ios, " + @"'13.0'"); + } +} + +static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + FIRAuth *auth, FIRAuthCredential *credentials, NSError *error, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (error) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [object handleMultiFactorError:app completion:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + if (credentials) { + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; + + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + // Removing since it's not parsed and causing issue when sending back the + // object to Flutter + NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; + [mutableUserInfo + removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + NSError *modifiedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:mutableUserInfo]; + + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:userInfo[@"NSLocalizedDescription"] + details:modifiedError.userInfo]); + + } else if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is + // buried in underlying error. + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:firebaseDictionary[@"message"]]); + } else { + completion(nil, [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:error.userInfo]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; + } +} + +#pragma mark - Utilities + ++ (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + // We temporarily store the non-serializable credential so the + // Dart API can consume these at a later time. + NSNumber *authCredentialHash = @([authCredential hash]); + credentialsMap[authCredentialHash] = authCredential; + return authCredentialHash; + } + return nil; +} + +- (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { + FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; + FIRAuth *auth = [FIRAuth authWithApp:app]; + + auth.tenantID = pigeonApp.tenantId; + auth.customAuthDomain = [FLTFirebaseCorePlugin getCustomDomain:app.name]; + // Auth's `customAuthDomain` supersedes value from `getCustomDomain` set by `initializeApp` + if (pigeonApp.customAuthDomain != nil) { + auth.customAuthDomain = pigeonApp.customAuthDomain; + } + + return auth; +} + +- (void)getFIRAuthCredentialFromArguments:(NSDictionary *)arguments + app:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FIRAuthCredential *credential, + NSError *error))completion { + // If the credential dictionary contains a token, it means a native one has + // been stored for later usage, so we'll attempt to retrieve it here. + if (arguments[kArgumentToken] != nil && ![arguments[kArgumentToken] isEqual:[NSNull null]]) { + NSNumber *credentialHashCode = arguments[kArgumentToken]; + if (credentialsMap[credentialHashCode] != nil) { + completion(credentialsMap[credentialHashCode], nil); + return; + } + } + + NSString *signInMethod = arguments[kArgumentSignInMethod]; + + if ([signInMethod isEqualToString:kSignInMethodGameCenter]) { + // Game Center Games is different to other providers, it requires below callback to get a + // credential. This is why getFIRAuthCredentialFromArguments now requires a completion() + // callback + [FIRGameCenterAuthProvider + getCredentialWithCompletion:^(FIRAuthCredential *credential, NSError *error) { + if (error) { + completion(nil, error); + } else { + completion(credential, nil); + } + }]; + return; + } + + NSString *secret = arguments[kArgumentSecret] == [NSNull null] ? nil : arguments[kArgumentSecret]; + NSString *idToken = + arguments[kArgumentIdToken] == [NSNull null] ? nil : arguments[kArgumentIdToken]; + NSString *accessToken = + arguments[kArgumentAccessToken] == [NSNull null] ? nil : arguments[kArgumentAccessToken]; + NSString *rawNonce = + arguments[kArgumentRawNonce] == [NSNull null] ? nil : arguments[kArgumentRawNonce]; + + // Password Auth + if ([signInMethod isEqualToString:kSignInMethodPassword]) { + NSString *email = arguments[kArgumentEmail]; + completion([FIREmailAuthProvider credentialWithEmail:email password:secret], nil); + return; + } + + // Email Link Auth + if ([signInMethod isEqualToString:kSignInMethodEmailLink]) { + NSString *email = arguments[kArgumentEmail]; + NSString *emailLink = arguments[kArgumentEmailLink]; + completion([FIREmailAuthProvider credentialWithEmail:email link:emailLink], nil); + return; + } + + // Facebook Auth + if ([signInMethod isEqualToString:kSignInMethodFacebook]) { + completion([FIRFacebookAuthProvider credentialWithAccessToken:accessToken], nil); + return; + } + + // Google Auth + if ([signInMethod isEqualToString:kSignInMethodGoogle]) { + completion([FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken], nil); + return; + } + + // Twitter Auth + if ([signInMethod isEqualToString:kSignInMethodTwitter]) { + completion([FIRTwitterAuthProvider credentialWithToken:accessToken secret:secret], nil); + return; + } + + // GitHub Auth + if ([signInMethod isEqualToString:kSignInMethodGithub]) { + completion([FIRGitHubAuthProvider credentialWithToken:accessToken], nil); + return; + } + + // Phone Auth - Only supported on iOS + if ([signInMethod isEqualToString:kSignInMethodPhone]) { +#if TARGET_OS_IPHONE + NSString *verificationId = arguments[kArgumentVerificationId]; + NSString *smsCode = arguments[kArgumentSmsCode]; + completion([[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:verificationId + verificationCode:smsCode], + nil); + return; +#else + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); + return; +#endif + } + // Apple Auth + if ([signInMethod isEqualToString:kSignInMethodApple]) { + if (idToken && rawNonce) { + // Credential with idToken, rawNonce and fullName + NSPersonNameComponents *fullName = [[NSPersonNameComponents alloc] init]; + fullName.givenName = + arguments[kArgumentGivenName] == [NSNull null] ? nil : arguments[kArgumentGivenName]; + fullName.familyName = + arguments[kArgumentFamilyName] == [NSNull null] ? nil : arguments[kArgumentFamilyName]; + fullName.nickname = + arguments[kArgumentNickname] == [NSNull null] ? nil : arguments[kArgumentNickname]; + fullName.namePrefix = + arguments[kArgumentNamePrefix] == [NSNull null] ? nil : arguments[kArgumentNamePrefix]; + fullName.nameSuffix = + arguments[kArgumentNameSuffix] == [NSNull null] ? nil : arguments[kArgumentNameSuffix]; + fullName.middleName = + arguments[kArgumentMiddleName] == [NSNull null] ? nil : arguments[kArgumentMiddleName]; + + completion([FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:fullName], + nil); + return; + } + } + // OAuth + if ([signInMethod isEqualToString:kSignInMethodOAuth]) { + NSString *providerId = arguments[kArgumentProviderId]; + completion([FIROAuthProvider credentialWithProviderID:providerId + IDToken:idToken + rawNonce:rawNonce + accessToken:accessToken], + nil); + return; + } + + NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", signInMethod); + completion(nil, nil); + return; +} + +- (void)ensureAPNSTokenSetting { +#if !TARGET_OS_OSX + FIRApp *defaultApp = [FIRApp defaultApp]; + if (defaultApp) { + if ([FIRAuth auth].APNSToken == nil && _apnsToken != nil) { + [[FIRAuth auth] setAPNSToken:_apnsToken type:FIRAuthAPNSTokenTypeUnknown]; + _apnsToken = nil; + } + } +#endif +} + +- (FIRMultiFactor *)getAppMultiFactorFromPigeon:(nonnull AuthPigeonFirebaseApp *)app { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + return currentUser.multiFactor; +} + +- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController: + (nonnull ASAuthorizationController *)controller API_AVAILABLE(macos(10.15), ios(13.0)) { +#if TARGET_OS_OSX + return [[NSApplication sharedApplication] keyWindow]; +#else + // UIApplication.keyWindow is deprecated in iOS 13+ with UIScene lifecycle. + // Walk the connected scenes to find the foreground active window. + if (@available(iOS 15.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.keyWindow) { + return windowScene.keyWindow; + } + } + } + } else if (@available(iOS 13.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + return window; + } + } + } + } + } + return [[UIApplication sharedApplication] keyWindow]; +#endif +} + +- (void)enrollPhoneApp:(nonnull AuthPigeonFirebaseApp *)app + assertion:(nonnull InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + completion([FlutterError errorWithCode:@"unsupported-platform" + message:@"Phone authentication is not supported on macOS" + details:nil]); +#else + + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + + FIRMultiFactorAssertion *multiFactorAssertion = + [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; + + [multiFactor enrollWithAssertion:multiFactorAssertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +#endif +} + +- (void)getEnrolledFactorsApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + NSArray *enrolledFactors = [multiFactor enrolledFactors]; + + NSMutableArray *results = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in enrolledFactors) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + [results addObject:[InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]]; + } + + completion(results, nil); +} + +- (void)getSessionApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalMultiFactorSession *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session, + NSError *_Nullable error) { + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[UUID] = session; + + InternalMultiFactorSession *pigeonSession = [InternalMultiFactorSession makeWithId:UUID]; + completion(pigeonSession, nil); + }]; +} + +- (void)unenrollApp:(nonnull AuthPigeonFirebaseApp *)app + factorUid:(nonnull NSString *)factorUid + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor unenrollWithFactorUID:factorUid + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"unenroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)enrollTotpApp:(nonnull AuthPigeonFirebaseApp *)app + assertionId:(nonnull NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRMultiFactorAssertion *assertion = _multiFactorAssertionMap[assertionId]; + + [multiFactor enrollWithAssertion:assertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)resolveSignInResolverId:(nonnull NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorResolver *resolver = _multiFactorResolverMap[resolverId]; + + FIRMultiFactorAssertion *multiFactorAssertion; + + if (assertion != nil) { +#if TARGET_OS_IPHONE + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider provider] credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + multiFactorAssertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; +#endif + } else if (totpAssertionId != nil) { + multiFactorAssertion = _multiFactorAssertionMap[totpAssertionId]; + } else { + completion(nil, + [FlutterError errorWithCode:@"resolve-signin-failed" + message:@"Neither assertion nor totpAssertionId were provided" + details:nil]); + return; + } + + [resolver + resolveSignInWithAssertion:multiFactorAssertion + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error == nil) { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } else { + completion(nil, [FlutterError errorWithCode:@"resolve-signin-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)generateSecretSessionId:(nonnull NSString *)sessionId + completion:(nonnull void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorSession *multiFactorSession = _multiFactorSessionMap[sessionId]; + + [FIRTOTPMultiFactorGenerator + generateSecretWithMultiFactorSession:multiFactorSession + completion:^(FIRTOTPSecret *_Nullable secret, + NSError *_Nullable error) { + if (error == nil) { + self->_multiFactorTotpSecretMap[secret.sharedSecretKey] = + secret; + completion([PigeonParser getPigeonTotpSecret:secret], nil); + } else { + completion( + nil, [FlutterError errorWithCode:@"generate-secret-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)getAssertionForEnrollmentSecretKey:(nonnull NSString *)secretKey + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForEnrollmentWithSecret:totpSecret + oneTimePassword:oneTimePassword]; + + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)getAssertionForSignInEnrollmentId:(nonnull NSString *)enrollmentId + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForSignInWithEnrollmentID:enrollmentId + oneTimePassword:oneTimePassword]; + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)generateQrCodeUrlSecretKey:(nonnull NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + completion([totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer], nil); +} + +- (void)openInOtpAppSecretKey:(nonnull NSString *)secretKey + qrCodeUrl:(nonnull NSString *)qrCodeUrl + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + [totpSecret openInOTPAppWithQRCodeURL:qrCodeUrl]; + completion(nil); +} + +- (void)applyActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth applyActionCode:code + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeTokenWithAuthorizationCodeApp:(nonnull AuthPigeonFirebaseApp *)app + authorizationCode:(nonnull NSString *)authorizationCode + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth revokeTokenWithAuthorizationCode:authorizationCode + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeAccessTokenApp:(nonnull AuthPigeonFirebaseApp *)app + accessToken:(nonnull NSString *)accessToken + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + // `revokeAccessToken(_:)` is currently Android-only on the Firebase SDK. + // On Apple platforms use `revokeTokenWithAuthorizationCode:` instead. + completion([FlutterError errorWithCode:@"unsupported-platform-operation" + message:@"revokeAccessToken is not supported on iOS/macOS. " + @"Use revokeTokenWithAuthorizationCode instead." + details:nil]); +} + +- (void)checkActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth checkActionCode:code + completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + InternalActionCodeInfo *result = [self parseActionCode:info]; + if (result.operation == ActionCodeInfoOperationUnknown) { + // Workaround: Firebase iOS SDK >=11.12.0 returns .unknown because + // actionCodeOperation(forRequestType:) only matches camelCase but the + // REST API returns SCREAMING_SNAKE_CASE (e.g. "VERIFY_EMAIL"). + // Re-fetch the raw requestType via REST to resolve the operation. + // See: https://github.com/firebase/flutterfire/issues/17452 + [self resolveActionCodeOperationForApp:app + code:code + fallbackInfo:result + completion:completion]; + } else { + completion(result, nil); + } + } + }]; +} + +- (InternalActionCodeInfo *_Nullable)parseActionCode:(nonnull FIRActionCodeInfo *)info { + InternalActionCodeInfoData *data = [InternalActionCodeInfoData makeWithEmail:info.email + previousEmail:info.previousEmail]; + + ActionCodeInfoOperation operation; + + if (info.operation == FIRActionCodeOperationPasswordReset) { + operation = ActionCodeInfoOperationPasswordReset; + } else if (info.operation == FIRActionCodeOperationVerifyEmail) { + operation = ActionCodeInfoOperationVerifyEmail; + } else if (info.operation == FIRActionCodeOperationRecoverEmail) { + operation = ActionCodeInfoOperationRecoverEmail; + } else if (info.operation == FIRActionCodeOperationEmailLink) { + operation = ActionCodeInfoOperationEmailSignIn; + } else if (info.operation == FIRActionCodeOperationVerifyAndChangeEmail) { + operation = ActionCodeInfoOperationVerifyAndChangeEmail; + } else if (info.operation == FIRActionCodeOperationRevertSecondFactorAddition) { + operation = ActionCodeInfoOperationRevertSecondFactorAddition; + } else { + operation = ActionCodeInfoOperationUnknown; + } + + return [InternalActionCodeInfo makeWithOperation:operation data:data]; +} + +/// Maps a raw requestType string (either camelCase or SCREAMING_SNAKE_CASE) to +/// the corresponding Pigeon enum value. ++ (ActionCodeInfoOperation)operationFromRequestType:(nullable NSString *)requestType { + static NSDictionary *mapping; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mapping = @{ + @"PASSWORD_RESET" : @(ActionCodeInfoOperationPasswordReset), + @"resetPassword" : @(ActionCodeInfoOperationPasswordReset), + @"VERIFY_EMAIL" : @(ActionCodeInfoOperationVerifyEmail), + @"verifyEmail" : @(ActionCodeInfoOperationVerifyEmail), + @"RECOVER_EMAIL" : @(ActionCodeInfoOperationRecoverEmail), + @"recoverEmail" : @(ActionCodeInfoOperationRecoverEmail), + @"EMAIL_SIGNIN" : @(ActionCodeInfoOperationEmailSignIn), + @"signIn" : @(ActionCodeInfoOperationEmailSignIn), + @"VERIFY_AND_CHANGE_EMAIL" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"verifyAndChangeEmail" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"REVERT_SECOND_FACTOR_ADDITION" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + @"revertSecondFactorAddition" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + }; + }); + + NSNumber *value = mapping[requestType]; + return value ? (ActionCodeInfoOperation)value.integerValue : ActionCodeInfoOperationUnknown; +} + +/// Calls the Identity Toolkit REST API directly to retrieve the raw requestType +/// string, which the iOS SDK fails to parse correctly. Falls back to the original +/// result if the REST call fails for any reason. +- (void)resolveActionCodeOperationForApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + fallbackInfo:(nonnull InternalActionCodeInfo *)fallbackInfo + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:app.appName]; + NSString *apiKey = firebaseApp.options.APIKey; + + NSString *baseURL; + NSDictionary *emulatorConfig = _emulatorConfigs[app.appName]; + if (emulatorConfig) { + baseURL = [NSString stringWithFormat:@"http://%@:%@/identitytoolkit.googleapis.com", + emulatorConfig[@"host"], emulatorConfig[@"port"]]; + } else { + baseURL = @"https://identitytoolkit.googleapis.com"; + } + + NSString *urlString = + [NSString stringWithFormat:@"%@/v1/accounts:resetPassword?key=%@", baseURL, apiKey]; + NSURL *url = [NSURL URLWithString:urlString]; + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = @"POST"; + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + request.HTTPBody = [NSJSONSerialization dataWithJSONObject:@{@"oobCode" : code} + options:0 + error:nil]; + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error || !data) { + completion(fallbackInfo, nil); + return; + } + + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (!json || json[@"error"]) { + completion(fallbackInfo, nil); + return; + } + + ActionCodeInfoOperation operation = + [FLTFirebaseAuthPlugin operationFromRequestType:json[@"requestType"]]; + + if (operation != ActionCodeInfoOperationUnknown) { + completion([InternalActionCodeInfo makeWithOperation:operation data:fallbackInfo.data], + nil); + } else { + completion(fallbackInfo, nil); + } + }]; + [task resume]; +} + +- (void)confirmPasswordResetApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth confirmPasswordResetWithCode:code + newPassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)createUserWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth createUserWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)fetchSignInMethodsForEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth fetchSignInMethodsForEmail:email + completion:^(NSArray *_Nullable providers, + NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + if (providers == nil) { + completion(@[], nil); + } else { + completion(providers, nil); + } + } + }]; +} + +- (void)registerAuthStateListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/auth-state/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTAuthStateChannelStreamHandler *handler = + [[FLTAuthStateChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)registerIdTokenListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/id-token/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTIdTokenChannelStreamHandler *handler = + [[FLTIdTokenChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)sendPasswordResetEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + if (actionCodeSettings != nil) { + FIRActionCodeSettings *settings = [PigeonParser parseActionCodeSettings:actionCodeSettings]; + [auth sendPasswordResetWithEmail:email + actionCodeSettings:settings + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } else { + [auth sendPasswordResetWithEmail:email + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } +} + +- (void)sendSignInLinkToEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nonnull InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth sendSignInLinkToEmail:email + actionCodeSettings:[PigeonParser parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeInternalError) { + [self + handleInternalError:^(InternalUserCredential *_Nullable creds, + FlutterError *_Nullable internalError) { + completion(internalError); + } + withError:error]; + } else { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion(nil); + } + }]; +} + +- (void)setLanguageCodeApp:(nonnull AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (languageCode != nil && ![languageCode isEqual:[NSNull null]]) { + auth.languageCode = languageCode; + } else { + [auth useAppLanguage]; + } + + completion(auth.languageCode, nil); +} + +- (void)setSettingsApp:(nonnull AuthPigeonFirebaseApp *)app + settings:(nonnull InternalFirebaseAuthSettings *)settings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (settings.userAccessGroup != nil) { + BOOL useUserAccessGroupSuccessful; + NSError *useUserAccessGroupErrorPtr; + useUserAccessGroupSuccessful = [auth useUserAccessGroup:settings.userAccessGroup + error:&useUserAccessGroupErrorPtr]; + if (!useUserAccessGroupSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:useUserAccessGroupErrorPtr]); + return; + } + } + +#if TARGET_OS_IPHONE + if (settings.appVerificationDisabledForTesting) { + auth.settings.appVerificationDisabledForTesting = settings.appVerificationDisabledForTesting; + } +#else + NSLog(@"FIRAuthSettings.appVerificationDisabledForTesting is not supported " + @"on MacOS."); +#endif + + completion(nil); +} + +- (void)signInAnonymouslyApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [auth + signInWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = + [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError + .userInfo[@"FIRAuthErrorUserInfoDeserializ" + @"edResponseKey"]; + + if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is buried in + // underlying error. + if ([firebaseDictionary[@"code"] + isKindOfClass:[NSNumber class]]) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FlutterError + errorWithCode:firebaseDictionary + [@"code"] + message:firebaseDictionary + [@"message"] + details:nil]); + } + } else { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else if (error.code == + FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)signInWithCustomTokenApp:(nonnull AuthPigeonFirebaseApp *)app + token:(nonnull NSString *)token + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth signInWithCustomToken:token + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailLinkApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + emailLink:(nonnull NSString *)emailLink + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + link:emailLink + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"sign-in-failure" + message: + @"Game Center sign-in requires signing in with 'signInWithCredential()' API." + details:@{}]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.signInWithAppleAuth = auth; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"signInWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId auth:auth]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [self.authProvider + getCredentialWithUIDelegate:nil + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + handleAppleAuthResult(self, app, auth, credential, error, completion); + }]; +#endif +} + +- (void)signOutApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (auth.currentUser == nil) { + completion(nil); + return; + } + + NSError *signOutErrorPtr; + BOOL signOutSuccessful = [auth signOut:&signOutErrorPtr]; + + if (!signOutSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:signOutErrorPtr]); + } else { + completion(nil); + } +} + +- (void)useEmulatorApp:(nonnull AuthPigeonFirebaseApp *)app + host:(nonnull NSString *)host + port:(long)port + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth useEmulatorWithHost:host port:port]; + _emulatorConfigs[app.appName] = @{@"host" : host, @"port" : @(port)}; + completion(nil); +} + +- (void)verifyPasswordResetCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth verifyPasswordResetCode:code + completion:^(NSString *_Nullable email, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(email, nil); + } + }]; +} + +- (void)verifyPhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + request:(nonnull InternalVerifyPhoneNumberRequest *)request + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = [NSString + stringWithFormat:@"%@/phone/%@", kFLTFirebaseAuthChannelName, [NSUUID UUID].UUIDString]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + NSString *multiFactorSessionId = request.multiFactorSessionId; + FIRMultiFactorSession *multiFactorSession = nil; + + if (multiFactorSessionId != nil) { + multiFactorSession = _multiFactorSessionMap[multiFactorSessionId]; + } + + NSString *multiFactorInfoId = request.multiFactorInfoId; + + FIRPhoneMultiFactorInfo *multiFactorInfo = nil; + if (multiFactorInfoId != nil) { + for (NSString *resolverId in _multiFactorResolverMap) { + for (FIRMultiFactorInfo *info in _multiFactorResolverMap[resolverId].hints) { + if ([info.UID isEqualToString:multiFactorInfoId] && + [info class] == [FIRPhoneMultiFactorInfo class]) { + multiFactorInfo = (FIRPhoneMultiFactorInfo *)info; + break; + } + } + } + } + +#if TARGET_OS_OSX + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth]; +#else + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth + request:request + session:multiFactorSession + factorInfo:multiFactorInfo]; +#endif + + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +#endif +} + +- (void)deleteApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser deleteWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)getIdTokenApp:(nonnull AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion:(nonnull void (^)(InternalIdTokenResult *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + getIDTokenResultForcingRefresh:forceRefresh + completion:^(FIRAuthTokenResult *tokenResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + completion([PigeonParser parseIdTokenResult:tokenResult], nil); + }]; +} + +- (void)linkWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)linkWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"provider-link-failure" + message:@"Game Center provider requires linking with 'linkWithCredential()' API." + details:@{}]); + return; + } + + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.linkWithAppleUser = currentUser; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"linkWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser + linkWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, error, completion); + }]; +#endif +} + +- (void)reauthenticateWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion( + nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode: + nil], + nil); + } + }]; + }]; +} + +- (void)reauthenticateWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.isReauthenticatingWithApple = YES; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"reauthenticateWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser reauthenticateWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, + error, completion); + }]; +#endif +} + +- (void)reloadApp:(nonnull AuthPigeonFirebaseApp *)app + completion: + (nonnull void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser reloadWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; +} + +- (void)sendEmailVerificationApp:(nonnull AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationWithActionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)unlinkApp:(nonnull AuthPigeonFirebaseApp *)app + providerId:(nonnull NSString *)providerId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser unlinkFromProvider:providerId + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromFIRUser:user], nil); + } + }]; +} + +- (void)updateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser updateEmail:newEmail + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePasswordApp:(nonnull AuthPigeonFirebaseApp *)app + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + updatePassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { +#if TARGET_OS_IPHONE + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } else { + [currentUser + reloadWithCompletion:^( + NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError: + reloadError]); + } else { + completion( + [PigeonParser getPigeonDetails: + currentUser], + nil); + } + }]; + } + }]; + }]; +#else + NSLog(@"Updating a users phone number via Firebase Authentication is only " + @"supported on the iOS " + @"platform."); + completion(nil, nil); +#endif +} + +- (void)updateProfileApp:(nonnull AuthPigeonFirebaseApp *)app + profile:(nonnull InternalUserProfile *)profile + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + FIRUserProfileChangeRequest *changeRequest = [currentUser profileChangeRequest]; + + if (profile.displayNameChanged) { + changeRequest.displayName = profile.displayName; + } + + if (profile.photoUrlChanged) { + if (profile.photoUrl == nil) { + // We apparently cannot set photoURL to nil/NULL to remove it. + // Instead, setting it to empty string appears to work. + // When doing so, Dart will properly receive `null` anyway. + changeRequest.photoURL = [NSURL URLWithString:@""]; + } else { + changeRequest.photoURL = [NSURL URLWithString:profile.photoUrl]; + } + } + + [changeRequest commitChangesWithCompletion:^(NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)verifyBeforeUpdateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationBeforeUpdatingEmail:newEmail + actionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"initializeRecaptchaConfigWithCompletion is not supported on the " + @"MacOS platform."); + completion(nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth initializeRecaptchaConfigWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +#endif +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m new file mode 100644 index 00000000..315bc5ec --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m @@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTIdTokenChannelStreamHandler { + FIRAuth *_auth; + FIRIDTokenDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{@"user" : [NSNull null]}); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeIDTokenDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m new file mode 100644 index 00000000..511d2caa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m @@ -0,0 +1,98 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTPhoneNumberVerificationStreamHandler { + FIRAuth *_auth; + NSString *_phoneNumber; +#if TARGET_OS_OSX +#else + FIRMultiFactorSession *_session; + FIRPhoneMultiFactorInfo *_factorInfo; +#endif +} + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(id)auth request:(InternalVerifyPhoneNumberRequest *)request { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + } + return self; +} +#else +- (instancetype)initWithAuth:(id)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + _session = session; + _factorInfo = factorInfo; + } + return self; +} +#endif + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { +#if TARGET_OS_IPHONE + id completer = ^(NSString *verificationID, NSError *error) { + if (error != nil) { + FlutterError *errorDetails = [FLTFirebaseAuthPlugin convertToFlutterError:error]; + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"code" : errorDetails.code, + @"message" : errorDetails.message, + @"details" : errorDetails.details, + } + }); + } else { + events(@{ + @"name" : @"Auth#phoneCodeSent", + @"verificationId" : verificationID, + }); + } + }; + + // Try catch to capture 'missing URL scheme' error. + @try { + if (_factorInfo != nil) { + [[FIRPhoneAuthProvider providerWithAuth:_auth] + verifyPhoneNumberWithMultiFactorInfo:_factorInfo + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + + } else { + [[FIRPhoneAuthProvider providerWithAuth:_auth] verifyPhoneNumber:_phoneNumber + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + } + } @catch (NSException *exception) { + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"message" : exception.reason, + } + }); + } +#endif + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m new file mode 100644 index 00000000..8d7a7b1c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m @@ -0,0 +1,171 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/PigeonParser.h" +#import +#import "include/Public/CustomPigeonHeader.h" + +@implementation PigeonParser + ++ (InternalUserCredential *) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalUserCredential + makeWithUser:[self getPigeonDetails:authResult.user] + additionalUserInfo:[self getPigeonAdditionalUserInfo:authResult.additionalUserInfo + authorizationCode:authorizationCode] + credential:[self getPigeonAuthCredential:authResult.credential token:nil]]; +} + ++ (InternalUserCredential *)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user { + return [InternalUserCredential makeWithUser:[self getPigeonDetails:user] + additionalUserInfo:nil + credential:nil]; +} + ++ (InternalUserDetails *)getPigeonDetails:(nonnull FIRUser *)user { + return [InternalUserDetails makeWithUserInfo:[self getPigeonUserInfo:user] + providerData:[self getProviderData:user.providerData]]; +} + ++ (InternalUserInfo *)getPigeonUserInfo:(nonnull FIRUser *)user { + NSString *photoUrlString = user.photoURL.absoluteString; + return [InternalUserInfo + makeWithUid:user.uid + email:user.email + displayName:user.displayName + photoUrl:(photoUrlString.length > 0) ? photoUrlString : nil + phoneNumber:user.phoneNumber + isAnonymous:user.isAnonymous + isEmailVerified:user.emailVerified + providerId:user.providerID + tenantId:user.tenantID + refreshToken:user.refreshToken + creationTimestamp:@((long)([user.metadata.creationDate timeIntervalSince1970] * 1000)) + lastSignInTimestamp:@((long)([user.metadata.lastSignInDate timeIntervalSince1970] * 1000))]; +} + ++ (NSArray *> *)getProviderData: + (nonnull NSArray> *)providerData { + NSMutableArray *> *dataArray = + [NSMutableArray arrayWithCapacity:providerData.count]; + + for (id userInfo in providerData) { + NSString *photoUrlStr = userInfo.photoURL.absoluteString; + NSDictionary *dataDict = @{ + @"providerId" : userInfo.providerID, + // Can be null on emulator + @"uid" : userInfo.uid ?: @"", + @"displayName" : userInfo.displayName ?: [NSNull null], + @"email" : userInfo.email ?: [NSNull null], + @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], + @"photoURL" : photoUrlStr ?: [NSNull null], + // isAnonymous is always false on in a providerData object (the user is not anonymous) + @"isAnonymous" : @NO, + // isEmailVerified is always true on in a providerData object (the email is verified by the + // provider) + @"isEmailVerified" : @YES, + }; + [dataArray addObject:dataDict]; + } + return [dataArray copy]; +} + ++ (InternalAdditionalUserInfo *)getPigeonAdditionalUserInfo: + (nonnull FIRAdditionalUserInfo *)userInfo + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalAdditionalUserInfo makeWithIsNewUser:userInfo.isNewUser + providerId:userInfo.providerID + username:userInfo.username + authorizationCode:authorizationCode + profile:userInfo.profile]; +} + ++ (InternalTotpSecret *)getPigeonTotpSecret:(FIRTOTPSecret *)secret { + return [InternalTotpSecret makeWithCodeIntervalSeconds:nil + codeLength:nil + enrollmentCompletionDeadline:nil + hashingAlgorithm:nil + secretKey:secret.sharedSecretKey]; +} + ++ (InternalAuthCredential *)getPigeonAuthCredential:(FIRAuthCredential *)authCredential + token:(NSNumber *_Nullable)token { + if (authCredential == nil) { + return nil; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + NSUInteger nativeId = + token != nil ? [token unsignedLongValue] : (NSUInteger)[authCredential hash]; + + return [InternalAuthCredential makeWithProviderId:authCredential.provider + signInMethod:authCredential.provider + nativeId:nativeId + accessToken:accessToken ?: nil]; +} + ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings { + if (settings == nil) { + return nil; + } + + FIRActionCodeSettings *codeSettings = [[FIRActionCodeSettings alloc] init]; + + if (settings.url != nil) { + codeSettings.URL = [NSURL URLWithString:settings.url]; + } + + if (settings.linkDomain != nil) { + codeSettings.linkDomain = settings.linkDomain; + } + + codeSettings.handleCodeInApp = settings.handleCodeInApp; + + if (settings.iOSBundleId != nil) { + codeSettings.iOSBundleID = settings.iOSBundleId; + } + + return codeSettings; +} + ++ (InternalIdTokenResult *)parseIdTokenResult:(FIRAuthTokenResult *)tokenResult { + long expirationTimestamp = (long)[tokenResult.expirationDate timeIntervalSince1970] * 1000; + long authTimestamp = (long)[tokenResult.authDate timeIntervalSince1970] * 1000; + long issuedAtTimestamp = (long)[tokenResult.issuedAtDate timeIntervalSince1970] * 1000; + + return [InternalIdTokenResult makeWithToken:tokenResult.token + expirationTimestamp:@(expirationTimestamp) + authTimestamp:@(authTimestamp) + issuedAtTimestamp:@(issuedAtTimestamp) + signInProvider:tokenResult.signInProvider + claims:tokenResult.claims + signInSecondFactor:tokenResult.signInSecondFactor]; +} + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails { + NSMutableArray *output = [NSMutableArray array]; + + id userInfoList = [[userDetails userInfo] toList]; + [output addObject:userInfoList]; + + id providerData = [userDetails providerData]; + [output addObject:providerData]; + + return [output copy]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m new file mode 100644 index 00000000..82ae8cfc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m @@ -0,0 +1,3005 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#import "include/Public/firebase_auth_messages.g.h" + +#if TARGET_OS_OSX +@import FlutterMacOS; +#else +@import Flutter; +#endif + +static BOOL __attribute__((unused)) FLTPigeonDeepEquals(id _Nullable a, id _Nullable b) { + if (a == b) { + return YES; + } + if (a == nil) { + return b == [NSNull null]; + } + if (b == nil) { + return a == [NSNull null]; + } + if ([a isKindOfClass:[NSNumber class]] && [b isKindOfClass:[NSNumber class]]) { + return + [a isEqual:b] || (isnan([(NSNumber *)a doubleValue]) && isnan([(NSNumber *)b doubleValue])); + } + if ([a isKindOfClass:[NSArray class]] && [b isKindOfClass:[NSArray class]]) { + NSArray *arrayA = (NSArray *)a; + NSArray *arrayB = (NSArray *)b; + if (arrayA.count != arrayB.count) { + return NO; + } + for (NSUInteger i = 0; i < arrayA.count; i++) { + if (!FLTPigeonDeepEquals(arrayA[i], arrayB[i])) { + return NO; + } + } + return YES; + } + if ([a isKindOfClass:[NSDictionary class]] && [b isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictA = (NSDictionary *)a; + NSDictionary *dictB = (NSDictionary *)b; + if (dictA.count != dictB.count) { + return NO; + } + for (id keyA in dictA) { + id valueA = dictA[keyA]; + BOOL found = NO; + for (id keyB in dictB) { + if (FLTPigeonDeepEquals(keyA, keyB)) { + id valueB = dictB[keyB]; + if (FLTPigeonDeepEquals(valueA, valueB)) { + found = YES; + break; + } else { + return NO; + } + } + } + if (!found) { + return NO; + } + } + return YES; + } + return [a isEqual:b]; +} + +static NSUInteger __attribute__((unused)) FLTPigeonDeepHash(id _Nullable value) { + if (value == nil || value == (id)[NSNull null]) { + return 0; + } + if ([value isKindOfClass:[NSNumber class]]) { + NSNumber *n = (NSNumber *)value; + double d = n.doubleValue; + if (isnan(d)) { + // Normalize NaN to a consistent hash. + return (NSUInteger)0x7FF8000000000000; + } + if (d == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + d = 0.0; + } + return @(d).hash; + } + if ([value isKindOfClass:[NSArray class]]) { + NSUInteger result = 1; + for (id item in (NSArray *)value) { + result = result * 31 + FLTPigeonDeepHash(item); + } + return result; + } + if ([value isKindOfClass:[NSDictionary class]]) { + NSUInteger result = 0; + NSDictionary *dict = (NSDictionary *)value; + for (id key in dict) { + result += ((FLTPigeonDeepHash(key) * 31) ^ FLTPigeonDeepHash(dict[key])); + } + return result; + } + return [value hash]; +} + +static NSArray *wrapResult(id result, FlutterError *error) { + if (error) { + return @[ + error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] + ]; + } + return @[ result ?: [NSNull null] ]; +} + +static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { + id result = array[key]; + return (result == [NSNull null]) ? nil : result; +} + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +@implementation ActionCodeInfoOperationBox +- (instancetype)initWithValue:(ActionCodeInfoOperation)value { + self = [super init]; + if (self) { + _value = value; + } + return self; +} +@end + +@interface InternalMultiFactorSession () ++ (InternalMultiFactorSession *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalPhoneMultiFactorAssertion () ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list; ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalMultiFactorInfo () ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface AuthPigeonFirebaseApp () ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list; ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfoData () ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfo () ++ (InternalActionCodeInfo *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAdditionalUserInfo () ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredential () ++ (InternalAuthCredential *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserInfo () ++ (InternalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserDetails () ++ (InternalUserDetails *)fromList:(NSArray *)list; ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserCredential () ++ (InternalUserCredential *)fromList:(NSArray *)list; ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredentialInput () ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeSettings () ++ (InternalActionCodeSettings *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalFirebaseAuthSettings () ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list; ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalSignInProvider () ++ (InternalSignInProvider *)fromList:(NSArray *)list; ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalVerifyPhoneNumberRequest () ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list; ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalIdTokenResult () ++ (InternalIdTokenResult *)fromList:(NSArray *)list; ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserProfile () ++ (InternalUserProfile *)fromList:(NSArray *)list; ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalTotpSecret () ++ (InternalTotpSecret *)fromList:(NSArray *)list; ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@implementation InternalMultiFactorSession ++ (instancetype)makeWithId:(NSString *)id { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = id; + return pigeonResult; +} ++ (InternalMultiFactorSession *)fromList:(NSArray *)list { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = GetNullableObjectAtIndex(list, 0); + return pigeonResult; +} ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorSession fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.id ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorSession *other = (InternalMultiFactorSession *)object; + return FLTPigeonDeepEquals(self.id, other.id); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.id); + return result; +} +@end + +@implementation InternalPhoneMultiFactorAssertion ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = verificationId; + pigeonResult.verificationCode = verificationCode; + return pigeonResult; +} ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = GetNullableObjectAtIndex(list, 0); + pigeonResult.verificationCode = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list { + return (list) ? [InternalPhoneMultiFactorAssertion fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.verificationId ?: [NSNull null], + self.verificationCode ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalPhoneMultiFactorAssertion *other = (InternalPhoneMultiFactorAssertion *)object; + return FLTPigeonDeepEquals(self.verificationId, other.verificationId) && + FLTPigeonDeepEquals(self.verificationCode, other.verificationCode); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.verificationId); + result = result * 31 + FLTPigeonDeepHash(self.verificationCode); + return result; +} +@end + +@implementation InternalMultiFactorInfo ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.enrollmentTimestamp = enrollmentTimestamp; + pigeonResult.factorId = factorId; + pigeonResult.uid = uid; + pigeonResult.phoneNumber = phoneNumber; + return pigeonResult; +} ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.enrollmentTimestamp = [GetNullableObjectAtIndex(list, 1) doubleValue]; + pigeonResult.factorId = GetNullableObjectAtIndex(list, 2); + pigeonResult.uid = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + @(self.enrollmentTimestamp), + self.factorId ?: [NSNull null], + self.uid ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorInfo *other = (InternalMultiFactorInfo *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + (self.enrollmentTimestamp == other.enrollmentTimestamp || + (isnan(self.enrollmentTimestamp) && isnan(other.enrollmentTimestamp))) && + FLTPigeonDeepEquals(self.factorId, other.factorId) && + FLTPigeonDeepEquals(self.uid, other.uid) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + (isnan(self.enrollmentTimestamp) ? (NSUInteger)0x7FF8000000000000 + : @(self.enrollmentTimestamp).hash); + result = result * 31 + FLTPigeonDeepHash(self.factorId); + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + return result; +} +@end + +@implementation AuthPigeonFirebaseApp ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = appName; + pigeonResult.tenantId = tenantId; + pigeonResult.customAuthDomain = customAuthDomain; + return pigeonResult; +} ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = GetNullableObjectAtIndex(list, 0); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 1); + pigeonResult.customAuthDomain = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list { + return (list) ? [AuthPigeonFirebaseApp fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.appName ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.customAuthDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + AuthPigeonFirebaseApp *other = (AuthPigeonFirebaseApp *)object; + return FLTPigeonDeepEquals(self.appName, other.appName) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.customAuthDomain, other.customAuthDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.appName); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.customAuthDomain); + return result; +} +@end + +@implementation InternalActionCodeInfoData ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = email; + pigeonResult.previousEmail = previousEmail; + return pigeonResult; +} ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = GetNullableObjectAtIndex(list, 0); + pigeonResult.previousEmail = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfoData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.email ?: [NSNull null], + self.previousEmail ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfoData *other = (InternalActionCodeInfoData *)object; + return FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.previousEmail, other.previousEmail); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.previousEmail); + return result; +} +@end + +@implementation InternalActionCodeInfo ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + pigeonResult.operation = operation; + pigeonResult.data = data; + return pigeonResult; +} ++ (InternalActionCodeInfo *)fromList:(NSArray *)list { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + ActionCodeInfoOperationBox *boxedActionCodeInfoOperation = GetNullableObjectAtIndex(list, 0); + pigeonResult.operation = boxedActionCodeInfoOperation.value; + pigeonResult.data = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + [[ActionCodeInfoOperationBox alloc] initWithValue:self.operation], + self.data ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfo *other = (InternalActionCodeInfo *)object; + return self.operation == other.operation && FLTPigeonDeepEquals(self.data, other.data); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.operation).hash; + result = result * 31 + FLTPigeonDeepHash(self.data); + return result; +} +@end + +@implementation InternalAdditionalUserInfo ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = isNewUser; + pigeonResult.providerId = providerId; + pigeonResult.username = username; + pigeonResult.authorizationCode = authorizationCode; + pigeonResult.profile = profile; + return pigeonResult; +} ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 1); + pigeonResult.username = GetNullableObjectAtIndex(list, 2); + pigeonResult.authorizationCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.profile = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAdditionalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.isNewUser), + self.providerId ?: [NSNull null], + self.username ?: [NSNull null], + self.authorizationCode ?: [NSNull null], + self.profile ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAdditionalUserInfo *other = (InternalAdditionalUserInfo *)object; + return self.isNewUser == other.isNewUser && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.username, other.username) && + FLTPigeonDeepEquals(self.authorizationCode, other.authorizationCode) && + FLTPigeonDeepEquals(self.profile, other.profile); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.isNewUser).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.username); + result = result * 31 + FLTPigeonDeepHash(self.authorizationCode); + result = result * 31 + FLTPigeonDeepHash(self.profile); + return result; +} +@end + +@implementation InternalAuthCredential ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.nativeId = nativeId; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredential *)fromList:(NSArray *)list { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.nativeId = [GetNullableObjectAtIndex(list, 2) integerValue]; + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + @(self.nativeId), + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredential *other = (InternalAuthCredential *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + self.nativeId == other.nativeId && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + @(self.nativeId).hash; + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalUserInfo ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = uid; + pigeonResult.email = email; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.isAnonymous = isAnonymous; + pigeonResult.isEmailVerified = isEmailVerified; + pigeonResult.providerId = providerId; + pigeonResult.tenantId = tenantId; + pigeonResult.refreshToken = refreshToken; + pigeonResult.creationTimestamp = creationTimestamp; + pigeonResult.lastSignInTimestamp = lastSignInTimestamp; + return pigeonResult; +} ++ (InternalUserInfo *)fromList:(NSArray *)list { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = GetNullableObjectAtIndex(list, 0); + pigeonResult.email = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayName = GetNullableObjectAtIndex(list, 2); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + pigeonResult.isAnonymous = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.isEmailVerified = [GetNullableObjectAtIndex(list, 6) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 7); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 8); + pigeonResult.refreshToken = GetNullableObjectAtIndex(list, 9); + pigeonResult.creationTimestamp = GetNullableObjectAtIndex(list, 10); + pigeonResult.lastSignInTimestamp = GetNullableObjectAtIndex(list, 11); + return pigeonResult; +} ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.uid ?: [NSNull null], + self.email ?: [NSNull null], + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + @(self.isAnonymous), + @(self.isEmailVerified), + self.providerId ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.refreshToken ?: [NSNull null], + self.creationTimestamp ?: [NSNull null], + self.lastSignInTimestamp ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserInfo *other = (InternalUserInfo *)object; + return FLTPigeonDeepEquals(self.uid, other.uid) && FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.isAnonymous == other.isAnonymous && self.isEmailVerified == other.isEmailVerified && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.refreshToken, other.refreshToken) && + FLTPigeonDeepEquals(self.creationTimestamp, other.creationTimestamp) && + FLTPigeonDeepEquals(self.lastSignInTimestamp, other.lastSignInTimestamp); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.isAnonymous).hash; + result = result * 31 + @(self.isEmailVerified).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.refreshToken); + result = result * 31 + FLTPigeonDeepHash(self.creationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.lastSignInTimestamp); + return result; +} +@end + +@implementation InternalUserDetails ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = userInfo; + pigeonResult.providerData = providerData; + return pigeonResult; +} ++ (InternalUserDetails *)fromList:(NSArray *)list { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = GetNullableObjectAtIndex(list, 0); + pigeonResult.providerData = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserDetails fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.userInfo ?: [NSNull null], + self.providerData ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserDetails *other = (InternalUserDetails *)object; + return FLTPigeonDeepEquals(self.userInfo, other.userInfo) && + FLTPigeonDeepEquals(self.providerData, other.providerData); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.userInfo); + result = result * 31 + FLTPigeonDeepHash(self.providerData); + return result; +} +@end + +@implementation InternalUserCredential ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = user; + pigeonResult.additionalUserInfo = additionalUserInfo; + pigeonResult.credential = credential; + return pigeonResult; +} ++ (InternalUserCredential *)fromList:(NSArray *)list { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = GetNullableObjectAtIndex(list, 0); + pigeonResult.additionalUserInfo = GetNullableObjectAtIndex(list, 1); + pigeonResult.credential = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.user ?: [NSNull null], + self.additionalUserInfo ?: [NSNull null], + self.credential ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserCredential *other = (InternalUserCredential *)object; + return FLTPigeonDeepEquals(self.user, other.user) && + FLTPigeonDeepEquals(self.additionalUserInfo, other.additionalUserInfo) && + FLTPigeonDeepEquals(self.credential, other.credential); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.user); + result = result * 31 + FLTPigeonDeepHash(self.additionalUserInfo); + result = result * 31 + FLTPigeonDeepHash(self.credential); + return result; +} +@end + +@implementation InternalAuthCredentialInput ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.token = token; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.token = GetNullableObjectAtIndex(list, 2); + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredentialInput fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + self.token ?: [NSNull null], + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredentialInput *other = (InternalAuthCredentialInput *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalActionCodeSettings ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = url; + pigeonResult.dynamicLinkDomain = dynamicLinkDomain; + pigeonResult.handleCodeInApp = handleCodeInApp; + pigeonResult.iOSBundleId = iOSBundleId; + pigeonResult.androidPackageName = androidPackageName; + pigeonResult.androidInstallApp = androidInstallApp; + pigeonResult.androidMinimumVersion = androidMinimumVersion; + pigeonResult.linkDomain = linkDomain; + return pigeonResult; +} ++ (InternalActionCodeSettings *)fromList:(NSArray *)list { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = GetNullableObjectAtIndex(list, 0); + pigeonResult.dynamicLinkDomain = GetNullableObjectAtIndex(list, 1); + pigeonResult.handleCodeInApp = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.iOSBundleId = GetNullableObjectAtIndex(list, 3); + pigeonResult.androidPackageName = GetNullableObjectAtIndex(list, 4); + pigeonResult.androidInstallApp = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.androidMinimumVersion = GetNullableObjectAtIndex(list, 6); + pigeonResult.linkDomain = GetNullableObjectAtIndex(list, 7); + return pigeonResult; +} ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.url ?: [NSNull null], + self.dynamicLinkDomain ?: [NSNull null], + @(self.handleCodeInApp), + self.iOSBundleId ?: [NSNull null], + self.androidPackageName ?: [NSNull null], + @(self.androidInstallApp), + self.androidMinimumVersion ?: [NSNull null], + self.linkDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeSettings *other = (InternalActionCodeSettings *)object; + return FLTPigeonDeepEquals(self.url, other.url) && + FLTPigeonDeepEquals(self.dynamicLinkDomain, other.dynamicLinkDomain) && + self.handleCodeInApp == other.handleCodeInApp && + FLTPigeonDeepEquals(self.iOSBundleId, other.iOSBundleId) && + FLTPigeonDeepEquals(self.androidPackageName, other.androidPackageName) && + self.androidInstallApp == other.androidInstallApp && + FLTPigeonDeepEquals(self.androidMinimumVersion, other.androidMinimumVersion) && + FLTPigeonDeepEquals(self.linkDomain, other.linkDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.url); + result = result * 31 + FLTPigeonDeepHash(self.dynamicLinkDomain); + result = result * 31 + @(self.handleCodeInApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.iOSBundleId); + result = result * 31 + FLTPigeonDeepHash(self.androidPackageName); + result = result * 31 + @(self.androidInstallApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.androidMinimumVersion); + result = result * 31 + FLTPigeonDeepHash(self.linkDomain); + return result; +} +@end + +@implementation InternalFirebaseAuthSettings ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = appVerificationDisabledForTesting; + pigeonResult.userAccessGroup = userAccessGroup; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.smsCode = smsCode; + pigeonResult.forceRecaptchaFlow = forceRecaptchaFlow; + return pigeonResult; +} ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.userAccessGroup = GetNullableObjectAtIndex(list, 1); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 2); + pigeonResult.smsCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.forceRecaptchaFlow = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalFirebaseAuthSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.appVerificationDisabledForTesting), + self.userAccessGroup ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + self.smsCode ?: [NSNull null], + self.forceRecaptchaFlow ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalFirebaseAuthSettings *other = (InternalFirebaseAuthSettings *)object; + return self.appVerificationDisabledForTesting == other.appVerificationDisabledForTesting && + FLTPigeonDeepEquals(self.userAccessGroup, other.userAccessGroup) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + FLTPigeonDeepEquals(self.smsCode, other.smsCode) && + FLTPigeonDeepEquals(self.forceRecaptchaFlow, other.forceRecaptchaFlow); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.appVerificationDisabledForTesting).hash; + result = result * 31 + FLTPigeonDeepHash(self.userAccessGroup); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + FLTPigeonDeepHash(self.smsCode); + result = result * 31 + FLTPigeonDeepHash(self.forceRecaptchaFlow); + return result; +} +@end + +@implementation InternalSignInProvider ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.scopes = scopes; + pigeonResult.customParameters = customParameters; + return pigeonResult; +} ++ (InternalSignInProvider *)fromList:(NSArray *)list { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.scopes = GetNullableObjectAtIndex(list, 1); + pigeonResult.customParameters = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list { + return (list) ? [InternalSignInProvider fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.scopes ?: [NSNull null], + self.customParameters ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalSignInProvider *other = (InternalSignInProvider *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.scopes, other.scopes) && + FLTPigeonDeepEquals(self.customParameters, other.customParameters); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.scopes); + result = result * 31 + FLTPigeonDeepHash(self.customParameters); + return result; +} +@end + +@implementation InternalVerifyPhoneNumberRequest ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.timeout = timeout; + pigeonResult.forceResendingToken = forceResendingToken; + pigeonResult.autoRetrievedSmsCodeForTesting = autoRetrievedSmsCodeForTesting; + pigeonResult.multiFactorInfoId = multiFactorInfoId; + pigeonResult.multiFactorSessionId = multiFactorSessionId; + return pigeonResult; +} ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 0); + pigeonResult.timeout = [GetNullableObjectAtIndex(list, 1) integerValue]; + pigeonResult.forceResendingToken = GetNullableObjectAtIndex(list, 2); + pigeonResult.autoRetrievedSmsCodeForTesting = GetNullableObjectAtIndex(list, 3); + pigeonResult.multiFactorInfoId = GetNullableObjectAtIndex(list, 4); + pigeonResult.multiFactorSessionId = GetNullableObjectAtIndex(list, 5); + return pigeonResult; +} ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list { + return (list) ? [InternalVerifyPhoneNumberRequest fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.phoneNumber ?: [NSNull null], + @(self.timeout), + self.forceResendingToken ?: [NSNull null], + self.autoRetrievedSmsCodeForTesting ?: [NSNull null], + self.multiFactorInfoId ?: [NSNull null], + self.multiFactorSessionId ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalVerifyPhoneNumberRequest *other = (InternalVerifyPhoneNumberRequest *)object; + return FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.timeout == other.timeout && + FLTPigeonDeepEquals(self.forceResendingToken, other.forceResendingToken) && + FLTPigeonDeepEquals(self.autoRetrievedSmsCodeForTesting, + other.autoRetrievedSmsCodeForTesting) && + FLTPigeonDeepEquals(self.multiFactorInfoId, other.multiFactorInfoId) && + FLTPigeonDeepEquals(self.multiFactorSessionId, other.multiFactorSessionId); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.timeout).hash; + result = result * 31 + FLTPigeonDeepHash(self.forceResendingToken); + result = result * 31 + FLTPigeonDeepHash(self.autoRetrievedSmsCodeForTesting); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorInfoId); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorSessionId); + return result; +} +@end + +@implementation InternalIdTokenResult ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = token; + pigeonResult.expirationTimestamp = expirationTimestamp; + pigeonResult.authTimestamp = authTimestamp; + pigeonResult.issuedAtTimestamp = issuedAtTimestamp; + pigeonResult.signInProvider = signInProvider; + pigeonResult.claims = claims; + pigeonResult.signInSecondFactor = signInSecondFactor; + return pigeonResult; +} ++ (InternalIdTokenResult *)fromList:(NSArray *)list { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = GetNullableObjectAtIndex(list, 0); + pigeonResult.expirationTimestamp = GetNullableObjectAtIndex(list, 1); + pigeonResult.authTimestamp = GetNullableObjectAtIndex(list, 2); + pigeonResult.issuedAtTimestamp = GetNullableObjectAtIndex(list, 3); + pigeonResult.signInProvider = GetNullableObjectAtIndex(list, 4); + pigeonResult.claims = GetNullableObjectAtIndex(list, 5); + pigeonResult.signInSecondFactor = GetNullableObjectAtIndex(list, 6); + return pigeonResult; +} ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list { + return (list) ? [InternalIdTokenResult fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.token ?: [NSNull null], + self.expirationTimestamp ?: [NSNull null], + self.authTimestamp ?: [NSNull null], + self.issuedAtTimestamp ?: [NSNull null], + self.signInProvider ?: [NSNull null], + self.claims ?: [NSNull null], + self.signInSecondFactor ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalIdTokenResult *other = (InternalIdTokenResult *)object; + return FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.expirationTimestamp, other.expirationTimestamp) && + FLTPigeonDeepEquals(self.authTimestamp, other.authTimestamp) && + FLTPigeonDeepEquals(self.issuedAtTimestamp, other.issuedAtTimestamp) && + FLTPigeonDeepEquals(self.signInProvider, other.signInProvider) && + FLTPigeonDeepEquals(self.claims, other.claims) && + FLTPigeonDeepEquals(self.signInSecondFactor, other.signInSecondFactor); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.expirationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.authTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.issuedAtTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.signInProvider); + result = result * 31 + FLTPigeonDeepHash(self.claims); + result = result * 31 + FLTPigeonDeepHash(self.signInSecondFactor); + return result; +} +@end + +@implementation InternalUserProfile ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.displayNameChanged = displayNameChanged; + pigeonResult.photoUrlChanged = photoUrlChanged; + return pigeonResult; +} ++ (InternalUserProfile *)fromList:(NSArray *)list { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayNameChanged = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.photoUrlChanged = [GetNullableObjectAtIndex(list, 3) boolValue]; + return pigeonResult; +} ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserProfile fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + @(self.displayNameChanged), + @(self.photoUrlChanged), + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserProfile *other = (InternalUserProfile *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + self.displayNameChanged == other.displayNameChanged && + self.photoUrlChanged == other.photoUrlChanged; +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + @(self.displayNameChanged).hash; + result = result * 31 + @(self.photoUrlChanged).hash; + return result; +} +@end + +@implementation InternalTotpSecret ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = codeIntervalSeconds; + pigeonResult.codeLength = codeLength; + pigeonResult.enrollmentCompletionDeadline = enrollmentCompletionDeadline; + pigeonResult.hashingAlgorithm = hashingAlgorithm; + pigeonResult.secretKey = secretKey; + return pigeonResult; +} ++ (InternalTotpSecret *)fromList:(NSArray *)list { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = GetNullableObjectAtIndex(list, 0); + pigeonResult.codeLength = GetNullableObjectAtIndex(list, 1); + pigeonResult.enrollmentCompletionDeadline = GetNullableObjectAtIndex(list, 2); + pigeonResult.hashingAlgorithm = GetNullableObjectAtIndex(list, 3); + pigeonResult.secretKey = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list { + return (list) ? [InternalTotpSecret fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.codeIntervalSeconds ?: [NSNull null], + self.codeLength ?: [NSNull null], + self.enrollmentCompletionDeadline ?: [NSNull null], + self.hashingAlgorithm ?: [NSNull null], + self.secretKey ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalTotpSecret *other = (InternalTotpSecret *)object; + return FLTPigeonDeepEquals(self.codeIntervalSeconds, other.codeIntervalSeconds) && + FLTPigeonDeepEquals(self.codeLength, other.codeLength) && + FLTPigeonDeepEquals(self.enrollmentCompletionDeadline, + other.enrollmentCompletionDeadline) && + FLTPigeonDeepEquals(self.hashingAlgorithm, other.hashingAlgorithm) && + FLTPigeonDeepEquals(self.secretKey, other.secretKey); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.codeIntervalSeconds); + result = result * 31 + FLTPigeonDeepHash(self.codeLength); + result = result * 31 + FLTPigeonDeepHash(self.enrollmentCompletionDeadline); + result = result * 31 + FLTPigeonDeepHash(self.hashingAlgorithm); + result = result * 31 + FLTPigeonDeepHash(self.secretKey); + return result; +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReader : FlutterStandardReader +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReader +- (nullable id)readValueOfType:(UInt8)type { + switch (type) { + case 129: { + NSNumber *enumAsNumber = [self readValue]; + return enumAsNumber == nil + ? nil + : [[ActionCodeInfoOperationBox alloc] initWithValue:[enumAsNumber integerValue]]; + } + case 130: + return [InternalMultiFactorSession fromList:[self readValue]]; + case 131: + return [InternalPhoneMultiFactorAssertion fromList:[self readValue]]; + case 132: + return [InternalMultiFactorInfo fromList:[self readValue]]; + case 133: + return [AuthPigeonFirebaseApp fromList:[self readValue]]; + case 134: + return [InternalActionCodeInfoData fromList:[self readValue]]; + case 135: + return [InternalActionCodeInfo fromList:[self readValue]]; + case 136: + return [InternalAdditionalUserInfo fromList:[self readValue]]; + case 137: + return [InternalAuthCredential fromList:[self readValue]]; + case 138: + return [InternalUserInfo fromList:[self readValue]]; + case 139: + return [InternalUserDetails fromList:[self readValue]]; + case 140: + return [InternalUserCredential fromList:[self readValue]]; + case 141: + return [InternalAuthCredentialInput fromList:[self readValue]]; + case 142: + return [InternalActionCodeSettings fromList:[self readValue]]; + case 143: + return [InternalFirebaseAuthSettings fromList:[self readValue]]; + case 144: + return [InternalSignInProvider fromList:[self readValue]]; + case 145: + return [InternalVerifyPhoneNumberRequest fromList:[self readValue]]; + case 146: + return [InternalIdTokenResult fromList:[self readValue]]; + case 147: + return [InternalUserProfile fromList:[self readValue]]; + case 148: + return [InternalTotpSecret fromList:[self readValue]]; + default: + return [super readValueOfType:type]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecWriter : FlutterStandardWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecWriter +- (void)writeValue:(id)value { + if ([value isKindOfClass:[ActionCodeInfoOperationBox class]]) { + ActionCodeInfoOperationBox *box = (ActionCodeInfoOperationBox *)value; + [self writeByte:129]; + [self writeValue:(value == nil ? [NSNull null] : [NSNumber numberWithInteger:box.value])]; + } else if ([value isKindOfClass:[InternalMultiFactorSession class]]) { + [self writeByte:130]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalPhoneMultiFactorAssertion class]]) { + [self writeByte:131]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalMultiFactorInfo class]]) { + [self writeByte:132]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[AuthPigeonFirebaseApp class]]) { + [self writeByte:133]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfoData class]]) { + [self writeByte:134]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfo class]]) { + [self writeByte:135]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAdditionalUserInfo class]]) { + [self writeByte:136]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredential class]]) { + [self writeByte:137]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserInfo class]]) { + [self writeByte:138]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserDetails class]]) { + [self writeByte:139]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserCredential class]]) { + [self writeByte:140]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredentialInput class]]) { + [self writeByte:141]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeSettings class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalFirebaseAuthSettings class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalSignInProvider class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalVerifyPhoneNumberRequest class]]) { + [self writeByte:145]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalIdTokenResult class]]) { + [self writeByte:146]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserProfile class]]) { + [self writeByte:147]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalTotpSecret class]]) { + [self writeByte:148]; + [self writeValue:[value toList]]; + } else { + [super writeValue:value]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReaderWriter : FlutterStandardReaderWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecWriter alloc] initWithData:data]; +} +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecReader alloc] initWithData:data]; +} +@end + +NSObject *nullGetFirebaseAuthMessagesCodec(void) { + static FlutterStandardMessageCodec *sSharedObject = nil; + static dispatch_once_t sPred = 0; + dispatch_once(&sPred, ^{ + nullFirebaseAuthMessagesPigeonCodecReaderWriter *readerWriter = + [[nullFirebaseAuthMessagesPigeonCodecReaderWriter alloc] init]; + sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; + }); + return sSharedObject; +} +void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerIdTokenListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerIdTokenListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerIdTokenListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerIdTokenListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerAuthStateListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerAuthStateListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerAuthStateListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerAuthStateListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.useEmulator", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(useEmulatorApp:host:port:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(useEmulatorApp:host:port:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_host = GetNullableObjectAtIndex(args, 1); + NSInteger arg_port = [GetNullableObjectAtIndex(args, 2) integerValue]; + [api useEmulatorApp:arg_app + host:arg_host + port:arg_port + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.applyActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(applyActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(applyActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api applyActionCodeApp:arg_app + code:arg_code + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.checkActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(checkActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(checkActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api checkActionCodeApp:arg_app + code:arg_code + completion:^(InternalActionCodeInfo *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.confirmPasswordReset", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(confirmPasswordResetApp:code:newPassword:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(confirmPasswordResetApp:code:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 2); + [api confirmPasswordResetApp:arg_app + code:arg_code + newPassword:arg_newPassword + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.createUserWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api + respondsToSelector:@selector( + createUserWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(createUserWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api createUserWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInAnonymously", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInAnonymouslyApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInAnonymouslyApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signInAnonymouslyApp:arg_app + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCredentialApp:input:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api signInWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCustomToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCustomTokenApp:token:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCustomTokenApp:token:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_token = GetNullableObjectAtIndex(args, 1); + [api signInWithCustomTokenApp:arg_app + token:arg_token + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + signInWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailLink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithEmailLinkApp:email:emailLink:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailLinkApp:email:emailLink:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_emailLink = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailLinkApp:arg_app + email:arg_email + emailLink:arg_emailLink + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api signInWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.signOut", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signOutApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to @selector(signOutApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signOutApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.fetchSignInMethodsForEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(fetchSignInMethodsForEmailApp:email:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(fetchSignInMethodsForEmailApp:email:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + [api fetchSignInMethodsForEmailApp:arg_app + email:arg_email + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendPasswordResetEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendPasswordResetEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendSignInLinkToEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendSignInLinkToEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setLanguageCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setLanguageCodeApp:languageCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setLanguageCodeApp:languageCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_languageCode = GetNullableObjectAtIndex(args, 1); + [api setLanguageCodeApp:arg_app + languageCode:arg_languageCode + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setSettings", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setSettingsApp:settings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setSettingsApp:settings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalFirebaseAuthSettings *arg_settings = GetNullableObjectAtIndex(args, 1); + [api setSettingsApp:arg_app + settings:arg_settings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPasswordResetCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPasswordResetCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPasswordResetCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api verifyPasswordResetCodeApp:arg_app + code:arg_code + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPhoneNumberApp:request:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPhoneNumberApp:request:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalVerifyPhoneNumberRequest *arg_request = GetNullableObjectAtIndex(args, 1); + [api verifyPhoneNumberApp:arg_app + request:arg_request + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeTokenWithAuthorizationCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeTokenWithAuthorizationCodeApp: + authorizationCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeTokenWithAuthorizationCodeApp:authorizationCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_authorizationCode = GetNullableObjectAtIndex(args, 1); + [api revokeTokenWithAuthorizationCodeApp:arg_app + authorizationCode:arg_authorizationCode + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeAccessToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeAccessTokenApp:accessToken:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeAccessTokenApp:accessToken:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_accessToken = GetNullableObjectAtIndex(args, 1); + [api revokeAccessTokenApp:arg_app + accessToken:arg_accessToken + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.initializeRecaptchaConfig", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(initializeRecaptchaConfigApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(initializeRecaptchaConfigApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api initializeRecaptchaConfigApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.delete", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(deleteApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(deleteApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api deleteApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.getIdToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getIdTokenApp:forceRefresh:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(getIdTokenApp:forceRefresh:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + BOOL arg_forceRefresh = [GetNullableObjectAtIndex(args, 1) boolValue]; + [api getIdTokenApp:arg_app + forceRefresh:arg_forceRefresh + completion:^(InternalIdTokenResult *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api linkWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api linkWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reauthenticateWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + reauthenticateWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.reload", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reloadApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(reloadApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api reloadApp:arg_app + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.sendEmailVerification", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + sendEmailVerificationApp:actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(sendEmailVerificationApp:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 1); + [api sendEmailVerificationApp:arg_app + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.unlink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unlinkApp:providerId:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(unlinkApp:providerId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_providerId = GetNullableObjectAtIndex(args, 1); + [api unlinkApp:arg_app + providerId:arg_providerId + completion:^(InternalUserCredential *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.updateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateEmailApp:newEmail:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateEmailApp:newEmail:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + [api + updateEmailApp:arg_app + newEmail:arg_newEmail + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePasswordApp:newPassword:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePasswordApp:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 1); + [api updatePasswordApp:arg_app + newPassword:arg_newPassword + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePhoneNumberApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePhoneNumberApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api updatePhoneNumberApp:arg_app + input:arg_input + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updateProfile", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateProfileApp:profile:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateProfileApp:profile:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalUserProfile *arg_profile = GetNullableObjectAtIndex(args, 1); + [api updateProfileApp:arg_app + profile:arg_profile + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.verifyBeforeUpdateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyBeforeUpdateEmailApp:newEmail: + actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(verifyBeforeUpdateEmailApp:newEmail:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api verifyBeforeUpdateEmailApp:arg_app + newEmail:arg_newEmail + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollPhone", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollPhoneApp:assertion:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollPhoneApp:assertion:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollPhoneApp:arg_app + assertion:arg_assertion + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollTotp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollTotpApp:assertionId:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollTotpApp:assertionId:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_assertionId = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollTotpApp:arg_app + assertionId:arg_assertionId + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.getSession", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getSessionApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getSessionApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getSessionApp:arg_app + completion:^(InternalMultiFactorSession *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.unenroll", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unenrollApp:factorUid:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(unenrollApp:factorUid:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_factorUid = GetNullableObjectAtIndex(args, 1); + [api unenrollApp:arg_app + factorUid:arg_factorUid + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorUserHostApi.getEnrolledFactors", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getEnrolledFactorsApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getEnrolledFactorsApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getEnrolledFactorsApp:arg_app + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactoResolverHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactoResolverHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactoResolverHostApi.resolveSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)], + @"MultiFactoResolverHostApi api (%@) doesn't respond to " + @"@selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_resolverId = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_totpAssertionId = GetNullableObjectAtIndex(args, 2); + [api resolveSignInResolverId:arg_resolverId + assertion:arg_assertion + totpAssertionId:arg_totpAssertionId + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.generateSecret", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(generateSecretSessionId:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(generateSecretSessionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_sessionId = GetNullableObjectAtIndex(args, 0); + [api generateSecretSessionId:arg_sessionId + completion:^(InternalTotpSecret *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForEnrollment", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForEnrollmentSecretKey:arg_secretKey + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_enrollmentId = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForSignInEnrollmentId:arg_enrollmentId + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpSecretHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpSecretHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpSecretHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.generateQrCodeUrl", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + generateQrCodeUrlSecretKey:accountName:issuer:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(generateQrCodeUrlSecretKey:accountName:issuer:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_accountName = GetNullableObjectAtIndex(args, 1); + NSString *arg_issuer = GetNullableObjectAtIndex(args, 2); + [api generateQrCodeUrlSecretKey:arg_secretKey + accountName:arg_accountName + issuer:arg_issuer + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.openInOtpApp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_qrCodeUrl = GetNullableObjectAtIndex(args, 1); + [api openInOtpAppSecretKey:arg_secretKey + qrCodeUrl:arg_qrCodeUrl + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *api) { + SetUpGenerateInterfacesWithSuffix(binaryMessenger, api, @""); +} + +void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.GenerateInterfaces.pigeonInterface", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(pigeonInterfaceInfo:error:)], + @"GenerateInterfaces api (%@) doesn't respond to @selector(pigeonInterfaceInfo:error:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + InternalMultiFactorInfo *arg_info = GetNullableObjectAtIndex(args, 0); + FlutterError *error; + [api pigeonInterfaceInfo:arg_info error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h new file mode 100644 index 00000000..7b7efae7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h @@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import "../Public/CustomPigeonHeader.h" + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTAuthStateChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h new file mode 100644 index 00000000..c1660499 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/CustomPigeonHeader.h" + +#import + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTIdTokenChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h new file mode 100644 index 00000000..53e5f28c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/firebase_auth_messages.g.h" + +#import + +@class FIRAuth; +@class FIRMultiFactorSession; +@class FIRPhoneMultiFactorInfo; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTPhoneNumberVerificationStreamHandler : NSObject + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(FIRAuth *)auth arguments:(NSDictionary *)arguments; +#else +- (instancetype)initWithAuth:(FIRAuth *)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo; +#endif + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h new file mode 100644 index 00000000..b500fd2c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h @@ -0,0 +1,33 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#import +#import "../Public/firebase_auth_messages.g.h" + +@class FIRAuthDataResult; +@class FIRUser; +@class FIRActionCodeSettings; +@class FIRAuthTokenResult; +@class FIRTOTPSecret; +@class FIRAuthCredential; + +@interface PigeonParser : NSObject + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails; ++ (InternalUserCredential *_Nullable) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode; ++ (InternalUserDetails *_Nullable)getPigeonDetails:(nonnull FIRUser *)user; ++ (InternalUserInfo *_Nullable)getPigeonUserInfo:(nonnull FIRUser *)user; ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings; ++ (InternalUserCredential *_Nullable)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user; ++ (InternalIdTokenResult *_Nonnull)parseIdTokenResult:(nonnull FIRAuthTokenResult *)tokenResult; ++ (InternalTotpSecret *_Nonnull)getPigeonTotpSecret:(nonnull FIRTOTPSecret *)secret; ++ (InternalAuthCredential *_Nullable)getPigeonAuthCredential: + (FIRAuthCredential *_Nullable)authCredentialToken + token:(NSNumber *_Nullable)token; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h new file mode 100644 index 00000000..d32a6b45 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h @@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#import "firebase_auth_messages.g.h" + +@interface InternalMultiFactorInfo (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserDetails (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserInfo (Map) +- (NSDictionary *)toList; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h new file mode 100644 index 00000000..53e20eca --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import +#if __has_include() +#import +#else +#import +#endif +#import "firebase_auth_messages.g.h" + +#if !TARGET_OS_OSX +@protocol FlutterSceneLifeCycleDelegate; +#endif + +@interface FLTFirebaseAuthPlugin + : FLTFirebasePlugin ) + , + FlutterSceneLifeCycleDelegate +#endif +#endif + > + ++ (FlutterError *)convertToFlutterError:(NSError *)error; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h new file mode 100644 index 00000000..f83da7e3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h @@ -0,0 +1,571 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +@import Foundation; + +@protocol FlutterBinaryMessenger; +@protocol FlutterMessageCodec; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +typedef NS_ENUM(NSUInteger, ActionCodeInfoOperation) { + /// Unknown operation. + ActionCodeInfoOperationUnknown = 0, + /// Password reset code generated via [sendPasswordResetEmail]. + ActionCodeInfoOperationPasswordReset = 1, + /// Email verification code generated via [User.sendEmailVerification]. + ActionCodeInfoOperationVerifyEmail = 2, + /// Email change revocation code generated via [User.updateEmail]. + ActionCodeInfoOperationRecoverEmail = 3, + /// Email sign in code generated via [sendSignInLinkToEmail]. + ActionCodeInfoOperationEmailSignIn = 4, + /// Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + ActionCodeInfoOperationVerifyAndChangeEmail = 5, + /// Action code for reverting second factor addition. + ActionCodeInfoOperationRevertSecondFactorAddition = 6, +}; + +/// Wrapper for ActionCodeInfoOperation to allow for nullability. +@interface ActionCodeInfoOperationBox : NSObject +@property(nonatomic, assign) ActionCodeInfoOperation value; +- (instancetype)initWithValue:(ActionCodeInfoOperation)value; +@end + +@class InternalMultiFactorSession; +@class InternalPhoneMultiFactorAssertion; +@class InternalMultiFactorInfo; +@class AuthPigeonFirebaseApp; +@class InternalActionCodeInfoData; +@class InternalActionCodeInfo; +@class InternalAdditionalUserInfo; +@class InternalAuthCredential; +@class InternalUserInfo; +@class InternalUserDetails; +@class InternalUserCredential; +@class InternalAuthCredentialInput; +@class InternalActionCodeSettings; +@class InternalFirebaseAuthSettings; +@class InternalSignInProvider; +@class InternalVerifyPhoneNumberRequest; +@class InternalIdTokenResult; +@class InternalUserProfile; +@class InternalTotpSecret; + +@interface InternalMultiFactorSession : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithId:(NSString *)id; +@property(nonatomic, copy) NSString *id; +@end + +@interface InternalPhoneMultiFactorAssertion : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode; +@property(nonatomic, copy) NSString *verificationId; +@property(nonatomic, copy) NSString *verificationCode; +@end + +@interface InternalMultiFactorInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, assign) double enrollmentTimestamp; +@property(nonatomic, copy, nullable) NSString *factorId; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@end + +@interface AuthPigeonFirebaseApp : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain; +@property(nonatomic, copy) NSString *appName; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *customAuthDomain; +@end + +@interface InternalActionCodeInfoData : NSObject ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *previousEmail; +@end + +@interface InternalActionCodeInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data; +@property(nonatomic, assign) ActionCodeInfoOperation operation; +@property(nonatomic, strong) InternalActionCodeInfoData *data; +@end + +@interface InternalAdditionalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile; +@property(nonatomic, assign) BOOL isNewUser; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *username; +@property(nonatomic, copy, nullable) NSString *authorizationCode; +@property(nonatomic, copy, nullable) NSDictionary *profile; +@end + +@interface InternalAuthCredential : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, assign) NSInteger nativeId; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) BOOL isAnonymous; +@property(nonatomic, assign) BOOL isEmailVerified; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *refreshToken; +@property(nonatomic, strong, nullable) NSNumber *creationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *lastSignInTimestamp; +@end + +@interface InternalUserDetails : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData; +@property(nonatomic, strong) InternalUserInfo *userInfo; +@property(nonatomic, copy) NSArray *> *providerData; +@end + +@interface InternalUserCredential : NSObject ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential; +@property(nonatomic, strong, nullable) InternalUserDetails *user; +@property(nonatomic, strong, nullable) InternalAdditionalUserInfo *additionalUserInfo; +@property(nonatomic, strong, nullable) InternalAuthCredential *credential; +@end + +@interface InternalAuthCredentialInput : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalActionCodeSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain; +@property(nonatomic, copy) NSString *url; +@property(nonatomic, copy, nullable) NSString *dynamicLinkDomain; +@property(nonatomic, assign) BOOL handleCodeInApp; +@property(nonatomic, copy, nullable) NSString *iOSBundleId; +@property(nonatomic, copy, nullable) NSString *androidPackageName; +@property(nonatomic, assign) BOOL androidInstallApp; +@property(nonatomic, copy, nullable) NSString *androidMinimumVersion; +@property(nonatomic, copy, nullable) NSString *linkDomain; +@end + +@interface InternalFirebaseAuthSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow; +@property(nonatomic, assign) BOOL appVerificationDisabledForTesting; +@property(nonatomic, copy, nullable) NSString *userAccessGroup; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, copy, nullable) NSString *smsCode; +@property(nonatomic, strong, nullable) NSNumber *forceRecaptchaFlow; +@end + +@interface InternalSignInProvider : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy, nullable) NSArray *scopes; +@property(nonatomic, copy, nullable) NSDictionary *customParameters; +@end + +@interface InternalVerifyPhoneNumberRequest : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) NSInteger timeout; +@property(nonatomic, strong, nullable) NSNumber *forceResendingToken; +@property(nonatomic, copy, nullable) NSString *autoRetrievedSmsCodeForTesting; +@property(nonatomic, copy, nullable) NSString *multiFactorInfoId; +@property(nonatomic, copy, nullable) NSString *multiFactorSessionId; +@end + +@interface InternalIdTokenResult : NSObject ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, strong, nullable) NSNumber *expirationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *authTimestamp; +@property(nonatomic, strong, nullable) NSNumber *issuedAtTimestamp; +@property(nonatomic, copy, nullable) NSString *signInProvider; +@property(nonatomic, copy, nullable) NSDictionary *claims; +@property(nonatomic, copy, nullable) NSString *signInSecondFactor; +@end + +@interface InternalUserProfile : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, assign) BOOL displayNameChanged; +@property(nonatomic, assign) BOOL photoUrlChanged; +@end + +@interface InternalTotpSecret : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey; +@property(nonatomic, strong, nullable) NSNumber *codeIntervalSeconds; +@property(nonatomic, strong, nullable) NSNumber *codeLength; +@property(nonatomic, strong, nullable) NSNumber *enrollmentCompletionDeadline; +@property(nonatomic, copy, nullable) NSString *hashingAlgorithm; +@property(nonatomic, copy) NSString *secretKey; +@end + +/// The codec used by all APIs. +NSObject *nullGetFirebaseAuthMessagesCodec(void); + +@protocol FirebaseAuthHostApi +- (void)registerIdTokenListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)registerAuthStateListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)useEmulatorApp:(AuthPigeonFirebaseApp *)app + host:(NSString *)host + port:(NSInteger)port + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)applyActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)checkActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion; +- (void)confirmPasswordResetApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + newPassword:(NSString *)newPassword + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)createUserWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInAnonymouslyApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCustomTokenApp:(AuthPigeonFirebaseApp *)app + token:(NSString *)token + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailLinkApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + emailLink:(NSString *)emailLink + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signOutApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)fetchSignInMethodsForEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)sendPasswordResetEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)sendSignInLinkToEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)setLanguageCodeApp:(AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)setSettingsApp:(AuthPigeonFirebaseApp *)app + settings:(InternalFirebaseAuthSettings *)settings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)verifyPasswordResetCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyPhoneNumberApp:(AuthPigeonFirebaseApp *)app + request:(InternalVerifyPhoneNumberRequest *)request + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)revokeTokenWithAuthorizationCodeApp:(AuthPigeonFirebaseApp *)app + authorizationCode:(NSString *)authorizationCode + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)revokeAccessTokenApp:(AuthPigeonFirebaseApp *)app + accessToken:(NSString *)accessToken + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol FirebaseAuthUserHostApi +- (void)deleteApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getIdTokenApp:(AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion: + (void (^)(InternalIdTokenResult *_Nullable, FlutterError *_Nullable))completion; +- (void)linkWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)linkWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reloadApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)sendEmailVerificationApp:(AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)unlinkApp:(AuthPigeonFirebaseApp *)app + providerId:(NSString *)providerId + completion:(void (^)(InternalUserCredential *_Nullable, FlutterError *_Nullable))completion; +- (void)updateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePasswordApp:(AuthPigeonFirebaseApp *)app + newPassword:(NSString *)newPassword + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePhoneNumberApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updateProfileApp:(AuthPigeonFirebaseApp *)app + profile:(InternalUserProfile *)profile + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyBeforeUpdateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorUserHostApi +- (void)enrollPhoneApp:(AuthPigeonFirebaseApp *)app + assertion:(InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)enrollTotpApp:(AuthPigeonFirebaseApp *)app + assertionId:(NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getSessionApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(InternalMultiFactorSession *_Nullable, FlutterError *_Nullable))completion; +- (void)unenrollApp:(AuthPigeonFirebaseApp *)app + factorUid:(NSString *)factorUid + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getEnrolledFactorsApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactoResolverHostApi +- (void)resolveSignInResolverId:(NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactoResolverHostApiWithSuffix( + id binaryMessenger, NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpHostApi +- (void)generateSecretSessionId:(NSString *)sessionId + completion:(void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForEnrollmentSecretKey:(NSString *)secretKey + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForSignInEnrollmentId:(NSString *)enrollmentId + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpSecretHostApi +- (void)generateQrCodeUrlSecretKey:(NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)openInOtpAppSecretKey:(NSString *)secretKey + qrCodeUrl:(NSString *)qrCodeUrl + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpSecretHostApi( + id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpSecretHostApiWithSuffix( + id binaryMessenger, + NSObject *_Nullable api, NSString *messageChannelSuffix); + +/// Only used to generate the object interface that are use outside of the Pigeon interface +@protocol GenerateInterfaces +- (void)pigeonInterfaceInfo:(InternalMultiFactorInfo *)info + error:(FlutterError *_Nullable *_Nonnull)error; +@end + +extern void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/pubspec.yaml new file mode 100755 index 00000000..ed5194bd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/pubspec.yaml @@ -0,0 +1,52 @@ +name: firebase_auth +description: Flutter plugin for Firebase Auth, enabling + authentication using passwords, phone numbers and identity providers + like Google, Facebook and Twitter. +homepage: https://firebase.google.com/docs/auth +repository: https://github.com/firebase/flutterfire/tree/main/packages/firebase_auth/firebase_auth +version: 6.5.4 +resolution: workspace +topics: + - firebase + - authentication + - identity + - sign-in + - sign-up + +false_secrets: + - example/** + +environment: + sdk: '^3.6.0' + flutter: '>=3.16.0' + +dependencies: + firebase_auth_platform_interface: ^9.0.3 + firebase_auth_web: ^6.2.3 + firebase_core: ^4.11.0 + firebase_core_platform_interface: ^7.1.0 + flutter: + sdk: flutter + meta: ^1.8.0 +dev_dependencies: + async: ^2.5.0 + flutter_test: + sdk: flutter + mockito: ^5.0.0 + plugin_platform_interface: ^2.1.3 + +flutter: + plugin: + platforms: + android: + package: io.flutter.plugins.firebase.auth + pluginClass: FlutterFirebaseAuthPlugin + ios: + pluginClass: FLTFirebaseAuthPlugin + macos: + pluginClass: FLTFirebaseAuthPlugin + web: + default_package: firebase_auth_web + windows: + pluginClass: FirebaseAuthPluginCApi + diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart new file mode 100644 index 00000000..5e570b0b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart @@ -0,0 +1,1382 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:async/async.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import './mock.dart'; + +void main() { + setupFirebaseAuthMocks(); + + late FirebaseAuth auth; + + const String kMockActionCode = '12345'; + const String kMockEmail = 'test@example.com'; + const String kMockPassword = 'passw0rd'; + const String kMockIdToken = '12345'; + const String kMockRawNonce = 'abcde12345'; + const String kMockAccessToken = '67890'; + const String kMockGithubToken = 'github'; + const String kMockCustomToken = '12345'; + const String kMockPhoneNumber = '5555555555'; + const String kMockVerificationId = '12345'; + const String kMockSmsCode = '123456'; + const String kMockLanguage = 'en'; + const String kMockOobCode = 'oobcode'; + const String kMockAuthToken = '12460'; + const String kMockURL = 'http://www.example.com'; + const String kMockHost = 'www.example.com'; + const String kMockValidPassword = + 'Password123!'; // For password policy impl testing + const String kMockInvalidPassword = 'Pa1!'; + const String kMockInvalidPassword2 = 'password123!'; + const String kMockInvalidPassword3 = 'PASSWORD123!'; + const String kMockInvalidPassword4 = 'password!'; + const String kMockInvalidPassword5 = 'Password123'; + const Map kMockPasswordPolicy = { + 'customStrengthOptions': { + 'minPasswordLength': 6, + 'maxPasswordLength': 12, + 'containsLowercaseCharacter': true, + 'containsUppercaseCharacter': true, + 'containsNumericCharacter': true, + 'containsNonAlphanumericCharacter': true, + }, + 'allowedNonAlphanumericCharacters': ['!'], + 'schemaVersion': 1, + 'enforcement': 'OFF', + }; + final PasswordPolicy kMockPasswordPolicyObject = + PasswordPolicy(kMockPasswordPolicy); + const int kMockPort = 31337; + + final TestAuthProvider testAuthProvider = TestAuthProvider(); + final int kMockCreationTimestamp = + DateTime.now().subtract(const Duration(days: 2)).millisecondsSinceEpoch; + final int kMockLastSignInTimestamp = + DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; + + final kMockUser = InternalUserDetails( + userInfo: InternalUserInfo( + uid: '12345', + displayName: 'displayName', + creationTimestamp: kMockCreationTimestamp, + lastSignInTimestamp: kMockLastSignInTimestamp, + isAnonymous: true, + isEmailVerified: false, + ), + providerData: [ + { + 'providerId': 'firebase', + 'uid': '12345', + 'displayName': 'Flutter Test User', + 'photoUrl': 'http://www.example.com/', + 'email': 'test@example.com', + } + ], + ); + + late MockUserPlatform mockUserPlatform; + late MockUserCredentialPlatform mockUserCredPlatform; + late MockConfirmationResultPlatform mockConfirmationResultPlatform; + late MockRecaptchaVerifier mockVerifier; + late AdditionalUserInfo mockAdditionalUserInfo; + late EmailAuthCredential mockCredential; + + MockFirebaseAuth mockAuthPlatform = MockFirebaseAuth(); + + group('$FirebaseAuth', () { + InternalUserDetails user; + // used to generate a unique application name for each test + var testCount = 0; + + setUp(() async { + FirebaseAuthPlatform.instance = mockAuthPlatform = MockFirebaseAuth(); + + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: '$testCount', + options: const FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + ), + ); + + auth = FirebaseAuth.instanceFor(app: app); + user = kMockUser; + + mockUserPlatform = MockUserPlatform( + mockAuthPlatform, TestMultiFactorPlatform(mockAuthPlatform), user); + mockConfirmationResultPlatform = MockConfirmationResultPlatform(); + mockAdditionalUserInfo = AdditionalUserInfo( + isNewUser: false, + username: 'flutterUser', + providerId: 'testProvider', + profile: {'foo': 'bar'}, + ); + mockCredential = EmailAuthProvider.credential( + email: 'test', + password: 'test', + ) as EmailAuthCredential; + mockUserCredPlatform = MockUserCredentialPlatform( + FirebaseAuthPlatform.instance, + mockAdditionalUserInfo, + mockCredential, + mockUserPlatform, + ); + mockVerifier = MockRecaptchaVerifier(); + + when(mockAuthPlatform.signInAnonymously()) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithCredential(any)).thenAnswer( + (_) => Future.value(mockUserCredPlatform)); + + when(mockAuthPlatform.currentUser).thenReturn(mockUserPlatform); + + when(mockAuthPlatform.instanceFor( + app: anyNamed('app'), + pluginConstants: anyNamed('pluginConstants'), + )).thenAnswer((_) => mockUserPlatform); + + when(mockAuthPlatform.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.setInitialValues( + currentUser: anyNamed('currentUser'), + languageCode: anyNamed('languageCode'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.createUserWithEmailAndPassword(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.getRedirectResult()) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithCustomToken(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithEmailAndPassword(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithEmailLink(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithPhoneNumber(any, any)) + .thenAnswer((_) async => mockConfirmationResultPlatform); + + when(mockVerifier.delegate).thenReturn(mockVerifier.mockDelegate); + + when(mockAuthPlatform.signInWithPopup(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithRedirect(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.authStateChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + when(mockAuthPlatform.idTokenChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + when(mockAuthPlatform.userChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(MethodChannelFirebaseAuth.channel, + (call) async { + return {'user': user}; + }); + }); + + // incremented after tests completed, in case a test may want to use this + // value for an assertion (toString) + tearDown(() => testCount++); + + setUp(() async { + user = kMockUser; + await auth.signInAnonymously(); + }); + + group('emulator', () { + test('useAuthEmulator() should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.useAuthEmulator(kMockHost, kMockPort)) + .thenAnswer((i) async {}); + await auth.useAuthEmulator(kMockHost, kMockPort); + verify(mockAuthPlatform.useAuthEmulator(kMockHost, kMockPort)); + }); + }); + + group('currentUser', () { + test('get currentUser', () { + User? user = auth.currentUser; + verify(mockAuthPlatform.currentUser); + expect(user, isA()); + }); + }); + + test('creates a fresh instance after app delete and reinitialize', + () async { + final appName = 'delete-reinit-$testCount'; + const options = FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId', + ); + final app = await Firebase.initializeApp( + name: appName, + options: options, + ); + final auth1 = FirebaseAuth.instanceFor(app: app); + + expect(app.getService(), same(auth1)); + + await app.delete(); + + final app2 = await Firebase.initializeApp( + name: appName, + options: options, + ); + addTearDown(app2.delete); + + final auth2 = FirebaseAuth.instanceFor(app: app2); + + expect(auth2, isNot(same(auth1))); + expect(auth2.app, app2); + expect(app2.getService(), same(auth2)); + }); + + group('tenantId', () { + test('set tenantId should call delegate method', () async { + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: 'tenantIdTest', + options: const FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId')); + + FirebaseAuthPlatform.instance = + FakeFirebaseAuthPlatform(tenantId: 'foo'); + auth = FirebaseAuth.instanceFor(app: app); + + expect(auth.tenantId, 'foo'); + + auth.tenantId = 'bar'; + + expect(auth.tenantId, 'bar'); + expect(FirebaseAuthPlatform.instance.tenantId, 'bar'); + }); + }); + + group('customAuthDomain', () { + test('set customAuthDomain should call delegate method', () async { + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: 'customAuthDomainTest', + options: const FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId')); + + FirebaseAuthPlatform.instance = + FakeFirebaseAuthPlatform(customAuthDomain: 'foo'); + auth = FirebaseAuth.instanceFor(app: app); + + expect(auth.customAuthDomain, 'foo'); + if (defaultTargetPlatform == TargetPlatform.windows || kIsWeb) { + try { + auth.customAuthDomain = 'bar'; + } on UnimplementedError catch (e) { + expect(e.message, contains('Cannot set auth domain')); + } + } else { + auth.customAuthDomain = 'bar'; + + expect(auth.customAuthDomain, 'bar'); + expect(FirebaseAuthPlatform.instance.customAuthDomain, 'bar'); + } + }); + }); + + group('languageCode', () { + test('.languageCode should call delegate method', () { + auth.languageCode; + verify(mockAuthPlatform.languageCode); + }); + + test('setLanguageCode() should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setLanguageCode(any)).thenAnswer((i) async {}); + + await auth.setLanguageCode(kMockLanguage); + verify(mockAuthPlatform.setLanguageCode(kMockLanguage)); + }); + }); + + group('checkActionCode()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.checkActionCode(any)).thenAnswer( + (i) async => ActionCodeInfo( + data: ActionCodeInfoData(email: null, previousEmail: null), + operation: ActionCodeInfoOperation.unknown, + ), + ); + + await auth.checkActionCode(kMockActionCode); + verify(mockAuthPlatform.checkActionCode(kMockActionCode)); + }); + }); + + group('confirmPasswordReset()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.confirmPasswordReset(any, any)) + .thenAnswer((i) async {}); + + await auth.confirmPasswordReset( + code: kMockActionCode, + newPassword: kMockPassword, + ); + verify(mockAuthPlatform.confirmPasswordReset( + kMockActionCode, kMockPassword)); + }); + }); + + group('createUserWithEmailAndPassword()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.createUserWithEmailAndPassword(any, any)) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.createUserWithEmailAndPassword( + email: kMockEmail, + password: kMockPassword, + ); + + verify(mockAuthPlatform.createUserWithEmailAndPassword( + kMockEmail, + kMockPassword, + )); + }); + }); + + group('getRedirectResult()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.getRedirectResult()) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.getRedirectResult(); + verify(mockAuthPlatform.getRedirectResult()); + }); + }); + + group('isSignInWithEmailLink()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.isSignInWithEmailLink(any)) + .thenAnswer((i) => false); + + auth.isSignInWithEmailLink(kMockURL); + verify(mockAuthPlatform.isSignInWithEmailLink(kMockURL)); + }); + }); + + group('authStateChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.authStateChanges()); + expect(await changes.next, isA()); + }); + }); + + group('idTokenChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.idTokenChanges()); + expect(await changes.next, isA()); + }); + }); + + group('userChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.userChanges()); + expect(await changes.next, isA()); + }); + }); + + group('sendPasswordResetEmail()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendPasswordResetEmail(any)) + .thenAnswer((i) async {}); + + await auth.sendPasswordResetEmail(email: kMockEmail); + verify(mockAuthPlatform.sendPasswordResetEmail(kMockEmail)); + }); + }); + + group('sendPasswordResetEmail()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendPasswordResetEmail(any)) + .thenAnswer((i) async {}); + + await auth.sendPasswordResetEmail(email: kMockEmail); + verify(mockAuthPlatform.sendPasswordResetEmail(kMockEmail)); + }); + }); + + group('sendSignInLinkToEmail()', () { + test('should throw if actionCodeSettings.handleCodeInApp is not true', + () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendSignInLinkToEmail(any, any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings kMockActionCodeSettingsNull = + ActionCodeSettings(url: kMockURL); + final ActionCodeSettings kMockActionCodeSettingsFalse = + ActionCodeSettings(url: kMockURL); + + // when handleCodeInApp is null + expect( + () => auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsNull), + throwsArgumentError, + ); + // when handleCodeInApp is false + expect( + () => auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsFalse), + throwsArgumentError, + ); + }); + + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendSignInLinkToEmail(any, any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings kMockActionCodeSettingsValid = + ActionCodeSettings(url: kMockURL, handleCodeInApp: true); + + await auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsValid, + ); + + verify(mockAuthPlatform.sendSignInLinkToEmail( + kMockEmail, + kMockActionCodeSettingsValid, + )); + }); + }); + + group('setSettings()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setSettings( + appVerificationDisabledForTesting: any, + phoneNumber: any, + smsCode: any, + forceRecaptchaFlow: any, + userAccessGroup: any, + )).thenAnswer((i) async {}); + + String phoneNumber = '123456'; + String smsCode = '1234'; + bool forceRecaptchaFlow = true; + bool appVerificationDisabledForTesting = true; + String userAccessGroup = 'group-id'; + + await auth.setSettings( + appVerificationDisabledForTesting: appVerificationDisabledForTesting, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + userAccessGroup: userAccessGroup, + ); + + verify( + mockAuthPlatform.setSettings( + appVerificationDisabledForTesting: + appVerificationDisabledForTesting, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + userAccessGroup: userAccessGroup, + ), + ); + }); + }); + + group('setPersistence()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setPersistence(any)).thenAnswer((i) async {}); + + await auth.setPersistence(Persistence.LOCAL); + verify(mockAuthPlatform.setPersistence(Persistence.LOCAL)); + }); + }); + + group('signInAnonymously()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.signInAnonymously()) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.signInAnonymously(); + verify(mockAuthPlatform.signInAnonymously()); + }); + }); + + group('signInWithCredential()', () { + test('GithubAuthProvider signInWithCredential', () async { + final AuthCredential credential = + GithubAuthProvider.credential(kMockGithubToken); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('github.com')); + expect(captured.accessToken, equals(kMockGithubToken)); + }); + + test('EmailAuthProvider (withLink) signInWithCredential', () async { + final AuthCredential credential = EmailAuthProvider.credentialWithLink( + email: 'test@example.com', + emailLink: '', + ); + await auth.signInWithCredential(credential); + final EmailAuthCredential captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('password')); + expect(captured.email, equals('test@example.com')); + expect(captured.emailLink, + equals('')); + }); + + test('TwitterAuthProvider signInWithCredential', () async { + final AuthCredential credential = TwitterAuthProvider.credential( + accessToken: kMockIdToken, + secret: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('twitter.com')); + expect(captured.accessToken, equals(kMockIdToken)); + expect(captured.secret, equals(kMockAccessToken)); + }); + + test('GoogleAuthProvider signInWithCredential', () async { + final credential = GoogleAuthProvider.credential( + idToken: kMockIdToken, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('google.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + + test('OAuthProvider signInWithCredential for Apple', () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.accessToken, equals(kMockAccessToken)); + expect(captured.rawNonce, equals(null)); + }); + + test('OAuthProvider signInWithCredential for Apple with rawNonce', + () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + rawNonce: kMockRawNonce, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.rawNonce, equals(kMockRawNonce)); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + + test( + 'OAuthProvider signInWithCredential for Apple with rawNonce (empty accessToken)', + () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + rawNonce: kMockRawNonce, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.rawNonce, equals(kMockRawNonce)); + expect(captured.accessToken, equals(null)); + }); + + test('PhoneAuthProvider signInWithCredential', () async { + final PhoneAuthCredential credential = PhoneAuthProvider.credential( + verificationId: kMockVerificationId, + smsCode: kMockSmsCode, + ); + await auth.signInWithCredential(credential); + final PhoneAuthCredential captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('phone')); + expect(captured.verificationId, equals(kMockVerificationId)); + expect(captured.smsCode, equals(kMockSmsCode)); + }); + + test('FacebookAuthProvider signInWithCredential', () async { + final AuthCredential credential = + FacebookAuthProvider.credential(kMockAccessToken); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('facebook.com')); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + }); + + group('signInWithCustomToken()', () { + test('should call delegate method', () async { + await auth.signInWithCustomToken(kMockCustomToken); + verify(mockAuthPlatform.signInWithCustomToken(kMockCustomToken)); + }); + }); + + group('signInWithEmailAndPassword()', () { + test('should call delegate method', () async { + await auth.signInWithEmailAndPassword( + email: kMockEmail, password: kMockPassword); + verify(mockAuthPlatform.signInWithEmailAndPassword( + kMockEmail, kMockPassword)); + }); + }); + + group('signInWithEmailLink()', () { + test('should call delegate method', () async { + await auth.signInWithEmailLink(email: kMockEmail, emailLink: kMockURL); + verify(mockAuthPlatform.signInWithEmailLink(kMockEmail, kMockURL)); + }); + }); + + group('signInWithPhoneNumber()', () { + test('should call delegate method', () async { + await auth.signInWithPhoneNumber(kMockPhoneNumber, mockVerifier); + verify(mockAuthPlatform.signInWithPhoneNumber(kMockPhoneNumber, any)); + }); + }); + + group('signInWithPopup()', () { + test('should call delegate method', () async { + await auth.signInWithPopup(testAuthProvider); + verify(mockAuthPlatform.signInWithPopup(testAuthProvider)); + }); + }); + + group('signInWithRedirect()', () { + test('should call delegate method', () async { + await auth.signInWithRedirect(testAuthProvider); + verify(mockAuthPlatform.signInWithRedirect(testAuthProvider)); + }); + }); + + group('signOut()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.signOut()).thenAnswer((i) async {}); + + await auth.signOut(); + verify(mockAuthPlatform.signOut()); + }); + }); + + group('verifyPasswordResetCode()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.verifyPasswordResetCode(any)) + .thenAnswer((i) async => ''); + + await auth.verifyPasswordResetCode(kMockOobCode); + verify(mockAuthPlatform.verifyPasswordResetCode(kMockOobCode)); + }); + }); + + group('verifyPhoneNumber()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.verifyPhoneNumber( + autoRetrievedSmsCodeForTesting: + anyNamed('autoRetrievedSmsCodeForTesting'), + codeAutoRetrievalTimeout: anyNamed('codeAutoRetrievalTimeout'), + codeSent: anyNamed('codeSent'), + forceResendingToken: anyNamed('forceResendingToken'), + phoneNumber: anyNamed('phoneNumber'), + timeout: anyNamed('timeout'), + verificationCompleted: anyNamed('verificationCompleted'), + verificationFailed: anyNamed('verificationFailed'), + )).thenAnswer((i) async {}); + + final PhoneVerificationCompleted verificationCompleted = + (PhoneAuthCredential phoneAuthCredential) {}; + final PhoneVerificationFailed verificationFailed = + (FirebaseAuthException authException) {}; + final PhoneCodeSent codeSent = + (String verificationId, [int? forceResendingToken]) async {}; + final PhoneCodeAutoRetrievalTimeout autoRetrievalTimeout = + (String verificationId) {}; + + await auth.verifyPhoneNumber( + phoneNumber: kMockPhoneNumber, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: autoRetrievalTimeout, + ); + + verify( + mockAuthPlatform.verifyPhoneNumber( + phoneNumber: kMockPhoneNumber, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: autoRetrievalTimeout, + ), + ); + }); + }); + + group('revokeAccessToken()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.revokeAccessToken(kMockAuthToken)) + .thenAnswer((i) async {}); + + await auth.revokeAccessToken(kMockAuthToken); + verify(mockAuthPlatform.revokeAccessToken(kMockAuthToken)); + }); + }); + + group('passwordPolicy', () { + test('passwordPolicy should be initialized with correct parameters', + () async { + PasswordPolicyImpl passwordPolicy = + PasswordPolicyImpl(kMockPasswordPolicyObject); + expect(passwordPolicy.policy, equals(kMockPasswordPolicyObject)); + }); + + PasswordPolicyImpl passwordPolicy = + PasswordPolicyImpl(kMockPasswordPolicyObject); + + test('should return true for valid password', () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockValidPassword); + expect(status.isValid, isTrue); + }); + + test('should return false for invalid password that is too short', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword); + expect(status.isValid, isFalse); + }); + + test( + 'should return false for invalid password with no capital characters', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword2); + expect(status.isValid, isFalse); + }); + + test( + 'should return false for invalid password with no lowercase characters', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword3); + expect(status.isValid, isFalse); + }); + + test('should return false for invalid password with no numbers', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword4); + expect(status.isValid, isFalse); + }); + + test('should return false for invalid password with no symbols', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword5); + expect(status.isValid, isFalse); + }); + }); + + test('toString()', () async { + expect( + auth.toString(), + equals('FirebaseAuth(app: $testCount)'), + ); + }); + }); +} + +class MockFirebaseAuth extends Mock + with MockPlatformInterfaceMixin + implements TestFirebaseAuthPlatform { + @override + Stream userChanges() { + return super.noSuchMethod( + Invocation.method(#userChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + Stream idTokenChanges() { + return super.noSuchMethod( + Invocation.method(#idTokenChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + Stream authStateChanges() { + return super.noSuchMethod( + Invocation.method(#authStateChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, [], {#app: app}), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + Future createUserWithEmailAndPassword( + String? email, + String? password, + ) { + return super.noSuchMethod( + Invocation.method(#createUserWithEmailAndPassword, [email, password]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithPhoneNumber( + String? phoneNumber, + RecaptchaVerifierFactoryPlatform? applicationVerifier, + ) { + return super.noSuchMethod( + Invocation.method( + #signInWithPhoneNumber, + [phoneNumber, applicationVerifier], + ), + returnValue: neverEndingFuture(), + returnValueForMissingStub: + neverEndingFuture(), + ); + } + + @override + Future signInWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithCustomToken(String? token) { + return super.noSuchMethod( + Invocation.method(#signInWithCustomToken, [token]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithEmailAndPassword( + String? email, + String? password, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithEmailAndPassword, [email, password]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithPopup(AuthProvider? provider) { + return super.noSuchMethod( + Invocation.method(#signInWithPopup, [provider]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithEmailLink( + String? email, + String? emailLink, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithEmailLink, [email, emailLink]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithRedirect(AuthProvider? provider) { + return super.noSuchMethod( + Invocation.method(#signInWithRedirect, [provider]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInAnonymously() { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, [], { + #currentUser: currentUser, + #languageCode: languageCode, + }), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + Future getRedirectResult() { + return super.noSuchMethod( + Invocation.method(#getRedirectResult, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setLanguageCode(String? languageCode) { + return super.noSuchMethod( + Invocation.method(#setLanguageCode, [languageCode]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future useAuthEmulator(String host, int port) { + return super.noSuchMethod( + Invocation.method(#useEmulator, [host, port]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future checkActionCode(String? code) { + return super.noSuchMethod( + Invocation.method(#checkActionCode, [code]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future confirmPasswordReset(String? code, String? newPassword) { + return super.noSuchMethod( + Invocation.method(#confirmPasswordReset, [code, newPassword]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + bool isSignInWithEmailLink(String? emailLink) { + return super.noSuchMethod( + Invocation.method(#isSignInWithEmailLink, [emailLink]), + returnValue: false, + returnValueForMissingStub: false, + ); + } + + @override + Future sendPasswordResetEmail( + String? email, [ + ActionCodeSettings? actionCodeSettings, + ]) { + return super.noSuchMethod( + Invocation.method(#sendPasswordResetEmail, [email, actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future sendSignInLinkToEmail( + String? email, + ActionCodeSettings? actionCodeSettings, + ) { + return super.noSuchMethod( + Invocation.method(#sendSignInLinkToEmail, [email, actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setSettings({ + bool? appVerificationDisabledForTesting, + String? userAccessGroup, + String? phoneNumber, + String? smsCode, + bool? forceRecaptchaFlow, + }) { + return super.noSuchMethod( + Invocation.method(#setSettings, [ + appVerificationDisabledForTesting, + userAccessGroup, + phoneNumber, + smsCode, + forceRecaptchaFlow, + ]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setPersistence(Persistence? persistence) { + return super.noSuchMethod( + Invocation.method(#setPersistence, [persistence]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signOut() { + return super.noSuchMethod( + Invocation.method(#signOut, [signOut]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyPasswordResetCode(String? code) { + return super.noSuchMethod( + Invocation.method(#verifyPasswordResetCode, [code]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyPhoneNumber({ + String? phoneNumber, + PhoneMultiFactorInfo? multiFactorInfo, + MultiFactorSession? multiFactorSession, + Object? verificationCompleted, + Object? verificationFailed, + Object? codeSent, + Object? codeAutoRetrievalTimeout, + Duration? timeout = const Duration(seconds: 30), + int? forceResendingToken, + String? autoRetrievedSmsCodeForTesting, + }) { + return super.noSuchMethod( + Invocation.method(#verifyPhoneNumber, [], { + #phoneNumber: phoneNumber, + #verificationCompleted: verificationCompleted, + #verificationFailed: verificationFailed, + #codeSent: codeSent, + #codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, + #timeout: timeout, + #forceResendingToken: forceResendingToken, + #autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, + }), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future revokeAccessToken(String accessToken) { + return super.noSuchMethod( + Invocation.method(#revokeAccessToken, [accessToken]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } +} + +class FakeFirebaseAuthPlatform extends Fake + with MockPlatformInterfaceMixin + implements FirebaseAuthPlatform { + FakeFirebaseAuthPlatform({this.tenantId, this.customAuthDomain}); + + @override + String? tenantId; + + @override + String? customAuthDomain; + + @override + FirebaseAuthPlatform delegateFor( + {required FirebaseApp app, Persistence? persistence}) { + return this; + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class MockUserPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserPlatform { + MockUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails _user) { + TestUserPlatform(auth, multiFactor, _user); + } +} + +class MockUserCredentialPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserCredentialPlatform { + MockUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) { + TestUserCredentialPlatform( + auth, + additionalUserInfo, + credential, + userPlatform, + ); + } +} + +class MockConfirmationResultPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestConfirmationResultPlatform { + MockConfirmationResultPlatform() { + TestConfirmationResultPlatform(); + } +} + +class TestConfirmationResultPlatform extends ConfirmationResultPlatform { + TestConfirmationResultPlatform() : super('TEST'); +} + +class TestFirebaseAuthPlatform extends FirebaseAuthPlatform { + TestFirebaseAuthPlatform() : super(); + + void instanceFor({ + FirebaseApp? app, + Map? pluginConstants, + }) {} + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return this; + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class MockRecaptchaVerifier extends Mock + with MockPlatformInterfaceMixin + implements TestRecaptchaVerifier { + MockRecaptchaVerifier() { + TestRecaptchaVerifier(); + } + + RecaptchaVerifierFactoryPlatform get mockDelegate { + return MockRecaptchaVerifierFactoryPlatform(); + } + + @override + RecaptchaVerifierFactoryPlatform get delegate { + return super.noSuchMethod( + Invocation.getter(#delegate), + returnValue: MockRecaptchaVerifierFactoryPlatform(), + returnValueForMissingStub: MockRecaptchaVerifierFactoryPlatform(), + ); + } +} + +class MockRecaptchaVerifierFactoryPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestRecaptchaVerifierFactoryPlatform { + MockRecaptchaVerifierFactoryPlatform() { + TestRecaptchaVerifierFactoryPlatform(); + } +} + +class TestRecaptchaVerifier implements RecaptchaVerifier { + TestRecaptchaVerifier() : super(); + + @override + void clear() {} + + @override + RecaptchaVerifierFactoryPlatform get delegate => + TestRecaptchaVerifierFactoryPlatform(); + + @override + Future render() { + throw UnimplementedError(); + } + + @override + String get type => throw UnimplementedError(); + + @override + Future verify() { + throw UnimplementedError(); + } +} + +class TestRecaptchaVerifierFactoryPlatform + extends RecaptchaVerifierFactoryPlatform {} + +class TestAuthProvider extends AuthProvider { + TestAuthProvider() : super('TEST'); +} + +class TestUserPlatform extends UserPlatform { + TestUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails data) + : super(auth, multiFactor, data); +} + +class TestMultiFactorPlatform extends MultiFactorPlatform { + TestMultiFactorPlatform(FirebaseAuthPlatform auth) : super(auth); +} + +class TestUserCredentialPlatform extends UserCredentialPlatform { + TestUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) : super( + auth: auth, + additionalUserInfo: additionalUserInfo, + credential: credential, + user: userPlatform, + ); +} + +class EmptyUserCredentialPlatform extends UserCredentialPlatform { + EmptyUserCredentialPlatform() : super(auth: FirebaseAuthPlatform.instance); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/mock.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/mock.dart new file mode 100644 index 00000000..6dc416fb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/mock.dart @@ -0,0 +1,40 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_core_platform_interface/test.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +typedef Callback = void Function(MethodCall call); + +void setupFirebaseAuthMocks([Callback? customHandlers]) { + TestWidgetsFlutterBinding.ensureInitialized(); + + setupFirebaseCoreMocks(); + TestFirebaseAppHostApi.setUp(MockFirebaseAppHostApi()); +} + +Future neverEndingFuture() async { + // ignore: literal_only_boolean_expressions + while (true) { + await Future.delayed(const Duration(minutes: 5)); + } +} + +class MockFirebaseAppHostApi implements TestFirebaseAppHostApi { + @override + Future delete(String appName) async {} + + @override + Future setAutomaticDataCollectionEnabled( + String appName, + bool enabled, + ) async {} + + @override + Future setAutomaticResourceManagementEnabled( + String appName, + bool enabled, + ) async {} +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/user_test.dart b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/user_test.dart new file mode 100644 index 00000000..967be866 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/test/user_test.dart @@ -0,0 +1,571 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +// import 'package:mockito/annotations.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +// import './user_test.mocks.dart'; +import './mock.dart'; +import 'firebase_auth_test.dart'; + +Map kMockUser1 = { + 'isAnonymous': true, + 'emailVerified': false, + 'displayName': 'displayName', +}; + +// @GenerateMocks([], customMocks: [ +// MockSpec(as: #MockFirebaseAuthPlatform), +// MockSpec(as: #MockUserPlatform), +// ]) +void main() { + setupFirebaseAuthMocks(); + + late FirebaseAuth auth; + + final kMockIdTokenResult = InternalIdTokenResult( + token: '12345', + expirationTimestamp: 123456, + authTimestamp: 1234567, + issuedAtTimestamp: 12345678, + signInProvider: 'password', + claims: { + 'claim1': 'value1', + }, + ); + + final int kMockCreationTimestamp = + DateTime.now().subtract(const Duration(days: 2)).millisecondsSinceEpoch; + final int kMockLastSignInTimestamp = + DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; + + final kMockUser = InternalUserDetails( + userInfo: InternalUserInfo( + uid: '12345', + displayName: 'displayName', + creationTimestamp: kMockCreationTimestamp, + lastSignInTimestamp: kMockLastSignInTimestamp, + isAnonymous: true, + isEmailVerified: false, + ), + providerData: [ + { + 'providerId': 'firebase', + 'uid': '12345', + 'displayName': 'Flutter Test User', + 'photoUrl': null, + 'email': 'test@example.com', + 'isAnonymous': true, + 'isEmailVerified': false, + } + ], + ); + late MockUserPlatform mockUserPlatform; + late MockUserCredentialPlatform mockUserCredPlatform; + + AdditionalUserInfo mockAdditionalInfo = AdditionalUserInfo( + isNewUser: false, + username: 'flutterUser', + providerId: 'testProvider', + profile: {'foo': 'bar'}, + ); + + EmailAuthCredential mockCredential = + EmailAuthProvider.credential(email: 'test', password: 'test') + as EmailAuthCredential; + + var mockAuthPlatform = MockFirebaseAuth(); + + group('$User', () { + late InternalUserDetails user; + + // used to generate a unique application name for each test + var testCount = 0; + + setUp(() async { + FirebaseAuthPlatform.instance = mockAuthPlatform = MockFirebaseAuth(); + + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: '$testCount', + options: const FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + ), + ); + + auth = FirebaseAuth.instanceFor(app: app); + + user = kMockUser; + + mockUserPlatform = MockUserPlatform(mockAuthPlatform, user); + + mockUserCredPlatform = MockUserCredentialPlatform( + FirebaseAuthPlatform.instance, + mockAdditionalInfo, + mockCredential, + mockUserPlatform, + ); + + when(mockAuthPlatform.signInAnonymously()).thenAnswer( + (_) => Future.value(mockUserCredPlatform)); + + when(mockAuthPlatform.currentUser).thenReturn(mockUserPlatform); + + when(mockAuthPlatform.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.setInitialValues( + currentUser: anyNamed('currentUser'), + languageCode: anyNamed('languageCode'), + )).thenAnswer((_) => mockAuthPlatform); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(MethodChannelFirebaseAuth.channel, + (call) async { + switch (call.method) { + default: + return {'user': user}; + } + }); + }); + + tearDown(() => testCount++); + + setUp(() async { + user = kMockUser; + await auth.signInAnonymously(); + }); + + test('delete()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.delete()).thenAnswer((i) async {}); + + await auth.currentUser!.delete(); + + verify(mockUserPlatform.delete()); + }); + + test('getIdToken()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.getIdToken(any)).thenAnswer((_) async => 'token'); + + final token = await auth.currentUser!.getIdToken(true); + + verify(mockUserPlatform.getIdToken(true)); + expect(token, isA()); + }); + + test('getIdTokenResult()', () async { + when(mockUserPlatform.getIdTokenResult(any)) + .thenAnswer((_) async => IdTokenResult(kMockIdTokenResult)); + + final idTokenResult = await auth.currentUser!.getIdTokenResult(true); + + verify(mockUserPlatform.getIdTokenResult(true)); + expect(idTokenResult, isA()); + }); + + group('linkWithCredential()', () { + setUp(() { + when(mockUserPlatform.linkWithCredential(any)) + .thenAnswer((_) async => mockUserCredPlatform); + }); + + test('should call linkWithCredential()', () async { + String newEmail = 'new@email.com'; + EmailAuthCredential credential = + EmailAuthProvider.credential(email: newEmail, password: 'test') + as EmailAuthCredential; + + await auth.currentUser!.linkWithCredential(credential); + + verify(mockUserPlatform.linkWithCredential(credential)); + }); + }); + + group('reauthenticateWithCredential()', () { + setUp(() { + when(mockUserPlatform.reauthenticateWithCredential(any)) + .thenAnswer((_) => Future.value(mockUserCredPlatform)); + }); + test('should call reauthenticateWithCredential()', () async { + String newEmail = 'new@email.com'; + EmailAuthCredential credential = + EmailAuthProvider.credential(email: newEmail, password: 'test') + as EmailAuthCredential; + + await auth.currentUser!.reauthenticateWithCredential(credential); + + verify(mockUserPlatform.reauthenticateWithCredential(credential)); + }); + }); + + test('reload()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.reload()).thenAnswer((i) async {}); + + await auth.currentUser!.reload(); + + verify(mockUserPlatform.reload()); + }); + + test('sendEmailVerification()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.sendEmailVerification(any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings actionCodeSettings = + ActionCodeSettings(url: 'test'); + + await auth.currentUser!.sendEmailVerification(actionCodeSettings); + + verify(mockUserPlatform.sendEmailVerification(actionCodeSettings)); + }); + + group('unlink()', () { + setUp(() { + when(mockUserPlatform.unlink(any)) + .thenAnswer((_) => Future.value(mockUserPlatform)); + }); + test('should call unlink()', () async { + const String providerId = 'providerId'; + + await auth.currentUser!.unlink(providerId); + + verify(mockUserPlatform.unlink(providerId)); + }); + }); + + group('updatePassword()', () { + test('should call updatePassword()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updatePassword(any)).thenAnswer((i) async {}); + + const String newPassword = 'newPassword'; + + await auth.currentUser!.updatePassword(newPassword); + + verify(mockUserPlatform.updatePassword(newPassword)); + }); + }); + group('updatePhoneNumber()', () { + test('should call updatePhoneNumber()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updatePhoneNumber(any)).thenAnswer((i) async {}); + + PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.credential( + verificationId: 'test', + smsCode: 'test', + ); + + await auth.currentUser!.updatePhoneNumber(phoneAuthCredential); + + verify(mockUserPlatform.updatePhoneNumber(phoneAuthCredential)); + }); + }); + + test('updateProfile()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updateProfile(any)).thenAnswer((i) async {}); + + const String displayName = 'updatedName'; + const String photoURL = 'testUrl'; + Map data = { + 'displayName': displayName, + 'photoURL': photoURL + }; + + await auth.currentUser! + // ignore: deprecated_member_use_from_same_package + .updateProfile(displayName: displayName, photoURL: photoURL); + + verify(mockUserPlatform.updateProfile(data)); + }); + + group('verifyBeforeUpdateEmail()', () { + test('should call verifyBeforeUpdateEmail()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.verifyBeforeUpdateEmail(any, any)) + .thenAnswer((i) async {}); + + const newEmail = 'new@email.com'; + ActionCodeSettings actionCodeSettings = ActionCodeSettings(url: 'test'); + + await auth.currentUser! + .verifyBeforeUpdateEmail(newEmail, actionCodeSettings); + + verify(mockUserPlatform.verifyBeforeUpdateEmail( + newEmail, actionCodeSettings)); + }); + }); + + test('toString()', () async { + when(mockAuthPlatform.currentUser).thenReturn(TestUserPlatform( + mockAuthPlatform, TestMultiFactorPlatform(mockAuthPlatform), user)); + + const userInfo = 'UserInfo(' + 'displayName: Flutter Test User, ' + 'email: test@example.com, ' + 'phoneNumber: null, ' + 'photoURL: null, ' + 'providerId: firebase, ' + 'uid: 12345)'; + + final userMetadata = 'UserMetadata(' + 'creationTime: ${DateTime.fromMillisecondsSinceEpoch(kMockCreationTimestamp, isUtc: true)}, ' + 'lastSignInTime: ${DateTime.fromMillisecondsSinceEpoch(kMockLastSignInTimestamp, isUtc: true)})'; + + expect( + auth.currentUser.toString(), + 'User(' + 'displayName: displayName, ' + 'email: null, ' + 'isEmailVerified: false, ' + 'isAnonymous: true, ' + 'metadata: $userMetadata, ' + 'phoneNumber: null, ' + 'photoURL: null, ' + 'providerData, ' + '[$userInfo], ' + 'refreshToken: null, ' + 'tenantId: null, ' + 'uid: 12345)', + ); + }); + }); +} + +class MockFirebaseAuthPlatformBase = TestFirebaseAuthPlatform + with MockPlatformInterfaceMixin; + +class MockUserPlatformBase = TestUserPlatform with MockPlatformInterfaceMixin; + +class MockFirebaseAuth extends Mock + with MockPlatformInterfaceMixin + implements TestFirebaseAuthPlatform { + @override + Future signInAnonymously() { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, const []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, const [], {#app: app}), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return super.noSuchMethod( + Invocation.method(#setInitialValues, const [], { + #currentUser: currentUser, + #languageCode: languageCode, + }), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } +} + +class MockUserPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserPlatform { + MockUserPlatform(FirebaseAuthPlatform auth, InternalUserDetails _user) { + TestUserPlatform(auth, TestMultiFactorPlatform(auth), _user); + } + + @override + Future delete() { + return super.noSuchMethod( + Invocation.method(#delete, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future reload() { + return super.noSuchMethod( + Invocation.method(#reload, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future getIdToken(bool? forceRefresh) { + return super.noSuchMethod( + Invocation.method(#getIdToken, [forceRefresh]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future unlink(String? providerId) { + return super.noSuchMethod( + Invocation.method(#unlink, [providerId]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future getIdTokenResult(bool? forceRefresh) { + return super.noSuchMethod( + Invocation.method(#getIdTokenResult, [forceRefresh]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future reauthenticateWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#reauthenticateWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future linkWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#linkWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future sendEmailVerification(ActionCodeSettings? actionCodeSettings) { + return super.noSuchMethod( + Invocation.method(#sendEmailVerification, [actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updatePassword(String? newPassword) { + return super.noSuchMethod( + Invocation.method(#updatePassword, [newPassword]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updatePhoneNumber(PhoneAuthCredential? phoneCredential) { + return super.noSuchMethod( + Invocation.method(#updatePhoneNumber, [phoneCredential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updateProfile(Map? profile) { + return super.noSuchMethod( + Invocation.method(#updateProfile, [profile]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyBeforeUpdateEmail( + String? newEmail, [ + ActionCodeSettings? actionCodeSettings, + ]) { + return super.noSuchMethod( + Invocation.method(#verifyBeforeUpdateEmail, [ + newEmail, + actionCodeSettings, + ]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } +} + +class MockUserCredentialPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserCredentialPlatform { + MockUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) { + TestUserCredentialPlatform( + auth, + additionalUserInfo, + credential, + userPlatform, + ); + } +} + +class TestFirebaseAuthPlatform extends FirebaseAuthPlatform { + TestFirebaseAuthPlatform() : super(); + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) => + this; + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class TestUserPlatform extends UserPlatform { + TestUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails data) + : super(auth, multiFactor, data); +} + +class TestUserCredentialPlatform extends UserCredentialPlatform { + TestUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) : super( + auth: auth, + additionalUserInfo: additionalUserInfo, + credential: credential, + user: userPlatform); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt new file mode 100644 index 00000000..74c8f9ab --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt @@ -0,0 +1,123 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "firebase_auth") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_auth_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "firebase_auth_plugin.cpp" + "firebase_auth_plugin.h" + "messages.g.cpp" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +add_library(${PLUGIN_NAME} STATIC + "include/firebase_auth/firebase_auth_plugin_c_api.h" + "firebase_auth_plugin_c_api.cpp" + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +set(MSVC_RUNTIME_MODE MD) +set(firebase_libs firebase_core_plugin firebase_auth) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_auth_bundled_libraries + "" + PARENT_SCOPE +) + +# === Tests === +# These unit tests can be run from a terminal after building the example, or +# from Visual Studio after opening the generated solution file. + +# Only enable test builds when building the example (which sets this variable) +# so that plugin clients aren't building the tests. +if (${include_${PROJECT_NAME}_tests}) +set(TEST_RUNNER "${PROJECT_NAME}_test") +enable_testing() + +# Add the Google Test dependency. +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/release-1.11.0.zip +) +# Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +# Disable install commands for gtest so it doesn't end up in the bundle. +set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE) +FetchContent_MakeAvailable(googletest) + +# The plugin's C API is not very useful for unit testing, so build the sources +# directly into the test binary rather than using the DLL. +add_executable(${TEST_RUNNER} + test/firebase_auth_plugin_test.cpp + ${PLUGIN_SOURCES} +) +apply_standard_settings(${TEST_RUNNER}) +target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") +target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin) +target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock) +# flutter_wrapper_plugin has link dependencies on the Flutter DLL. +add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${FLUTTER_LIBRARY}" $ +) + +# Enable automatic test discovery. +include(GoogleTest) +gtest_discover_tests(${TEST_RUNNER}) +endif() diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp new file mode 100644 index 00000000..a931dac2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp @@ -0,0 +1,1341 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_auth_plugin.h" + +// This must be included before many other Windows headers. +#include + +#include +#include + +#include "firebase/app.h" +#include "firebase/auth.h" +#include "firebase/future.h" +#include "firebase/log.h" +#include "firebase/util.h" +#include "firebase/variant.h" +#include "firebase_auth/plugin_version.h" +#include "firebase_core/firebase_core_plugin_c_api.h" +#include "messages.g.h" + +// For getPlatformVersion; remove unless needed for your plugin implementation. +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::firebase::App; +using ::firebase::auth::Auth; + +namespace firebase_auth_windows { + +static std::string kLibraryName = "flutter-fire-auth"; +flutter::BinaryMessenger* FirebaseAuthPlugin::binaryMessenger = nullptr; + +// static +void FirebaseAuthPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarWindows* registrar) { + auto plugin = std::make_unique(); + + FirebaseAuthHostApi::SetUp(registrar->messenger(), plugin.get()); + FirebaseAuthUserHostApi::SetUp(registrar->messenger(), plugin.get()); + + RegisterFlutterFirebasePlugin("plugins.flutter.io/firebase_auth", + plugin.get()); + + registrar->AddPlugin(std::move(plugin)); + + binaryMessenger = registrar->messenger(); + + // Register for platform logging + App::RegisterLibrary(kLibraryName.c_str(), getPluginVersion().c_str(), + nullptr); +} + +FirebaseAuthPlugin::FirebaseAuthPlugin() { + firebase::SetLogLevel(firebase::kLogLevelVerbose); +} + +FirebaseAuthPlugin::~FirebaseAuthPlugin() = default; + +Auth* GetAuthFromPigeon(const AuthPigeonFirebaseApp& pigeonApp) { + App* app = App::GetInstance(pigeonApp.app_name().c_str()); + + Auth* auth = Auth::GetAuth(app); + + return auth; +} + +InternalUserCredential ParseAuthResult( + const firebase::auth::AuthResult* authResult) { + InternalUserCredential result = InternalUserCredential(); + result.set_user(FirebaseAuthPlugin::ParseUserDetails(authResult->user)); + result.set_additional_user_info(FirebaseAuthPlugin::ParseAdditionalUserInfo( + authResult->additional_user_info)); + return result; +} + +using flutter::EncodableMap; +using flutter::EncodableValue; + +flutter::EncodableMap +firebase_auth_windows::FirebaseAuthPlugin::ConvertToEncodableMap( + const std::map& originalMap) { + EncodableMap convertedMap; + for (const auto& kv : originalMap) { + EncodableValue key = ConvertToEncodableValue( + kv.first); // convert std::string to EncodableValue + EncodableValue value = ConvertToEncodableValue( + kv.second); // convert FieldValue to EncodableValue + convertedMap[key] = value; // insert into the new map + } + return convertedMap; +} + +flutter::EncodableValue +firebase_auth_windows::FirebaseAuthPlugin::ConvertToEncodableValue( + const firebase::Variant& variant) { + switch (variant.type()) { + case firebase::Variant::kTypeNull: + return EncodableValue(); + case firebase::Variant::kTypeInt64: + return EncodableValue(variant.int64_value()); + case firebase::Variant::kTypeDouble: + return EncodableValue(variant.double_value()); + case firebase::Variant::kTypeBool: + return EncodableValue(variant.bool_value()); + case firebase::Variant::kTypeStaticString: + return EncodableValue(variant.string_value()); + case firebase::Variant::kTypeMutableString: + return EncodableValue(variant.mutable_string()); + case firebase::Variant::kTypeMap: + return FirebaseAuthPlugin::ConvertToEncodableMap(variant.map()); + case firebase::Variant::kTypeStaticBlob: + return EncodableValue(flutter::CustomEncodableValue(variant.blob_data())); + case firebase::Variant::kTypeMutableBlob: + return EncodableValue( + flutter::CustomEncodableValue(variant.mutable_blob_data())); + default: + return EncodableValue(); + } +} + +InternalAdditionalUserInfo FirebaseAuthPlugin::ParseAdditionalUserInfo( + const firebase::auth::AdditionalUserInfo additionalUserInfo) { + // Cannot know if the user is new or not with current API + InternalAdditionalUserInfo result = InternalAdditionalUserInfo(false); + result.set_profile(ConvertToEncodableMap(additionalUserInfo.profile)); + result.set_provider_id(additionalUserInfo.provider_id); + result.set_username(additionalUserInfo.user_name); + return result; +} + +InternalUserDetails FirebaseAuthPlugin::ParseUserDetails( + const firebase::auth::User user) { + InternalUserDetails result = + InternalUserDetails(FirebaseAuthPlugin::ParseUserInfo(&user), + FirebaseAuthPlugin::ParseProviderData(&user)); + + return result; +} + +InternalUserInfo FirebaseAuthPlugin::ParseUserInfo( + const firebase::auth::User* user) { + InternalUserInfo result = InternalUserInfo(user->uid(), user->is_anonymous(), + user->is_email_verified()); + result.set_display_name(user->display_name()); + result.set_email(user->email()); + result.set_phone_number(user->phone_number()); + result.set_photo_url(user->photo_url()); + result.set_provider_id(user->provider_id()); + result.set_uid(user->uid()); + result.set_creation_timestamp(user->metadata().creation_timestamp); + result.set_last_sign_in_timestamp(user->metadata().last_sign_in_timestamp); + + return result; +} + +flutter::EncodableList FirebaseAuthPlugin::ParseProviderData( + const firebase::auth::User* user) { + flutter::EncodableList output; + + for (firebase::auth::UserInfoInterface userInfo : user->provider_data()) { + output.push_back(FirebaseAuthPlugin::ParseUserInfoToMap(&userInfo)); + } + + return flutter::EncodableList(output); +} + +flutter::EncodableValue FirebaseAuthPlugin::ParseUserInfoToMap( + firebase::auth::UserInfoInterface* userInfo) { + return flutter::EncodableValue(flutter::EncodableMap{ + {flutter::EncodableValue("displayName"), + flutter::EncodableValue(userInfo->display_name())}, + {flutter::EncodableValue("email"), + flutter::EncodableValue(userInfo->email())}, + {flutter::EncodableValue("isEmailVerified"), + flutter::EncodableValue(true)}, + {flutter::EncodableValue("phoneNumber"), + flutter::EncodableValue(userInfo->phone_number())}, + {flutter::EncodableValue("photoUrl"), + flutter::EncodableValue(userInfo->photo_url())}, + {flutter::EncodableValue("uid"), + flutter::EncodableValue(userInfo->uid().empty() ? std::string("") + : userInfo->uid())}, + {flutter::EncodableValue("providerId"), + flutter::EncodableValue(userInfo->provider_id())}, + {flutter::EncodableValue("isAnonymous"), + flutter::EncodableValue(false)}}); +} + +std::string FirebaseAuthPlugin::GetAuthErrorCode(AuthError authError) { + switch (authError) { + case firebase::auth::kAuthErrorInvalidCustomToken: + return "invalid-custom-token"; + case firebase::auth::kAuthErrorCustomTokenMismatch: + return "custom-token-mismatch"; + case firebase::auth::kAuthErrorInvalidEmail: + return "invalid-email"; + case firebase::auth::kAuthErrorInvalidCredential: + return "invalid-credential"; + case firebase::auth::kAuthErrorUserDisabled: + return "user-disabled"; + case firebase::auth::kAuthErrorEmailAlreadyInUse: + return "email-already-in-use"; + case firebase::auth::kAuthErrorWrongPassword: + return "wrong-password"; + case firebase::auth::kAuthErrorTooManyRequests: + return "too-many-requests"; + case firebase::auth::kAuthErrorAccountExistsWithDifferentCredentials: + return "account-exists-with-different-credentials"; + case firebase::auth::kAuthErrorRequiresRecentLogin: + return "requires-recent-login"; + case firebase::auth::kAuthErrorProviderAlreadyLinked: + return "provider-already-linked"; + case firebase::auth::kAuthErrorNoSuchProvider: + return "no-such-provider"; + case firebase::auth::kAuthErrorInvalidUserToken: + return "invalid-user-token"; + case firebase::auth::kAuthErrorUserTokenExpired: + return "user-token-expired"; + case firebase::auth::kAuthErrorUserNotFound: + return "user-not-found"; + case firebase::auth::kAuthErrorInvalidApiKey: + return "invalid-api-key"; + case firebase::auth::kAuthErrorCredentialAlreadyInUse: + return "credential-already-in-use"; + case firebase::auth::kAuthErrorOperationNotAllowed: + return "operation-not-allowed"; + case firebase::auth::kAuthErrorWeakPassword: + return "weak-password"; + case firebase::auth::kAuthErrorAppNotAuthorized: + return "app-not-authorized"; + case firebase::auth::kAuthErrorExpiredActionCode: + return "expired-action-code"; + case firebase::auth::kAuthErrorInvalidActionCode: + return "invalid-action-code"; + case firebase::auth::kAuthErrorInvalidMessagePayload: + return "invalid-message-payload"; + case firebase::auth::kAuthErrorInvalidSender: + return "invalid-sender"; + case firebase::auth::kAuthErrorInvalidRecipientEmail: + return "invalid-recipient-email"; + case firebase::auth::kAuthErrorUnauthorizedDomain: + return "unauthorized-domain"; + case firebase::auth::kAuthErrorInvalidContinueUri: + return "invalid-continue-uri"; + case firebase::auth::kAuthErrorMissingContinueUri: + return "missing-continue-uri"; + case firebase::auth::kAuthErrorMissingEmail: + return "missing-email"; + case firebase::auth::kAuthErrorMissingPhoneNumber: + return "missing-phone-number"; + case firebase::auth::kAuthErrorInvalidPhoneNumber: + return "invalid-phone-number"; + case firebase::auth::kAuthErrorMissingVerificationCode: + return "missing-verification-code"; + case firebase::auth::kAuthErrorInvalidVerificationCode: + return "invalid-verification-code"; + case firebase::auth::kAuthErrorMissingVerificationId: + return "missing-verification-id"; + case firebase::auth::kAuthErrorInvalidVerificationId: + return "invalid-verification-id"; + case firebase::auth::kAuthErrorSessionExpired: + return "session-expired"; + case firebase::auth::kAuthErrorQuotaExceeded: + return "quota-exceeded"; + case firebase::auth::kAuthErrorMissingAppCredential: + return "missing-app-credential"; + case firebase::auth::kAuthErrorInvalidAppCredential: + return "invalid-app-credential"; + case firebase::auth::kAuthErrorMissingClientIdentifier: + return "missing-client-identifier"; + case firebase::auth::kAuthErrorTenantIdMismatch: + return "tenant-id-mismatch"; + case firebase::auth::kAuthErrorUnsupportedTenantOperation: + return "unsupported-tenant-operation"; + case firebase::auth::kAuthErrorUserMismatch: + return "user-mismatch"; + case firebase::auth::kAuthErrorNetworkRequestFailed: + return "network-request-failed"; + case firebase::auth::kAuthErrorNoSignedInUser: + return "no-signed-in-user"; + case firebase::auth::kAuthErrorCancelled: + return "cancelled"; + + default: + return "unknown-error"; + } +} + +FlutterError FirebaseAuthPlugin::ParseError( + const firebase::FutureBase& completed_future) { + const AuthError errorCode = + static_cast(completed_future.error()); + + return FlutterError(FirebaseAuthPlugin::GetAuthErrorCode(errorCode), + completed_future.error_message()); +} + +std::string const kFLTFirebaseAuthChannelName = "firebase_auth_plugin"; + +class FlutterIdTokenListener : public firebase::auth::IdTokenListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnIdTokenChanged(Auth* auth) override { + // Generate your ID Token + firebase::auth::User user = auth->current_user(); + InternalUserDetails userDetails = + FirebaseAuthPlugin::ParseUserDetails(user); + + using flutter::EncodableList; + using flutter::EncodableMap; + using flutter::EncodableValue; + + if (event_sink_) { + if (user.is_valid()) { + EncodableList userDetailsList = EncodableList(); + userDetailsList.push_back(userDetails.user_info().ToEncodableList()); + userDetailsList.push_back(userDetails.provider_data()); + event_sink_->Success(EncodableValue( + EncodableMap{{EncodableValue("user"), userDetailsList}})); + } else { + event_sink_->Success(EncodableValue(EncodableMap{ + {EncodableValue("user"), EncodableValue(std::monostate{})}})); + } + } + } + + private: + std::unique_ptr> event_sink_; +}; + +class IdTokenStreamHandler + : public flutter::StreamHandler { + public: + IdTokenStreamHandler(Auth* auth) { + listener_ = nullptr; + auth_ = auth; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = new FlutterIdTokenListener(); + listener_->SetEventSink(std::move(events)); + auth_->AddIdTokenListener(listener_); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + auth_->RemoveIdTokenListener(listener_); + listener_->SetEventSink(nullptr); + listener_ = nullptr; + return nullptr; + } + + private: + FlutterIdTokenListener* listener_; + firebase::auth::Auth* auth_; +}; + +void FirebaseAuthPlugin::RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + std::string name = + kFLTFirebaseAuthChannelName + "/id-token/" + app.app_name(); + + auto id_token_handler = std::make_unique(firebaseAuth); + + flutter::EventChannel channel( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + + channel.SetStreamHandler(std::move(id_token_handler)); + + result(ErrorOr(std::string(name))); +} + +class FlutterAuthStateListener : public firebase::auth::AuthStateListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnAuthStateChanged(Auth* auth) override { + // Generate your ID Token + firebase::auth::User user = auth->current_user(); + InternalUserDetails userDetails = + FirebaseAuthPlugin::ParseUserDetails(user); + + using flutter::EncodableList; + using flutter::EncodableMap; + using flutter::EncodableValue; + + if (event_sink_) { + if (user.is_valid()) { + EncodableList userDetailsList = EncodableList(); + userDetailsList.push_back(userDetails.user_info().ToEncodableList()); + userDetailsList.push_back(userDetails.provider_data()); + + event_sink_->Success(EncodableValue( + EncodableMap{{EncodableValue("user"), userDetailsList}})); + } else { + event_sink_->Success(EncodableValue(EncodableMap{ + {EncodableValue("user"), EncodableValue(std::monostate{})}})); + } + } + } + + private: + std::unique_ptr> event_sink_; +}; + +class AuthStateStreamHandler + : public flutter::StreamHandler { + public: + AuthStateStreamHandler(Auth* auth) { + listener_ = nullptr; + auth_ = auth; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = new FlutterAuthStateListener(); + listener_->SetEventSink(std::move(events)); + + auth_->AddAuthStateListener(listener_); + + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + auth_->RemoveAuthStateListener(listener_); + + listener_->SetEventSink(nullptr); + listener_ = nullptr; + return nullptr; + } + + private: + FlutterAuthStateListener* listener_; + firebase::auth::Auth* auth_; +}; + +void FirebaseAuthPlugin::RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + std::string name = + kFLTFirebaseAuthChannelName + "/auth-state/" + app.app_name(); + + auto auth_state_handler = + std::make_unique(firebaseAuth); + + flutter::EventChannel channel( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + + channel.SetStreamHandler(std::move(auth_state_handler)); + + result(ErrorOr(std::string(name))); +} + +void FirebaseAuthPlugin::UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebaseAuth->UseEmulator(host, static_cast(port)); + result(std::nullopt); +} + +void FirebaseAuthPlugin::ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError("unimplemented", + "ApplyActionCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError("unimplemented", + "CheckActionCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "ConfirmPasswordReset is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future createUserFuture = + firebaseAuth->CreateUserWithEmailAndPassword(email.c_str(), + password.c_str()); + + createUserFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInAnonymously(); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +// Provider type keys. +std::string const kSignInMethodPassword = "password"; +std::string const kSignInMethodEmailLink = "emailLink"; +std::string const kSignInMethodFacebook = "facebook.com"; +std::string const kSignInMethodGoogle = "google.com"; +std::string const kSignInMethodTwitter = "twitter.com"; +std::string const kSignInMethodGithub = "github.com"; +std::string const kSignInMethodApple = "apple.com"; +std::string const kSignInMethodPhone = "phone"; +std::string const kSignInMethodOAuth = "oauth"; + +// Credential argument keys. +std::string const kArgumentCredential = "credential"; +std::string const kArgumentProviderId = "providerId"; +std::string const kArgumentProviderScope = "scopes"; +std::string const kArgumentProviderCustomParameters = "customParameters"; +std::string const kArgumentSignInMethod = "signInMethod"; +std::string const kArgumentSecret = "secret"; +std::string const kArgumentIdToken = "idToken"; +std::string const kArgumentAccessToken = "accessToken"; +std::string const kArgumentRawNonce = "rawNonce"; +std::string const kArgumentEmail = "email"; +std::string const kArgumentCode = "code"; +std::string const kArgumentNewEmail = "newEmail"; +std::string const kArgumentEmailLink = kSignInMethodEmailLink; +std::string const kArgumentToken = "token"; +std::string const kArgumentVerificationId = "verificationId"; +std::string const kArgumentSmsCode = "smsCode"; +std::string const kArgumentActionCodeSettings = "actionCodeSettings"; + +// Emulating NSDictionary +typedef std::unordered_map Dictionary; + +firebase::auth::Credential getCredentialFromArguments( + flutter::EncodableMap arguments, const AuthPigeonFirebaseApp& app) { + std::string signInMethod = + std::get(arguments[kArgumentSignInMethod]); + + // Password Auth + if (signInMethod == kSignInMethodPassword) { + std::string email = std::get(arguments[kArgumentEmail]); + std::string secret = std::get(arguments[kArgumentSecret]); + return firebase::auth::EmailAuthProvider::GetCredential(email.c_str(), + secret.c_str()); + } + + // Email Link Auth + if (signInMethod == kSignInMethodEmailLink) { + // Firebase C++ SDK doesn't have email link authentication as of my + // knowledge cutoff in September 2021 + std::cout << "Email link authentication is not supported in Firebase C++ " + "SDK as of September 2021.\n"; + return firebase::auth::Credential(); + } + + // Lambda function to extract an optional string from the arguments map. This + // allows us to pass nullptr if no value exists + auto getStringOpt = + [&](const std::string& key) -> std::optional { + auto it = arguments.find(key); + if (it != arguments.end() && + std::holds_alternative(it->second)) { + return std::get(it->second); + } + return std::nullopt; + }; + + std::optional idToken = getStringOpt(kArgumentIdToken); + std::optional accessToken = getStringOpt(kArgumentAccessToken); + + // Facebook Auth + if (signInMethod == kSignInMethodFacebook) { + return firebase::auth::FacebookAuthProvider::GetCredential( + accessToken.value().c_str()); + } + + // Google Auth + if (signInMethod == kSignInMethodGoogle) { + // Both accessToken and idToken arguments can be null. You can use one or + // the other + return firebase::auth::GoogleAuthProvider::GetCredential( + idToken ? idToken.value().c_str() : nullptr, + accessToken ? accessToken.value().c_str() : nullptr); + } + + // Twitter Auth + if (signInMethod == kSignInMethodTwitter) { + std::string secret = std::get(arguments[kArgumentSecret]); + return firebase::auth::TwitterAuthProvider::GetCredential( + idToken.value().c_str(), secret.c_str()); + } + + // GitHub Auth + if (signInMethod == kSignInMethodGithub) { + return firebase::auth::GitHubAuthProvider::GetCredential( + accessToken.value().c_str()); + } + + // OAuth + if (signInMethod == kSignInMethodOAuth) { + std::string providerId = + std::get(arguments[kArgumentProviderId]); + std::optional rawNonce = getStringOpt(kArgumentRawNonce); + // If rawNonce provided use corresponding credential builder + // e.g. AppleID auth through the webView + if (rawNonce) { + return firebase::auth::OAuthProvider::GetCredential( + providerId.c_str(), idToken.value().c_str(), rawNonce.value().c_str(), + accessToken ? accessToken.value().c_str() : nullptr); + } else { + return firebase::auth::OAuthProvider::GetCredential( + providerId.c_str(), idToken.value().c_str(), + accessToken.value().c_str()); + } + } + + // If no known auth method matched + printf( + "Support for an auth provider with identifier '%s' is not implemented.\n", + signInMethod.c_str()); + return firebase::auth::Credential(); +} + +void FirebaseAuthPlugin::SignInWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithCredential( + getCredentialFromArguments(input, app)); + + signInFuture.OnCompletion( + [result](const firebase::Future& completed_future) { + if (completed_future.error() == 0) { + // TODO: not the right return type from C++ SDK + InternalUserInfo credential = + ParseUserInfo(completed_future.result()); + InternalUserCredential userCredential = InternalUserCredential(); + InternalUserDetails user = + InternalUserDetails(credential, flutter::EncodableList()); + userCredential.set_user(user); + result(userCredential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithCustomToken(token.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithEmailAndPassword(email.c_str(), password.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "SignInWithEmailLink is not available on this platform yet.", nullptr)); +} + +std::vector TransformEncodableList( + const flutter::EncodableList& encodable_list) { + std::vector transformed_list; + + for (const auto& value : encodable_list) { + if (std::holds_alternative(value)) { + transformed_list.push_back(std::get(value)); + } + } + + return transformed_list; +} + +std::map TransformEncodableMap( + const flutter::EncodableMap& encodable_map) { + std::map transformed_map; + + for (const auto& pair : encodable_map) { + if (std::holds_alternative(pair.first) && + std::holds_alternative(pair.second)) { + transformed_map[std::get(pair.first)] = + std::get(pair.second); + } + } + + return transformed_map; +} + +firebase::auth::FederatedOAuthProvider getProviderFromArguments( + const InternalSignInProvider& sign_in_provider) { + firebase::auth::FederatedOAuthProviderData federatedOAuthProviderData = + firebase::auth::FederatedOAuthProviderData( + sign_in_provider.provider_id().c_str(), + TransformEncodableList(*sign_in_provider.scopes()), + TransformEncodableMap(*sign_in_provider.custom_parameters())); + firebase::auth::FederatedOAuthProvider federatedAuthProvider = + firebase::auth::FederatedOAuthProvider(federatedOAuthProviderData); + + return federatedAuthProvider; +} + +void FirebaseAuthPlugin::SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithProvider( + &getProviderFromArguments(sign_in_provider)); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebaseAuth->SignOut(); + + result(std::nullopt); +} + +flutter::EncodableList TransformStringList( + const std::vector& string_list) { + flutter::EncodableList encodable_list; + + for (const auto& value : string_list) { + encodable_list.push_back(value); + } + + return encodable_list; +} + +void FirebaseAuthPlugin::FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->FetchProvidersForEmail(email.c_str()); + + signInFuture.OnCompletion( + [result]( + const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(TransformStringList(completed_future.result()->providers)); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SendPasswordResetEmail(email.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "SendSignInLinkToEmail is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + if (language_code == nullptr) { + firebaseAuth->UseAppLanguage(); + result(firebaseAuth->language_code()); + return; + } + + firebaseAuth->set_language_code(language_code->c_str()); + + result(*language_code); +} + +void FirebaseAuthPlugin::SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) { + result(FlutterError("unimplemented", + "SetSettings is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "VerifyPasswordResetCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "VerifyPhoneNumber is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.Delete(); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.GetToken(force_refresh); + + future.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalIdTokenResult token_result; + std::string_view sv(*completed_future.result()); + token_result.set_token(sv); + result(token_result); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::LinkWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.LinkWithCredential(getCredentialFromArguments(input, app)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.LinkWithProvider(&getProviderFromArguments(sign_in_provider)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.Reauthenticate(getCredentialFromArguments(input, app)); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + // TODO: wrong return type + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.ReauthenticateWithProvider( + &getProviderFromArguments(sign_in_provider)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.Reload(); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.SendEmailVerification(); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::Unlink( + const AuthPigeonFirebaseApp& app, const std::string& provider_id, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.Unlink(provider_id.c_str()); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.SendEmailVerificationBeforeUpdatingEmail(new_email.c_str()); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.UpdatePassword(new_password.c_str()); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +firebase::auth::PhoneAuthCredential getPhoneCredentialFromArguments( + flutter::EncodableMap arguments, const AuthPigeonFirebaseApp& app) { + std::string signInMethod = + std::get(arguments[kArgumentSignInMethod]); + + if (signInMethod == kSignInMethodPhone) { + std::string verificationId = + std::get(arguments[kArgumentVerificationId]); + std::string smsCode = std::get(arguments[kArgumentSmsCode]); + + // TODO: we cannot construct a PhoneAuthCredential from the verificationId + return firebase::auth::PhoneAuthCredential::PhoneAuthCredential(); + } + // If no known auth method matched + printf( + "Support for an auth provider with identifier '%s' is not " + "implemented.\n", + signInMethod.c_str()); + throw; +} + +void FirebaseAuthPlugin::UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.UpdatePhoneNumberCredential( + getPhoneCredentialFromArguments(input, app)); + + future.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = + ParseUserDetails(*completed_future.result()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::auth::User::UserProfile userProfile; + + if (profile.display_name_changed()) { + userProfile.display_name = profile.display_name()->c_str(); + } + if (profile.photo_url_changed()) { + userProfile.photo_url = profile.photo_url()->c_str(); + } + + firebase::Future future = user.UpdateUserProfile(userProfile); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + if (action_code_settings != nullptr) { + printf( + "Firebase C++ SDK does not support using `ActionCodeSettings` for " + "`verifyBeforeUpdateEmail()` API currently"); + } + + firebase::Future future = + user.SendEmailVerificationBeforeUpdatingEmail(new_email.c_str()); + + future.OnCompletion( + [result, firebaseAuth](const firebase::Future& completed_future) { + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "RevokeTokenWithAuthorizationCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) { + result(FlutterError("unimplemented", + "RevokeAccessToken is not available on this platform.", + nullptr)); +} + +void FirebaseAuthPlugin::InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "InitializeRecaptchaConfig is not available on this platform yet.", + nullptr)); +} + +flutter::EncodableMap FirebaseAuthPlugin::GetPluginConstantsForFirebaseApp( + const firebase::App& app) { + flutter::EncodableMap constants; + + Auth* auth = Auth::GetAuth(const_cast(&app)); + firebase::auth::User user = auth->current_user(); + + if (user.is_valid()) { + InternalUserDetails userDetails = ParseUserDetails(user); + flutter::EncodableList userDetailsList; + userDetailsList.push_back( + flutter::EncodableValue(userDetails.user_info().ToEncodableList())); + userDetailsList.push_back( + flutter::EncodableValue(userDetails.provider_data())); + constants[flutter::EncodableValue("APP_CURRENT_USER")] = + flutter::EncodableValue(userDetailsList); + } + + std::string lang = auth->language_code(); + if (!lang.empty()) { + constants[flutter::EncodableValue("APP_LANGUAGE_CODE")] = + flutter::EncodableValue(lang); + } + + return constants; +} + +void FirebaseAuthPlugin::DidReinitializeFirebaseCore() { + // No-op for now. Could be used to reset cached auth instances. +} + +} // namespace firebase_auth_windows diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h new file mode 100644 index 00000000..575e201f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h @@ -0,0 +1,218 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ + +#include +#include + +#include + +#include "firebase/app.h" +#include "firebase/auth.h" +#include "firebase/auth/types.h" +#include "firebase/future.h" +#include "firebase_core/flutter_firebase_plugin.h" +#include "messages.g.h" + +using firebase::auth::AuthError; + +namespace firebase_auth_windows { + +class FirebaseAuthPlugin : public flutter::Plugin, + public FirebaseAuthHostApi, + public FirebaseAuthUserHostApi, + public FlutterFirebasePlugin { + public: + static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar); + + FirebaseAuthPlugin(); + + virtual ~FirebaseAuthPlugin(); + + // Disallow copy and assign. + FirebaseAuthPlugin(const FirebaseAuthPlugin&) = delete; + FirebaseAuthPlugin& operator=(const FirebaseAuthPlugin&) = delete; + + // Parser functions + static std::string GetAuthErrorCode(AuthError authError); + static FlutterError ParseError(const firebase::FutureBase& future); + + static InternalUserDetails ParseUserDetails(const firebase::auth::User user); + static InternalAdditionalUserInfo ParseAdditionalUserInfo( + const firebase::auth::AdditionalUserInfo user); + static flutter::EncodableMap ConvertToEncodableMap( + const std::map& originalMap); + static flutter::EncodableValue ConvertToEncodableValue( + const firebase::Variant& variant); + static InternalUserInfo ParseUserInfo(const firebase::auth::User* user); + static flutter::EncodableList ParseProviderData( + const firebase::auth::User* user); + static flutter::EncodableValue ParseUserInfoToMap( + firebase::auth::UserInfoInterface* userInfo); + + // FirebaseAuthHostApi methods. + virtual void RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) override; + virtual void ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) override; + virtual void CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) + override; + virtual void ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) override; + virtual void CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) + override; + virtual void SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) + override; + virtual void SignInWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) + override; + virtual void SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) + override; + virtual void SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) + override; + virtual void SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) + override; + virtual void SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + virtual void SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) override; + virtual void SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) override; + virtual void SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) override; + virtual void VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) override; + virtual void VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) override; + + // FirebaseAuthUserHostApi methods. + virtual void Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) + override; + virtual void LinkWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + virtual void Unlink(const AuthPigeonFirebaseApp& app, + const std::string& provider_id, + std::function reply)> + result) override; + virtual void UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) override; + virtual void UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) override; + virtual void UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) override; + virtual void UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) override; + virtual void VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + + virtual void RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) override; + + virtual void RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) override; + + virtual void InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + + // FlutterFirebasePlugin methods. + flutter::EncodableMap GetPluginConstantsForFirebaseApp( + const firebase::App& app) override; + void DidReinitializeFirebaseCore() override; + + private: + static flutter::BinaryMessenger* binaryMessenger; +}; + +} // namespace firebase_auth_windows + +#endif // FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp new file mode 100644 index 00000000..03d93038 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp @@ -0,0 +1,16 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_auth/firebase_auth_plugin_c_api.h" + +#include + +#include "firebase_auth_plugin.h" + +void FirebaseAuthPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + firebase_auth_windows::FirebaseAuthPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h new file mode 100644 index 00000000..1c73a633 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h @@ -0,0 +1,29 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void FirebaseAuthPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp new file mode 100644 index 00000000..ea2200e6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp @@ -0,0 +1,5562 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#undef _HAS_EXCEPTIONS + +#include "messages.g.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace firebase_auth_windows { +using ::flutter::BasicMessageChannel; +using ::flutter::CustomEncodableValue; +using ::flutter::EncodableList; +using ::flutter::EncodableMap; +using ::flutter::EncodableValue; + +FlutterError CreateConnectionError(const std::string channel_name) { + return FlutterError( + "channel-error", + "Unable to establish connection on channel: '" + channel_name + "'.", + EncodableValue("")); +} + +namespace { +template +bool PigeonInternalDeepEquals(const T& a, const T& b); + +bool PigeonInternalDeepEquals(const double& a, const double& b); + +template +bool PigeonInternalDeepEquals(const std::vector& a, const std::vector& b); + +template +bool PigeonInternalDeepEquals(const std::map& a, const std::map& b); + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b); + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b); + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b); + +template +bool PigeonInternalDeepEquals(const T& a, const T& b) { + return a == b; +} + +template +bool PigeonInternalDeepEquals(const std::vector& a, + const std::vector& b) { + if (a.size() != b.size()) { + return false; + } + for (size_t i = 0; i < a.size(); ++i) { + if (!PigeonInternalDeepEquals(a[i], b[i])) { + return false; + } + } + return true; +} + +template +bool PigeonInternalDeepEquals(const std::map& a, + const std::map& b) { + if (a.size() != b.size()) { + return false; + } + for (const auto& kv : a) { + bool found = false; + for (const auto& b_kv : b) { + if (PigeonInternalDeepEquals(kv.first, b_kv.first)) { + if (PigeonInternalDeepEquals(kv.second, b_kv.second)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; +} + +bool PigeonInternalDeepEquals(const double& a, const double& b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == b) || (std::isnan(a) && std::isnan(b)); +} + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b) { + if (!a && !b) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b) { + if (a.get() == b.get()) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b) { + if (a.index() != b.index()) { + return false; + } + if (const double* da = std::get_if(&a)) { + return PigeonInternalDeepEquals(*da, std::get(b)); + } else if (const ::flutter::EncodableList* la = + std::get_if<::flutter::EncodableList>(&a)) { + return PigeonInternalDeepEquals(*la, std::get<::flutter::EncodableList>(b)); + } else if (const ::flutter::EncodableMap* ma = + std::get_if<::flutter::EncodableMap>(&a)) { + return PigeonInternalDeepEquals(*ma, std::get<::flutter::EncodableMap>(b)); + } + return a == b; +} + +template +size_t PigeonInternalDeepHash(const T& v); + +size_t PigeonInternalDeepHash(const double& v); + +template +size_t PigeonInternalDeepHash(const std::vector& v); + +template +size_t PigeonInternalDeepHash(const std::map& v); + +template +size_t PigeonInternalDeepHash(const std::optional& v); + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v); + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v); + +template +size_t PigeonInternalDeepHash(const T& v) { + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::vector& v) { + size_t result = 1; + for (const auto& item : v) { + result = result * 31 + PigeonInternalDeepHash(item); + } + return result; +} + +template +size_t PigeonInternalDeepHash(const std::map& v) { + size_t result = 0; + for (const auto& kv : v) { + result += ((PigeonInternalDeepHash(kv.first) * 31) ^ + PigeonInternalDeepHash(kv.second)); + } + return result; +} + +size_t PigeonInternalDeepHash(const double& v) { + if (std::isnan(v)) { + // Normalize NaN to a consistent hash. + return std::hash()(std::numeric_limits::quiet_NaN()); + } + if (v == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return std::hash()(0.0); + } + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::optional& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v) { + size_t result = v.index(); + if (const double* dv = std::get_if(&v)) { + result = result * 31 + PigeonInternalDeepHash(*dv); + } else if (const ::flutter::EncodableList* lv = + std::get_if<::flutter::EncodableList>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*lv); + } else if (const ::flutter::EncodableMap* mv = + std::get_if<::flutter::EncodableMap>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*mv); + } else { + std::visit( + [&result](const auto& val) { + using T = std::decay_t; + if constexpr (!std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v) { + result = result * 31 + PigeonInternalDeepHash(val); + } + }, + v); + } + return result; +} + +} // namespace +// InternalMultiFactorSession + +InternalMultiFactorSession::InternalMultiFactorSession(const std::string& id) + : id_(id) {} + +const std::string& InternalMultiFactorSession::id() const { return id_; } + +void InternalMultiFactorSession::set_id(std::string_view value_arg) { + id_ = value_arg; +} + +EncodableList InternalMultiFactorSession::ToEncodableList() const { + EncodableList list; + list.reserve(1); + list.push_back(EncodableValue(id_)); + return list; +} + +InternalMultiFactorSession InternalMultiFactorSession::FromEncodableList( + const EncodableList& list) { + InternalMultiFactorSession decoded(std::get(list[0])); + return decoded; +} + +bool InternalMultiFactorSession::operator==( + const InternalMultiFactorSession& other) const { + return PigeonInternalDeepEquals(id_, other.id_); +} + +bool InternalMultiFactorSession::operator!=( + const InternalMultiFactorSession& other) const { + return !(*this == other); +} + +size_t InternalMultiFactorSession::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(id_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalMultiFactorSession& v) { + return v.Hash(); +} + +// InternalPhoneMultiFactorAssertion + +InternalPhoneMultiFactorAssertion::InternalPhoneMultiFactorAssertion( + const std::string& verification_id, const std::string& verification_code) + : verification_id_(verification_id), + verification_code_(verification_code) {} + +const std::string& InternalPhoneMultiFactorAssertion::verification_id() const { + return verification_id_; +} + +void InternalPhoneMultiFactorAssertion::set_verification_id( + std::string_view value_arg) { + verification_id_ = value_arg; +} + +const std::string& InternalPhoneMultiFactorAssertion::verification_code() + const { + return verification_code_; +} + +void InternalPhoneMultiFactorAssertion::set_verification_code( + std::string_view value_arg) { + verification_code_ = value_arg; +} + +EncodableList InternalPhoneMultiFactorAssertion::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(EncodableValue(verification_id_)); + list.push_back(EncodableValue(verification_code_)); + return list; +} + +InternalPhoneMultiFactorAssertion +InternalPhoneMultiFactorAssertion::FromEncodableList( + const EncodableList& list) { + InternalPhoneMultiFactorAssertion decoded(std::get(list[0]), + std::get(list[1])); + return decoded; +} + +bool InternalPhoneMultiFactorAssertion::operator==( + const InternalPhoneMultiFactorAssertion& other) const { + return PigeonInternalDeepEquals(verification_id_, other.verification_id_) && + PigeonInternalDeepEquals(verification_code_, other.verification_code_); +} + +bool InternalPhoneMultiFactorAssertion::operator!=( + const InternalPhoneMultiFactorAssertion& other) const { + return !(*this == other); +} + +size_t InternalPhoneMultiFactorAssertion::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(verification_id_); + result = result * 31 + PigeonInternalDeepHash(verification_code_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalPhoneMultiFactorAssertion& v) { + return v.Hash(); +} + +// InternalMultiFactorInfo + +InternalMultiFactorInfo::InternalMultiFactorInfo(double enrollment_timestamp, + const std::string& uid) + : enrollment_timestamp_(enrollment_timestamp), uid_(uid) {} + +InternalMultiFactorInfo::InternalMultiFactorInfo( + const std::string* display_name, double enrollment_timestamp, + const std::string* factor_id, const std::string& uid, + const std::string* phone_number) + : display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + enrollment_timestamp_(enrollment_timestamp), + factor_id_(factor_id ? std::optional(*factor_id) + : std::nullopt), + uid_(uid), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt) {} + +const std::string* InternalMultiFactorInfo::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalMultiFactorInfo::set_display_name( + const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +double InternalMultiFactorInfo::enrollment_timestamp() const { + return enrollment_timestamp_; +} + +void InternalMultiFactorInfo::set_enrollment_timestamp(double value_arg) { + enrollment_timestamp_ = value_arg; +} + +const std::string* InternalMultiFactorInfo::factor_id() const { + return factor_id_ ? &(*factor_id_) : nullptr; +} + +void InternalMultiFactorInfo::set_factor_id(const std::string_view* value_arg) { + factor_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_factor_id(std::string_view value_arg) { + factor_id_ = value_arg; +} + +const std::string& InternalMultiFactorInfo::uid() const { return uid_; } + +void InternalMultiFactorInfo::set_uid(std::string_view value_arg) { + uid_ = value_arg; +} + +const std::string* InternalMultiFactorInfo::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalMultiFactorInfo::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_phone_number(std::string_view value_arg) { + phone_number_ = value_arg; +} + +EncodableList InternalMultiFactorInfo::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(EncodableValue(enrollment_timestamp_)); + list.push_back(factor_id_ ? EncodableValue(*factor_id_) : EncodableValue()); + list.push_back(EncodableValue(uid_)); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + return list; +} + +InternalMultiFactorInfo InternalMultiFactorInfo::FromEncodableList( + const EncodableList& list) { + InternalMultiFactorInfo decoded(std::get(list[1]), + std::get(list[3])); + auto& encodable_display_name = list[0]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_factor_id = list[2]; + if (!encodable_factor_id.IsNull()) { + decoded.set_factor_id(std::get(encodable_factor_id)); + } + auto& encodable_phone_number = list[4]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + return decoded; +} + +bool InternalMultiFactorInfo::operator==( + const InternalMultiFactorInfo& other) const { + return PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(enrollment_timestamp_, + other.enrollment_timestamp_) && + PigeonInternalDeepEquals(factor_id_, other.factor_id_) && + PigeonInternalDeepEquals(uid_, other.uid_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_); +} + +bool InternalMultiFactorInfo::operator!=( + const InternalMultiFactorInfo& other) const { + return !(*this == other); +} + +size_t InternalMultiFactorInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(enrollment_timestamp_); + result = result * 31 + PigeonInternalDeepHash(factor_id_); + result = result * 31 + PigeonInternalDeepHash(uid_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalMultiFactorInfo& v) { + return v.Hash(); +} + +// AuthPigeonFirebaseApp + +AuthPigeonFirebaseApp::AuthPigeonFirebaseApp(const std::string& app_name) + : app_name_(app_name) {} + +AuthPigeonFirebaseApp::AuthPigeonFirebaseApp( + const std::string& app_name, const std::string* tenant_id, + const std::string* custom_auth_domain) + : app_name_(app_name), + tenant_id_(tenant_id ? std::optional(*tenant_id) + : std::nullopt), + custom_auth_domain_(custom_auth_domain + ? std::optional(*custom_auth_domain) + : std::nullopt) {} + +const std::string& AuthPigeonFirebaseApp::app_name() const { return app_name_; } + +void AuthPigeonFirebaseApp::set_app_name(std::string_view value_arg) { + app_name_ = value_arg; +} + +const std::string* AuthPigeonFirebaseApp::tenant_id() const { + return tenant_id_ ? &(*tenant_id_) : nullptr; +} + +void AuthPigeonFirebaseApp::set_tenant_id(const std::string_view* value_arg) { + tenant_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void AuthPigeonFirebaseApp::set_tenant_id(std::string_view value_arg) { + tenant_id_ = value_arg; +} + +const std::string* AuthPigeonFirebaseApp::custom_auth_domain() const { + return custom_auth_domain_ ? &(*custom_auth_domain_) : nullptr; +} + +void AuthPigeonFirebaseApp::set_custom_auth_domain( + const std::string_view* value_arg) { + custom_auth_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void AuthPigeonFirebaseApp::set_custom_auth_domain(std::string_view value_arg) { + custom_auth_domain_ = value_arg; +} + +EncodableList AuthPigeonFirebaseApp::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(app_name_)); + list.push_back(tenant_id_ ? EncodableValue(*tenant_id_) : EncodableValue()); + list.push_back(custom_auth_domain_ ? EncodableValue(*custom_auth_domain_) + : EncodableValue()); + return list; +} + +AuthPigeonFirebaseApp AuthPigeonFirebaseApp::FromEncodableList( + const EncodableList& list) { + AuthPigeonFirebaseApp decoded(std::get(list[0])); + auto& encodable_tenant_id = list[1]; + if (!encodable_tenant_id.IsNull()) { + decoded.set_tenant_id(std::get(encodable_tenant_id)); + } + auto& encodable_custom_auth_domain = list[2]; + if (!encodable_custom_auth_domain.IsNull()) { + decoded.set_custom_auth_domain( + std::get(encodable_custom_auth_domain)); + } + return decoded; +} + +bool AuthPigeonFirebaseApp::operator==( + const AuthPigeonFirebaseApp& other) const { + return PigeonInternalDeepEquals(app_name_, other.app_name_) && + PigeonInternalDeepEquals(tenant_id_, other.tenant_id_) && + PigeonInternalDeepEquals(custom_auth_domain_, + other.custom_auth_domain_); +} + +bool AuthPigeonFirebaseApp::operator!=( + const AuthPigeonFirebaseApp& other) const { + return !(*this == other); +} + +size_t AuthPigeonFirebaseApp::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(app_name_); + result = result * 31 + PigeonInternalDeepHash(tenant_id_); + result = result * 31 + PigeonInternalDeepHash(custom_auth_domain_); + return result; +} + +size_t PigeonInternalDeepHash(const AuthPigeonFirebaseApp& v) { + return v.Hash(); +} + +// InternalActionCodeInfoData + +InternalActionCodeInfoData::InternalActionCodeInfoData() {} + +InternalActionCodeInfoData::InternalActionCodeInfoData( + const std::string* email, const std::string* previous_email) + : email_(email ? std::optional(*email) : std::nullopt), + previous_email_(previous_email + ? std::optional(*previous_email) + : std::nullopt) {} + +const std::string* InternalActionCodeInfoData::email() const { + return email_ ? &(*email_) : nullptr; +} + +void InternalActionCodeInfoData::set_email(const std::string_view* value_arg) { + email_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeInfoData::set_email(std::string_view value_arg) { + email_ = value_arg; +} + +const std::string* InternalActionCodeInfoData::previous_email() const { + return previous_email_ ? &(*previous_email_) : nullptr; +} + +void InternalActionCodeInfoData::set_previous_email( + const std::string_view* value_arg) { + previous_email_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeInfoData::set_previous_email( + std::string_view value_arg) { + previous_email_ = value_arg; +} + +EncodableList InternalActionCodeInfoData::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(email_ ? EncodableValue(*email_) : EncodableValue()); + list.push_back(previous_email_ ? EncodableValue(*previous_email_) + : EncodableValue()); + return list; +} + +InternalActionCodeInfoData InternalActionCodeInfoData::FromEncodableList( + const EncodableList& list) { + InternalActionCodeInfoData decoded; + auto& encodable_email = list[0]; + if (!encodable_email.IsNull()) { + decoded.set_email(std::get(encodable_email)); + } + auto& encodable_previous_email = list[1]; + if (!encodable_previous_email.IsNull()) { + decoded.set_previous_email(std::get(encodable_previous_email)); + } + return decoded; +} + +bool InternalActionCodeInfoData::operator==( + const InternalActionCodeInfoData& other) const { + return PigeonInternalDeepEquals(email_, other.email_) && + PigeonInternalDeepEquals(previous_email_, other.previous_email_); +} + +bool InternalActionCodeInfoData::operator!=( + const InternalActionCodeInfoData& other) const { + return !(*this == other); +} + +size_t InternalActionCodeInfoData::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(email_); + result = result * 31 + PigeonInternalDeepHash(previous_email_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeInfoData& v) { + return v.Hash(); +} + +// InternalActionCodeInfo + +InternalActionCodeInfo::InternalActionCodeInfo( + const ActionCodeInfoOperation& operation, + const InternalActionCodeInfoData& data) + : operation_(operation), + data_(std::make_unique(data)) {} + +InternalActionCodeInfo::InternalActionCodeInfo( + const InternalActionCodeInfo& other) + : operation_(other.operation_), + data_(std::make_unique(*other.data_)) {} + +InternalActionCodeInfo& InternalActionCodeInfo::operator=( + const InternalActionCodeInfo& other) { + operation_ = other.operation_; + data_ = std::make_unique(*other.data_); + return *this; +} + +const ActionCodeInfoOperation& InternalActionCodeInfo::operation() const { + return operation_; +} + +void InternalActionCodeInfo::set_operation( + const ActionCodeInfoOperation& value_arg) { + operation_ = value_arg; +} + +const InternalActionCodeInfoData& InternalActionCodeInfo::data() const { + return *data_; +} + +void InternalActionCodeInfo::set_data( + const InternalActionCodeInfoData& value_arg) { + data_ = std::make_unique(value_arg); +} + +EncodableList InternalActionCodeInfo::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(CustomEncodableValue(operation_)); + list.push_back(CustomEncodableValue(*data_)); + return list; +} + +InternalActionCodeInfo InternalActionCodeInfo::FromEncodableList( + const EncodableList& list) { + InternalActionCodeInfo decoded( + std::any_cast( + std::get(list[0])), + std::any_cast( + std::get(list[1]))); + return decoded; +} + +bool InternalActionCodeInfo::operator==( + const InternalActionCodeInfo& other) const { + return PigeonInternalDeepEquals(operation_, other.operation_) && + PigeonInternalDeepEquals(data_, other.data_); +} + +bool InternalActionCodeInfo::operator!=( + const InternalActionCodeInfo& other) const { + return !(*this == other); +} + +size_t InternalActionCodeInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(operation_); + result = result * 31 + PigeonInternalDeepHash(data_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeInfo& v) { + return v.Hash(); +} + +// InternalAdditionalUserInfo + +InternalAdditionalUserInfo::InternalAdditionalUserInfo(bool is_new_user) + : is_new_user_(is_new_user) {} + +InternalAdditionalUserInfo::InternalAdditionalUserInfo( + bool is_new_user, const std::string* provider_id, + const std::string* username, const std::string* authorization_code, + const EncodableMap* profile) + : is_new_user_(is_new_user), + provider_id_(provider_id ? std::optional(*provider_id) + : std::nullopt), + username_(username ? std::optional(*username) + : std::nullopt), + authorization_code_(authorization_code + ? std::optional(*authorization_code) + : std::nullopt), + profile_(profile ? std::optional(*profile) : std::nullopt) { +} + +bool InternalAdditionalUserInfo::is_new_user() const { return is_new_user_; } + +void InternalAdditionalUserInfo::set_is_new_user(bool value_arg) { + is_new_user_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::provider_id() const { + return provider_id_ ? &(*provider_id_) : nullptr; +} + +void InternalAdditionalUserInfo::set_provider_id( + const std::string_view* value_arg) { + provider_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::username() const { + return username_ ? &(*username_) : nullptr; +} + +void InternalAdditionalUserInfo::set_username( + const std::string_view* value_arg) { + username_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_username(std::string_view value_arg) { + username_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::authorization_code() const { + return authorization_code_ ? &(*authorization_code_) : nullptr; +} + +void InternalAdditionalUserInfo::set_authorization_code( + const std::string_view* value_arg) { + authorization_code_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_authorization_code( + std::string_view value_arg) { + authorization_code_ = value_arg; +} + +const EncodableMap* InternalAdditionalUserInfo::profile() const { + return profile_ ? &(*profile_) : nullptr; +} + +void InternalAdditionalUserInfo::set_profile(const EncodableMap* value_arg) { + profile_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_profile(const EncodableMap& value_arg) { + profile_ = value_arg; +} + +EncodableList InternalAdditionalUserInfo::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(EncodableValue(is_new_user_)); + list.push_back(provider_id_ ? EncodableValue(*provider_id_) + : EncodableValue()); + list.push_back(username_ ? EncodableValue(*username_) : EncodableValue()); + list.push_back(authorization_code_ ? EncodableValue(*authorization_code_) + : EncodableValue()); + list.push_back(profile_ ? EncodableValue(*profile_) : EncodableValue()); + return list; +} + +InternalAdditionalUserInfo InternalAdditionalUserInfo::FromEncodableList( + const EncodableList& list) { + InternalAdditionalUserInfo decoded(std::get(list[0])); + auto& encodable_provider_id = list[1]; + if (!encodable_provider_id.IsNull()) { + decoded.set_provider_id(std::get(encodable_provider_id)); + } + auto& encodable_username = list[2]; + if (!encodable_username.IsNull()) { + decoded.set_username(std::get(encodable_username)); + } + auto& encodable_authorization_code = list[3]; + if (!encodable_authorization_code.IsNull()) { + decoded.set_authorization_code( + std::get(encodable_authorization_code)); + } + auto& encodable_profile = list[4]; + if (!encodable_profile.IsNull()) { + decoded.set_profile(std::get(encodable_profile)); + } + return decoded; +} + +bool InternalAdditionalUserInfo::operator==( + const InternalAdditionalUserInfo& other) const { + return PigeonInternalDeepEquals(is_new_user_, other.is_new_user_) && + PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(username_, other.username_) && + PigeonInternalDeepEquals(authorization_code_, + other.authorization_code_) && + PigeonInternalDeepEquals(profile_, other.profile_); +} + +bool InternalAdditionalUserInfo::operator!=( + const InternalAdditionalUserInfo& other) const { + return !(*this == other); +} + +size_t InternalAdditionalUserInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(is_new_user_); + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(username_); + result = result * 31 + PigeonInternalDeepHash(authorization_code_); + result = result * 31 + PigeonInternalDeepHash(profile_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAdditionalUserInfo& v) { + return v.Hash(); +} + +// InternalAuthCredential + +InternalAuthCredential::InternalAuthCredential( + const std::string& provider_id, const std::string& sign_in_method, + int64_t native_id) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + native_id_(native_id) {} + +InternalAuthCredential::InternalAuthCredential( + const std::string& provider_id, const std::string& sign_in_method, + int64_t native_id, const std::string* access_token) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + native_id_(native_id), + access_token_(access_token ? std::optional(*access_token) + : std::nullopt) {} + +const std::string& InternalAuthCredential::provider_id() const { + return provider_id_; +} + +void InternalAuthCredential::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string& InternalAuthCredential::sign_in_method() const { + return sign_in_method_; +} + +void InternalAuthCredential::set_sign_in_method(std::string_view value_arg) { + sign_in_method_ = value_arg; +} + +int64_t InternalAuthCredential::native_id() const { return native_id_; } + +void InternalAuthCredential::set_native_id(int64_t value_arg) { + native_id_ = value_arg; +} + +const std::string* InternalAuthCredential::access_token() const { + return access_token_ ? &(*access_token_) : nullptr; +} + +void InternalAuthCredential::set_access_token( + const std::string_view* value_arg) { + access_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredential::set_access_token(std::string_view value_arg) { + access_token_ = value_arg; +} + +EncodableList InternalAuthCredential::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(EncodableValue(provider_id_)); + list.push_back(EncodableValue(sign_in_method_)); + list.push_back(EncodableValue(native_id_)); + list.push_back(access_token_ ? EncodableValue(*access_token_) + : EncodableValue()); + return list; +} + +InternalAuthCredential InternalAuthCredential::FromEncodableList( + const EncodableList& list) { + InternalAuthCredential decoded(std::get(list[0]), + std::get(list[1]), + std::get(list[2])); + auto& encodable_access_token = list[3]; + if (!encodable_access_token.IsNull()) { + decoded.set_access_token(std::get(encodable_access_token)); + } + return decoded; +} + +bool InternalAuthCredential::operator==( + const InternalAuthCredential& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(sign_in_method_, other.sign_in_method_) && + PigeonInternalDeepEquals(native_id_, other.native_id_) && + PigeonInternalDeepEquals(access_token_, other.access_token_); +} + +bool InternalAuthCredential::operator!=( + const InternalAuthCredential& other) const { + return !(*this == other); +} + +size_t InternalAuthCredential::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(sign_in_method_); + result = result * 31 + PigeonInternalDeepHash(native_id_); + result = result * 31 + PigeonInternalDeepHash(access_token_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAuthCredential& v) { + return v.Hash(); +} + +// InternalUserInfo + +InternalUserInfo::InternalUserInfo(const std::string& uid, bool is_anonymous, + bool is_email_verified) + : uid_(uid), + is_anonymous_(is_anonymous), + is_email_verified_(is_email_verified) {} + +InternalUserInfo::InternalUserInfo( + const std::string& uid, const std::string* email, + const std::string* display_name, const std::string* photo_url, + const std::string* phone_number, bool is_anonymous, bool is_email_verified, + const std::string* provider_id, const std::string* tenant_id, + const std::string* refresh_token, const int64_t* creation_timestamp, + const int64_t* last_sign_in_timestamp) + : uid_(uid), + email_(email ? std::optional(*email) : std::nullopt), + display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + photo_url_(photo_url ? std::optional(*photo_url) + : std::nullopt), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + is_anonymous_(is_anonymous), + is_email_verified_(is_email_verified), + provider_id_(provider_id ? std::optional(*provider_id) + : std::nullopt), + tenant_id_(tenant_id ? std::optional(*tenant_id) + : std::nullopt), + refresh_token_(refresh_token ? std::optional(*refresh_token) + : std::nullopt), + creation_timestamp_(creation_timestamp + ? std::optional(*creation_timestamp) + : std::nullopt), + last_sign_in_timestamp_( + last_sign_in_timestamp + ? std::optional(*last_sign_in_timestamp) + : std::nullopt) {} + +const std::string& InternalUserInfo::uid() const { return uid_; } + +void InternalUserInfo::set_uid(std::string_view value_arg) { uid_ = value_arg; } + +const std::string* InternalUserInfo::email() const { + return email_ ? &(*email_) : nullptr; +} + +void InternalUserInfo::set_email(const std::string_view* value_arg) { + email_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_email(std::string_view value_arg) { + email_ = value_arg; +} + +const std::string* InternalUserInfo::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalUserInfo::set_display_name(const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +const std::string* InternalUserInfo::photo_url() const { + return photo_url_ ? &(*photo_url_) : nullptr; +} + +void InternalUserInfo::set_photo_url(const std::string_view* value_arg) { + photo_url_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_photo_url(std::string_view value_arg) { + photo_url_ = value_arg; +} + +const std::string* InternalUserInfo::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalUserInfo::set_phone_number(const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_phone_number(std::string_view value_arg) { + phone_number_ = value_arg; +} + +bool InternalUserInfo::is_anonymous() const { return is_anonymous_; } + +void InternalUserInfo::set_is_anonymous(bool value_arg) { + is_anonymous_ = value_arg; +} + +bool InternalUserInfo::is_email_verified() const { return is_email_verified_; } + +void InternalUserInfo::set_is_email_verified(bool value_arg) { + is_email_verified_ = value_arg; +} + +const std::string* InternalUserInfo::provider_id() const { + return provider_id_ ? &(*provider_id_) : nullptr; +} + +void InternalUserInfo::set_provider_id(const std::string_view* value_arg) { + provider_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string* InternalUserInfo::tenant_id() const { + return tenant_id_ ? &(*tenant_id_) : nullptr; +} + +void InternalUserInfo::set_tenant_id(const std::string_view* value_arg) { + tenant_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_tenant_id(std::string_view value_arg) { + tenant_id_ = value_arg; +} + +const std::string* InternalUserInfo::refresh_token() const { + return refresh_token_ ? &(*refresh_token_) : nullptr; +} + +void InternalUserInfo::set_refresh_token(const std::string_view* value_arg) { + refresh_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_refresh_token(std::string_view value_arg) { + refresh_token_ = value_arg; +} + +const int64_t* InternalUserInfo::creation_timestamp() const { + return creation_timestamp_ ? &(*creation_timestamp_) : nullptr; +} + +void InternalUserInfo::set_creation_timestamp(const int64_t* value_arg) { + creation_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_creation_timestamp(int64_t value_arg) { + creation_timestamp_ = value_arg; +} + +const int64_t* InternalUserInfo::last_sign_in_timestamp() const { + return last_sign_in_timestamp_ ? &(*last_sign_in_timestamp_) : nullptr; +} + +void InternalUserInfo::set_last_sign_in_timestamp(const int64_t* value_arg) { + last_sign_in_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_last_sign_in_timestamp(int64_t value_arg) { + last_sign_in_timestamp_ = value_arg; +} + +EncodableList InternalUserInfo::ToEncodableList() const { + EncodableList list; + list.reserve(12); + list.push_back(EncodableValue(uid_)); + list.push_back(email_ ? EncodableValue(*email_) : EncodableValue()); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(photo_url_ ? EncodableValue(*photo_url_) : EncodableValue()); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(EncodableValue(is_anonymous_)); + list.push_back(EncodableValue(is_email_verified_)); + list.push_back(provider_id_ ? EncodableValue(*provider_id_) + : EncodableValue()); + list.push_back(tenant_id_ ? EncodableValue(*tenant_id_) : EncodableValue()); + list.push_back(refresh_token_ ? EncodableValue(*refresh_token_) + : EncodableValue()); + list.push_back(creation_timestamp_ ? EncodableValue(*creation_timestamp_) + : EncodableValue()); + list.push_back(last_sign_in_timestamp_ + ? EncodableValue(*last_sign_in_timestamp_) + : EncodableValue()); + return list; +} + +InternalUserInfo InternalUserInfo::FromEncodableList( + const EncodableList& list) { + InternalUserInfo decoded(std::get(list[0]), + std::get(list[5]), std::get(list[6])); + auto& encodable_email = list[1]; + if (!encodable_email.IsNull()) { + decoded.set_email(std::get(encodable_email)); + } + auto& encodable_display_name = list[2]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_photo_url = list[3]; + if (!encodable_photo_url.IsNull()) { + decoded.set_photo_url(std::get(encodable_photo_url)); + } + auto& encodable_phone_number = list[4]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_provider_id = list[7]; + if (!encodable_provider_id.IsNull()) { + decoded.set_provider_id(std::get(encodable_provider_id)); + } + auto& encodable_tenant_id = list[8]; + if (!encodable_tenant_id.IsNull()) { + decoded.set_tenant_id(std::get(encodable_tenant_id)); + } + auto& encodable_refresh_token = list[9]; + if (!encodable_refresh_token.IsNull()) { + decoded.set_refresh_token(std::get(encodable_refresh_token)); + } + auto& encodable_creation_timestamp = list[10]; + if (!encodable_creation_timestamp.IsNull()) { + decoded.set_creation_timestamp( + std::get(encodable_creation_timestamp)); + } + auto& encodable_last_sign_in_timestamp = list[11]; + if (!encodable_last_sign_in_timestamp.IsNull()) { + decoded.set_last_sign_in_timestamp( + std::get(encodable_last_sign_in_timestamp)); + } + return decoded; +} + +bool InternalUserInfo::operator==(const InternalUserInfo& other) const { + return PigeonInternalDeepEquals(uid_, other.uid_) && + PigeonInternalDeepEquals(email_, other.email_) && + PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(photo_url_, other.photo_url_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(is_anonymous_, other.is_anonymous_) && + PigeonInternalDeepEquals(is_email_verified_, + other.is_email_verified_) && + PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(tenant_id_, other.tenant_id_) && + PigeonInternalDeepEquals(refresh_token_, other.refresh_token_) && + PigeonInternalDeepEquals(creation_timestamp_, + other.creation_timestamp_) && + PigeonInternalDeepEquals(last_sign_in_timestamp_, + other.last_sign_in_timestamp_); +} + +bool InternalUserInfo::operator!=(const InternalUserInfo& other) const { + return !(*this == other); +} + +size_t InternalUserInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(uid_); + result = result * 31 + PigeonInternalDeepHash(email_); + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(photo_url_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(is_anonymous_); + result = result * 31 + PigeonInternalDeepHash(is_email_verified_); + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(tenant_id_); + result = result * 31 + PigeonInternalDeepHash(refresh_token_); + result = result * 31 + PigeonInternalDeepHash(creation_timestamp_); + result = result * 31 + PigeonInternalDeepHash(last_sign_in_timestamp_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserInfo& v) { return v.Hash(); } + +// InternalUserDetails + +InternalUserDetails::InternalUserDetails(const InternalUserInfo& user_info, + const EncodableList& provider_data) + : user_info_(std::make_unique(user_info)), + provider_data_(provider_data) {} + +InternalUserDetails::InternalUserDetails(const InternalUserDetails& other) + : user_info_(std::make_unique(*other.user_info_)), + provider_data_(other.provider_data_) {} + +InternalUserDetails& InternalUserDetails::operator=( + const InternalUserDetails& other) { + user_info_ = std::make_unique(*other.user_info_); + provider_data_ = other.provider_data_; + return *this; +} + +const InternalUserInfo& InternalUserDetails::user_info() const { + return *user_info_; +} + +void InternalUserDetails::set_user_info(const InternalUserInfo& value_arg) { + user_info_ = std::make_unique(value_arg); +} + +const EncodableList& InternalUserDetails::provider_data() const { + return provider_data_; +} + +void InternalUserDetails::set_provider_data(const EncodableList& value_arg) { + provider_data_ = value_arg; +} + +EncodableList InternalUserDetails::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(CustomEncodableValue(*user_info_)); + list.push_back(EncodableValue(provider_data_)); + return list; +} + +InternalUserDetails InternalUserDetails::FromEncodableList( + const EncodableList& list) { + InternalUserDetails decoded(std::any_cast( + std::get(list[0])), + std::get(list[1])); + return decoded; +} + +bool InternalUserDetails::operator==(const InternalUserDetails& other) const { + return PigeonInternalDeepEquals(user_info_, other.user_info_) && + PigeonInternalDeepEquals(provider_data_, other.provider_data_); +} + +bool InternalUserDetails::operator!=(const InternalUserDetails& other) const { + return !(*this == other); +} + +size_t InternalUserDetails::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(user_info_); + result = result * 31 + PigeonInternalDeepHash(provider_data_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserDetails& v) { return v.Hash(); } + +// InternalUserCredential + +InternalUserCredential::InternalUserCredential() {} + +InternalUserCredential::InternalUserCredential( + const InternalUserDetails* user, + const InternalAdditionalUserInfo* additional_user_info, + const InternalAuthCredential* credential) + : user_(user ? std::make_unique(*user) : nullptr), + additional_user_info_(additional_user_info + ? std::make_unique( + *additional_user_info) + : nullptr), + credential_(credential + ? std::make_unique(*credential) + : nullptr) {} + +InternalUserCredential::InternalUserCredential( + const InternalUserCredential& other) + : user_(other.user_ ? std::make_unique(*other.user_) + : nullptr), + additional_user_info_(other.additional_user_info_ + ? std::make_unique( + *other.additional_user_info_) + : nullptr), + credential_(other.credential_ ? std::make_unique( + *other.credential_) + : nullptr) {} + +InternalUserCredential& InternalUserCredential::operator=( + const InternalUserCredential& other) { + user_ = other.user_ ? std::make_unique(*other.user_) + : nullptr; + additional_user_info_ = other.additional_user_info_ + ? std::make_unique( + *other.additional_user_info_) + : nullptr; + credential_ = + other.credential_ + ? std::make_unique(*other.credential_) + : nullptr; + return *this; +} + +const InternalUserDetails* InternalUserCredential::user() const { + return user_.get(); +} + +void InternalUserCredential::set_user(const InternalUserDetails* value_arg) { + user_ = + value_arg ? std::make_unique(*value_arg) : nullptr; +} + +void InternalUserCredential::set_user(const InternalUserDetails& value_arg) { + user_ = std::make_unique(value_arg); +} + +const InternalAdditionalUserInfo* InternalUserCredential::additional_user_info() + const { + return additional_user_info_.get(); +} + +void InternalUserCredential::set_additional_user_info( + const InternalAdditionalUserInfo* value_arg) { + additional_user_info_ = + value_arg ? std::make_unique(*value_arg) + : nullptr; +} + +void InternalUserCredential::set_additional_user_info( + const InternalAdditionalUserInfo& value_arg) { + additional_user_info_ = + std::make_unique(value_arg); +} + +const InternalAuthCredential* InternalUserCredential::credential() const { + return credential_.get(); +} + +void InternalUserCredential::set_credential( + const InternalAuthCredential* value_arg) { + credential_ = value_arg ? std::make_unique(*value_arg) + : nullptr; +} + +void InternalUserCredential::set_credential( + const InternalAuthCredential& value_arg) { + credential_ = std::make_unique(value_arg); +} + +EncodableList InternalUserCredential::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(user_ ? CustomEncodableValue(*user_) : EncodableValue()); + list.push_back(additional_user_info_ + ? CustomEncodableValue(*additional_user_info_) + : EncodableValue()); + list.push_back(credential_ ? CustomEncodableValue(*credential_) + : EncodableValue()); + return list; +} + +InternalUserCredential InternalUserCredential::FromEncodableList( + const EncodableList& list) { + InternalUserCredential decoded; + auto& encodable_user = list[0]; + if (!encodable_user.IsNull()) { + decoded.set_user(std::any_cast( + std::get(encodable_user))); + } + auto& encodable_additional_user_info = list[1]; + if (!encodable_additional_user_info.IsNull()) { + decoded.set_additional_user_info( + std::any_cast( + std::get(encodable_additional_user_info))); + } + auto& encodable_credential = list[2]; + if (!encodable_credential.IsNull()) { + decoded.set_credential(std::any_cast( + std::get(encodable_credential))); + } + return decoded; +} + +bool InternalUserCredential::operator==( + const InternalUserCredential& other) const { + return PigeonInternalDeepEquals(user_, other.user_) && + PigeonInternalDeepEquals(additional_user_info_, + other.additional_user_info_) && + PigeonInternalDeepEquals(credential_, other.credential_); +} + +bool InternalUserCredential::operator!=( + const InternalUserCredential& other) const { + return !(*this == other); +} + +size_t InternalUserCredential::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(user_); + result = result * 31 + PigeonInternalDeepHash(additional_user_info_); + result = result * 31 + PigeonInternalDeepHash(credential_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserCredential& v) { + return v.Hash(); +} + +// InternalAuthCredentialInput + +InternalAuthCredentialInput::InternalAuthCredentialInput( + const std::string& provider_id, const std::string& sign_in_method) + : provider_id_(provider_id), sign_in_method_(sign_in_method) {} + +InternalAuthCredentialInput::InternalAuthCredentialInput( + const std::string& provider_id, const std::string& sign_in_method, + const std::string* token, const std::string* access_token) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + token_(token ? std::optional(*token) : std::nullopt), + access_token_(access_token ? std::optional(*access_token) + : std::nullopt) {} + +const std::string& InternalAuthCredentialInput::provider_id() const { + return provider_id_; +} + +void InternalAuthCredentialInput::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string& InternalAuthCredentialInput::sign_in_method() const { + return sign_in_method_; +} + +void InternalAuthCredentialInput::set_sign_in_method( + std::string_view value_arg) { + sign_in_method_ = value_arg; +} + +const std::string* InternalAuthCredentialInput::token() const { + return token_ ? &(*token_) : nullptr; +} + +void InternalAuthCredentialInput::set_token(const std::string_view* value_arg) { + token_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredentialInput::set_token(std::string_view value_arg) { + token_ = value_arg; +} + +const std::string* InternalAuthCredentialInput::access_token() const { + return access_token_ ? &(*access_token_) : nullptr; +} + +void InternalAuthCredentialInput::set_access_token( + const std::string_view* value_arg) { + access_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredentialInput::set_access_token(std::string_view value_arg) { + access_token_ = value_arg; +} + +EncodableList InternalAuthCredentialInput::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(EncodableValue(provider_id_)); + list.push_back(EncodableValue(sign_in_method_)); + list.push_back(token_ ? EncodableValue(*token_) : EncodableValue()); + list.push_back(access_token_ ? EncodableValue(*access_token_) + : EncodableValue()); + return list; +} + +InternalAuthCredentialInput InternalAuthCredentialInput::FromEncodableList( + const EncodableList& list) { + InternalAuthCredentialInput decoded(std::get(list[0]), + std::get(list[1])); + auto& encodable_token = list[2]; + if (!encodable_token.IsNull()) { + decoded.set_token(std::get(encodable_token)); + } + auto& encodable_access_token = list[3]; + if (!encodable_access_token.IsNull()) { + decoded.set_access_token(std::get(encodable_access_token)); + } + return decoded; +} + +bool InternalAuthCredentialInput::operator==( + const InternalAuthCredentialInput& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(sign_in_method_, other.sign_in_method_) && + PigeonInternalDeepEquals(token_, other.token_) && + PigeonInternalDeepEquals(access_token_, other.access_token_); +} + +bool InternalAuthCredentialInput::operator!=( + const InternalAuthCredentialInput& other) const { + return !(*this == other); +} + +size_t InternalAuthCredentialInput::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(sign_in_method_); + result = result * 31 + PigeonInternalDeepHash(token_); + result = result * 31 + PigeonInternalDeepHash(access_token_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAuthCredentialInput& v) { + return v.Hash(); +} + +// InternalActionCodeSettings + +InternalActionCodeSettings::InternalActionCodeSettings(const std::string& url, + bool handle_code_in_app, + bool android_install_app) + : url_(url), + handle_code_in_app_(handle_code_in_app), + android_install_app_(android_install_app) {} + +InternalActionCodeSettings::InternalActionCodeSettings( + const std::string& url, const std::string* dynamic_link_domain, + bool handle_code_in_app, const std::string* i_o_s_bundle_id, + const std::string* android_package_name, bool android_install_app, + const std::string* android_minimum_version, const std::string* link_domain) + : url_(url), + dynamic_link_domain_( + dynamic_link_domain ? std::optional(*dynamic_link_domain) + : std::nullopt), + handle_code_in_app_(handle_code_in_app), + i_o_s_bundle_id_(i_o_s_bundle_id + ? std::optional(*i_o_s_bundle_id) + : std::nullopt), + android_package_name_(android_package_name ? std::optional( + *android_package_name) + : std::nullopt), + android_install_app_(android_install_app), + android_minimum_version_( + android_minimum_version + ? std::optional(*android_minimum_version) + : std::nullopt), + link_domain_(link_domain ? std::optional(*link_domain) + : std::nullopt) {} + +const std::string& InternalActionCodeSettings::url() const { return url_; } + +void InternalActionCodeSettings::set_url(std::string_view value_arg) { + url_ = value_arg; +} + +const std::string* InternalActionCodeSettings::dynamic_link_domain() const { + return dynamic_link_domain_ ? &(*dynamic_link_domain_) : nullptr; +} + +void InternalActionCodeSettings::set_dynamic_link_domain( + const std::string_view* value_arg) { + dynamic_link_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_dynamic_link_domain( + std::string_view value_arg) { + dynamic_link_domain_ = value_arg; +} + +bool InternalActionCodeSettings::handle_code_in_app() const { + return handle_code_in_app_; +} + +void InternalActionCodeSettings::set_handle_code_in_app(bool value_arg) { + handle_code_in_app_ = value_arg; +} + +const std::string* InternalActionCodeSettings::i_o_s_bundle_id() const { + return i_o_s_bundle_id_ ? &(*i_o_s_bundle_id_) : nullptr; +} + +void InternalActionCodeSettings::set_i_o_s_bundle_id( + const std::string_view* value_arg) { + i_o_s_bundle_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_i_o_s_bundle_id( + std::string_view value_arg) { + i_o_s_bundle_id_ = value_arg; +} + +const std::string* InternalActionCodeSettings::android_package_name() const { + return android_package_name_ ? &(*android_package_name_) : nullptr; +} + +void InternalActionCodeSettings::set_android_package_name( + const std::string_view* value_arg) { + android_package_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_android_package_name( + std::string_view value_arg) { + android_package_name_ = value_arg; +} + +bool InternalActionCodeSettings::android_install_app() const { + return android_install_app_; +} + +void InternalActionCodeSettings::set_android_install_app(bool value_arg) { + android_install_app_ = value_arg; +} + +const std::string* InternalActionCodeSettings::android_minimum_version() const { + return android_minimum_version_ ? &(*android_minimum_version_) : nullptr; +} + +void InternalActionCodeSettings::set_android_minimum_version( + const std::string_view* value_arg) { + android_minimum_version_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_android_minimum_version( + std::string_view value_arg) { + android_minimum_version_ = value_arg; +} + +const std::string* InternalActionCodeSettings::link_domain() const { + return link_domain_ ? &(*link_domain_) : nullptr; +} + +void InternalActionCodeSettings::set_link_domain( + const std::string_view* value_arg) { + link_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_link_domain(std::string_view value_arg) { + link_domain_ = value_arg; +} + +EncodableList InternalActionCodeSettings::ToEncodableList() const { + EncodableList list; + list.reserve(8); + list.push_back(EncodableValue(url_)); + list.push_back(dynamic_link_domain_ ? EncodableValue(*dynamic_link_domain_) + : EncodableValue()); + list.push_back(EncodableValue(handle_code_in_app_)); + list.push_back(i_o_s_bundle_id_ ? EncodableValue(*i_o_s_bundle_id_) + : EncodableValue()); + list.push_back(android_package_name_ ? EncodableValue(*android_package_name_) + : EncodableValue()); + list.push_back(EncodableValue(android_install_app_)); + list.push_back(android_minimum_version_ + ? EncodableValue(*android_minimum_version_) + : EncodableValue()); + list.push_back(link_domain_ ? EncodableValue(*link_domain_) + : EncodableValue()); + return list; +} + +InternalActionCodeSettings InternalActionCodeSettings::FromEncodableList( + const EncodableList& list) { + InternalActionCodeSettings decoded(std::get(list[0]), + std::get(list[2]), + std::get(list[5])); + auto& encodable_dynamic_link_domain = list[1]; + if (!encodable_dynamic_link_domain.IsNull()) { + decoded.set_dynamic_link_domain( + std::get(encodable_dynamic_link_domain)); + } + auto& encodable_i_o_s_bundle_id = list[3]; + if (!encodable_i_o_s_bundle_id.IsNull()) { + decoded.set_i_o_s_bundle_id( + std::get(encodable_i_o_s_bundle_id)); + } + auto& encodable_android_package_name = list[4]; + if (!encodable_android_package_name.IsNull()) { + decoded.set_android_package_name( + std::get(encodable_android_package_name)); + } + auto& encodable_android_minimum_version = list[6]; + if (!encodable_android_minimum_version.IsNull()) { + decoded.set_android_minimum_version( + std::get(encodable_android_minimum_version)); + } + auto& encodable_link_domain = list[7]; + if (!encodable_link_domain.IsNull()) { + decoded.set_link_domain(std::get(encodable_link_domain)); + } + return decoded; +} + +bool InternalActionCodeSettings::operator==( + const InternalActionCodeSettings& other) const { + return PigeonInternalDeepEquals(url_, other.url_) && + PigeonInternalDeepEquals(dynamic_link_domain_, + other.dynamic_link_domain_) && + PigeonInternalDeepEquals(handle_code_in_app_, + other.handle_code_in_app_) && + PigeonInternalDeepEquals(i_o_s_bundle_id_, other.i_o_s_bundle_id_) && + PigeonInternalDeepEquals(android_package_name_, + other.android_package_name_) && + PigeonInternalDeepEquals(android_install_app_, + other.android_install_app_) && + PigeonInternalDeepEquals(android_minimum_version_, + other.android_minimum_version_) && + PigeonInternalDeepEquals(link_domain_, other.link_domain_); +} + +bool InternalActionCodeSettings::operator!=( + const InternalActionCodeSettings& other) const { + return !(*this == other); +} + +size_t InternalActionCodeSettings::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(url_); + result = result * 31 + PigeonInternalDeepHash(dynamic_link_domain_); + result = result * 31 + PigeonInternalDeepHash(handle_code_in_app_); + result = result * 31 + PigeonInternalDeepHash(i_o_s_bundle_id_); + result = result * 31 + PigeonInternalDeepHash(android_package_name_); + result = result * 31 + PigeonInternalDeepHash(android_install_app_); + result = result * 31 + PigeonInternalDeepHash(android_minimum_version_); + result = result * 31 + PigeonInternalDeepHash(link_domain_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeSettings& v) { + return v.Hash(); +} + +// InternalFirebaseAuthSettings + +InternalFirebaseAuthSettings::InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing) + : app_verification_disabled_for_testing_( + app_verification_disabled_for_testing) {} + +InternalFirebaseAuthSettings::InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing, + const std::string* user_access_group, const std::string* phone_number, + const std::string* sms_code, const bool* force_recaptcha_flow) + : app_verification_disabled_for_testing_( + app_verification_disabled_for_testing), + user_access_group_(user_access_group + ? std::optional(*user_access_group) + : std::nullopt), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + sms_code_(sms_code ? std::optional(*sms_code) + : std::nullopt), + force_recaptcha_flow_(force_recaptcha_flow + ? std::optional(*force_recaptcha_flow) + : std::nullopt) {} + +bool InternalFirebaseAuthSettings::app_verification_disabled_for_testing() + const { + return app_verification_disabled_for_testing_; +} + +void InternalFirebaseAuthSettings::set_app_verification_disabled_for_testing( + bool value_arg) { + app_verification_disabled_for_testing_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::user_access_group() const { + return user_access_group_ ? &(*user_access_group_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_user_access_group( + const std::string_view* value_arg) { + user_access_group_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_user_access_group( + std::string_view value_arg) { + user_access_group_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_phone_number( + std::string_view value_arg) { + phone_number_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::sms_code() const { + return sms_code_ ? &(*sms_code_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_sms_code( + const std::string_view* value_arg) { + sms_code_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_sms_code(std::string_view value_arg) { + sms_code_ = value_arg; +} + +const bool* InternalFirebaseAuthSettings::force_recaptcha_flow() const { + return force_recaptcha_flow_ ? &(*force_recaptcha_flow_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_force_recaptcha_flow( + const bool* value_arg) { + force_recaptcha_flow_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_force_recaptcha_flow(bool value_arg) { + force_recaptcha_flow_ = value_arg; +} + +EncodableList InternalFirebaseAuthSettings::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(EncodableValue(app_verification_disabled_for_testing_)); + list.push_back(user_access_group_ ? EncodableValue(*user_access_group_) + : EncodableValue()); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(sms_code_ ? EncodableValue(*sms_code_) : EncodableValue()); + list.push_back(force_recaptcha_flow_ ? EncodableValue(*force_recaptcha_flow_) + : EncodableValue()); + return list; +} + +InternalFirebaseAuthSettings InternalFirebaseAuthSettings::FromEncodableList( + const EncodableList& list) { + InternalFirebaseAuthSettings decoded(std::get(list[0])); + auto& encodable_user_access_group = list[1]; + if (!encodable_user_access_group.IsNull()) { + decoded.set_user_access_group( + std::get(encodable_user_access_group)); + } + auto& encodable_phone_number = list[2]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_sms_code = list[3]; + if (!encodable_sms_code.IsNull()) { + decoded.set_sms_code(std::get(encodable_sms_code)); + } + auto& encodable_force_recaptcha_flow = list[4]; + if (!encodable_force_recaptcha_flow.IsNull()) { + decoded.set_force_recaptcha_flow( + std::get(encodable_force_recaptcha_flow)); + } + return decoded; +} + +bool InternalFirebaseAuthSettings::operator==( + const InternalFirebaseAuthSettings& other) const { + return PigeonInternalDeepEquals( + app_verification_disabled_for_testing_, + other.app_verification_disabled_for_testing_) && + PigeonInternalDeepEquals(user_access_group_, + other.user_access_group_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(sms_code_, other.sms_code_) && + PigeonInternalDeepEquals(force_recaptcha_flow_, + other.force_recaptcha_flow_); +} + +bool InternalFirebaseAuthSettings::operator!=( + const InternalFirebaseAuthSettings& other) const { + return !(*this == other); +} + +size_t InternalFirebaseAuthSettings::Hash() const { + size_t result = 1; + result = result * 31 + + PigeonInternalDeepHash(app_verification_disabled_for_testing_); + result = result * 31 + PigeonInternalDeepHash(user_access_group_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(sms_code_); + result = result * 31 + PigeonInternalDeepHash(force_recaptcha_flow_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalFirebaseAuthSettings& v) { + return v.Hash(); +} + +// InternalSignInProvider + +InternalSignInProvider::InternalSignInProvider(const std::string& provider_id) + : provider_id_(provider_id) {} + +InternalSignInProvider::InternalSignInProvider( + const std::string& provider_id, const EncodableList* scopes, + const EncodableMap* custom_parameters) + : provider_id_(provider_id), + scopes_(scopes ? std::optional(*scopes) : std::nullopt), + custom_parameters_(custom_parameters + ? std::optional(*custom_parameters) + : std::nullopt) {} + +const std::string& InternalSignInProvider::provider_id() const { + return provider_id_; +} + +void InternalSignInProvider::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const EncodableList* InternalSignInProvider::scopes() const { + return scopes_ ? &(*scopes_) : nullptr; +} + +void InternalSignInProvider::set_scopes(const EncodableList* value_arg) { + scopes_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalSignInProvider::set_scopes(const EncodableList& value_arg) { + scopes_ = value_arg; +} + +const EncodableMap* InternalSignInProvider::custom_parameters() const { + return custom_parameters_ ? &(*custom_parameters_) : nullptr; +} + +void InternalSignInProvider::set_custom_parameters( + const EncodableMap* value_arg) { + custom_parameters_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalSignInProvider::set_custom_parameters( + const EncodableMap& value_arg) { + custom_parameters_ = value_arg; +} + +EncodableList InternalSignInProvider::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(provider_id_)); + list.push_back(scopes_ ? EncodableValue(*scopes_) : EncodableValue()); + list.push_back(custom_parameters_ ? EncodableValue(*custom_parameters_) + : EncodableValue()); + return list; +} + +InternalSignInProvider InternalSignInProvider::FromEncodableList( + const EncodableList& list) { + InternalSignInProvider decoded(std::get(list[0])); + auto& encodable_scopes = list[1]; + if (!encodable_scopes.IsNull()) { + decoded.set_scopes(std::get(encodable_scopes)); + } + auto& encodable_custom_parameters = list[2]; + if (!encodable_custom_parameters.IsNull()) { + decoded.set_custom_parameters( + std::get(encodable_custom_parameters)); + } + return decoded; +} + +bool InternalSignInProvider::operator==( + const InternalSignInProvider& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(scopes_, other.scopes_) && + PigeonInternalDeepEquals(custom_parameters_, other.custom_parameters_); +} + +bool InternalSignInProvider::operator!=( + const InternalSignInProvider& other) const { + return !(*this == other); +} + +size_t InternalSignInProvider::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(scopes_); + result = result * 31 + PigeonInternalDeepHash(custom_parameters_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalSignInProvider& v) { + return v.Hash(); +} + +// InternalVerifyPhoneNumberRequest + +InternalVerifyPhoneNumberRequest::InternalVerifyPhoneNumberRequest( + int64_t timeout) + : timeout_(timeout) {} + +InternalVerifyPhoneNumberRequest::InternalVerifyPhoneNumberRequest( + const std::string* phone_number, int64_t timeout, + const int64_t* force_resending_token, + const std::string* auto_retrieved_sms_code_for_testing, + const std::string* multi_factor_info_id, + const std::string* multi_factor_session_id) + : phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + timeout_(timeout), + force_resending_token_( + force_resending_token ? std::optional(*force_resending_token) + : std::nullopt), + auto_retrieved_sms_code_for_testing_( + auto_retrieved_sms_code_for_testing + ? std::optional(*auto_retrieved_sms_code_for_testing) + : std::nullopt), + multi_factor_info_id_(multi_factor_info_id ? std::optional( + *multi_factor_info_id) + : std::nullopt), + multi_factor_session_id_( + multi_factor_session_id + ? std::optional(*multi_factor_session_id) + : std::nullopt) {} + +const std::string* InternalVerifyPhoneNumberRequest::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_phone_number( + std::string_view value_arg) { + phone_number_ = value_arg; +} + +int64_t InternalVerifyPhoneNumberRequest::timeout() const { return timeout_; } + +void InternalVerifyPhoneNumberRequest::set_timeout(int64_t value_arg) { + timeout_ = value_arg; +} + +const int64_t* InternalVerifyPhoneNumberRequest::force_resending_token() const { + return force_resending_token_ ? &(*force_resending_token_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_force_resending_token( + const int64_t* value_arg) { + force_resending_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_force_resending_token( + int64_t value_arg) { + force_resending_token_ = value_arg; +} + +const std::string* +InternalVerifyPhoneNumberRequest::auto_retrieved_sms_code_for_testing() const { + return auto_retrieved_sms_code_for_testing_ + ? &(*auto_retrieved_sms_code_for_testing_) + : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_auto_retrieved_sms_code_for_testing( + const std::string_view* value_arg) { + auto_retrieved_sms_code_for_testing_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_auto_retrieved_sms_code_for_testing( + std::string_view value_arg) { + auto_retrieved_sms_code_for_testing_ = value_arg; +} + +const std::string* InternalVerifyPhoneNumberRequest::multi_factor_info_id() + const { + return multi_factor_info_id_ ? &(*multi_factor_info_id_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_info_id( + const std::string_view* value_arg) { + multi_factor_info_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_info_id( + std::string_view value_arg) { + multi_factor_info_id_ = value_arg; +} + +const std::string* InternalVerifyPhoneNumberRequest::multi_factor_session_id() + const { + return multi_factor_session_id_ ? &(*multi_factor_session_id_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_session_id( + const std::string_view* value_arg) { + multi_factor_session_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_session_id( + std::string_view value_arg) { + multi_factor_session_id_ = value_arg; +} + +EncodableList InternalVerifyPhoneNumberRequest::ToEncodableList() const { + EncodableList list; + list.reserve(6); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(EncodableValue(timeout_)); + list.push_back(force_resending_token_ + ? EncodableValue(*force_resending_token_) + : EncodableValue()); + list.push_back(auto_retrieved_sms_code_for_testing_ + ? EncodableValue(*auto_retrieved_sms_code_for_testing_) + : EncodableValue()); + list.push_back(multi_factor_info_id_ ? EncodableValue(*multi_factor_info_id_) + : EncodableValue()); + list.push_back(multi_factor_session_id_ + ? EncodableValue(*multi_factor_session_id_) + : EncodableValue()); + return list; +} + +InternalVerifyPhoneNumberRequest +InternalVerifyPhoneNumberRequest::FromEncodableList(const EncodableList& list) { + InternalVerifyPhoneNumberRequest decoded(std::get(list[1])); + auto& encodable_phone_number = list[0]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_force_resending_token = list[2]; + if (!encodable_force_resending_token.IsNull()) { + decoded.set_force_resending_token( + std::get(encodable_force_resending_token)); + } + auto& encodable_auto_retrieved_sms_code_for_testing = list[3]; + if (!encodable_auto_retrieved_sms_code_for_testing.IsNull()) { + decoded.set_auto_retrieved_sms_code_for_testing( + std::get(encodable_auto_retrieved_sms_code_for_testing)); + } + auto& encodable_multi_factor_info_id = list[4]; + if (!encodable_multi_factor_info_id.IsNull()) { + decoded.set_multi_factor_info_id( + std::get(encodable_multi_factor_info_id)); + } + auto& encodable_multi_factor_session_id = list[5]; + if (!encodable_multi_factor_session_id.IsNull()) { + decoded.set_multi_factor_session_id( + std::get(encodable_multi_factor_session_id)); + } + return decoded; +} + +bool InternalVerifyPhoneNumberRequest::operator==( + const InternalVerifyPhoneNumberRequest& other) const { + return PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(timeout_, other.timeout_) && + PigeonInternalDeepEquals(force_resending_token_, + other.force_resending_token_) && + PigeonInternalDeepEquals(auto_retrieved_sms_code_for_testing_, + other.auto_retrieved_sms_code_for_testing_) && + PigeonInternalDeepEquals(multi_factor_info_id_, + other.multi_factor_info_id_) && + PigeonInternalDeepEquals(multi_factor_session_id_, + other.multi_factor_session_id_); +} + +bool InternalVerifyPhoneNumberRequest::operator!=( + const InternalVerifyPhoneNumberRequest& other) const { + return !(*this == other); +} + +size_t InternalVerifyPhoneNumberRequest::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(timeout_); + result = result * 31 + PigeonInternalDeepHash(force_resending_token_); + result = result * 31 + + PigeonInternalDeepHash(auto_retrieved_sms_code_for_testing_); + result = result * 31 + PigeonInternalDeepHash(multi_factor_info_id_); + result = result * 31 + PigeonInternalDeepHash(multi_factor_session_id_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalVerifyPhoneNumberRequest& v) { + return v.Hash(); +} + +// InternalIdTokenResult + +InternalIdTokenResult::InternalIdTokenResult() {} + +InternalIdTokenResult::InternalIdTokenResult( + const std::string* token, const int64_t* expiration_timestamp, + const int64_t* auth_timestamp, const int64_t* issued_at_timestamp, + const std::string* sign_in_provider, const EncodableMap* claims, + const std::string* sign_in_second_factor) + : token_(token ? std::optional(*token) : std::nullopt), + expiration_timestamp_(expiration_timestamp + ? std::optional(*expiration_timestamp) + : std::nullopt), + auth_timestamp_(auth_timestamp ? std::optional(*auth_timestamp) + : std::nullopt), + issued_at_timestamp_(issued_at_timestamp + ? std::optional(*issued_at_timestamp) + : std::nullopt), + sign_in_provider_(sign_in_provider + ? std::optional(*sign_in_provider) + : std::nullopt), + claims_(claims ? std::optional(*claims) : std::nullopt), + sign_in_second_factor_(sign_in_second_factor ? std::optional( + *sign_in_second_factor) + : std::nullopt) {} + +const std::string* InternalIdTokenResult::token() const { + return token_ ? &(*token_) : nullptr; +} + +void InternalIdTokenResult::set_token(const std::string_view* value_arg) { + token_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_token(std::string_view value_arg) { + token_ = value_arg; +} + +const int64_t* InternalIdTokenResult::expiration_timestamp() const { + return expiration_timestamp_ ? &(*expiration_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_expiration_timestamp(const int64_t* value_arg) { + expiration_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_expiration_timestamp(int64_t value_arg) { + expiration_timestamp_ = value_arg; +} + +const int64_t* InternalIdTokenResult::auth_timestamp() const { + return auth_timestamp_ ? &(*auth_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_auth_timestamp(const int64_t* value_arg) { + auth_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_auth_timestamp(int64_t value_arg) { + auth_timestamp_ = value_arg; +} + +const int64_t* InternalIdTokenResult::issued_at_timestamp() const { + return issued_at_timestamp_ ? &(*issued_at_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_issued_at_timestamp(const int64_t* value_arg) { + issued_at_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_issued_at_timestamp(int64_t value_arg) { + issued_at_timestamp_ = value_arg; +} + +const std::string* InternalIdTokenResult::sign_in_provider() const { + return sign_in_provider_ ? &(*sign_in_provider_) : nullptr; +} + +void InternalIdTokenResult::set_sign_in_provider( + const std::string_view* value_arg) { + sign_in_provider_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_sign_in_provider(std::string_view value_arg) { + sign_in_provider_ = value_arg; +} + +const EncodableMap* InternalIdTokenResult::claims() const { + return claims_ ? &(*claims_) : nullptr; +} + +void InternalIdTokenResult::set_claims(const EncodableMap* value_arg) { + claims_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_claims(const EncodableMap& value_arg) { + claims_ = value_arg; +} + +const std::string* InternalIdTokenResult::sign_in_second_factor() const { + return sign_in_second_factor_ ? &(*sign_in_second_factor_) : nullptr; +} + +void InternalIdTokenResult::set_sign_in_second_factor( + const std::string_view* value_arg) { + sign_in_second_factor_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_sign_in_second_factor( + std::string_view value_arg) { + sign_in_second_factor_ = value_arg; +} + +EncodableList InternalIdTokenResult::ToEncodableList() const { + EncodableList list; + list.reserve(7); + list.push_back(token_ ? EncodableValue(*token_) : EncodableValue()); + list.push_back(expiration_timestamp_ ? EncodableValue(*expiration_timestamp_) + : EncodableValue()); + list.push_back(auth_timestamp_ ? EncodableValue(*auth_timestamp_) + : EncodableValue()); + list.push_back(issued_at_timestamp_ ? EncodableValue(*issued_at_timestamp_) + : EncodableValue()); + list.push_back(sign_in_provider_ ? EncodableValue(*sign_in_provider_) + : EncodableValue()); + list.push_back(claims_ ? EncodableValue(*claims_) : EncodableValue()); + list.push_back(sign_in_second_factor_ + ? EncodableValue(*sign_in_second_factor_) + : EncodableValue()); + return list; +} + +InternalIdTokenResult InternalIdTokenResult::FromEncodableList( + const EncodableList& list) { + InternalIdTokenResult decoded; + auto& encodable_token = list[0]; + if (!encodable_token.IsNull()) { + decoded.set_token(std::get(encodable_token)); + } + auto& encodable_expiration_timestamp = list[1]; + if (!encodable_expiration_timestamp.IsNull()) { + decoded.set_expiration_timestamp( + std::get(encodable_expiration_timestamp)); + } + auto& encodable_auth_timestamp = list[2]; + if (!encodable_auth_timestamp.IsNull()) { + decoded.set_auth_timestamp(std::get(encodable_auth_timestamp)); + } + auto& encodable_issued_at_timestamp = list[3]; + if (!encodable_issued_at_timestamp.IsNull()) { + decoded.set_issued_at_timestamp( + std::get(encodable_issued_at_timestamp)); + } + auto& encodable_sign_in_provider = list[4]; + if (!encodable_sign_in_provider.IsNull()) { + decoded.set_sign_in_provider( + std::get(encodable_sign_in_provider)); + } + auto& encodable_claims = list[5]; + if (!encodable_claims.IsNull()) { + decoded.set_claims(std::get(encodable_claims)); + } + auto& encodable_sign_in_second_factor = list[6]; + if (!encodable_sign_in_second_factor.IsNull()) { + decoded.set_sign_in_second_factor( + std::get(encodable_sign_in_second_factor)); + } + return decoded; +} + +bool InternalIdTokenResult::operator==( + const InternalIdTokenResult& other) const { + return PigeonInternalDeepEquals(token_, other.token_) && + PigeonInternalDeepEquals(expiration_timestamp_, + other.expiration_timestamp_) && + PigeonInternalDeepEquals(auth_timestamp_, other.auth_timestamp_) && + PigeonInternalDeepEquals(issued_at_timestamp_, + other.issued_at_timestamp_) && + PigeonInternalDeepEquals(sign_in_provider_, other.sign_in_provider_) && + PigeonInternalDeepEquals(claims_, other.claims_) && + PigeonInternalDeepEquals(sign_in_second_factor_, + other.sign_in_second_factor_); +} + +bool InternalIdTokenResult::operator!=( + const InternalIdTokenResult& other) const { + return !(*this == other); +} + +size_t InternalIdTokenResult::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(token_); + result = result * 31 + PigeonInternalDeepHash(expiration_timestamp_); + result = result * 31 + PigeonInternalDeepHash(auth_timestamp_); + result = result * 31 + PigeonInternalDeepHash(issued_at_timestamp_); + result = result * 31 + PigeonInternalDeepHash(sign_in_provider_); + result = result * 31 + PigeonInternalDeepHash(claims_); + result = result * 31 + PigeonInternalDeepHash(sign_in_second_factor_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalIdTokenResult& v) { + return v.Hash(); +} + +// InternalUserProfile + +InternalUserProfile::InternalUserProfile(bool display_name_changed, + bool photo_url_changed) + : display_name_changed_(display_name_changed), + photo_url_changed_(photo_url_changed) {} + +InternalUserProfile::InternalUserProfile(const std::string* display_name, + const std::string* photo_url, + bool display_name_changed, + bool photo_url_changed) + : display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + photo_url_(photo_url ? std::optional(*photo_url) + : std::nullopt), + display_name_changed_(display_name_changed), + photo_url_changed_(photo_url_changed) {} + +const std::string* InternalUserProfile::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalUserProfile::set_display_name(const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserProfile::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +const std::string* InternalUserProfile::photo_url() const { + return photo_url_ ? &(*photo_url_) : nullptr; +} + +void InternalUserProfile::set_photo_url(const std::string_view* value_arg) { + photo_url_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserProfile::set_photo_url(std::string_view value_arg) { + photo_url_ = value_arg; +} + +bool InternalUserProfile::display_name_changed() const { + return display_name_changed_; +} + +void InternalUserProfile::set_display_name_changed(bool value_arg) { + display_name_changed_ = value_arg; +} + +bool InternalUserProfile::photo_url_changed() const { + return photo_url_changed_; +} + +void InternalUserProfile::set_photo_url_changed(bool value_arg) { + photo_url_changed_ = value_arg; +} + +EncodableList InternalUserProfile::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(photo_url_ ? EncodableValue(*photo_url_) : EncodableValue()); + list.push_back(EncodableValue(display_name_changed_)); + list.push_back(EncodableValue(photo_url_changed_)); + return list; +} + +InternalUserProfile InternalUserProfile::FromEncodableList( + const EncodableList& list) { + InternalUserProfile decoded(std::get(list[2]), std::get(list[3])); + auto& encodable_display_name = list[0]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_photo_url = list[1]; + if (!encodable_photo_url.IsNull()) { + decoded.set_photo_url(std::get(encodable_photo_url)); + } + return decoded; +} + +bool InternalUserProfile::operator==(const InternalUserProfile& other) const { + return PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(photo_url_, other.photo_url_) && + PigeonInternalDeepEquals(display_name_changed_, + other.display_name_changed_) && + PigeonInternalDeepEquals(photo_url_changed_, other.photo_url_changed_); +} + +bool InternalUserProfile::operator!=(const InternalUserProfile& other) const { + return !(*this == other); +} + +size_t InternalUserProfile::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(photo_url_); + result = result * 31 + PigeonInternalDeepHash(display_name_changed_); + result = result * 31 + PigeonInternalDeepHash(photo_url_changed_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserProfile& v) { return v.Hash(); } + +// InternalTotpSecret + +InternalTotpSecret::InternalTotpSecret(const std::string& secret_key) + : secret_key_(secret_key) {} + +InternalTotpSecret::InternalTotpSecret( + const int64_t* code_interval_seconds, const int64_t* code_length, + const int64_t* enrollment_completion_deadline, + const std::string* hashing_algorithm, const std::string& secret_key) + : code_interval_seconds_( + code_interval_seconds ? std::optional(*code_interval_seconds) + : std::nullopt), + code_length_(code_length ? std::optional(*code_length) + : std::nullopt), + enrollment_completion_deadline_( + enrollment_completion_deadline + ? std::optional(*enrollment_completion_deadline) + : std::nullopt), + hashing_algorithm_(hashing_algorithm + ? std::optional(*hashing_algorithm) + : std::nullopt), + secret_key_(secret_key) {} + +const int64_t* InternalTotpSecret::code_interval_seconds() const { + return code_interval_seconds_ ? &(*code_interval_seconds_) : nullptr; +} + +void InternalTotpSecret::set_code_interval_seconds(const int64_t* value_arg) { + code_interval_seconds_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_code_interval_seconds(int64_t value_arg) { + code_interval_seconds_ = value_arg; +} + +const int64_t* InternalTotpSecret::code_length() const { + return code_length_ ? &(*code_length_) : nullptr; +} + +void InternalTotpSecret::set_code_length(const int64_t* value_arg) { + code_length_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_code_length(int64_t value_arg) { + code_length_ = value_arg; +} + +const int64_t* InternalTotpSecret::enrollment_completion_deadline() const { + return enrollment_completion_deadline_ ? &(*enrollment_completion_deadline_) + : nullptr; +} + +void InternalTotpSecret::set_enrollment_completion_deadline( + const int64_t* value_arg) { + enrollment_completion_deadline_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_enrollment_completion_deadline(int64_t value_arg) { + enrollment_completion_deadline_ = value_arg; +} + +const std::string* InternalTotpSecret::hashing_algorithm() const { + return hashing_algorithm_ ? &(*hashing_algorithm_) : nullptr; +} + +void InternalTotpSecret::set_hashing_algorithm( + const std::string_view* value_arg) { + hashing_algorithm_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_hashing_algorithm(std::string_view value_arg) { + hashing_algorithm_ = value_arg; +} + +const std::string& InternalTotpSecret::secret_key() const { + return secret_key_; +} + +void InternalTotpSecret::set_secret_key(std::string_view value_arg) { + secret_key_ = value_arg; +} + +EncodableList InternalTotpSecret::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(code_interval_seconds_ + ? EncodableValue(*code_interval_seconds_) + : EncodableValue()); + list.push_back(code_length_ ? EncodableValue(*code_length_) + : EncodableValue()); + list.push_back(enrollment_completion_deadline_ + ? EncodableValue(*enrollment_completion_deadline_) + : EncodableValue()); + list.push_back(hashing_algorithm_ ? EncodableValue(*hashing_algorithm_) + : EncodableValue()); + list.push_back(EncodableValue(secret_key_)); + return list; +} + +InternalTotpSecret InternalTotpSecret::FromEncodableList( + const EncodableList& list) { + InternalTotpSecret decoded(std::get(list[4])); + auto& encodable_code_interval_seconds = list[0]; + if (!encodable_code_interval_seconds.IsNull()) { + decoded.set_code_interval_seconds( + std::get(encodable_code_interval_seconds)); + } + auto& encodable_code_length = list[1]; + if (!encodable_code_length.IsNull()) { + decoded.set_code_length(std::get(encodable_code_length)); + } + auto& encodable_enrollment_completion_deadline = list[2]; + if (!encodable_enrollment_completion_deadline.IsNull()) { + decoded.set_enrollment_completion_deadline( + std::get(encodable_enrollment_completion_deadline)); + } + auto& encodable_hashing_algorithm = list[3]; + if (!encodable_hashing_algorithm.IsNull()) { + decoded.set_hashing_algorithm( + std::get(encodable_hashing_algorithm)); + } + return decoded; +} + +bool InternalTotpSecret::operator==(const InternalTotpSecret& other) const { + return PigeonInternalDeepEquals(code_interval_seconds_, + other.code_interval_seconds_) && + PigeonInternalDeepEquals(code_length_, other.code_length_) && + PigeonInternalDeepEquals(enrollment_completion_deadline_, + other.enrollment_completion_deadline_) && + PigeonInternalDeepEquals(hashing_algorithm_, + other.hashing_algorithm_) && + PigeonInternalDeepEquals(secret_key_, other.secret_key_); +} + +bool InternalTotpSecret::operator!=(const InternalTotpSecret& other) const { + return !(*this == other); +} + +size_t InternalTotpSecret::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(code_interval_seconds_); + result = result * 31 + PigeonInternalDeepHash(code_length_); + result = + result * 31 + PigeonInternalDeepHash(enrollment_completion_deadline_); + result = result * 31 + PigeonInternalDeepHash(hashing_algorithm_); + result = result * 31 + PigeonInternalDeepHash(secret_key_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalTotpSecret& v) { return v.Hash(); } + +PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {} + +EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const { + switch (type) { + case 129: { + const auto& encodable_enum_arg = ReadValue(stream); + const int64_t enum_arg_value = + encodable_enum_arg.IsNull() ? 0 : encodable_enum_arg.LongValue(); + return encodable_enum_arg.IsNull() + ? EncodableValue() + : CustomEncodableValue( + static_cast(enum_arg_value)); + } + case 130: { + return CustomEncodableValue(InternalMultiFactorSession::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 131: { + return CustomEncodableValue( + InternalPhoneMultiFactorAssertion::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 132: { + return CustomEncodableValue(InternalMultiFactorInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 133: { + return CustomEncodableValue(AuthPigeonFirebaseApp::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 134: { + return CustomEncodableValue(InternalActionCodeInfoData::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 135: { + return CustomEncodableValue(InternalActionCodeInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 136: { + return CustomEncodableValue(InternalAdditionalUserInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 137: { + return CustomEncodableValue(InternalAuthCredential::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 138: { + return CustomEncodableValue(InternalUserInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 139: { + return CustomEncodableValue(InternalUserDetails::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 140: { + return CustomEncodableValue(InternalUserCredential::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 141: { + return CustomEncodableValue( + InternalAuthCredentialInput::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 142: { + return CustomEncodableValue(InternalActionCodeSettings::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 143: { + return CustomEncodableValue( + InternalFirebaseAuthSettings::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 144: { + return CustomEncodableValue(InternalSignInProvider::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 145: { + return CustomEncodableValue( + InternalVerifyPhoneNumberRequest::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 146: { + return CustomEncodableValue(InternalIdTokenResult::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 147: { + return CustomEncodableValue(InternalUserProfile::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 148: { + return CustomEncodableValue(InternalTotpSecret::FromEncodableList( + std::get(ReadValue(stream)))); + } + default: + return ::flutter::StandardCodecSerializer::ReadValueOfType(type, stream); + } +} + +void PigeonInternalCodecSerializer::WriteValue( + const EncodableValue& value, ::flutter::ByteStreamWriter* stream) const { + if (const CustomEncodableValue* custom_value = + std::get_if(&value)) { + if (custom_value->type() == typeid(ActionCodeInfoOperation)) { + stream->WriteByte(129); + WriteValue(EncodableValue(static_cast( + std::any_cast(*custom_value))), + stream); + return; + } + if (custom_value->type() == typeid(InternalMultiFactorSession)) { + stream->WriteByte(130); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalPhoneMultiFactorAssertion)) { + stream->WriteByte(131); + WriteValue( + EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalMultiFactorInfo)) { + stream->WriteByte(132); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(AuthPigeonFirebaseApp)) { + stream->WriteByte(133); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeInfoData)) { + stream->WriteByte(134); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeInfo)) { + stream->WriteByte(135); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAdditionalUserInfo)) { + stream->WriteByte(136); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAuthCredential)) { + stream->WriteByte(137); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserInfo)) { + stream->WriteByte(138); + WriteValue( + EncodableValue( + std::any_cast(*custom_value).ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserDetails)) { + stream->WriteByte(139); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserCredential)) { + stream->WriteByte(140); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAuthCredentialInput)) { + stream->WriteByte(141); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeSettings)) { + stream->WriteByte(142); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalFirebaseAuthSettings)) { + stream->WriteByte(143); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalSignInProvider)) { + stream->WriteByte(144); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalVerifyPhoneNumberRequest)) { + stream->WriteByte(145); + WriteValue(EncodableValue(std::any_cast( + *custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalIdTokenResult)) { + stream->WriteByte(146); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserProfile)) { + stream->WriteByte(147); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalTotpSecret)) { + stream->WriteByte(148); + WriteValue(EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + } + ::flutter::StandardCodecSerializer::WriteValue(value, stream); +} + +/// The codec used by FirebaseAuthHostApi. +const ::flutter::StandardMessageCodec& FirebaseAuthHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAuthHostApi` to handle messages through the +// `binary_messenger`. +void FirebaseAuthHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api) { + FirebaseAuthHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAuthHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.registerIdTokenListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->RegisterIdTokenListener( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.registerAuthStateListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->RegisterAuthStateListener( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.useEmulator" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_host_arg = args.at(1); + if (encodable_host_arg.IsNull()) { + reply(WrapError("host_arg unexpectedly null.")); + return; + } + const auto& host_arg = std::get(encodable_host_arg); + const auto& encodable_port_arg = args.at(2); + if (encodable_port_arg.IsNull()) { + reply(WrapError("port_arg unexpectedly null.")); + return; + } + const int64_t port_arg = encodable_port_arg.LongValue(); + api->UseEmulator(app_arg, host_arg, port_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.applyActionCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->ApplyActionCode( + app_arg, code_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.checkActionCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->CheckActionCode( + app_arg, code_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.confirmPasswordReset" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + const auto& encodable_new_password_arg = args.at(2); + if (encodable_new_password_arg.IsNull()) { + reply(WrapError("new_password_arg unexpectedly null.")); + return; + } + const auto& new_password_arg = + std::get(encodable_new_password_arg); + api->ConfirmPasswordReset( + app_arg, code_arg, new_password_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.createUserWithEmailAndPassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_password_arg = args.at(2); + if (encodable_password_arg.IsNull()) { + reply(WrapError("password_arg unexpectedly null.")); + return; + } + const auto& password_arg = + std::get(encodable_password_arg); + api->CreateUserWithEmailAndPassword( + app_arg, email_arg, password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInAnonymously" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->SignInAnonymously( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->SignInWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithCustomToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_token_arg = args.at(1); + if (encodable_token_arg.IsNull()) { + reply(WrapError("token_arg unexpectedly null.")); + return; + } + const auto& token_arg = + std::get(encodable_token_arg); + api->SignInWithCustomToken( + app_arg, token_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailAndPassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_password_arg = args.at(2); + if (encodable_password_arg.IsNull()) { + reply(WrapError("password_arg unexpectedly null.")); + return; + } + const auto& password_arg = + std::get(encodable_password_arg); + api->SignInWithEmailAndPassword( + app_arg, email_arg, password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailLink" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_email_link_arg = args.at(2); + if (encodable_email_link_arg.IsNull()) { + reply(WrapError("email_link_arg unexpectedly null.")); + return; + } + const auto& email_link_arg = + std::get(encodable_email_link_arg); + api->SignInWithEmailLink( + app_arg, email_arg, email_link_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->SignInWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.signOut" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->SignOut(app_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.fetchSignInMethodsForEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + api->FetchSignInMethodsForEmail( + app_arg, email_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.sendPasswordResetEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->SendPasswordResetEmail( + app_arg, email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.sendSignInLinkToEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + if (encodable_action_code_settings_arg.IsNull()) { + reply(WrapError("action_code_settings_arg unexpectedly null.")); + return; + } + const auto& action_code_settings_arg = + std::any_cast( + std::get( + encodable_action_code_settings_arg)); + api->SendSignInLinkToEmail( + app_arg, email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.setLanguageCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_language_code_arg = args.at(1); + const auto* language_code_arg = + std::get_if(&encodable_language_code_arg); + api->SetLanguageCode(app_arg, language_code_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.setSettings" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_settings_arg = args.at(1); + if (encodable_settings_arg.IsNull()) { + reply(WrapError("settings_arg unexpectedly null.")); + return; + } + const auto& settings_arg = + std::any_cast( + std::get(encodable_settings_arg)); + api->SetSettings(app_arg, settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.verifyPasswordResetCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->VerifyPasswordResetCode( + app_arg, code_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.verifyPhoneNumber" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_request_arg = args.at(1); + if (encodable_request_arg.IsNull()) { + reply(WrapError("request_arg unexpectedly null.")); + return; + } + const auto& request_arg = + std::any_cast( + std::get(encodable_request_arg)); + api->VerifyPhoneNumber( + app_arg, request_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeTokenWithAuthorizationCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_authorization_code_arg = args.at(1); + if (encodable_authorization_code_arg.IsNull()) { + reply(WrapError("authorization_code_arg unexpectedly null.")); + return; + } + const auto& authorization_code_arg = + std::get(encodable_authorization_code_arg); + api->RevokeTokenWithAuthorizationCode( + app_arg, authorization_code_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeAccessToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_access_token_arg = args.at(1); + if (encodable_access_token_arg.IsNull()) { + reply(WrapError("access_token_arg unexpectedly null.")); + return; + } + const auto& access_token_arg = + std::get(encodable_access_token_arg); + api->RevokeAccessToken( + app_arg, access_token_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.initializeRecaptchaConfig" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->InitializeRecaptchaConfig( + app_arg, [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAuthHostApi::WrapError(std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAuthHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by FirebaseAuthUserHostApi. +const ::flutter::StandardMessageCodec& FirebaseAuthUserHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through +// the `binary_messenger`. +void FirebaseAuthUserHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api) { + FirebaseAuthUserHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAuthUserHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, FirebaseAuthUserHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.delete" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->Delete(app_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.getIdToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_force_refresh_arg = args.at(1); + if (encodable_force_refresh_arg.IsNull()) { + reply(WrapError("force_refresh_arg unexpectedly null.")); + return; + } + const auto& force_refresh_arg = + std::get(encodable_force_refresh_arg); + api->GetIdToken(app_arg, force_refresh_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->LinkWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->LinkWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->ReauthenticateWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->ReauthenticateWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.reload" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->Reload( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.sendEmailVerification" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_action_code_settings_arg = args.at(1); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->SendEmailVerification( + app_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.unlink" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_provider_id_arg = args.at(1); + if (encodable_provider_id_arg.IsNull()) { + reply(WrapError("provider_id_arg unexpectedly null.")); + return; + } + const auto& provider_id_arg = + std::get(encodable_provider_id_arg); + api->Unlink(app_arg, provider_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_email_arg = args.at(1); + if (encodable_new_email_arg.IsNull()) { + reply(WrapError("new_email_arg unexpectedly null.")); + return; + } + const auto& new_email_arg = + std::get(encodable_new_email_arg); + api->UpdateEmail(app_arg, new_email_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_password_arg = args.at(1); + if (encodable_new_password_arg.IsNull()) { + reply(WrapError("new_password_arg unexpectedly null.")); + return; + } + const auto& new_password_arg = + std::get(encodable_new_password_arg); + api->UpdatePassword( + app_arg, new_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePhoneNumber" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->UpdatePhoneNumber( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateProfile" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_profile_arg = args.at(1); + if (encodable_profile_arg.IsNull()) { + reply(WrapError("profile_arg unexpectedly null.")); + return; + } + const auto& profile_arg = + std::any_cast( + std::get(encodable_profile_arg)); + api->UpdateProfile( + app_arg, profile_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.verifyBeforeUpdateEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_email_arg = args.at(1); + if (encodable_new_email_arg.IsNull()) { + reply(WrapError("new_email_arg unexpectedly null.")); + return; + } + const auto& new_email_arg = + std::get(encodable_new_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->VerifyBeforeUpdateEmail( + app_arg, new_email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAuthUserHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAuthUserHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorUserHostApi. +const ::flutter::StandardMessageCodec& MultiFactorUserHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorUserHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactorUserHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api) { + MultiFactorUserHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorUserHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollPhone" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_assertion_arg = args.at(1); + if (encodable_assertion_arg.IsNull()) { + reply(WrapError("assertion_arg unexpectedly null.")); + return; + } + const auto& assertion_arg = + std::any_cast( + std::get(encodable_assertion_arg)); + const auto& encodable_display_name_arg = args.at(2); + const auto* display_name_arg = + std::get_if(&encodable_display_name_arg); + api->EnrollPhone(app_arg, assertion_arg, display_name_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollTotp" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_assertion_id_arg = args.at(1); + if (encodable_assertion_id_arg.IsNull()) { + reply(WrapError("assertion_id_arg unexpectedly null.")); + return; + } + const auto& assertion_id_arg = + std::get(encodable_assertion_id_arg); + const auto& encodable_display_name_arg = args.at(2); + const auto* display_name_arg = + std::get_if(&encodable_display_name_arg); + api->EnrollTotp(app_arg, assertion_id_arg, display_name_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getSession" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->GetSession( + app_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.MultiFactorUserHostApi.unenroll" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_factor_uid_arg = args.at(1); + if (encodable_factor_uid_arg.IsNull()) { + reply(WrapError("factor_uid_arg unexpectedly null.")); + return; + } + const auto& factor_uid_arg = + std::get(encodable_factor_uid_arg); + api->Unenroll(app_arg, factor_uid_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getEnrolledFactors" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->GetEnrolledFactors( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorUserHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorUserHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactoResolverHostApi. +const ::flutter::StandardMessageCodec& MultiFactoResolverHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactoResolverHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactoResolverHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api) { + MultiFactoResolverHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactoResolverHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api, const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactoResolverHostApi.resolveSignIn" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler([api](const EncodableValue& message, + const ::flutter::MessageReply< + EncodableValue>& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_resolver_id_arg = args.at(0); + if (encodable_resolver_id_arg.IsNull()) { + reply(WrapError("resolver_id_arg unexpectedly null.")); + return; + } + const auto& resolver_id_arg = + std::get(encodable_resolver_id_arg); + const auto& encodable_assertion_arg = args.at(1); + const auto* assertion_arg = + encodable_assertion_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_assertion_arg))); + const auto& encodable_totp_assertion_id_arg = args.at(2); + const auto* totp_assertion_id_arg = + std::get_if(&encodable_totp_assertion_id_arg); + api->ResolveSignIn( + resolver_id_arg, assertion_arg, totp_assertion_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactoResolverHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactoResolverHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorTotpHostApi. +const ::flutter::StandardMessageCodec& MultiFactorTotpHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorTotpHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactorTotpHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api) { + MultiFactorTotpHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorTotpHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.generateSecret" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_session_id_arg = args.at(0); + if (encodable_session_id_arg.IsNull()) { + reply(WrapError("session_id_arg unexpectedly null.")); + return; + } + const auto& session_id_arg = + std::get(encodable_session_id_arg); + api->GenerateSecret( + session_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForEnrollment" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_one_time_password_arg = args.at(1); + if (encodable_one_time_password_arg.IsNull()) { + reply(WrapError("one_time_password_arg unexpectedly null.")); + return; + } + const auto& one_time_password_arg = + std::get(encodable_one_time_password_arg); + api->GetAssertionForEnrollment( + secret_key_arg, one_time_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForSignIn" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_enrollment_id_arg = args.at(0); + if (encodable_enrollment_id_arg.IsNull()) { + reply(WrapError("enrollment_id_arg unexpectedly null.")); + return; + } + const auto& enrollment_id_arg = + std::get(encodable_enrollment_id_arg); + const auto& encodable_one_time_password_arg = args.at(1); + if (encodable_one_time_password_arg.IsNull()) { + reply(WrapError("one_time_password_arg unexpectedly null.")); + return; + } + const auto& one_time_password_arg = + std::get(encodable_one_time_password_arg); + api->GetAssertionForSignIn( + enrollment_id_arg, one_time_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorTotpHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorTotpHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorTotpSecretHostApi. +const ::flutter::StandardMessageCodec& +MultiFactorTotpSecretHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages +// through the `binary_messenger`. +void MultiFactorTotpSecretHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api) { + MultiFactorTotpSecretHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorTotpSecretHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.generateQrCodeUrl" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_account_name_arg = args.at(1); + const auto* account_name_arg = + std::get_if(&encodable_account_name_arg); + const auto& encodable_issuer_arg = args.at(2); + const auto* issuer_arg = + std::get_if(&encodable_issuer_arg); + api->GenerateQrCodeUrl( + secret_key_arg, account_name_arg, issuer_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.openInOtpApp" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_qr_code_url_arg = args.at(1); + if (encodable_qr_code_url_arg.IsNull()) { + reply(WrapError("qr_code_url_arg unexpectedly null.")); + return; + } + const auto& qr_code_url_arg = + std::get(encodable_qr_code_url_arg); + api->OpenInOtpApp(secret_key_arg, qr_code_url_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorTotpSecretHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorTotpSecretHostApi::WrapError( + const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by GenerateInterfaces. +const ::flutter::StandardMessageCodec& GenerateInterfaces::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `GenerateInterfaces` to handle messages through the +// `binary_messenger`. +void GenerateInterfaces::SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api) { + GenerateInterfaces::SetUp(binary_messenger, api, ""); +} + +void GenerateInterfaces::SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "GenerateInterfaces.pigeonInterface" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_info_arg = args.at(0); + if (encodable_info_arg.IsNull()) { + reply(WrapError("info_arg unexpectedly null.")); + return; + } + const auto& info_arg = + std::any_cast( + std::get(encodable_info_arg)); + std::optional output = + api->PigeonInterface(info_arg); + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue GenerateInterfaces::WrapError(std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue GenerateInterfaces::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +} // namespace firebase_auth_windows diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h new file mode 100644 index 00000000..e1e1af02 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h @@ -0,0 +1,1531 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_auth_windows { + +// Generated class from Pigeon. + +class FlutterError { + public: + explicit FlutterError(const std::string& code) : code_(code) {} + explicit FlutterError(const std::string& code, const std::string& message) + : code_(code), message_(message) {} + explicit FlutterError(const std::string& code, const std::string& message, + const ::flutter::EncodableValue& details) + : code_(code), message_(message), details_(details) {} + + const std::string& code() const { return code_; } + const std::string& message() const { return message_; } + const ::flutter::EncodableValue& details() const { return details_; } + + private: + std::string code_; + std::string message_; + ::flutter::EncodableValue details_; +}; + +template +class ErrorOr { + public: + ErrorOr(const T& rhs) : v_(rhs) {} + ErrorOr(const T&& rhs) : v_(std::move(rhs)) {} + ErrorOr(const FlutterError& rhs) : v_(rhs) {} + ErrorOr(const FlutterError&& rhs) : v_(std::move(rhs)) {} + + bool has_error() const { return std::holds_alternative(v_); } + const T& value() const { return std::get(v_); }; + const FlutterError& error() const { return std::get(v_); }; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + ErrorOr() = default; + T TakeValue() && { return std::get(std::move(v_)); } + + std::variant v_; +}; + +// The type of operation that generated the action code from calling +// [checkActionCode]. +enum class ActionCodeInfoOperation { + // Unknown operation. + kUnknown = 0, + // Password reset code generated via [sendPasswordResetEmail]. + kPasswordReset = 1, + // Email verification code generated via [User.sendEmailVerification]. + kVerifyEmail = 2, + // Email change revocation code generated via [User.updateEmail]. + kRecoverEmail = 3, + // Email sign in code generated via [sendSignInLinkToEmail]. + kEmailSignIn = 4, + // Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + kVerifyAndChangeEmail = 5, + // Action code for reverting second factor addition. + kRevertSecondFactorAddition = 6 +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalMultiFactorSession { + public: + // Constructs an object setting all fields. + explicit InternalMultiFactorSession(const std::string& id); + + const std::string& id() const; + void set_id(std::string_view value_arg); + + bool operator==(const InternalMultiFactorSession& other) const; + bool operator!=(const InternalMultiFactorSession& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalMultiFactorSession FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string id_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalPhoneMultiFactorAssertion { + public: + // Constructs an object setting all fields. + explicit InternalPhoneMultiFactorAssertion( + const std::string& verification_id, const std::string& verification_code); + + const std::string& verification_id() const; + void set_verification_id(std::string_view value_arg); + + const std::string& verification_code() const; + void set_verification_code(std::string_view value_arg); + + bool operator==(const InternalPhoneMultiFactorAssertion& other) const; + bool operator!=(const InternalPhoneMultiFactorAssertion& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalPhoneMultiFactorAssertion FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string verification_id_; + std::string verification_code_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalMultiFactorInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalMultiFactorInfo(double enrollment_timestamp, + const std::string& uid); + + // Constructs an object setting all fields. + explicit InternalMultiFactorInfo(const std::string* display_name, + double enrollment_timestamp, + const std::string* factor_id, + const std::string& uid, + const std::string* phone_number); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + double enrollment_timestamp() const; + void set_enrollment_timestamp(double value_arg); + + const std::string* factor_id() const; + void set_factor_id(const std::string_view* value_arg); + void set_factor_id(std::string_view value_arg); + + const std::string& uid() const; + void set_uid(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + bool operator==(const InternalMultiFactorInfo& other) const; + bool operator!=(const InternalMultiFactorInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalMultiFactorInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional display_name_; + double enrollment_timestamp_; + std::optional factor_id_; + std::string uid_; + std::optional phone_number_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class AuthPigeonFirebaseApp { + public: + // Constructs an object setting all non-nullable fields. + explicit AuthPigeonFirebaseApp(const std::string& app_name); + + // Constructs an object setting all fields. + explicit AuthPigeonFirebaseApp(const std::string& app_name, + const std::string* tenant_id, + const std::string* custom_auth_domain); + + const std::string& app_name() const; + void set_app_name(std::string_view value_arg); + + const std::string* tenant_id() const; + void set_tenant_id(const std::string_view* value_arg); + void set_tenant_id(std::string_view value_arg); + + const std::string* custom_auth_domain() const; + void set_custom_auth_domain(const std::string_view* value_arg); + void set_custom_auth_domain(std::string_view value_arg); + + bool operator==(const AuthPigeonFirebaseApp& other) const; + bool operator!=(const AuthPigeonFirebaseApp& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static AuthPigeonFirebaseApp FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string app_name_; + std::optional tenant_id_; + std::optional custom_auth_domain_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeInfoData { + public: + // Constructs an object setting all non-nullable fields. + InternalActionCodeInfoData(); + + // Constructs an object setting all fields. + explicit InternalActionCodeInfoData(const std::string* email, + const std::string* previous_email); + + const std::string* email() const; + void set_email(const std::string_view* value_arg); + void set_email(std::string_view value_arg); + + const std::string* previous_email() const; + void set_previous_email(const std::string_view* value_arg); + void set_previous_email(std::string_view value_arg); + + bool operator==(const InternalActionCodeInfoData& other) const; + bool operator!=(const InternalActionCodeInfoData& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeInfoData FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalActionCodeInfo; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional email_; + std::optional previous_email_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeInfo { + public: + // Constructs an object setting all fields. + explicit InternalActionCodeInfo(const ActionCodeInfoOperation& operation, + const InternalActionCodeInfoData& data); + + ~InternalActionCodeInfo() = default; + InternalActionCodeInfo(const InternalActionCodeInfo& other); + InternalActionCodeInfo& operator=(const InternalActionCodeInfo& other); + InternalActionCodeInfo(InternalActionCodeInfo&& other) = default; + InternalActionCodeInfo& operator=(InternalActionCodeInfo&& other) noexcept = + default; + const ActionCodeInfoOperation& operation() const; + void set_operation(const ActionCodeInfoOperation& value_arg); + + const InternalActionCodeInfoData& data() const; + void set_data(const InternalActionCodeInfoData& value_arg); + + bool operator==(const InternalActionCodeInfo& other) const; + bool operator!=(const InternalActionCodeInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + ActionCodeInfoOperation operation_; + std::unique_ptr data_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAdditionalUserInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAdditionalUserInfo(bool is_new_user); + + // Constructs an object setting all fields. + explicit InternalAdditionalUserInfo(bool is_new_user, + const std::string* provider_id, + const std::string* username, + const std::string* authorization_code, + const ::flutter::EncodableMap* profile); + + bool is_new_user() const; + void set_is_new_user(bool value_arg); + + const std::string* provider_id() const; + void set_provider_id(const std::string_view* value_arg); + void set_provider_id(std::string_view value_arg); + + const std::string* username() const; + void set_username(const std::string_view* value_arg); + void set_username(std::string_view value_arg); + + const std::string* authorization_code() const; + void set_authorization_code(const std::string_view* value_arg); + void set_authorization_code(std::string_view value_arg); + + const ::flutter::EncodableMap* profile() const; + void set_profile(const ::flutter::EncodableMap* value_arg); + void set_profile(const ::flutter::EncodableMap& value_arg); + + bool operator==(const InternalAdditionalUserInfo& other) const; + bool operator!=(const InternalAdditionalUserInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAdditionalUserInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + bool is_new_user_; + std::optional provider_id_; + std::optional username_; + std::optional authorization_code_; + std::optional<::flutter::EncodableMap> profile_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAuthCredential { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAuthCredential(const std::string& provider_id, + const std::string& sign_in_method, + int64_t native_id); + + // Constructs an object setting all fields. + explicit InternalAuthCredential(const std::string& provider_id, + const std::string& sign_in_method, + int64_t native_id, + const std::string* access_token); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const std::string& sign_in_method() const; + void set_sign_in_method(std::string_view value_arg); + + int64_t native_id() const; + void set_native_id(int64_t value_arg); + + const std::string* access_token() const; + void set_access_token(const std::string_view* value_arg); + void set_access_token(std::string_view value_arg); + + bool operator==(const InternalAuthCredential& other) const; + bool operator!=(const InternalAuthCredential& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAuthCredential FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::string sign_in_method_; + int64_t native_id_; + std::optional access_token_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalUserInfo(const std::string& uid, bool is_anonymous, + bool is_email_verified); + + // Constructs an object setting all fields. + explicit InternalUserInfo( + const std::string& uid, const std::string* email, + const std::string* display_name, const std::string* photo_url, + const std::string* phone_number, bool is_anonymous, + bool is_email_verified, const std::string* provider_id, + const std::string* tenant_id, const std::string* refresh_token, + const int64_t* creation_timestamp, const int64_t* last_sign_in_timestamp); + + const std::string& uid() const; + void set_uid(std::string_view value_arg); + + const std::string* email() const; + void set_email(const std::string_view* value_arg); + void set_email(std::string_view value_arg); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + const std::string* photo_url() const; + void set_photo_url(const std::string_view* value_arg); + void set_photo_url(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + bool is_anonymous() const; + void set_is_anonymous(bool value_arg); + + bool is_email_verified() const; + void set_is_email_verified(bool value_arg); + + const std::string* provider_id() const; + void set_provider_id(const std::string_view* value_arg); + void set_provider_id(std::string_view value_arg); + + const std::string* tenant_id() const; + void set_tenant_id(const std::string_view* value_arg); + void set_tenant_id(std::string_view value_arg); + + const std::string* refresh_token() const; + void set_refresh_token(const std::string_view* value_arg); + void set_refresh_token(std::string_view value_arg); + + const int64_t* creation_timestamp() const; + void set_creation_timestamp(const int64_t* value_arg); + void set_creation_timestamp(int64_t value_arg); + + const int64_t* last_sign_in_timestamp() const; + void set_last_sign_in_timestamp(const int64_t* value_arg); + void set_last_sign_in_timestamp(int64_t value_arg); + + bool operator==(const InternalUserInfo& other) const; + bool operator!=(const InternalUserInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserDetails; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string uid_; + std::optional email_; + std::optional display_name_; + std::optional photo_url_; + std::optional phone_number_; + bool is_anonymous_; + bool is_email_verified_; + std::optional provider_id_; + std::optional tenant_id_; + std::optional refresh_token_; + std::optional creation_timestamp_; + std::optional last_sign_in_timestamp_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserDetails { + public: + // Constructs an object setting all fields. + explicit InternalUserDetails(const InternalUserInfo& user_info, + const ::flutter::EncodableList& provider_data); + + ~InternalUserDetails() = default; + InternalUserDetails(const InternalUserDetails& other); + InternalUserDetails& operator=(const InternalUserDetails& other); + InternalUserDetails(InternalUserDetails&& other) = default; + InternalUserDetails& operator=(InternalUserDetails&& other) noexcept = + default; + const InternalUserInfo& user_info() const; + void set_user_info(const InternalUserInfo& value_arg); + + const ::flutter::EncodableList& provider_data() const; + void set_provider_data(const ::flutter::EncodableList& value_arg); + + bool operator==(const InternalUserDetails& other) const; + bool operator!=(const InternalUserDetails& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserDetails FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::unique_ptr user_info_; + ::flutter::EncodableList provider_data_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserCredential { + public: + // Constructs an object setting all non-nullable fields. + InternalUserCredential(); + + // Constructs an object setting all fields. + explicit InternalUserCredential( + const InternalUserDetails* user, + const InternalAdditionalUserInfo* additional_user_info, + const InternalAuthCredential* credential); + + ~InternalUserCredential() = default; + InternalUserCredential(const InternalUserCredential& other); + InternalUserCredential& operator=(const InternalUserCredential& other); + InternalUserCredential(InternalUserCredential&& other) = default; + InternalUserCredential& operator=(InternalUserCredential&& other) noexcept = + default; + const InternalUserDetails* user() const; + void set_user(const InternalUserDetails* value_arg); + void set_user(const InternalUserDetails& value_arg); + + const InternalAdditionalUserInfo* additional_user_info() const; + void set_additional_user_info(const InternalAdditionalUserInfo* value_arg); + void set_additional_user_info(const InternalAdditionalUserInfo& value_arg); + + const InternalAuthCredential* credential() const; + void set_credential(const InternalAuthCredential* value_arg); + void set_credential(const InternalAuthCredential& value_arg); + + bool operator==(const InternalUserCredential& other) const; + bool operator!=(const InternalUserCredential& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserCredential FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::unique_ptr user_; + std::unique_ptr additional_user_info_; + std::unique_ptr credential_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAuthCredentialInput { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAuthCredentialInput(const std::string& provider_id, + const std::string& sign_in_method); + + // Constructs an object setting all fields. + explicit InternalAuthCredentialInput(const std::string& provider_id, + const std::string& sign_in_method, + const std::string* token, + const std::string* access_token); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const std::string& sign_in_method() const; + void set_sign_in_method(std::string_view value_arg); + + const std::string* token() const; + void set_token(const std::string_view* value_arg); + void set_token(std::string_view value_arg); + + const std::string* access_token() const; + void set_access_token(const std::string_view* value_arg); + void set_access_token(std::string_view value_arg); + + bool operator==(const InternalAuthCredentialInput& other) const; + bool operator!=(const InternalAuthCredentialInput& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAuthCredentialInput FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::string sign_in_method_; + std::optional token_; + std::optional access_token_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeSettings { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalActionCodeSettings(const std::string& url, + bool handle_code_in_app, + bool android_install_app); + + // Constructs an object setting all fields. + explicit InternalActionCodeSettings( + const std::string& url, const std::string* dynamic_link_domain, + bool handle_code_in_app, const std::string* i_o_s_bundle_id, + const std::string* android_package_name, bool android_install_app, + const std::string* android_minimum_version, + const std::string* link_domain); + + const std::string& url() const; + void set_url(std::string_view value_arg); + + const std::string* dynamic_link_domain() const; + void set_dynamic_link_domain(const std::string_view* value_arg); + void set_dynamic_link_domain(std::string_view value_arg); + + bool handle_code_in_app() const; + void set_handle_code_in_app(bool value_arg); + + const std::string* i_o_s_bundle_id() const; + void set_i_o_s_bundle_id(const std::string_view* value_arg); + void set_i_o_s_bundle_id(std::string_view value_arg); + + const std::string* android_package_name() const; + void set_android_package_name(const std::string_view* value_arg); + void set_android_package_name(std::string_view value_arg); + + bool android_install_app() const; + void set_android_install_app(bool value_arg); + + const std::string* android_minimum_version() const; + void set_android_minimum_version(const std::string_view* value_arg); + void set_android_minimum_version(std::string_view value_arg); + + const std::string* link_domain() const; + void set_link_domain(const std::string_view* value_arg); + void set_link_domain(std::string_view value_arg); + + bool operator==(const InternalActionCodeSettings& other) const; + bool operator!=(const InternalActionCodeSettings& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeSettings FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string url_; + std::optional dynamic_link_domain_; + bool handle_code_in_app_; + std::optional i_o_s_bundle_id_; + std::optional android_package_name_; + bool android_install_app_; + std::optional android_minimum_version_; + std::optional link_domain_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalFirebaseAuthSettings { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing); + + // Constructs an object setting all fields. + explicit InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing, + const std::string* user_access_group, const std::string* phone_number, + const std::string* sms_code, const bool* force_recaptcha_flow); + + bool app_verification_disabled_for_testing() const; + void set_app_verification_disabled_for_testing(bool value_arg); + + const std::string* user_access_group() const; + void set_user_access_group(const std::string_view* value_arg); + void set_user_access_group(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + const std::string* sms_code() const; + void set_sms_code(const std::string_view* value_arg); + void set_sms_code(std::string_view value_arg); + + const bool* force_recaptcha_flow() const; + void set_force_recaptcha_flow(const bool* value_arg); + void set_force_recaptcha_flow(bool value_arg); + + bool operator==(const InternalFirebaseAuthSettings& other) const; + bool operator!=(const InternalFirebaseAuthSettings& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalFirebaseAuthSettings FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + bool app_verification_disabled_for_testing_; + std::optional user_access_group_; + std::optional phone_number_; + std::optional sms_code_; + std::optional force_recaptcha_flow_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalSignInProvider { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalSignInProvider(const std::string& provider_id); + + // Constructs an object setting all fields. + explicit InternalSignInProvider( + const std::string& provider_id, const ::flutter::EncodableList* scopes, + const ::flutter::EncodableMap* custom_parameters); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const ::flutter::EncodableList* scopes() const; + void set_scopes(const ::flutter::EncodableList* value_arg); + void set_scopes(const ::flutter::EncodableList& value_arg); + + const ::flutter::EncodableMap* custom_parameters() const; + void set_custom_parameters(const ::flutter::EncodableMap* value_arg); + void set_custom_parameters(const ::flutter::EncodableMap& value_arg); + + bool operator==(const InternalSignInProvider& other) const; + bool operator!=(const InternalSignInProvider& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalSignInProvider FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::optional<::flutter::EncodableList> scopes_; + std::optional<::flutter::EncodableMap> custom_parameters_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalVerifyPhoneNumberRequest { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalVerifyPhoneNumberRequest(int64_t timeout); + + // Constructs an object setting all fields. + explicit InternalVerifyPhoneNumberRequest( + const std::string* phone_number, int64_t timeout, + const int64_t* force_resending_token, + const std::string* auto_retrieved_sms_code_for_testing, + const std::string* multi_factor_info_id, + const std::string* multi_factor_session_id); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + int64_t timeout() const; + void set_timeout(int64_t value_arg); + + const int64_t* force_resending_token() const; + void set_force_resending_token(const int64_t* value_arg); + void set_force_resending_token(int64_t value_arg); + + const std::string* auto_retrieved_sms_code_for_testing() const; + void set_auto_retrieved_sms_code_for_testing( + const std::string_view* value_arg); + void set_auto_retrieved_sms_code_for_testing(std::string_view value_arg); + + const std::string* multi_factor_info_id() const; + void set_multi_factor_info_id(const std::string_view* value_arg); + void set_multi_factor_info_id(std::string_view value_arg); + + const std::string* multi_factor_session_id() const; + void set_multi_factor_session_id(const std::string_view* value_arg); + void set_multi_factor_session_id(std::string_view value_arg); + + bool operator==(const InternalVerifyPhoneNumberRequest& other) const; + bool operator!=(const InternalVerifyPhoneNumberRequest& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalVerifyPhoneNumberRequest FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional phone_number_; + int64_t timeout_; + std::optional force_resending_token_; + std::optional auto_retrieved_sms_code_for_testing_; + std::optional multi_factor_info_id_; + std::optional multi_factor_session_id_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalIdTokenResult { + public: + // Constructs an object setting all non-nullable fields. + InternalIdTokenResult(); + + // Constructs an object setting all fields. + explicit InternalIdTokenResult(const std::string* token, + const int64_t* expiration_timestamp, + const int64_t* auth_timestamp, + const int64_t* issued_at_timestamp, + const std::string* sign_in_provider, + const ::flutter::EncodableMap* claims, + const std::string* sign_in_second_factor); + + const std::string* token() const; + void set_token(const std::string_view* value_arg); + void set_token(std::string_view value_arg); + + const int64_t* expiration_timestamp() const; + void set_expiration_timestamp(const int64_t* value_arg); + void set_expiration_timestamp(int64_t value_arg); + + const int64_t* auth_timestamp() const; + void set_auth_timestamp(const int64_t* value_arg); + void set_auth_timestamp(int64_t value_arg); + + const int64_t* issued_at_timestamp() const; + void set_issued_at_timestamp(const int64_t* value_arg); + void set_issued_at_timestamp(int64_t value_arg); + + const std::string* sign_in_provider() const; + void set_sign_in_provider(const std::string_view* value_arg); + void set_sign_in_provider(std::string_view value_arg); + + const ::flutter::EncodableMap* claims() const; + void set_claims(const ::flutter::EncodableMap* value_arg); + void set_claims(const ::flutter::EncodableMap& value_arg); + + const std::string* sign_in_second_factor() const; + void set_sign_in_second_factor(const std::string_view* value_arg); + void set_sign_in_second_factor(std::string_view value_arg); + + bool operator==(const InternalIdTokenResult& other) const; + bool operator!=(const InternalIdTokenResult& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalIdTokenResult FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional token_; + std::optional expiration_timestamp_; + std::optional auth_timestamp_; + std::optional issued_at_timestamp_; + std::optional sign_in_provider_; + std::optional<::flutter::EncodableMap> claims_; + std::optional sign_in_second_factor_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserProfile { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalUserProfile(bool display_name_changed, + bool photo_url_changed); + + // Constructs an object setting all fields. + explicit InternalUserProfile(const std::string* display_name, + const std::string* photo_url, + bool display_name_changed, + bool photo_url_changed); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + const std::string* photo_url() const; + void set_photo_url(const std::string_view* value_arg); + void set_photo_url(std::string_view value_arg); + + bool display_name_changed() const; + void set_display_name_changed(bool value_arg); + + bool photo_url_changed() const; + void set_photo_url_changed(bool value_arg); + + bool operator==(const InternalUserProfile& other) const; + bool operator!=(const InternalUserProfile& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserProfile FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional display_name_; + std::optional photo_url_; + bool display_name_changed_; + bool photo_url_changed_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalTotpSecret { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalTotpSecret(const std::string& secret_key); + + // Constructs an object setting all fields. + explicit InternalTotpSecret(const int64_t* code_interval_seconds, + const int64_t* code_length, + const int64_t* enrollment_completion_deadline, + const std::string* hashing_algorithm, + const std::string& secret_key); + + const int64_t* code_interval_seconds() const; + void set_code_interval_seconds(const int64_t* value_arg); + void set_code_interval_seconds(int64_t value_arg); + + const int64_t* code_length() const; + void set_code_length(const int64_t* value_arg); + void set_code_length(int64_t value_arg); + + const int64_t* enrollment_completion_deadline() const; + void set_enrollment_completion_deadline(const int64_t* value_arg); + void set_enrollment_completion_deadline(int64_t value_arg); + + const std::string* hashing_algorithm() const; + void set_hashing_algorithm(const std::string_view* value_arg); + void set_hashing_algorithm(std::string_view value_arg); + + const std::string& secret_key() const; + void set_secret_key(std::string_view value_arg); + + bool operator==(const InternalTotpSecret& other) const; + bool operator!=(const InternalTotpSecret& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalTotpSecret FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional code_interval_seconds_; + std::optional code_length_; + std::optional enrollment_completion_deadline_; + std::optional hashing_algorithm_; + std::string secret_key_; +}; + +class PigeonInternalCodecSerializer + : public ::flutter::StandardCodecSerializer { + public: + PigeonInternalCodecSerializer(); + inline static PigeonInternalCodecSerializer& GetInstance() { + static PigeonInternalCodecSerializer sInstance; + return sInstance; + } + + void WriteValue(const ::flutter::EncodableValue& value, + ::flutter::ByteStreamWriter* stream) const override; + + protected: + ::flutter::EncodableValue ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const override; +}; + +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAuthHostApi { + public: + FirebaseAuthHostApi(const FirebaseAuthHostApi&) = delete; + FirebaseAuthHostApi& operator=(const FirebaseAuthHostApi&) = delete; + virtual ~FirebaseAuthHostApi() {} + virtual void RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) = 0; + virtual void ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) = 0; + virtual void CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) = 0; + virtual void SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void SignInWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) = 0; + virtual void SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) = 0; + virtual void SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) = 0; + virtual void SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) = 0; + virtual void SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + virtual void SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) = 0; + virtual void SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) = 0; + virtual void SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) = 0; + virtual void VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) = 0; + virtual void RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) = 0; + virtual void RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) = 0; + virtual void InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + + // The codec used by FirebaseAuthHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAuthHostApi` to handle messages through the + // `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAuthHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAuthUserHostApi { + public: + FirebaseAuthUserHostApi(const FirebaseAuthUserHostApi&) = delete; + FirebaseAuthUserHostApi& operator=(const FirebaseAuthUserHostApi&) = delete; + virtual ~FirebaseAuthUserHostApi() {} + virtual void Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) = 0; + virtual void LinkWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + virtual void Unlink( + const AuthPigeonFirebaseApp& app, const std::string& provider_id, + std::function reply)> result) = 0; + virtual void UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) = 0; + virtual void UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) = 0; + virtual void UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) = 0; + virtual void VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + + // The codec used by FirebaseAuthUserHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAuthUserHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorUserHostApi { + public: + MultiFactorUserHostApi(const MultiFactorUserHostApi&) = delete; + MultiFactorUserHostApi& operator=(const MultiFactorUserHostApi&) = delete; + virtual ~MultiFactorUserHostApi() {} + virtual void EnrollPhone( + const AuthPigeonFirebaseApp& app, + const InternalPhoneMultiFactorAssertion& assertion, + const std::string* display_name, + std::function reply)> result) = 0; + virtual void EnrollTotp( + const AuthPigeonFirebaseApp& app, const std::string& assertion_id, + const std::string* display_name, + std::function reply)> result) = 0; + virtual void GetSession( + const AuthPigeonFirebaseApp& app, + std::function reply)> + result) = 0; + virtual void Unenroll( + const AuthPigeonFirebaseApp& app, const std::string& factor_uid, + std::function reply)> result) = 0; + virtual void GetEnrolledFactors( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + + // The codec used by MultiFactorUserHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorUserHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorUserHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactoResolverHostApi { + public: + MultiFactoResolverHostApi(const MultiFactoResolverHostApi&) = delete; + MultiFactoResolverHostApi& operator=(const MultiFactoResolverHostApi&) = + delete; + virtual ~MultiFactoResolverHostApi() {} + virtual void ResolveSignIn( + const std::string& resolver_id, + const InternalPhoneMultiFactorAssertion* assertion, + const std::string* totp_assertion_id, + std::function reply)> result) = 0; + + // The codec used by MultiFactoResolverHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactoResolverHostApi` to handle messages + // through the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactoResolverHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorTotpHostApi { + public: + MultiFactorTotpHostApi(const MultiFactorTotpHostApi&) = delete; + MultiFactorTotpHostApi& operator=(const MultiFactorTotpHostApi&) = delete; + virtual ~MultiFactorTotpHostApi() {} + virtual void GenerateSecret( + const std::string& session_id, + std::function reply)> result) = 0; + virtual void GetAssertionForEnrollment( + const std::string& secret_key, const std::string& one_time_password, + std::function reply)> result) = 0; + virtual void GetAssertionForSignIn( + const std::string& enrollment_id, const std::string& one_time_password, + std::function reply)> result) = 0; + + // The codec used by MultiFactorTotpHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorTotpHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorTotpHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorTotpSecretHostApi { + public: + MultiFactorTotpSecretHostApi(const MultiFactorTotpSecretHostApi&) = delete; + MultiFactorTotpSecretHostApi& operator=(const MultiFactorTotpSecretHostApi&) = + delete; + virtual ~MultiFactorTotpSecretHostApi() {} + virtual void GenerateQrCodeUrl( + const std::string& secret_key, const std::string* account_name, + const std::string* issuer, + std::function reply)> result) = 0; + virtual void OpenInOtpApp( + const std::string& secret_key, const std::string& qr_code_url, + std::function reply)> result) = 0; + + // The codec used by MultiFactorTotpSecretHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages + // through the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorTotpSecretHostApi() = default; +}; +// Only used to generate the object interface that are use outside of the Pigeon +// interface +// +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class GenerateInterfaces { + public: + GenerateInterfaces(const GenerateInterfaces&) = delete; + GenerateInterfaces& operator=(const GenerateInterfaces&) = delete; + virtual ~GenerateInterfaces() {} + virtual std::optional PigeonInterface( + const InternalMultiFactorInfo& info) = 0; + + // The codec used by GenerateInterfaces. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `GenerateInterfaces` to handle messages through the + // `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + GenerateInterfaces() = default; +}; +} // namespace firebase_auth_windows +#endif // PIGEON_MESSAGES_G_H_ diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in new file mode 100644 index 00000000..3a8915c4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_auth_windows { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_auth_windows + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp new file mode 100644 index 00000000..7c8110cf --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp @@ -0,0 +1,47 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_auth_plugin.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_auth { +namespace test { + +namespace { + +using flutter::EncodableMap; +using flutter::EncodableValue; +using flutter::MethodCall; +using flutter::MethodResultFunctions; + +} // namespace + +TEST(FirebaseAuthPlugin, GetPlatformVersion) { + FirebaseAuthPlugin plugin; + // Save the reply value from the success callback. + std::string result_string; + plugin.HandleMethodCall( + MethodCall("getPlatformVersion", std::make_unique()), + std::make_unique>( + [&result_string](const EncodableValue* result) { + result_string = std::get(*result); + }, + nullptr, nullptr)); + + // Since the exact string varies by host, just ensure that it's a string + // with the expected format. + EXPECT_TRUE(result_string.rfind("Windows ", 0) == 0); +} + +} // namespace test +} // namespace firebase_auth diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/CHANGELOG.md b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/CHANGELOG.md new file mode 100644 index 00000000..20a205f9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/CHANGELOG.md @@ -0,0 +1,695 @@ +## 8.0.0 +* Updates minimum Flutter SDK to 3.38.1 +* Updates Dart SDK low bound to 3.10.0. +* Adds Swift Package Manager Support for the plugin. [PR 1395](https://github.com/googleads/googleads-mobile-flutter/pull/1395) +* Adds `isCollapsible` API. [FR 1294](https://github.com/googleads/googleads-mobile-flutter/issues/1294) +* Renamed method name to avoid possible name collision. [FR 1394](https://github.com/googleads/googleads-mobile-flutter/issues/1394) +* Migrated to use UISceneDelegate protocol. [Issue 1391](https://github.com/googleads/googleads-mobile-flutter/issues/1391) +* New to Anchored adaptive banner ads: + * The following APIs have been deprecated for their replacement: + * The `getCurrentOrientationAnchoredAdaptiveBannerAdSize` function is deprecated. Instead, use the `getLargeAnchoredAdaptiveBannerAdSize` function. + * The `getAnchoredAdaptiveBannerAdSize` function is deprecated. Instead, use the `getLargeAnchoredAdaptiveBannerAdSizeWithOrientation` function. +* Updates GMA [Android](https://developers.google.com/admob/android/rel-notes) dependency to 25.1.0 +* Updates GMA [iOS](https://developers.google.com/admob/ios/rel-notes) dependency to 13.2.0 +* Uses latest UMP SDK: + * [Android](https://developers.google.com/admob/android/privacy/release-notes) UMP SDK version 4.0.0. + * [iOS](https://developers.google.com/admob/ios/privacy/download#release_notes) UMP SDK version 3.1.0. + +## 7.0.0 +* Added character limits expected for Native Ad Templates. Issues [1243](https://github.com/googleads/googleads-mobile-flutter/issues/1243) and [1332](https://github.com/googleads/googleads-mobile-flutter/issues/1332) +* Fixed padding for Native Ads small template. [Issue 1357](https://github.com/googleads/googleads-mobile-flutter/issues/1357) +* Updated to use Gradle plugin 9.2.1 [Issue 1361](https://github.com/googleads/googleads-mobile-flutter/issues/1361) +* Updates dependencies. [Issue 1366](https://github.com/googleads/googleads-mobile-flutter/issues/1366) +* Updates GMA [Android](https://developers.google.com/admob/android/rel-notes) dependency to 24.9.0 +* Updates GMA [iOS](https://developers.google.com/admob/ios/rel-notes) dependency to 12.14.0 +* Uses latest UMP SDK: + * [Android](https://developers.google.com/admob/android/privacy/release-notes) UMP SDK version 4.0.0. + * [iOS](https://developers.google.com/admob/ios/privacy/download#release_notes) UMP SDK version 3.1.0. + +## 6.0.0 +* Updates minimum Flutter SDK to 3.27.0 +* Updates Dart SDK low bound to 3.6.0. +* Fixes AdMessageCodec deprecated API issue: https://github.com/googleads/googleads-mobile-flutter/issues/1242 +* Adds a new API (`isMounted`) to support recycling ad banners +* Updates GMA [Android](https://developers.google.com/admob/android/rel-notes) dependency to 24.1.0 +* Updates GMA [iOS](https://developers.google.com/admob/ios/rel-notes) dependency to 12.2.0 +* Uses latest UMP SDK: + * [Android](https://developers.google.com/admob/android/privacy/release-notes) UMP SDK version 3.2.0. + * [iOS](https://developers.google.com/admob/ios/privacy/download#release_notes) UMP SDK version 3.0.0. + +## 5.3.1 +* Fixes dart SDK low bound building issues: https://github.com/googleads/googleads-mobile-flutter/issues/1234 + +## 5.3.0 +* Updated WebView Flutter Android dependency +* Adds support for the new Debug Geography enums for the UMP SDK: + * [Android](https://developers.google.com/admob/android/privacy/release-notes) UMP SDK version 3.1.0. + * [iOS](https://developers.google.com/admob/ios/privacy/download#release_notes) UMP SDK version 2.7.0. +* Updates GMA [iOS](https://developers.google.com/admob/ios/rel-notes) dependency to 11.13.0 +* Updates GMA [Android](https://developers.google.com/admob/android/rel-notes) dependency to 23.6.0 + +## 5.2.0 +* Removed use of rootViewController for iOS GMA SDK which solved issues like + https://github.com/googleads/googleads-mobile-flutter/issues/1146 and https://github.com/googleads/googleads-mobile-flutter/issues/700. +* Android GMA SDK is now initialized on a background thread. +* Updates GMA [iOS](https://developers.google.com/admob/ios/rel-notes) dependency to 11.10.0 +* Updates GMA [Android](https://developers.google.com/admob/android/rel-notes) dependency to 23.4.0 + +## 5.1.0 +* Adds support for APIs from the [Android](https://developers.google.com/admob/android/privacy/release-notes) UMP SDK version 2.2.0. +* Adds support for APIs from the [iOS](https://developers.google.com/admob/ios/privacy/download#release_notes) UMP SDK version 2.4.0. + +## 5.0.0 +* Adds `MediationExtras` class to include parameters when using mediation through the implementation of `FlutterMediationExtras` in Android and `FlutterMediationExtras` in iOS. +* Deprecates `MediationNetworkExtrasProvider` and `FLTMediationNetworkExtrasProvider`. +* Removed the `orientation` parameter for the AppOpen Ad format. +* Bumps minimum Android SDK version to 21. +* Updates GMA iOS dependency to 11.2.0 +* Updates GMA Android dependency to 23.0.0 + +## 4.0.0 +* The minimum supported Flutter version is now 3.7.0. +* Removes `visibility_detector` as a dependency, and the workaround added in + https://github.com/googleads/googleads-mobile-flutter/pull/610. +* Adds null checks for Ad Ids for Android in + https://github.com/googleads/googleads-mobile-flutter/pull/967 +* Updated Android dependencies in https://github.com/googleads/googleads-mobile-flutter/pull/843 +* Updates GMA iOS dependency to 10.11.0 +* Updates GMA Android dependency to 22.5.0 + +## 3.1.0 +* Updates GMA iOS dependency to 10.9.0 +* Adds explicit UMP SDK 2.1.0 dependency for Android. +* Fixes https://github.com/googleads/googleads-mobile-flutter/issues/735 + +## 3.0.0 +* Adds support for `MobileAds.registerWebView()`. This API supports in-app ad monetization for + `WebView`s. You can read more in the [android](https://developers.google.com/admob/android/webview) + or [iOS](https://developers.google.com/admob/ios/webview) documentation. + This plugin now depends on [webview_flutter](https://pub.dev/packages/webview_flutter), + [webview_flutter_wkwebview](https://pub.dev/packages/webview_flutter_wkwebview), and + [webview_flutter_android](https://pub.dev/packages/webview_flutter_android) +* Updates Android GMA dependency to 22.0.0 and iOS dependency to 10.4.0 +* Fixes https://github.com/googleads/googleads-mobile-flutter/issues/700 +* Updates minimum supported Xcode version to 14.1. + +## 2.4.0 +* Adds support for native templates, which are predefined layouts for native ads. + * `NativeAd` has a new optional parameter, `nativeTemplateStyle` of type `NativeTemplateStyle`. + If provided, the plugin will inflate and style a platform native ad view for you, instead of + requiring you to write and register a NativeAdFactory (android) or FLTNativeAdFactory (iOS). +* Adds a new flag, AdWidget.optOutOfVisibilityDetectorWorkaround. Setting this to true + lets you opt out of the fix added for https://github.com/googleads/googleads-mobile-flutter/issues/580, + which was resolved in Flutter 3.7.0. + +## 2.3.0 +* Updates GMA iOS dependency to 9.13 +* Updates GMA Android dependency to 21.3.0 +* Updates request agent string based on metadata in AndroidManifest.xml or Info.plist + +## 2.2.0 +* Updates GMA iOS dependency to 9.11.0. This fixes dependency issues in apps that + also depend on the latest version of Firebase: https://github.com/googleads/googleads-mobile-flutter/issues/673 +* Adds the field `responseExtras` to `ResponseInfo`. See `ResponseInfo` docs: + * https://developers.google.com/admob/flutter/response-info + * https://developers.google.com/ad-manager/mobile-ads-sdk/flutter/response-info +* Fixes a crash introduced in 2.1.0, [issue #675](https://github.com/googleads/googleads-mobile-flutter/issues/675) + +## 2.1.0 +* Updates GMA dependencies to 21.2.0 (Android) and 9.10.0 (iOS): +* Adds `loadedAdapterResponseInfo` to `ResponseInfo` and the following fields to + `AdapterResponseInfo`: + * adSourceID + * adSourceInstanceId + * adSourceInstanceName + * adSourceName +* Fixes [close button issue on iOS](https://github.com/googleads/googleads-mobile-flutter/issues/191) +## 2.0.1 +* Bug fix for [issue 580](https://github.com/googleads/googleads-mobile-flutter/issues/580). + Adds a workaround on Android to wait for the ad widget to become visible + before attaching the platform view. + +## 2.0.0 +* Updates GMA Android dependency to 21.0.0 and iOS to 9.6.0 +* Removes `credentials` from `AdapterResponseInfo`, which is replaced with + `adUnitMapping`. +* Removes `serverSideVerificationOptions` from `RewardedAd.load()` and + `RewardedInterstitialAd.load()`, replacing them with setters + `RewardedAd.setServerSideVerificationOptions()` and + `RewardedInterstitialAd.setServerSideVerificationOptions()`. This lets you + update the ssv after the ad is loaded. +* Removes static `testAdUnitId` parameters. See the + [Admob](https://developers.google.com/admob/flutter/test-ads) and + [AdManager](https://developers.google.com/ad-manager/mobile-ads-sdk/flutter/test-ads) + documentation for up to date test ad units. +* Removes `NativeAdListener.onNativeAdClicked`. You should use `onAdClicked` + instead, which present on all ad listeners. +* Removes `AdRequest.location` + +## 1.3.0 +* Adds support for programmatically opening the debug options menu using`MobileAds.openDebugMenu(String adUnitId)` +* Adds support for Ad inspector APIs. See the [AdMob](https://developers.google.com/admob/flutter/ad-inspector) + and [Ad Manager](https://developers.google.com/ad-manager/mobile-ads-sdk/flutter/ad-inspector) + sites for integration guides. +* Adds support for User Messaging Platform. See the [AdMob](https://developers.google.com/admob/flutter/eu-consent) + and [Ad Manager](https://developers.google.com/ad-manager/mobile-ads-sdk/flutter/eu-consent) + sites for integration guides. + +## 1.2.0 +* Set new minimum height for `FluidAdWidget`. + This is required after Flutter v2.11.0-0.1.pre because Android platform views + that have no size don't load. +* Update GMA Android dependency to 20.6.0 and iOS to 8.13.0. + * [Android release notes](https://developers.google.com/admob/android/rel-notes) + * [iOS release notes](https://developers.google.com/admob/ios/rel-notes) +* Deprecate `AdapterResponseInfo.credentials` in favor of `adUnitMapping` +* Deprecates `LocationParams` in `AdRequest` and `AdManagerAdRequest`. + +## 1.1.0 +* Adds support for [Rewarded Interstitial](https://support.google.com/admob/answer/9884467) (beta) ad format. +* Adds support for `onAdClicked` events to all ad formats. `NativeAdListener.onNativeAdClicked` is now deprecated. + * `FullScreenContentCallback` and `AdWithViewListeners` now have an `onAdClicked` event. +## 1.0.1 + +* Fix for [Issue 449](https://github.com/googleads/googleads-mobile-flutter/issues/449). + In `LocationParams`, time is now treated as an optional parameter on Android. +* Fix for [Issue 447](https://github.com/googleads/googleads-mobile-flutter/issues/447), + which affected mediation networks that require an Activity to be initialized on Android. + +## 1.0.0 + +* Mediation is now supported in beta. + * There are new APIs to support passing network extras to mediation adapters: + * [MediationNetworkExtrasProvider](https://github.com/googleads/googleads-mobile-flutter/blob/master/packages/google_mobile_ads/android/src/main/java/io/flutter/plugins/googlemobileads/MediationNetworkExtrasProvider.java) + on Android and [FLTMediationNetworkExtrasProvider](https://github.com/googleads/googleads-mobile-flutter/blob/master/packages/google_mobile_ads/ios/Classes/FLTConstants.h) on iOS + * See the mediation example app [README](https://github.com/googleads/googleads-mobile-flutter/blob/master/packages/mediation_example/README.md) + for more details on how to use these APIs. + +* Fix for Android 12 issue [#330](https://github.com/googleads/googleads-mobile-flutter/issues/330) + * This will break compilation on android if you do not already set `compileSdkVersion` to `31`, or override the WorkManager dependency to < 2.7.0: + ``` + dependencies { + implementation('androidx.work:work-runtime') { + version { + strictly '2.6.0' + } + } + } + ``` +* Fixes issue [#404](https://github.com/googleads/googleads-mobile-flutter/issues/404) + * Adds a new dart class, `AppStateEventNotifier`. You should subscribe to `AppStateEventNotifier.appStateStream` + instead of using `WidgetsBindingObserver` to listen to app foreground/background events. + * See the app open [example app](https://github.com/googleads/googleads-mobile-flutter/tree/master/packages/app_open_example) for a reference + on how to use the new API. + +* Adds a new parameter `extras` to `AdRequest` and `AdManagerAdRequest`. + * This can be used to pass additional signals to the AdMob adapter, such as + [CCPA](https://developers.google.com/admob/android/ccpa) signals. + * For example, to notify Google that [RDP](https://developers.google.com/admob/android/ccpa#rdp_signal) + should be enabled when constructing an ad request: + ```dart + AdRequest request = AdRequest(extras: {'rdp': '1'}); + ``` + +## 0.13.6 + +* Partial fix for [#265](https://github.com/googleads/googleads-mobile-flutter/issues/265). + * The partial fix allows you to load ads from a cached flutter engine in the add to app scenario, + but it only works the first time the engine is attached to an activity. + * Support for reusing the engine in another activity after the first one is destroyed is blocked + by this Flutter issue which affects all platform views: https://github.com/flutter/flutter/issues/88880. +* Adds support for getRequestConfiguration API + * [Android API reference](https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-requestconfiguration-getrequestconfiguration) + * [iOS API reference](https://developers.google.com/admob/ios/api/reference/Classes/GADMobileAds#requestconfiguration) +* Adds support for Fluid Ad Size (Ad Manager only) + * Fluid ads dynamically adjust their height based on their width. To help display them we've added a new + ad container, `FluidAdManagerBannerAd`, and a new widget `FluidAdWidget`. + * You can see the [fluid_example.dart](https://github.com/googleads/googleads-mobile-flutter/blob/master/packages/google_mobile_ads/example/lib/fluid_example.dart) for a reference of how to load and display a fluid ad. + * [Android API reference](https://developers.google.com/ad-manager/mobile-ads-sdk/android/native/styles#fluid_size) + * [iOS API reference](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/native/native-styles#fluid_size) +* Adds `AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize()` to support getting an `AnchoredAdaptiveBannerAdSize` in the current orientation. + * Previously the user had to specify an orientation (portrait / landscape) to create an AnchoredAdaptiveBannerAdSize. It has been made optional with this version. SDK will determine the current orientation of the device and return an appropriate AdSize. + * More information on anchored adaptive banners can be found here: + * [Admob android](https://developers.google.com/admob/android/banner/anchored-adaptive) + * [Admob iOS](https://developers.google.com/admob/ios/banner/anchored-adaptive) + * [Ad manager android](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner/anchored-adaptive) + * [Ad manager iOS](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner/anchored-adaptive) +* Adds support for inline adaptive banner ads. + * Inline adaptive banner ads are meant to be used in scrollable content. They are of variable height and can be as tall as the device screen. + They differ from Fluid ads in that they only resize once when the ad is loaded. + You can see the [inline_adaptive_example.dart](https://github.com/googleads/googleads-mobile-flutter/blob/master/packages/google_mobile_ads/example/lib/inline_adaptive_example.dart) for a reference of how to load and display + inline adaptive banners. + * More information on inline adaptive banners can be found here: + * [Admob android](https://developers.google.com/admob/android/banner/inline-adaptive) + * [Admob iOS](https://developers.google.com/admob/ios/banner/inline-adaptive) + * [Ad manager android](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner/inline-adaptive) + * [Ad manager iOS](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner/inline-adaptive) +* Fix for [#369](https://github.com/googleads/googleads-mobile-flutter/issues/369) + * Fixes setting the app volume in android (doesn't affect iOS). +* Adds support for setting location in `AdRequest` and `AdManagerAdRequest`. + * Both `AdRequest` and `AdManagerAdRequest` have a new param, `location`. + * Location data is not used to target Google Ads, but may be used by 3rd party ad networks. + * See other packages for getting the location. For example, https://pub.dev/packages/location. +* Adds `publisherProvidedId` to `AdManagerAdRequest` to support [publisher provided ids](https://support.google.com/admanager/answer/2880055). + +## 0.13.5 + +* Adds support for app open. + * Implementation guidance can be found [here](https://developers.google.com/admob/flutter/app-open). + * As a reference please also see the [example app](https://github.com/googleads/googleads-mobile-flutter/tree/master/packages/app_open_example). + * Best practices can be found [here](https://support.google.com/admob/answer/9341964?hl=en). + +## 0.13.4 + +* Adds support for muting and setting the volume level of the app. +* Visit the following links for more information: + * https://developers.google.com/admob/android/global-settings#video_ad_volume_control + * https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-void-setappvolume-float-volume +* Adds support for setting immersive mode for Rewarded and Interstitial Ads in Android. +* Visit the following links for more information: + * https://developers.google.com/android/reference/com/google/android/gms/ads/interstitial/InterstitialAd?hl=en#setImmersiveMode(boolean) + * https://developers.google.com/android/reference/com/google/android/gms/ads/rewarded/RewardedAd#setImmersiveMode(boolean) +* Adds support for disableSDKCrashReporting in iOS; disableMediationInitialization and getVersionString in both the platforms. + * https://developers.google.com/admob/ios/api/reference/Classes/GADMobileAds#-disablesdkcrashreporting + * iOS (disableMediationInitialization): https://developers.google.com/admob/ios/api/reference/Classes/GADMobileAds#-disablemediationinitialization + * Android (disableMediationAdapterInitialization): https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-void-disablemediationadapterinitialization-context-context + * https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#getVersionString() + +## 0.13.3 + +* Adds support for NativeAdOptions. More documentation also available for [Android](https://developers.google.com/admob/android/native/options) and [iOS](https://developers.google.com/admob/ios/native/options) + +## 0.13.2+1 + +* Fixes [Issue #130](https://github.com/googleads/googleads-mobile-flutter/issues/130) + +## 0.13.2 + +* Fixes a crash where [PlatformView.getView() returns null](https://github.com/googleads/googleads-mobile-flutter/issues/46) +* Fixes memory leaks on Android. +* Fixes a [crash on iOS](https://github.com/googleads/googleads-mobile-flutter/issues/138). +* Marks smart banner sizes as deprecated. Instead you should use adaptive banners. + +## 0.13.1 + +* Adds support for the paid event callback. + +## 0.13.0 + +* Updates GMA Android and iOS dependencies to 20.1.0 and 8.5.0, respectively. +* Renames APIs that use the `Publisher` prefix to `AdManager`. +* Rewarded and Interstitial ads now provide static `load` methods and a new `FullScreenContentCallback` for full screen events. +* Native ads use [GADNativeAdView](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/api/reference/Classes/GADNativeAdView) for iOS +and [NativeAdView](https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeAdView) on Android. +* Adds support for [ResponseInfo](https://developers.google.com/admob/android/response-info). +* Adds support for [same app key](https://developers.google.com/admob/ios/ios14#same_app_key) on iOS. +* Removes `testDevices` from `AdRequest`. Use `MobileAds.updateRequestConfiguration` to set test device ids. +* Removes `Ad.isLoaded()`. Instead you should use the `onAdLoaded` callback to track whether an ad is loaded. +* Removes need to call `Ad.dispose()` for Rewarded and Interstitial ads when they fail to load. + +## 0.12.2+1 + +* Fix anchored adaptive banner message corruption error. +* Update example app with better practices and adaptive banner. + +## 0.12.2 + +* Add support for anchored adaptive banners. + +## 0.12.1+1 + +* Fixes a [crash with Swift based native ads](https://github.com/googleads/googleads-mobile-flutter/issues/121) + +## 0.12.1 + +* Rewarded ads now take an optional `ServerSideVerification`, to support [custom data in rewarded ads](https://developers.google.com/admob/ios/rewarded-video-ssv#custom_data). + +## 0.12.0 + +* Migrated to null safety. Minimum Dart SDK version is bumped to 2.12.0. + +## 0.11.0+4 + +* Fixes a [bug](https://github.com/googleads/googleads-mobile-flutter/issues/47) where state is not properly cleaned up on hot restart. +* Update README and example app to appropriately dispose ads. + +## 0.11.0+3 + +* Fixes an [Android crash](https://github.com/googleads/googleads-mobile-flutter/issues/46) when reusing Native and Banner Ad objects. +* Fixes [iOS memory leaks](https://github.com/googleads/googleads-mobile-flutter/issues/69). +* Adds a section on Ad Manager to the README. +* Updates iOS setup in the README to include SKAdNetwork. + +## 0.11.0+2 + +* Set min Android version to `19`. +* Fixes bug that displayed "This AdWidget is already in the Widget tree". +* Update minimum gradle version. +* Add references to the [codelab](https://codelabs.developers.google.com/codelabs/admob-inline-ads-in-flutter#0) in the README. + +## 0.11.0+1 + +* Improve AdRequest documentation and fix README heading. + +## 0.11.0 +Open beta release of the Google Mobile Ads Flutter plugin. +Please see the [README](https://github.com/googleads/googleads-mobile-flutter/blob/master/README.md) for updated integration steps. + +* Package and file names have been renamed from `firebase_admob` to `google_mobile_ads`. + +* Removes support for legacy plugin APIs. + +* Removes Firebase dependencies. + +* Adds support for `RequestConfiguration` targeting APIs. + +* Adds support for Ad Manager key values, via the new `Publisher` ad containers. +See `PublisherBannerAd` and similar classes. + +* Shows warning if an `Ad` object is reused without being disposed. + +* Removes support for V1 embedding. + +* Add version to request agent. + +## 0.10.0 + +* Old Plugin API has been moved to `lib/firebase_admob_legacy.dart`. To keep using the old API change +`import 'package:firebase_admob/firebase_admob.dart';` to +`import 'package:firebase_admob/firebase_admob_legacy.dart';`. + +* Updated `RewardedAd` to the latest API. Instantiating and displaying a `RewardedAd` is now similar +to`InterstitialAd`. See README for more info. A simple example is shown below. +```dart +final RewardedAd myRewardedAd = RewardedAd( + adUnitId: RewardedAd.testAdUnitId, + request: AdRequest(), + listener: AdListener( + onAdLoaded: (Ad ad) => (ad as RewardedAd).show(), + ), +); +myRewardedAd.load(); +``` + +* Replacement of `MobileAdEvent` callbacks with improved `AdListener`. +```dart +BannerAd( + listener: (MobileAdEvent event) { + print("BannerAd event $event"); + }, +); +``` + +can be replaced by: + +```dart +BannerAd( + listener: AdListener( + onAdLoaded: (Ad ad) => print('$BannerAd loaded.'), + onAdFailedToLoad: (Ad ad) => print('$BannerAd failed to load.'), + ), +); +``` + +* `MobileAdTargeting` has been renamed to `AdRequest` to keep consistent with SDK. +* `MobileAd` has been renamed to `Ad`. + +* Fix smart banners on iOS. + - `AdSize.smartBanner` is for Android only. + - `AdSize.smartBannerPortrait` and `AdSize.smartBannerLandscape` are only for iOS. + - Use `Adsize.getSmartBanner(Orientation)` to get the correct value depending on platform. The + orientation can be retrieved using a `BuildContext`: +```dart +Orientation currentOrientation = MediaQuery.of(context).orientation; +``` + +* Removal of `show()` for `BannerAd` and `NativeAd` since they can now be displayed within a widget +tree. +* Showing of `InterstitialAd` and `RewardedAd` should now wait for `AdListener.onAdLoaded` callback +before calling `show()` as best practice: + +```dart +InterstitialAd( + adUnitId: InterstitialAd.testAdUnitId, + targetingInfo: targetingInfo, + listener: (MobileAdEvent event) { + print("InterstitialAd event $event"); + }, +) + ..load() + ..show(); +``` + +can be replaced by: + +```dart +final InterstatialAd interstitial = InterstatialAd( + adUnitId: InterstatialAd.testAdUnitId, + request: AdRequest(), + listener: AdListener( + onAdLoaded: (Ad ad) => (ad as InterstatialAd).show(), + ), +)..load(); +``` + +* `Ad.load()` no longer returns a boolean that only confirms the method was called successfully. + +## 0.9.3+4 + +* Bump Dart version requirement. + +## 0.9.3+3 + +* Provide a default `MobileAdTargetingInfo` for `RewardedVideoAd.load()`. `RewardedVideoAd.load()` +would inadvertently cause a crash if `MobileAdTargetingInfo` was excluded. + +## 0.9.3+2 + +* Fixed bug related to simultaneous ad loading behavior on iOS. + +## 0.9.3+1 + +* Modified README to reflect supporting Native Ads. + +## 0.9.3 + +* Support Native Ads on iOS. + +## 0.9.2+1 + +* Added note about required Google Service config files. + +## 0.9.2 + +* Add basic Native Ads support for Android. + +## 0.9.1+3 + +* Replace deprecated `getFlutterEngine` call on Android. + +## 0.9.1+2 + +* Make the pedantic dev_dependency explicit. + +## 0.9.1+1 + +* Enable custom parameters for rewarded video server-side verification callbacks. + +## 0.9.1 + +* Support v2 embedding. This will remain compatible with the original embedding and won't require + app migration. + +## 0.9.0+10 + +* Remove the deprecated `author:` field from pubspec.yaml +* Migrate the plugin to the pubspec platforms manifest. +* Bump the minimum Flutter version to 1.10.0. + +## 0.9.0+9 + +* Updated README instructions for contributing for consistency with other Flutterfire plugins. + +## 0.9.0+8 + +* Remove AndroidX warning. + +## 0.9.0+7 + +* Update Android gradle plugin, gradle, and Admob versions. +* Improvements to the Android implementation, fixing warnings about a possible null pointer exception. +* Fixed an issue where an advertisement could incorrectly remain displayed when transitioning to another screen. + +## 0.9.0+6 + +* Remove duplicate example from documentation. + +## 0.9.0+5 + +* Update documentation to reflect new repository location. + +## 0.9.0+4 + +* Add the ability to horizontally adjust the ads banner location by specifying a pixel offset from the centre. + +## 0.9.0+3 + +* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. + +## 0.9.0+2 + +* On Android, no longer crashes when registering the plugin if no activity is available. + +## 0.9.0+1 + +* Add missing template type parameter to `invokeMethod` calls. +* Bump minimum Flutter version to 1.5.0. + +## 0.9.0 + +* Update Android dependencies to latest. + +## 0.8.0+4 + +* Update documentation to add AdMob App ID in Info.plist +* Add iOS AdMob App ID in Info.plist in example project + +## 0.8.0+3 + +* Log messages about automatic configuration of the default app are now less confusing. + +## 0.8.0+2 + +* Remove categories. + +## 0.8.0+1 + +* Log a more detailed warning at build time about the previous AndroidX + migration. + +## 0.8.0 + +* **Breaking change**. Migrate from the deprecated original Android Support + Library to AndroidX. This shouldn't result in any functional changes, but it + requires any Android apps using this plugin to [also + migrate](https://developer.android.com/jetpack/androidx/migrate) if they're + using the original support library. + +## 0.7.0 + +* Mark Dart code as deprecated where the newer version AdMob deprecates features (Birthday, Gender, and Family targeting). +* Update gradle dependencies. +* Add documentation for new AndroidManifest requirements. + +## 0.6.1+1 + +* Bump Android dependencies to latest. +* __THIS WAS AN UNINTENTIONAL BREAKING CHANGE__. Users should consume 0.6.1 instead if they need the old API, or 0.7.0 for the bumped version. +* Guide how to fix crash with admob version 17.0.0 in README + +## 0.6.1 + +* listener on MobileAd shouldn't be final. +* Ad listeners can to be set in or out of Ad initialization. + +## 0.6.0 + +* Add nonPersonalizedAds option to MobileAdTargetingInfo + +## 0.5.7 + +* Bumped mockito dependency to pick up Dart 2 support. + +## 0.5.6 + +* Bump Android and Firebase dependency versions. + +## 0.5.5 + +* Updated Gradle tooling to match Android Studio 3.1.2. + +## 0.5.4+1 + +* Graduate to beta. + +## 0.5.4 + +* Fixed a bug that was causing rewarded video failure event to be called on the wrong listener. + +## 0.5.3 + +* Updated Google Play Services dependencies to version 15.0.0. +* Added handling of rewarded video completion event. + +## 0.5.2 + +* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. + +## 0.5.1 + +* Fixed Dart 2 type errors. + +## 0.5.0 + +* **Breaking change**. The BannerAd constructor now requires an AdSize + parameter. BannerAds can be created with AdSize.smartBanner, or one of + the other predefined AdSize values. Previously BannerAds were always + defined with the smartBanner size. + +## 0.4.0 + +* **Breaking change**. Set SDK constraints to match the Flutter beta release. + +## 0.3.2 + +* Fixed Dart 2 type errors. + +## 0.3.1 + +* Enabled use in Swift projects. + +## 0.3.0 + +* Added support for rewarded video ads. +* **Breaking change**. The properties and parameters named "unitId" in BannerAd + and InterstitialAd have been renamed to "adUnitId" to better match AdMob's + documentation and UI. + +## 0.2.3 + +* Simplified and upgraded Android project template to Android SDK 27. +* Updated package description. + +## 0.2.2 + +* Added platform-specific App IDs and ad unit IDs to example. +* Separated load and show functionality for interstitials in example. + +## 0.2.1 + +* Use safe area layout to place ad in iOS 11 + +## 0.2.0 + +* **Breaking change**. MobileAd TargetingInfo requestAgent is now hardcoded to 'flutter-alpha'. + +## 0.1.0 + +* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin + 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in + order to use this version of the plugin. Instructions can be found + [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). +* Relaxed GMS dependency to [11.4.0,12.0[ + +## 0.0.3 + +* Add FLT prefix to iOS types +* Change GMS dependency to 11.4.+ + +## 0.0.2 + +* Change GMS dependency to 11.+ + +## 0.0.1 + +* Initial Release: not ready for production use diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/LICENSE b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/README.md b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/README.md new file mode 100644 index 00000000..622eb3c9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/README.md @@ -0,0 +1,33 @@ +# Google Mobile Ads for Flutter + +[![google_mobile_ads](https://github.com/googleads/googleads-mobile-flutter/actions/workflows/google_mobile_ads.yaml/badge.svg)](https://github.com/googleads/googleads-mobile-flutter/actions/workflows/google_mobile_ads.yaml) + +This repository contains the source code for the Google Mobile Ads Flutter +plugin, which enables publishers to monetize [Flutter](https://flutter.dev/) +apps using the Google Mobile Ads SDK. + +## Documentation + +For instructions on how to use the plugin, please refer to the developer guides +for [AdMob](https://developers.google.com/admob/flutter/quick-start) and +[Ad Manager](https://developers.google.com/ad-manager/mobile-ads-sdk/flutter/quick-start). + +## Downloads + +See [pub.dev](https://pub.dev/packages/google_mobile_ads/versions) for the +latest releases of the plugin. + +## Suggesting improvements + +To file bugs, make feature requests, or to suggest other improvements, please +use [github's issue tracker](https://github.com/googleads/googleads-mobile-flutter/issues). + + +## Other resources + +* [AdMob help center](https://support.google.com/admob/?hl=en#topic=7383088) +* [Ad Manager help center](https://support.google.com/admanager/?hl=en#topic=7505988) + +## License + +[Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) \ No newline at end of file diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/build.gradle b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/build.gradle new file mode 100644 index 00000000..14c700f9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/build.gradle @@ -0,0 +1,77 @@ +group 'io.flutter.plugins.googlemobileads' +version '8.0.0' + +buildscript { + ext { + agp_version = '8.13.1' + } + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "com.android.tools.build:gradle:$agp_version" + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdk 36 + + if (project.android.hasProperty('namespace')) { + namespace 'io.flutter.plugins.googlemobileads' + } + + defaultConfig { + minSdk 24 + } + lintOptions { + disable 'InvalidPackage' + } + dependencies { + api 'com.google.android.gms:play-services-ads:25.1.0' + implementation 'com.google.android.ump:user-messaging-platform:4.0.0' + implementation 'androidx.constraintlayout:constraintlayout:2.2.1' + implementation 'androidx.lifecycle:lifecycle-process:2.10.0' + implementation 'com.google.errorprone:error_prone_annotations:2.48.0' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.hamcrest:hamcrest:3.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.robolectric:robolectric:4.16.1' + testImplementation 'androidx.test:core:1.7.0' + } + testOptions { + unitTests { + includeAndroidResources = true + } + } +} + +afterEvaluate { + def containsEmbeddingDependencies = configurations.any { configuration -> + configuration.dependencies.any { dependency -> + dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + (dependency instanceof ModuleDependency && dependency.isTransitive()) + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "1.1.1" + compileOnly "android.arch.lifecycle:runtime:$lifecycle_version" + compileOnly "android.arch.lifecycle:common:$lifecycle_version" + compileOnly "android.arch.lifecycle:common-java8:$lifecycle_version" + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle.properties b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle.properties new file mode 100644 index 00000000..94e8c9d9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle.properties @@ -0,0 +1,15 @@ +## For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +#Fri Aug 06 00:15:03 EDT 2021 +android.useAndroidX=true +android.enableJetifier=true diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/gradle-daemon-jvm.properties b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/gradle-daemon-jvm.properties new file mode 100644 index 00000000..6c1139ec --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21 diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c5856afb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Dec 04 10:45:11 PST 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/settings.gradle b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/settings.gradle new file mode 100644 index 00000000..84685e36 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'google_mobile_ads' diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..eaa5574a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/NativeTemplateStyle.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/NativeTemplateStyle.java new file mode 100644 index 00000000..91ababe9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/NativeTemplateStyle.java @@ -0,0 +1,272 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.android.ads.nativetemplates; + +import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; +import androidx.annotation.Nullable; +import com.google.errorprone.annotations.CanIgnoreReturnValue; + +/** A class containing the optional styling options for the Native Template. */ +public final class NativeTemplateStyle { + + // Call to action typeface. + private Typeface callToActionTextTypeface; + + // Size of call to action text. + private float callToActionTextSize; + + // Call to action typeface color in the form 0xAARRGGBB. + @Nullable private Integer callToActionTypefaceColor; + + // Call to action background color. + private ColorDrawable callToActionBackgroundColor; + + // All templates have a primary text area which is populated by the native ad's headline. + + // Primary text typeface. + private Typeface primaryTextTypeface; + + // Size of primary text. + private float primaryTextSize; + + // Primary text typeface color in the form 0xAARRGGBB. + @Nullable private Integer primaryTextTypefaceColor; + + // Primary text background color. + private ColorDrawable primaryTextBackgroundColor; + + // The typeface, typeface color, and background color for the second row of text in the template. + // All templates have a secondary text area which is populated either by the body of the ad or + // by the rating of the app. + + // Secondary text typeface. + private Typeface secondaryTextTypeface; + + // Size of secondary text. + private float secondaryTextSize; + + // Secondary text typeface color in the form 0xAARRGGBB. + @Nullable private Integer secondaryTextTypefaceColor; + + // Secondary text background color. + private ColorDrawable secondaryTextBackgroundColor; + + // The typeface, typeface color, and background color for the third row of text in the template. + // The third row is used to display store name or the default tertiary text. + + // Tertiary text typeface. + private Typeface tertiaryTextTypeface; + + // Size of tertiary text. + private float tertiaryTextSize; + + // Tertiary text typeface color in the form 0xAARRGGBB. + @Nullable private Integer tertiaryTextTypefaceColor; + + // Tertiary text background color. + private ColorDrawable tertiaryTextBackgroundColor; + + // The background color for the bulk of the ad. + private ColorDrawable mainBackgroundColor; + + public Typeface getCallToActionTextTypeface() { + return callToActionTextTypeface; + } + + public float getCallToActionTextSize() { + return callToActionTextSize; + } + + @Nullable + public Integer getCallToActionTypefaceColor() { + return callToActionTypefaceColor; + } + + public ColorDrawable getCallToActionBackgroundColor() { + return callToActionBackgroundColor; + } + + public Typeface getPrimaryTextTypeface() { + return primaryTextTypeface; + } + + public float getPrimaryTextSize() { + return primaryTextSize; + } + + @Nullable + public Integer getPrimaryTextTypefaceColor() { + return primaryTextTypefaceColor; + } + + public ColorDrawable getPrimaryTextBackgroundColor() { + return primaryTextBackgroundColor; + } + + public Typeface getSecondaryTextTypeface() { + return secondaryTextTypeface; + } + + public float getSecondaryTextSize() { + return secondaryTextSize; + } + + @Nullable + public Integer getSecondaryTextTypefaceColor() { + return secondaryTextTypefaceColor; + } + + public ColorDrawable getSecondaryTextBackgroundColor() { + return secondaryTextBackgroundColor; + } + + public Typeface getTertiaryTextTypeface() { + return tertiaryTextTypeface; + } + + public float getTertiaryTextSize() { + return tertiaryTextSize; + } + + @Nullable + public Integer getTertiaryTextTypefaceColor() { + return tertiaryTextTypefaceColor; + } + + public ColorDrawable getTertiaryTextBackgroundColor() { + return tertiaryTextBackgroundColor; + } + + public ColorDrawable getMainBackgroundColor() { + return mainBackgroundColor; + } + + /** A class that provides helper methods to build a style object. */ + public static final class Builder { + + private NativeTemplateStyle styles; + + public Builder() { + this.styles = new NativeTemplateStyle(); + } + + @CanIgnoreReturnValue + public Builder withCallToActionTextTypeface(Typeface callToActionTextTypeface) { + this.styles.callToActionTextTypeface = callToActionTextTypeface; + return this; + } + + @CanIgnoreReturnValue + public Builder withCallToActionTextSize(float callToActionTextSize) { + this.styles.callToActionTextSize = callToActionTextSize; + return this; + } + + @CanIgnoreReturnValue + public Builder withCallToActionTypefaceColor(int callToActionTypefaceColor) { + this.styles.callToActionTypefaceColor = callToActionTypefaceColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withCallToActionBackgroundColor(ColorDrawable callToActionBackgroundColor) { + this.styles.callToActionBackgroundColor = callToActionBackgroundColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withPrimaryTextTypeface(Typeface primaryTextTypeface) { + this.styles.primaryTextTypeface = primaryTextTypeface; + return this; + } + + @CanIgnoreReturnValue + public Builder withPrimaryTextSize(float primaryTextSize) { + this.styles.primaryTextSize = primaryTextSize; + return this; + } + + @CanIgnoreReturnValue + public Builder withPrimaryTextTypefaceColor(int primaryTextTypefaceColor) { + this.styles.primaryTextTypefaceColor = primaryTextTypefaceColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withPrimaryTextBackgroundColor(ColorDrawable primaryTextBackgroundColor) { + this.styles.primaryTextBackgroundColor = primaryTextBackgroundColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withSecondaryTextTypeface(Typeface secondaryTextTypeface) { + this.styles.secondaryTextTypeface = secondaryTextTypeface; + return this; + } + + @CanIgnoreReturnValue + public Builder withSecondaryTextSize(float secondaryTextSize) { + this.styles.secondaryTextSize = secondaryTextSize; + return this; + } + + @CanIgnoreReturnValue + public Builder withSecondaryTextTypefaceColor(int secondaryTextTypefaceColor) { + this.styles.secondaryTextTypefaceColor = secondaryTextTypefaceColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withSecondaryTextBackgroundColor(ColorDrawable secondaryTextBackgroundColor) { + this.styles.secondaryTextBackgroundColor = secondaryTextBackgroundColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withTertiaryTextTypeface(Typeface tertiaryTextTypeface) { + this.styles.tertiaryTextTypeface = tertiaryTextTypeface; + return this; + } + + @CanIgnoreReturnValue + public Builder withTertiaryTextSize(float tertiaryTextSize) { + this.styles.tertiaryTextSize = tertiaryTextSize; + return this; + } + + @CanIgnoreReturnValue + public Builder withTertiaryTextTypefaceColor(int tertiaryTextTypefaceColor) { + this.styles.tertiaryTextTypefaceColor = tertiaryTextTypefaceColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withTertiaryTextBackgroundColor(ColorDrawable tertiaryTextBackgroundColor) { + this.styles.tertiaryTextBackgroundColor = tertiaryTextBackgroundColor; + return this; + } + + @CanIgnoreReturnValue + public Builder withMainBackgroundColor(ColorDrawable mainBackgroundColor) { + this.styles.mainBackgroundColor = mainBackgroundColor; + return this; + } + + public NativeTemplateStyle build() { + return styles; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/TemplateView.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/TemplateView.java new file mode 100644 index 00000000..8ee7f145 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/com/google/android/ads/nativetemplates/TemplateView.java @@ -0,0 +1,295 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.android.ads.nativetemplates; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RatingBar; +import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import com.google.android.gms.ads.nativead.MediaView; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAdView; +import io.flutter.plugins.googlemobileads.R; + +/** Base class for a template view. */ +public final class TemplateView extends FrameLayout { + + private int templateType; + private NativeTemplateStyle styles; + private NativeAd nativeAd; + private NativeAdView nativeAdView; + + private TextView primaryView; + private TextView secondaryView; + private RatingBar ratingBar; + private TextView tertiaryView; + private ImageView iconView; + private MediaView mediaView; + private Button callToActionView; + private ConstraintLayout background; + + private static final String MEDIUM_TEMPLATE = "medium_template"; + private static final String SMALL_TEMPLATE = "small_template"; + + public TemplateView(Context context) { + super(context); + } + + public TemplateView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(context, attrs); + } + + public TemplateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context, attrs); + } + + public TemplateView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initView(context, attrs); + } + + public void setStyles(NativeTemplateStyle styles) { + this.styles = styles; + this.applyStyles(); + } + + public NativeAdView getNativeAdView() { + return nativeAdView; + } + + private void applyStyles() { + + Drawable mainBackground = styles.getMainBackgroundColor(); + if (mainBackground != null) { + background.setBackground(mainBackground); + if (primaryView != null) { + primaryView.setBackground(mainBackground); + } + if (secondaryView != null) { + secondaryView.setBackground(mainBackground); + } + if (tertiaryView != null) { + tertiaryView.setBackground(mainBackground); + } + } + + Typeface primary = styles.getPrimaryTextTypeface(); + if (primary != null && primaryView != null) { + primaryView.setTypeface(primary); + } + + Typeface secondary = styles.getSecondaryTextTypeface(); + if (secondary != null && secondaryView != null) { + secondaryView.setTypeface(secondary); + } + + Typeface tertiary = styles.getTertiaryTextTypeface(); + if (tertiary != null && tertiaryView != null) { + tertiaryView.setTypeface(tertiary); + } + + Typeface ctaTypeface = styles.getCallToActionTextTypeface(); + if (ctaTypeface != null && callToActionView != null) { + callToActionView.setTypeface(ctaTypeface); + } + + if (styles.getPrimaryTextTypefaceColor() != null && primaryView != null) { + primaryView.setTextColor(styles.getPrimaryTextTypefaceColor()); + } + + if (styles.getSecondaryTextTypefaceColor() != null && secondaryView != null) { + secondaryView.setTextColor(styles.getSecondaryTextTypefaceColor()); + } + + if (styles.getTertiaryTextTypefaceColor() != null && tertiaryView != null) { + tertiaryView.setTextColor(styles.getTertiaryTextTypefaceColor()); + } + + if (styles.getCallToActionTypefaceColor() != null && callToActionView != null) { + callToActionView.setTextColor(styles.getCallToActionTypefaceColor()); + } + + float ctaTextSize = styles.getCallToActionTextSize(); + if (ctaTextSize > 0 && callToActionView != null) { + callToActionView.setTextSize(ctaTextSize); + } + + float primaryTextSize = styles.getPrimaryTextSize(); + if (primaryTextSize > 0 && primaryView != null) { + primaryView.setTextSize(primaryTextSize); + } + + float secondaryTextSize = styles.getSecondaryTextSize(); + if (secondaryTextSize > 0 && secondaryView != null) { + secondaryView.setTextSize(secondaryTextSize); + } + + float tertiaryTextSize = styles.getTertiaryTextSize(); + if (tertiaryTextSize > 0 && tertiaryView != null) { + tertiaryView.setTextSize(tertiaryTextSize); + } + + Drawable ctaBackground = styles.getCallToActionBackgroundColor(); + if (ctaBackground != null && callToActionView != null) { + callToActionView.setBackground(ctaBackground); + } + + Drawable primaryBackground = styles.getPrimaryTextBackgroundColor(); + if (primaryBackground != null && primaryView != null) { + primaryView.setBackground(primaryBackground); + } + + Drawable secondaryBackground = styles.getSecondaryTextBackgroundColor(); + if (secondaryBackground != null && secondaryView != null) { + secondaryView.setBackground(secondaryBackground); + } + + Drawable tertiaryBackground = styles.getTertiaryTextBackgroundColor(); + if (tertiaryBackground != null && tertiaryView != null) { + tertiaryView.setBackground(tertiaryBackground); + } + + invalidate(); + requestLayout(); + } + + private boolean adHasOnlyStore(NativeAd nativeAd) { + String store = nativeAd.getStore(); + String advertiser = nativeAd.getAdvertiser(); + return !TextUtils.isEmpty(store) && TextUtils.isEmpty(advertiser); + } + + public void setNativeAd(NativeAd nativeAd) { + this.nativeAd = nativeAd; + + String store = nativeAd.getStore(); + String advertiser = nativeAd.getAdvertiser(); + String headline = nativeAd.getHeadline(); + String body = nativeAd.getBody(); + String cta = nativeAd.getCallToAction(); + Double starRating = nativeAd.getStarRating(); + NativeAd.Image icon = nativeAd.getIcon(); + + String secondaryText; + + nativeAdView.setCallToActionView(callToActionView); + nativeAdView.setHeadlineView(primaryView); + nativeAdView.setMediaView(mediaView); + secondaryView.setVisibility(VISIBLE); + if (adHasOnlyStore(nativeAd)) { + nativeAdView.setStoreView(secondaryView); + secondaryText = store; + } else if (!TextUtils.isEmpty(advertiser)) { + nativeAdView.setAdvertiserView(secondaryView); + secondaryText = advertiser; + } else { + secondaryText = ""; + } + + primaryView.setText(headline); + callToActionView.setText(cta); + + // Set the secondary view to be the star rating if available. + if (starRating != null && starRating > 0) { + secondaryView.setVisibility(GONE); + ratingBar.setVisibility(VISIBLE); + ratingBar.setRating(starRating.floatValue()); + + nativeAdView.setStarRatingView(ratingBar); + } else { + secondaryView.setText(secondaryText); + secondaryView.setVisibility(VISIBLE); + ratingBar.setVisibility(GONE); + } + + if (icon != null) { + iconView.setVisibility(VISIBLE); + iconView.setImageDrawable(icon.getDrawable()); + } else { + iconView.setVisibility(GONE); + } + + if (tertiaryView != null) { + tertiaryView.setText(body); + nativeAdView.setBodyView(tertiaryView); + } + + nativeAdView.setNativeAd(nativeAd); + } + + /** + * To prevent memory leaks, make sure to destroy your ad when you don't need it anymore. This + * method does not destroy the template view. + * https://developers.google.com/admob/android/native-unified#destroy_ad + */ + public void destroyNativeAd() { + nativeAd.destroy(); + } + + public String getTemplateTypeName() { + if (templateType == R.layout.gnt_medium_template_view) { + return MEDIUM_TEMPLATE; + } else if (templateType == R.layout.gnt_small_template_view) { + return SMALL_TEMPLATE; + } + return ""; + } + + private void initView(Context context, AttributeSet attributeSet) { + + TypedArray attributes = + context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.TemplateView, 0, 0); + + try { + templateType = + attributes.getResourceId( + R.styleable.TemplateView_gnt_template_type, R.layout.gnt_medium_template_view); + } finally { + attributes.recycle(); + } + LayoutInflater inflater = + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(templateType, this); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + nativeAdView = (NativeAdView) findViewById(R.id.native_ad_view); + primaryView = (TextView) findViewById(R.id.primary); + secondaryView = (TextView) findViewById(R.id.secondary); + tertiaryView = (TextView) findViewById(R.id.body); + + ratingBar = (RatingBar) findViewById(R.id.rating_bar); + ratingBar.setEnabled(false); + + callToActionView = (Button) findViewById(R.id.cta); + iconView = (ImageView) findViewById(R.id.icon); + mediaView = (MediaView) findViewById(R.id.media_view); + background = (ConstraintLayout) findViewById(R.id.background); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdInstanceManager.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdInstanceManager.java new file mode 100644 index 00000000..3adc88b2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdInstanceManager.java @@ -0,0 +1,245 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.app.Activity; +import android.os.Handler; +import android.os.Looper; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.ResponseInfo; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterAdError; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterResponseInfo; +import java.util.HashMap; +import java.util.Map; + +/** + * Maintains reference to ad instances for the {@link + * io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin}. + * + *

When an Ad is loaded from Dart, an equivalent ad object is created and maintained here to + * provide access until the ad is disposed. + */ +class AdInstanceManager { + @Nullable private Activity activity; + + @NonNull private final Map ads; + @NonNull private final MethodChannel channel; + + /** + * Initializes the ad instance manager. We only need a method channel to start loading ads, but an + * activity must be present in order to attach any ads to the view hierarchy. + */ + AdInstanceManager(@NonNull MethodChannel channel) { + this.channel = channel; + this.ads = new HashMap<>(); + } + + void setActivity(@Nullable Activity activity) { + this.activity = activity; + } + + @Nullable + Activity getActivity() { + return activity; + } + + @Nullable + FlutterAd adForId(int id) { + return ads.get(id); + } + + @Nullable + Integer adIdFor(@NonNull FlutterAd ad) { + for (Integer adId : ads.keySet()) { + if (ads.get(adId) == ad) { + return adId; + } + } + return null; + } + + void trackAd(@NonNull FlutterAd ad, int adId) { + if (ads.get(adId) != null) { + throw new IllegalArgumentException( + String.format("Ad for following adId already exists: %d", adId)); + } + ads.put(adId, ad); + } + + void disposeAd(int adId) { + if (!ads.containsKey(adId)) { + return; + } + FlutterAd ad = ads.get(adId); + if (ad != null) { + ad.dispose(); + } + ads.remove(adId); + } + + void disposeAllAds() { + for (Map.Entry entry : ads.entrySet()) { + if (entry.getValue() != null) { + entry.getValue().dispose(); + } + } + ads.clear(); + } + + void onAdLoaded(int adId, @Nullable ResponseInfo responseInfo) { + Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdLoaded"); + FlutterResponseInfo flutterResponseInfo = + (responseInfo == null) ? null : new FlutterResponseInfo(responseInfo); + arguments.put("responseInfo", flutterResponseInfo); + invokeOnAdEvent(arguments); + } + + void onAdFailedToLoad(int adId, @NonNull FlutterAd.FlutterLoadAdError error) { + Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdFailedToLoad"); + arguments.put("loadAdError", error); + invokeOnAdEvent(arguments); + } + + void onAppEvent(int adId, @NonNull String name, @NonNull String data) { + Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAppEvent"); + arguments.put("name", name); + arguments.put("data", data); + invokeOnAdEvent(arguments); + } + + void onAdImpression(int id) { + Map arguments = new HashMap<>(); + arguments.put("adId", id); + arguments.put("eventName", "onAdImpression"); + invokeOnAdEvent(arguments); + } + + void onAdClicked(int id) { + Map arguments = new HashMap<>(); + arguments.put("adId", id); + arguments.put("eventName", "onAdClicked"); + invokeOnAdEvent(arguments); + } + + void onAdOpened(int adId) { + Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdOpened"); + invokeOnAdEvent(arguments); + } + + void onAdClosed(int adId) { + Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdClosed"); + invokeOnAdEvent(arguments); + } + + void onRewardedAdUserEarnedReward(int adId, @NonNull FlutterRewardedAd.FlutterRewardItem reward) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onRewardedAdUserEarnedReward"); + arguments.put("rewardItem", reward); + invokeOnAdEvent(arguments); + } + + void onRewardedInterstitialAdUserEarnedReward( + int adId, @NonNull FlutterRewardedAd.FlutterRewardItem reward) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onRewardedInterstitialAdUserEarnedReward"); + arguments.put("rewardItem", reward); + invokeOnAdEvent(arguments); + } + + void onPaidEvent(@NonNull FlutterAd ad, @NonNull FlutterAdValue adValue) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adIdFor(ad)); + arguments.put("eventName", "onPaidEvent"); + arguments.put("valueMicros", adValue.valueMicros); + arguments.put("precision", adValue.precisionType); + arguments.put("currencyCode", adValue.currencyCode); + invokeOnAdEvent(arguments); + } + + void onFailedToShowFullScreenContent(int adId, @NonNull AdError error) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onFailedToShowFullScreenContent"); + arguments.put("error", new FlutterAdError(error)); + invokeOnAdEvent(arguments); + } + + void onAdShowedFullScreenContent(int adId) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdShowedFullScreenContent"); + invokeOnAdEvent(arguments); + } + + void onAdDismissedFullScreenContent(int adId) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdDismissedFullScreenContent"); + invokeOnAdEvent(arguments); + } + + void onAdMetadataChanged(int adId) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onAdMetadataChanged"); + invokeOnAdEvent(arguments); + } + + void onFluidAdHeightChanged(int adId, int height) { + final Map arguments = new HashMap<>(); + arguments.put("adId", adId); + arguments.put("eventName", "onFluidAdHeightChanged"); + arguments.put("height", height); + invokeOnAdEvent(arguments); + } + + boolean showAdWithId(int id) { + final FlutterAd.FlutterOverlayAd ad = (FlutterAd.FlutterOverlayAd) adForId(id); + + if (ad == null) { + return false; + } + + ad.show(); + return true; + } + + /** Invoke the method channel using the UI thread. Otherwise the message gets silently dropped. */ + private void invokeOnAdEvent(final Map arguments) { + new Handler(Looper.getMainLooper()) + .post( + new Runnable() { + @Override + public void run() { + channel.invokeMethod("onAdEvent", arguments); + } + }); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdMessageCodec.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdMessageCodec.java new file mode 100644 index 00000000..68c23891 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AdMessageCodec.java @@ -0,0 +1,484 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.c language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import com.google.android.gms.ads.RequestConfiguration; +import io.flutter.plugin.common.StandardMessageCodec; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterAdError; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterAdapterResponseInfo; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterResponseInfo; +import io.flutter.plugins.googlemobileads.FlutterAdSize.InlineAdaptiveBannerAdSize; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateFontStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateTextStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateType; +import java.lang.reflect.InvocationTargetException; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.InvocationTargetException; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Map; + +/** + * Encodes and decodes values by reading from a ByteBuffer and writing to a ByteArrayOutputStream. + */ +class AdMessageCodec extends StandardMessageCodec { + // The type values below must be consistent for each platform. + private static final byte VALUE_AD_SIZE = (byte) 128; + private static final byte VALUE_AD_REQUEST = (byte) 129; + private static final byte VALUE_FLUID_AD_SIZE = (byte) 130; + private static final byte VALUE_REWARD_ITEM = (byte) 132; + private static final byte VALUE_LOAD_AD_ERROR = (byte) 133; + private static final byte VALUE_ADMANAGER_AD_REQUEST = (byte) 134; + private static final byte VALUE_INITIALIZATION_STATE = (byte) 135; + private static final byte VALUE_ADAPTER_STATUS = (byte) 136; + private static final byte VALUE_INITIALIZATION_STATUS = (byte) 137; + private static final byte VALUE_SERVER_SIDE_VERIFICATION_OPTIONS = (byte) 138; + private static final byte VALUE_AD_ERROR = (byte) 139; + private static final byte VALUE_RESPONSE_INFO = (byte) 140; + private static final byte VALUE_ADAPTER_RESPONSE_INFO = (byte) 141; + private static final byte VALUE_ANCHORED_ADAPTIVE_BANNER_AD_SIZE = (byte) 142; + private static final byte VALUE_SMART_BANNER_AD_SIZE = (byte) 143; + private static final byte VALUE_NATIVE_AD_OPTIONS = (byte) 144; + private static final byte VALUE_VIDEO_OPTIONS = (byte) 145; + private static final byte VALUE_INLINE_ADAPTIVE_BANNER_AD_SIZE = (byte) 146; + private static final byte VALUE_REQUEST_CONFIGURATION_PARAMS = (byte) 148; + private static final byte VALUE_NATIVE_TEMPLATE_STYLE = (byte) 149; + private static final byte VALUE_NATIVE_TEMPLATE_TEXT_STYLE = (byte) 150; + private static final byte VALUE_NATIVE_TEMPLATE_FONT_STYLE = (byte) 151; + private static final byte VALUE_NATIVE_TEMPLATE_TYPE = (byte) 152; + private static final byte VALUE_COLOR = (byte) 153; + private static final byte VALUE_MEDIATION_EXTRAS = (byte) 154; + + @NonNull Context context; + @NonNull final FlutterAdSize.AdSizeFactory adSizeFactory; + + @SuppressWarnings("deprecation") // Keeping for compatibility + @Nullable + private MediationNetworkExtrasProvider mediationNetworkExtrasProvider; + + @NonNull private final FlutterRequestAgentProvider requestAgentProvider; + + AdMessageCodec( + @NonNull Context context, @NonNull FlutterRequestAgentProvider requestAgentProvider) { + this.context = context; + this.adSizeFactory = new FlutterAdSize.AdSizeFactory(); + this.requestAgentProvider = requestAgentProvider; + } + + @VisibleForTesting + AdMessageCodec( + @NonNull Context context, + @NonNull FlutterAdSize.AdSizeFactory adSizeFactory, + @NonNull FlutterRequestAgentProvider requestAgentProvider) { + this.context = context; + this.adSizeFactory = adSizeFactory; + this.requestAgentProvider = requestAgentProvider; + } + + void setContext(@NonNull Context context) { + this.context = context; + } + + @SuppressWarnings("deprecation") // Keeping for compatibility + void setMediationNetworkExtrasProvider( + @Nullable MediationNetworkExtrasProvider mediationNetworkExtrasProvider) { + this.mediationNetworkExtrasProvider = mediationNetworkExtrasProvider; + } + + @Override + protected void writeValue(ByteArrayOutputStream stream, Object value) { + if (value instanceof FlutterAdSize) { + writeAdSize(stream, (FlutterAdSize) value); + } else if (value instanceof FlutterAdManagerAdRequest) { + stream.write(VALUE_ADMANAGER_AD_REQUEST); + final FlutterAdManagerAdRequest request = (FlutterAdManagerAdRequest) value; + writeValue(stream, request.getKeywords()); + writeValue(stream, request.getContentUrl()); + writeValue(stream, request.getCustomTargeting()); + writeValue(stream, request.getCustomTargetingLists()); + writeValue(stream, request.getNonPersonalizedAds()); + writeValue(stream, request.getNeighboringContentUrls()); + writeValue(stream, request.getHttpTimeoutMillis()); + writeValue(stream, request.getPublisherProvidedId()); + writeValue(stream, request.getMediationExtrasIdentifier()); + writeValue(stream, request.getAdMobExtras()); + writeValue(stream, request.getMediationExtras()); + } else if (value instanceof FlutterAdRequest) { + stream.write(VALUE_AD_REQUEST); + final FlutterAdRequest request = (FlutterAdRequest) value; + writeValue(stream, request.getKeywords()); + writeValue(stream, request.getContentUrl()); + writeValue(stream, request.getNonPersonalizedAds()); + writeValue(stream, request.getNeighboringContentUrls()); + writeValue(stream, request.getHttpTimeoutMillis()); + writeValue(stream, request.getMediationExtrasIdentifier()); + writeValue(stream, request.getAdMobExtras()); + writeValue(stream, request.getMediationExtras()); + } else if (value instanceof FlutterMediationExtras) { + stream.write(VALUE_MEDIATION_EXTRAS); + final FlutterMediationExtras mediationExtras = (FlutterMediationExtras) value; + String className = mediationExtras.getClass().getCanonicalName(); + writeValue(stream, className); + writeValue(stream, mediationExtras.extras); + } else if (value instanceof FlutterRewardedAd.FlutterRewardItem) { + stream.write(VALUE_REWARD_ITEM); + final FlutterRewardedAd.FlutterRewardItem item = (FlutterRewardedAd.FlutterRewardItem) value; + writeValue(stream, item.amount); + writeValue(stream, item.type); + } else if (value instanceof FlutterAdapterResponseInfo) { + stream.write(VALUE_ADAPTER_RESPONSE_INFO); + final FlutterAdapterResponseInfo responseInfo = (FlutterAdapterResponseInfo) value; + writeValue(stream, responseInfo.getAdapterClassName()); + writeValue(stream, responseInfo.getLatencyMillis()); + writeValue(stream, responseInfo.getDescription()); + writeValue(stream, responseInfo.getAdUnitMapping()); + writeValue(stream, responseInfo.getError()); + writeValue(stream, responseInfo.getAdSourceName()); + writeValue(stream, responseInfo.getAdSourceId()); + writeValue(stream, responseInfo.getAdSourceInstanceName()); + writeValue(stream, responseInfo.getAdSourceInstanceId()); + } else if (value instanceof FlutterResponseInfo) { + stream.write(VALUE_RESPONSE_INFO); + final FlutterResponseInfo responseInfo = (FlutterResponseInfo) value; + writeValue(stream, responseInfo.getResponseId()); + writeValue(stream, responseInfo.getMediationAdapterClassName()); + writeValue(stream, responseInfo.getAdapterResponses()); + writeValue(stream, responseInfo.getLoadedAdapterResponseInfo()); + writeValue(stream, responseInfo.getResponseExtras()); + } else if (value instanceof FlutterAd.FlutterLoadAdError) { + stream.write(VALUE_LOAD_AD_ERROR); + final FlutterAd.FlutterLoadAdError error = (FlutterAd.FlutterLoadAdError) value; + writeValue(stream, error.code); + writeValue(stream, error.domain); + writeValue(stream, error.message); + writeValue(stream, error.responseInfo); + } else if (value instanceof FlutterAdError) { + stream.write(VALUE_AD_ERROR); + final FlutterAdError error = (FlutterAdError) value; + writeValue(stream, error.code); + writeValue(stream, error.domain); + writeValue(stream, error.message); + } else if (value instanceof FlutterAdapterStatus.AdapterInitializationState) { + stream.write(VALUE_INITIALIZATION_STATE); + final FlutterAdapterStatus.AdapterInitializationState state = + (FlutterAdapterStatus.AdapterInitializationState) value; + switch (state) { + case NOT_READY: + writeValue(stream, "notReady"); + return; + case READY: + writeValue(stream, "ready"); + return; + } + final String message = String.format("Unable to handle state: %s", state); + throw new IllegalArgumentException(message); + } else if (value instanceof FlutterAdapterStatus) { + stream.write(VALUE_ADAPTER_STATUS); + final FlutterAdapterStatus status = (FlutterAdapterStatus) value; + writeValue(stream, status.state); + writeValue(stream, status.description); + writeValue(stream, status.latency); + } else if (value instanceof FlutterInitializationStatus) { + stream.write(VALUE_INITIALIZATION_STATUS); + final FlutterInitializationStatus status = (FlutterInitializationStatus) value; + writeValue(stream, status.adapterStatuses); + } else if (value instanceof FlutterServerSideVerificationOptions) { + stream.write(VALUE_SERVER_SIDE_VERIFICATION_OPTIONS); + FlutterServerSideVerificationOptions options = (FlutterServerSideVerificationOptions) value; + writeValue(stream, options.getUserId()); + writeValue(stream, options.getCustomData()); + } else if (value instanceof FlutterNativeAdOptions) { + stream.write(VALUE_NATIVE_AD_OPTIONS); + FlutterNativeAdOptions options = (FlutterNativeAdOptions) value; + writeValue(stream, options.adChoicesPlacement); + writeValue(stream, options.mediaAspectRatio); + writeValue(stream, options.videoOptions); + writeValue(stream, options.requestCustomMuteThisAd); + writeValue(stream, options.shouldRequestMultipleImages); + writeValue(stream, options.shouldReturnUrlsForImageAssets); + } else if (value instanceof RequestConfiguration) { + stream.write(VALUE_REQUEST_CONFIGURATION_PARAMS); + RequestConfiguration params = (RequestConfiguration) value; + writeValue(stream, params.getMaxAdContentRating()); + writeValue(stream, params.getTagForChildDirectedTreatment()); + writeValue(stream, params.getTagForUnderAgeOfConsent()); + writeValue(stream, params.getTestDeviceIds()); + } else if (value instanceof FlutterVideoOptions) { + stream.write(VALUE_VIDEO_OPTIONS); + FlutterVideoOptions options = (FlutterVideoOptions) value; + writeValue(stream, options.clickToExpandRequested); + writeValue(stream, options.customControlsRequested); + writeValue(stream, options.startMuted); + } else if (value instanceof FlutterNativeTemplateStyle) { + stream.write(VALUE_NATIVE_TEMPLATE_STYLE); + FlutterNativeTemplateStyle nativeTemplateStyle = (FlutterNativeTemplateStyle) value; + writeValue(stream, nativeTemplateStyle.getTemplateType()); + writeValue(stream, nativeTemplateStyle.getMainBackgroundColor()); + writeValue(stream, nativeTemplateStyle.getCallToActionStyle()); + writeValue(stream, nativeTemplateStyle.getPrimaryTextStyle()); + writeValue(stream, nativeTemplateStyle.getSecondaryTextStyle()); + writeValue(stream, nativeTemplateStyle.getTertiaryTextStyle()); + } else if (value instanceof FlutterNativeTemplateFontStyle) { + stream.write(VALUE_NATIVE_TEMPLATE_FONT_STYLE); + writeValue(stream, ((FlutterNativeTemplateFontStyle) value).ordinal()); + } else if (value instanceof FlutterNativeTemplateType) { + stream.write(VALUE_NATIVE_TEMPLATE_TYPE); + writeValue(stream, ((FlutterNativeTemplateType) value).ordinal()); + } else if (value instanceof FlutterNativeTemplateTextStyle) { + stream.write(VALUE_NATIVE_TEMPLATE_TEXT_STYLE); + FlutterNativeTemplateTextStyle textStyle = (FlutterNativeTemplateTextStyle) value; + writeValue(stream, textStyle.getTextColor()); + writeValue(stream, textStyle.getBackgroundColor()); + writeValue(stream, textStyle.getFontStyle()); + writeValue(stream, textStyle.getSize()); + } else if (value instanceof ColorDrawable) { + stream.write(VALUE_COLOR); + int colorValue = ((ColorDrawable) value).getColor(); + writeValue(stream, Color.alpha(colorValue)); + writeValue(stream, Color.red(colorValue)); + writeValue(stream, Color.green(colorValue)); + writeValue(stream, Color.blue(colorValue)); + } else { + super.writeValue(stream, value); + } + } + + @SuppressWarnings("unchecked") + @Override + protected Object readValueOfType(byte type, ByteBuffer buffer) { + switch (type) { + case VALUE_INLINE_ADAPTIVE_BANNER_AD_SIZE: + { + final Integer width = (Integer) readValueOfType(buffer.get(), buffer); + final Integer height = (Integer) readValueOfType(buffer.get(), buffer); + final Integer orientation = (Integer) readValueOfType(buffer.get(), buffer); + return new FlutterAdSize.InlineAdaptiveBannerAdSize( + adSizeFactory, context, width, orientation, height); + } + case VALUE_ANCHORED_ADAPTIVE_BANNER_AD_SIZE: + final String orientation = (String) readValueOfType(buffer.get(), buffer); + final Integer width = (Integer) readValueOfType(buffer.get(), buffer); + return new FlutterAdSize.AnchoredAdaptiveBannerAdSize( + context, adSizeFactory, orientation, width, /* isLarge = */ false); + case VALUE_SMART_BANNER_AD_SIZE: + return new FlutterAdSize.SmartBannerAdSize(); + case VALUE_AD_SIZE: + return new FlutterAdSize( + (Integer) readValueOfType(buffer.get(), buffer), + (Integer) readValueOfType(buffer.get(), buffer)); + case VALUE_FLUID_AD_SIZE: + return new FlutterAdSize.FluidAdSize(); + case VALUE_AD_REQUEST: + return new FlutterAdRequest.Builder() + .setKeywords((List) readValueOfType(buffer.get(), buffer)) + .setContentUrl((String) readValueOfType(buffer.get(), buffer)) + .setNonPersonalizedAds(booleanValueOf(readValueOfType(buffer.get(), buffer))) + .setNeighboringContentUrls((List) readValueOfType(buffer.get(), buffer)) + .setHttpTimeoutMillis((Integer) readValueOfType(buffer.get(), buffer)) + .setMediationNetworkExtrasIdentifier((String) readValueOfType(buffer.get(), buffer)) + .setMediationNetworkExtrasProvider(mediationNetworkExtrasProvider) + .setAdMobExtras((Map) readValueOfType(buffer.get(), buffer)) + .setRequestAgent(requestAgentProvider.getRequestAgent()) + .setMediationExtras( + (List) readValueOfType(buffer.get(), buffer)) + .build(); + case VALUE_MEDIATION_EXTRAS: + String className = (String) readValueOfType(buffer.get(), buffer); + Map extras = (Map) readValueOfType(buffer.get(), buffer); + try { + assert className != null; + Class cls = Class.forName(className); + FlutterMediationExtras flutterExtras = (FlutterMediationExtras) cls.getDeclaredConstructor() + .newInstance(); + flutterExtras.setMediationExtras(extras); + return flutterExtras; + } catch (ClassNotFoundException e) { + Log.e("FlutterMediationExtras", "Class not found: " + className); + } catch (NoSuchMethodException e) { + Log.e("FlutterMediationExtras", "No such method found: " + className + ".getDeclaredConstructor()"); + } catch (InvocationTargetException e) { + Log.e("FlutterMediationExtras", "Invocation Target Exception for: " + className); + } catch (IllegalAccessException e) { + Log.e("FlutterMediationExtras", "Illegal Access to " + className); + } catch (InstantiationException e) { + Log.e("FlutterMediationExtras", "Unable to instantiate class " + className); + } + return null; + case VALUE_REWARD_ITEM: + return new FlutterRewardedAd.FlutterRewardItem( + (Integer) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer)); + case VALUE_ADAPTER_RESPONSE_INFO: + return new FlutterAdapterResponseInfo( + (String) readValueOfType(buffer.get(), buffer), + (long) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (Map) readValueOfType(buffer.get(), buffer), + (FlutterAdError) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer)); + case VALUE_RESPONSE_INFO: + return new FlutterResponseInfo( + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (List) readValueOfType(buffer.get(), buffer), + (FlutterAdapterResponseInfo) readValueOfType(buffer.get(), buffer), + (Map) readValueOfType(buffer.get(), buffer)); + case VALUE_LOAD_AD_ERROR: + return new FlutterAd.FlutterLoadAdError( + (Integer) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (FlutterResponseInfo) readValueOfType(buffer.get(), buffer)); + case VALUE_AD_ERROR: + return new FlutterAdError( + (Integer) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer)); + case VALUE_ADMANAGER_AD_REQUEST: + FlutterAdManagerAdRequest.Builder builder = new FlutterAdManagerAdRequest.Builder(); + builder.setKeywords((List) readValueOfType(buffer.get(), buffer)); + builder.setContentUrl((String) readValueOfType(buffer.get(), buffer)); + builder.setCustomTargeting((Map) readValueOfType(buffer.get(), buffer)); + builder.setCustomTargetingLists( + (Map>) readValueOfType(buffer.get(), buffer)); + builder.setNonPersonalizedAds((Boolean) readValueOfType(buffer.get(), buffer)); + builder.setNeighboringContentUrls((List) readValueOfType(buffer.get(), buffer)); + builder.setHttpTimeoutMillis((Integer) readValueOfType(buffer.get(), buffer)); + builder.setPublisherProvidedId((String) readValueOfType(buffer.get(), buffer)); + builder.setMediationNetworkExtrasIdentifier((String) readValueOfType(buffer.get(), buffer)); + builder.setMediationNetworkExtrasProvider(mediationNetworkExtrasProvider); + builder.setAdMobExtras((Map) readValueOfType(buffer.get(), buffer)); + builder.setRequestAgent(requestAgentProvider.getRequestAgent()); + builder.setMediationExtras( + (List) readValueOfType(buffer.get(), buffer)); + return builder.build(); + case VALUE_INITIALIZATION_STATE: + final String state = (String) readValueOfType(buffer.get(), buffer); + switch (state) { + case "notReady": + return FlutterAdapterStatus.AdapterInitializationState.NOT_READY; + case "ready": + return FlutterAdapterStatus.AdapterInitializationState.READY; + default: + final String message = String.format("Unable to handle state: %s", state); + throw new IllegalArgumentException(message); + } + case VALUE_ADAPTER_STATUS: + return new FlutterAdapterStatus( + (FlutterAdapterStatus.AdapterInitializationState) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer), + (Number) readValueOfType(buffer.get(), buffer)); + case VALUE_INITIALIZATION_STATUS: + return new FlutterInitializationStatus( + (Map) readValueOfType(buffer.get(), buffer)); + case VALUE_SERVER_SIDE_VERIFICATION_OPTIONS: + return new FlutterServerSideVerificationOptions( + (String) readValueOfType(buffer.get(), buffer), + (String) readValueOfType(buffer.get(), buffer)); + case VALUE_NATIVE_AD_OPTIONS: + return new FlutterNativeAdOptions( + (Integer) readValueOfType(buffer.get(), buffer), + (Integer) readValueOfType(buffer.get(), buffer), + (FlutterVideoOptions) readValueOfType(buffer.get(), buffer), + (Boolean) readValueOfType(buffer.get(), buffer), + (Boolean) readValueOfType(buffer.get(), buffer), + (Boolean) readValueOfType(buffer.get(), buffer)); + case VALUE_VIDEO_OPTIONS: + return new FlutterVideoOptions( + (Boolean) readValueOfType(buffer.get(), buffer), + (Boolean) readValueOfType(buffer.get(), buffer), + (Boolean) readValueOfType(buffer.get(), buffer)); + case VALUE_REQUEST_CONFIGURATION_PARAMS: + RequestConfiguration.Builder rcb = new RequestConfiguration.Builder(); + rcb.setMaxAdContentRating((String) readValueOfType(buffer.get(), buffer)); + rcb.setTagForChildDirectedTreatment((Integer) readValueOfType(buffer.get(), buffer)); + rcb.setTagForUnderAgeOfConsent((Integer) readValueOfType(buffer.get(), buffer)); + rcb.setTestDeviceIds((List) readValueOfType(buffer.get(), buffer)); + return rcb.build(); + case VALUE_NATIVE_TEMPLATE_STYLE: + return new FlutterNativeTemplateStyle( + (FlutterNativeTemplateType) readValueOfType(buffer.get(), buffer), + (ColorDrawable) readValueOfType(buffer.get(), buffer), + (FlutterNativeTemplateTextStyle) readValueOfType(buffer.get(), buffer), + (FlutterNativeTemplateTextStyle) readValueOfType(buffer.get(), buffer), + (FlutterNativeTemplateTextStyle) readValueOfType(buffer.get(), buffer), + (FlutterNativeTemplateTextStyle) readValueOfType(buffer.get(), buffer)); + case VALUE_NATIVE_TEMPLATE_TEXT_STYLE: + return new FlutterNativeTemplateTextStyle( + (ColorDrawable) readValueOfType(buffer.get(), buffer), + (ColorDrawable) readValueOfType(buffer.get(), buffer), + (FlutterNativeTemplateFontStyle) readValueOfType(buffer.get(), buffer), + ((Double) readValueOfType(buffer.get(), buffer))); + case VALUE_NATIVE_TEMPLATE_FONT_STYLE: + return FlutterNativeTemplateFontStyle.fromIntValue( + (Integer) readValueOfType(buffer.get(), buffer)); + case VALUE_NATIVE_TEMPLATE_TYPE: + return FlutterNativeTemplateType.fromIntValue( + (Integer) readValueOfType(buffer.get(), buffer)); + case VALUE_COLOR: + final Integer alpha = (Integer) readValueOfType(buffer.get(), buffer); + final Integer red = (Integer) readValueOfType(buffer.get(), buffer); + final Integer green = (Integer) readValueOfType(buffer.get(), buffer); + final Integer blue = (Integer) readValueOfType(buffer.get(), buffer); + return new ColorDrawable(Color.argb(alpha, red, green, blue)); + default: + return super.readValueOfType(type, buffer); + } + } + + protected void writeAdSize(ByteArrayOutputStream stream, FlutterAdSize value) { + if (value instanceof FlutterAdSize.InlineAdaptiveBannerAdSize) { + final InlineAdaptiveBannerAdSize size = (InlineAdaptiveBannerAdSize) value; + stream.write(VALUE_INLINE_ADAPTIVE_BANNER_AD_SIZE); + writeValue(stream, size.width); + writeValue(stream, size.maxHeight); + writeValue(stream, size.orientation); + } else if (value instanceof FlutterAdSize.AnchoredAdaptiveBannerAdSize) { + stream.write(VALUE_ANCHORED_ADAPTIVE_BANNER_AD_SIZE); + final FlutterAdSize.AnchoredAdaptiveBannerAdSize size = + (FlutterAdSize.AnchoredAdaptiveBannerAdSize) value; + writeValue(stream, size.orientation); + writeValue(stream, size.width); + } else if (value instanceof FlutterAdSize.SmartBannerAdSize) { + stream.write(VALUE_SMART_BANNER_AD_SIZE); + } else if (value instanceof FlutterAdSize.FluidAdSize) { + stream.write(VALUE_FLUID_AD_SIZE); + } else { + stream.write(VALUE_AD_SIZE); + writeValue(stream, value.width); + writeValue(stream, value.height); + } + } + + @Nullable + private static Boolean booleanValueOf(@Nullable Object object) { + if (object == null) { + return null; + } + return (Boolean) object; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AppStateNotifier.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AppStateNotifier.java new file mode 100644 index 00000000..3e6bffb9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/AppStateNotifier.java @@ -0,0 +1,94 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Lifecycle.Event; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ProcessLifecycleOwner; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +/** Listens to changes in app foreground/background and forwards events to Flutter. */ +final class AppStateNotifier implements LifecycleEventObserver, MethodCallHandler, StreamHandler { + + private static final String METHOD_CHANNEL_NAME = + "plugins.flutter.io/google_mobile_ads/app_state_method"; + private static final String EVENT_CHANNEL_NAME = + "plugins.flutter.io/google_mobile_ads/app_state_event"; + + @NonNull private final MethodChannel methodChannel; + @NonNull private final EventChannel eventChannel; + + @Nullable private EventSink events; + + AppStateNotifier(BinaryMessenger binaryMessenger) { + methodChannel = new MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME); + methodChannel.setMethodCallHandler(this); + eventChannel = new EventChannel(binaryMessenger, EVENT_CHANNEL_NAME); + eventChannel.setStreamHandler(this); + } + + /** Starts listening for app lifecycle changes. */ + void start() { + ProcessLifecycleOwner.get().getLifecycle().addObserver(this); + } + + /** Stops listening for app lifecycle changes. */ + void stop() { + ProcessLifecycleOwner.get().getLifecycle().removeObserver(this); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + switch (call.method) { + case "start": + start(); + break; + case "stop": + stop(); + break; + default: + result.notImplemented(); + } + } + + @Override + public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) { + if (event == Event.ON_START && events != null) { + events.success("foreground"); + } else if (event == Event.ON_STOP && events != null) { + events.success("background"); + } + } + + @Override + public void onListen(Object arguments, EventSink events) { + this.events = events; + } + + @Override + public void onCancel(Object arguments) { + this.events = null; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/BannerAdCreator.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/BannerAdCreator.java new file mode 100644 index 00000000..618eb183 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/BannerAdCreator.java @@ -0,0 +1,40 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import androidx.annotation.NonNull; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.admanager.AdManagerAdView; + +/** Creates AdView and AdManagerAdViews for banner ads. */ +public class BannerAdCreator { + + @NonNull private final Context context; + + public BannerAdCreator(@NonNull Context context) { + this.context = context; + } + + /** Create a new {@link AdManagerAdView}. */ + public AdManagerAdView createAdManagerAdView() { + return new AdManagerAdView(context); + } + + /** Create a new {@link AdView}. */ + public AdView createAdView() { + return new AdView(context); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/Constants.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/Constants.java new file mode 100644 index 00000000..ab28b206 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/Constants.java @@ -0,0 +1,27 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +/** Constants used in the plugin. */ +public class Constants { + /** Version request agent. Should be bumped alongside plugin versions. */ + public static final String REQUEST_AGENT_PREFIX_VERSIONED = "Flutter-GMA-8.0.0"; + /** Prefix for news template */ + public static final String REQUEST_AGENT_NEWS_TEMPLATE_PREFIX = "News"; + + public static final String REQUEST_AGENT_GAME_TEMPLATE_PREFIX = "Game"; + + static final String ERROR_CODE_UNEXPECTED_AD_TYPE = "unexpected_ad_type"; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAd.java new file mode 100644 index 00000000..35dadd63 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAd.java @@ -0,0 +1,125 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import android.view.View; +import android.view.View.OnLayoutChangeListener; +import android.view.ViewGroup; +import android.widget.ScrollView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import com.google.android.gms.ads.AdSize; +import io.flutter.plugin.platform.PlatformView; +import java.util.Collections; + +/** A subclass of {@link FlutterAdManagerBannerAd} specifically for fluid ad size. */ +final class FluidAdManagerBannerAd extends FlutterAdManagerBannerAd { + + private static final String TAG = "FluidAdManagerBannerAd"; + + @Nullable private ViewGroup containerView; + + private int height = -1; + + FluidAdManagerBannerAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdManagerAdRequest request, + @NonNull BannerAdCreator bannerAdCreator) { + super( + adId, + manager, + adUnitId, + Collections.singletonList(new FlutterAdSize(AdSize.FLUID)), + request, + bannerAdCreator); + } + + @Override + public void onAdLoaded() { + if (adView != null) { + adView.addOnLayoutChangeListener( + new OnLayoutChangeListener() { + @Override + public void onLayoutChange( + View v, + int left, + int top, + int right, + int bottom, + int oldLeft, + int oldTop, + int oldRight, + int oldBottom) { + // Forward the new height to its container. + int newHeight = v.getMeasuredHeight(); + if (newHeight != height) { + manager.onFluidAdHeightChanged(adId, newHeight); + } + height = newHeight; + } + }); + manager.onAdLoaded(adId, adView.getResponseInfo()); + } + } + + @Nullable + @Override + PlatformView getPlatformView() { + if (adView == null) { + return null; + } + if (containerView != null) { + return new FlutterPlatformView(containerView); + } + // Place the ad view inside a scroll view. This allows the height of the ad view to overflow + // its container so we can calculate the height and send it back to flutter. + ScrollView scrollView = createContainerView(); + if (scrollView == null) { + return null; + } + scrollView.setClipChildren(false); + scrollView.setVerticalScrollBarEnabled(false); + scrollView.setHorizontalScrollBarEnabled(false); + containerView = scrollView; + containerView.addView(adView); + return new FlutterPlatformView(adView); + } + + @Nullable + @VisibleForTesting + ScrollView createContainerView() { + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to create container view before plugin is attached to an activity."); + return null; + } + return new ScrollView(manager.getActivity()); + } + + @Override + void dispose() { + if (adView != null) { + adView.destroy(); + adView = null; + } + if (containerView != null) { + containerView.removeAllViews(); + containerView = null; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAd.java new file mode 100644 index 00000000..9730b514 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAd.java @@ -0,0 +1,388 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdapterResponseInfo; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import io.flutter.plugin.platform.PlatformView; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +abstract class FlutterAd { + + protected final int adId; + + FlutterAd(int adId) { + this.adId = adId; + } + + /** A {@link FlutterAd} that is overlaid on top of a running application. */ + abstract static class FlutterOverlayAd extends FlutterAd { + abstract void show(); + + abstract void setImmersiveMode(boolean immersiveModeEnabled); + + FlutterOverlayAd(int adId) { + super(adId); + } + } + + /** A wrapper around {@link ResponseInfo}. */ + static class FlutterResponseInfo { + + @Nullable private final String responseId; + @Nullable private final String mediationAdapterClassName; + @NonNull private final List adapterResponses; + @Nullable private final FlutterAdapterResponseInfo loadedAdapterResponseInfo; + @NonNull private final Map responseExtras; + + FlutterResponseInfo(@NonNull ResponseInfo responseInfo) { + this.responseId = responseInfo.getResponseId(); + this.mediationAdapterClassName = responseInfo.getMediationAdapterClassName(); + final List adapterResponseInfos = new ArrayList<>(); + for (AdapterResponseInfo adapterInfo : responseInfo.getAdapterResponses()) { + adapterResponseInfos.add(new FlutterAdapterResponseInfo(adapterInfo)); + } + this.adapterResponses = adapterResponseInfos; + if (responseInfo.getLoadedAdapterResponseInfo() != null) { + this.loadedAdapterResponseInfo = + new FlutterAdapterResponseInfo(responseInfo.getLoadedAdapterResponseInfo()); + } else { + this.loadedAdapterResponseInfo = null; + } + Map extras = new HashMap<>(); + if (responseInfo.getResponseExtras() != null) { + for (String key : responseInfo.getResponseExtras().keySet()) { + String value = responseInfo.getResponseExtras().getString(key); + extras.put(key, value); + } + } + + this.responseExtras = extras; + } + + FlutterResponseInfo( + @Nullable String responseId, + @Nullable String mediationAdapterClassName, + @NonNull List adapterResponseInfos, + @Nullable FlutterAdapterResponseInfo loadedAdapterResponseInfo, + @NonNull Map responseExtras) { + this.responseId = responseId; + this.mediationAdapterClassName = mediationAdapterClassName; + this.adapterResponses = adapterResponseInfos; + this.loadedAdapterResponseInfo = loadedAdapterResponseInfo; + this.responseExtras = responseExtras; + } + + @Nullable + String getResponseId() { + return responseId; + } + + @Nullable + String getMediationAdapterClassName() { + return mediationAdapterClassName; + } + + @NonNull + List getAdapterResponses() { + return adapterResponses; + } + + @Nullable + FlutterAdapterResponseInfo getLoadedAdapterResponseInfo() { + return loadedAdapterResponseInfo; + } + + @NonNull + Map getResponseExtras() { + return responseExtras; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == this) { + return true; + } else if (!(obj instanceof FlutterResponseInfo)) { + return false; + } + + FlutterResponseInfo that = (FlutterResponseInfo) obj; + return Objects.equals(responseId, that.responseId) + && Objects.equals(mediationAdapterClassName, that.mediationAdapterClassName) + && Objects.equals(adapterResponses, that.adapterResponses) + && Objects.equals(loadedAdapterResponseInfo, that.loadedAdapterResponseInfo); + } + + @Override + public int hashCode() { + return Objects.hash( + responseId, mediationAdapterClassName, adapterResponses, loadedAdapterResponseInfo); + } + } + + /** A wrapper for {@link AdapterResponseInfo}. */ + static class FlutterAdapterResponseInfo { + + @NonNull private final String adapterClassName; + private final long latencyMillis; + @NonNull private final String description; + @NonNull private final Map adUnitMapping; + @Nullable private FlutterAdError error; + @NonNull private final String adSourceName; + @NonNull private final String adSourceId; + @NonNull private final String adSourceInstanceName; + @NonNull private final String adSourceInstanceId; + + FlutterAdapterResponseInfo(@NonNull AdapterResponseInfo responseInfo) { + this.adapterClassName = responseInfo.getAdapterClassName(); + this.latencyMillis = responseInfo.getLatencyMillis(); + this.description = responseInfo.toString(); + if (responseInfo.getCredentials() != null) { + this.adUnitMapping = new HashMap<>(); + for (String key : responseInfo.getCredentials().keySet()) { + adUnitMapping.put(key, responseInfo.getCredentials().getString(key)); + } + } else { + adUnitMapping = new HashMap<>(); + } + if (responseInfo.getAdError() != null) { + this.error = new FlutterAdError(responseInfo.getAdError()); + } + adSourceName = responseInfo.getAdSourceName(); + adSourceId = responseInfo.getAdSourceId(); + adSourceInstanceName = responseInfo.getAdSourceInstanceName(); + adSourceInstanceId = responseInfo.getAdSourceInstanceId(); + } + + FlutterAdapterResponseInfo( + @NonNull String adapterClassName, + long latencyMillis, + @NonNull String description, + @NonNull Map adUnitMapping, + @Nullable FlutterAdError error, + @NonNull String adSourceName, + @NonNull String adSourceId, + @NonNull String adSourceInstanceName, + @NonNull String adSourceInstanceId) { + this.adapterClassName = adapterClassName; + this.latencyMillis = latencyMillis; + this.description = description; + this.adUnitMapping = adUnitMapping; + this.error = error; + this.adSourceName = adSourceName; + this.adSourceId = adSourceId; + this.adSourceInstanceName = adSourceInstanceName; + this.adSourceInstanceId = adSourceInstanceId; + } + + @NonNull + public String getAdapterClassName() { + return adapterClassName; + } + + public long getLatencyMillis() { + return latencyMillis; + } + + @NonNull + public String getDescription() { + return description; + } + + @NonNull + public Map getAdUnitMapping() { + return adUnitMapping; + } + + @Nullable + public FlutterAdError getError() { + return error; + } + + @NonNull + public String getAdSourceName() { + return adSourceName; + } + + @NonNull + public String getAdSourceId() { + return adSourceId; + } + + @NonNull + public String getAdSourceInstanceName() { + return adSourceInstanceName; + } + + @NonNull + public String getAdSourceInstanceId() { + return adSourceInstanceId; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == this) { + return true; + } else if (!(obj instanceof FlutterAdapterResponseInfo)) { + return false; + } + + final FlutterAdapterResponseInfo that = (FlutterAdapterResponseInfo) obj; + return Objects.equals(adapterClassName, that.adapterClassName) + && latencyMillis == that.latencyMillis + && Objects.equals(description, that.description) + && Objects.equals(error, that.error) + && Objects.equals(adUnitMapping, that.adUnitMapping) + && Objects.equals(adSourceName, that.adSourceName) + && Objects.equals(adSourceId, that.adSourceId) + && Objects.equals(adSourceInstanceName, that.adSourceInstanceName) + && Objects.equals(adSourceInstanceId, that.adSourceInstanceId); + } + + @Override + public int hashCode() { + return Objects.hash( + adapterClassName, + latencyMillis, + description, + error, + adSourceName, + adSourceId, + adSourceInstanceName, + adSourceInstanceId); + } + } + + /** Wrapper for {@link AdError}. */ + static class FlutterAdError { + final int code; + @NonNull final String domain; + @NonNull final String message; + + FlutterAdError(@NonNull AdError error) { + code = error.getCode(); + domain = error.getDomain(); + message = error.getMessage(); + } + + FlutterAdError(int code, @NonNull String domain, @NonNull String message) { + this.code = code; + this.domain = domain; + this.message = message; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } else if (!(object instanceof FlutterAdError)) { + return false; + } + + final FlutterAdError that = (FlutterAdError) object; + + if (code != that.code) { + return false; + } else if (!domain.equals(that.domain)) { + return false; + } + return message.equals(that.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, domain, message); + } + } + + /** Wrapper for {@link LoadAdError}. */ + static class FlutterLoadAdError { + final int code; + @NonNull final String domain; + @NonNull final String message; + @Nullable FlutterResponseInfo responseInfo; + + FlutterLoadAdError(@NonNull LoadAdError error) { + code = error.getCode(); + domain = error.getDomain(); + message = error.getMessage(); + + if (error.getResponseInfo() != null) { + responseInfo = new FlutterResponseInfo(error.getResponseInfo()); + } + } + + FlutterLoadAdError( + int code, + @NonNull String domain, + @NonNull String message, + @Nullable FlutterResponseInfo responseInfo) { + this.code = code; + this.domain = domain; + this.message = message; + this.responseInfo = responseInfo; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } else if (!(object instanceof FlutterLoadAdError)) { + return false; + } + + final FlutterLoadAdError that = (FlutterLoadAdError) object; + + if (code != that.code) { + return false; + } else if (!domain.equals(that.domain)) { + return false; + } else if (!Objects.equals(responseInfo, that.responseInfo)) { + return false; + } + return message.equals(that.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, domain, message, responseInfo); + } + } + + abstract void load(); + + /** + * Gets the PlatformView for the ad. Default behavior is to return null. Should be overridden by + * ads with platform views, such as banner and native ads. + */ + @Nullable + PlatformView getPlatformView() { + return null; + }; + + /** + * Invoked when dispose() is called on the corresponding Flutter ad object. This perform any + * necessary cleanup. + */ + abstract void dispose(); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdListener.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdListener.java new file mode 100644 index 00000000..8f29ee43 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdListener.java @@ -0,0 +1,112 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAd.OnNativeAdLoadedListener; +import java.lang.ref.WeakReference; + +/** Callback type to notify when an ad successfully loads. */ +interface FlutterAdLoadedListener { + void onAdLoaded(); +} + +class FlutterAdListener extends AdListener { + protected final int adId; + @NonNull protected final AdInstanceManager manager; + + FlutterAdListener(int adId, @NonNull AdInstanceManager manager) { + this.adId = adId; + this.manager = manager; + } + + @Override + public void onAdClosed() { + manager.onAdClosed(adId); + } + + @Override + public void onAdFailedToLoad(LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterAd.FlutterLoadAdError(loadAdError)); + } + + @Override + public void onAdOpened() { + manager.onAdOpened(adId); + } + + @Override + public void onAdImpression() { + manager.onAdImpression(adId); + } + + @Override + public void onAdClicked() { + manager.onAdClicked(adId); + } +} + +/** + * Ad listener for banner ads. Does not override onAdClicked(), since that is only for native ads. + */ +class FlutterBannerAdListener extends FlutterAdListener { + + @NonNull final WeakReference adLoadedListenerWeakReference; + + FlutterBannerAdListener( + int adId, @NonNull AdInstanceManager manager, FlutterAdLoadedListener adLoadedListener) { + super(adId, manager); + adLoadedListenerWeakReference = new WeakReference<>(adLoadedListener); + } + + @Override + public void onAdLoaded() { + if (adLoadedListenerWeakReference.get() != null) { + adLoadedListenerWeakReference.get().onAdLoaded(); + } + } +} + +/** Listener for native ads. */ +class FlutterNativeAdListener extends FlutterAdListener { + + FlutterNativeAdListener(int adId, AdInstanceManager manager) { + super(adId, manager); + } + + @Override + public void onAdLoaded() { + // Do nothing. Loaded event is handled from FlutterNativeAdLoadedListener. + } +} + +/** {@link OnNativeAdLoadedListener} for native ads. */ +class FlutterNativeAdLoadedListener implements OnNativeAdLoadedListener { + + private final WeakReference nativeAdWeakReference; + + FlutterNativeAdLoadedListener(FlutterNativeAd flutterNativeAd) { + nativeAdWeakReference = new WeakReference<>(flutterNativeAd); + } + + @Override + public void onNativeAdLoaded(@NonNull NativeAd nativeAd) { + if (nativeAdWeakReference.get() != null) { + nativeAdWeakReference.get().onNativeAdLoaded(nativeAd); + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdLoader.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdLoader.java new file mode 100644 index 00000000..0e864e7d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdLoader.java @@ -0,0 +1,140 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import androidx.annotation.NonNull; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdLoader; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAd; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAdLoadCallback; +import com.google.android.gms.ads.appopen.AppOpenAd; +import com.google.android.gms.ads.appopen.AppOpenAd.AppOpenAdLoadCallback; +import com.google.android.gms.ads.interstitial.InterstitialAd; +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; +import com.google.android.gms.ads.nativead.NativeAd.OnNativeAdLoadedListener; +import com.google.android.gms.ads.nativead.NativeAdOptions; +import com.google.android.gms.ads.rewarded.RewardedAd; +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback; + +/** + * A wrapper around load methods in GMA. This exists mainly to make the Android code more testable. + */ +public class FlutterAdLoader { + + @NonNull private final Context context; + + public FlutterAdLoader(@NonNull Context context) { + this.context = context; + } + + /** Load an app open ad. */ + public void loadAppOpen( + @NonNull String adUnitId, + @NonNull AdRequest adRequest, + @NonNull AppOpenAdLoadCallback loadCallback) { + AppOpenAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load an ad manager app open ad. */ + public void loadAdManagerAppOpen( + @NonNull String adUnitId, + @NonNull AdManagerAdRequest adRequest, + @NonNull AppOpenAdLoadCallback loadCallback) { + AppOpenAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load an interstitial ad. */ + public void loadInterstitial( + @NonNull String adUnitId, + @NonNull AdRequest adRequest, + @NonNull InterstitialAdLoadCallback loadCallback) { + InterstitialAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load an ad manager interstitial ad. */ + public void loadAdManagerInterstitial( + @NonNull String adUnitId, + @NonNull AdManagerAdRequest adRequest, + @NonNull AdManagerInterstitialAdLoadCallback loadCallback) { + AdManagerInterstitialAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load a rewarded ad. */ + public void loadRewarded( + @NonNull String adUnitId, + @NonNull AdRequest adRequest, + @NonNull RewardedAdLoadCallback loadCallback) { + RewardedAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load a rewarded interstitial ad. */ + public void loadRewardedInterstitial( + @NonNull String adUnitId, + @NonNull AdRequest adRequest, + @NonNull RewardedInterstitialAdLoadCallback loadCallback) { + RewardedInterstitialAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load an ad manager rewarded ad. */ + public void loadAdManagerRewarded( + @NonNull String adUnitId, + @NonNull AdManagerAdRequest adRequest, + @NonNull RewardedAdLoadCallback loadCallback) { + RewardedAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load an ad manager rewarded interstitial ad. */ + public void loadAdManagerRewardedInterstitial( + @NonNull String adUnitId, + @NonNull AdManagerAdRequest adRequest, + @NonNull RewardedInterstitialAdLoadCallback loadCallback) { + RewardedInterstitialAd.load(context, adUnitId, adRequest, loadCallback); + } + + /** Load a native ad. */ + public void loadNativeAd( + @NonNull String adUnitId, + @NonNull OnNativeAdLoadedListener onNativeAdLoadedListener, + @NonNull NativeAdOptions nativeAdOptions, + @NonNull AdListener adListener, + @NonNull AdRequest adRequest) { + new AdLoader.Builder(context, adUnitId) + .forNativeAd(onNativeAdLoadedListener) + .withNativeAdOptions(nativeAdOptions) + .withAdListener(adListener) + .build() + .loadAd(adRequest); + } + + /** Load an ad manager native ad. */ + public void loadAdManagerNativeAd( + @NonNull String adUnitId, + @NonNull OnNativeAdLoadedListener onNativeAdLoadedListener, + @NonNull NativeAdOptions nativeAdOptions, + @NonNull AdListener adListener, + @NonNull AdManagerAdRequest adManagerAdRequest) { + new AdLoader.Builder(context, adUnitId) + .forNativeAd(onNativeAdLoadedListener) + .withNativeAdOptions(nativeAdOptions) + .withAdListener(adListener) + .build() + .loadAd(adManagerAdRequest); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequest.java new file mode 100644 index 00000000..2ae5f99f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequest.java @@ -0,0 +1,163 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Instantiates and serializes {@link com.google.android.gms.ads.admanager.AdManagerAdRequest} for + * the Google Mobile Ads Plugin. + */ +class FlutterAdManagerAdRequest extends FlutterAdRequest { + + @Nullable private final Map customTargeting; + @Nullable private final Map> customTargetingLists; + @Nullable private final String publisherProvidedId; + + static class Builder extends FlutterAdRequest.Builder { + + @Nullable private Map customTargeting; + @Nullable private Map> customTargetingLists; + @Nullable private String publisherProvidedId; + + @CanIgnoreReturnValue + public Builder setCustomTargeting(@Nullable Map customTargeting) { + this.customTargeting = customTargeting; + return this; + } + + @CanIgnoreReturnValue + public Builder setCustomTargetingLists( + @Nullable Map> customTargetingLists) { + this.customTargetingLists = customTargetingLists; + return this; + } + + @CanIgnoreReturnValue + public Builder setPublisherProvidedId(@Nullable String publisherProvidedId) { + this.publisherProvidedId = publisherProvidedId; + return this; + } + + @Override + FlutterAdManagerAdRequest build() { + return new FlutterAdManagerAdRequest( + getKeywords(), + getContentUrl(), + customTargeting, + customTargetingLists, + getNonPersonalizedAds(), + getNeighboringContentUrls(), + getHttpTimeoutMillis(), + publisherProvidedId, + getMediationExtrasIdentifier(), + getMediationNetworkExtrasProvider(), + getAdMobExtras(), + getRequestAgent(), + getMediationExtras()); + } + } + + @SuppressWarnings("deprecation") // Keeping for compatibility + private FlutterAdManagerAdRequest( + @Nullable List keywords, + @Nullable String contentUrl, + @Nullable Map customTargeting, + @Nullable Map> customTargetingLists, + @Nullable Boolean nonPersonalizedAds, + @Nullable List neighboringContentUrls, + @Nullable Integer httpTimeoutMillis, + @Nullable String publisherProvidedId, + @Nullable String mediationExtrasIdentifier, + @Nullable MediationNetworkExtrasProvider mediationNetworkExtrasProvider, + @Nullable Map adMobExtras, + @NonNull String requestAgent, + @Nullable List mediationExtras) { + super( + keywords, + contentUrl, + nonPersonalizedAds, + neighboringContentUrls, + httpTimeoutMillis, + mediationExtrasIdentifier, + mediationNetworkExtrasProvider, + adMobExtras, + requestAgent, + mediationExtras); + this.customTargeting = customTargeting; + this.customTargetingLists = customTargetingLists; + this.publisherProvidedId = publisherProvidedId; + } + + AdManagerAdRequest asAdManagerAdRequest(String adUnitId) { + final AdManagerAdRequest.Builder builder = new AdManagerAdRequest.Builder(); + updateAdRequestBuilder(builder, adUnitId); + + if (customTargeting != null) { + for (final Map.Entry entry : customTargeting.entrySet()) { + builder.addCustomTargeting(entry.getKey(), entry.getValue()); + } + } + if (customTargetingLists != null) { + for (final Map.Entry> entry : customTargetingLists.entrySet()) { + builder.addCustomTargeting(entry.getKey(), entry.getValue()); + } + } + if (publisherProvidedId != null) { + builder.setPublisherProvidedId(publisherProvidedId); + } + return builder.build(); + } + + @Nullable + protected Map getCustomTargeting() { + return customTargeting; + } + + @Nullable + protected Map> getCustomTargetingLists() { + return customTargetingLists; + } + + @Nullable + protected String getPublisherProvidedId() { + return publisherProvidedId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterAdManagerAdRequest)) { + return false; + } + + FlutterAdManagerAdRequest request = (FlutterAdManagerAdRequest) o; + return super.equals(o) + && Objects.equals(customTargeting, request.customTargeting) + && Objects.equals(customTargetingLists, request.customTargetingLists); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), customTargeting, customTargetingLists); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAd.java new file mode 100644 index 00000000..c07168eb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAd.java @@ -0,0 +1,131 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + +import android.view.ViewGroup.LayoutParams; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.admanager.AdManagerAdView; +import com.google.android.gms.ads.admanager.AppEventListener; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.util.Preconditions; +import java.util.List; + +/** + * Wrapper around {@link com.google.android.gms.ads.admanager.AdManagerAdView} for the Google Mobile + * Ads Plugin. + */ +class FlutterAdManagerBannerAd extends FlutterAd implements FlutterAdLoadedListener { + + @NonNull protected final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final List sizes; + @NonNull private final FlutterAdManagerAdRequest request; + @NonNull private final BannerAdCreator bannerAdCreator; + @Nullable protected AdManagerAdView adView; + + /** + * Constructs a `FlutterAdManagerBannerAd`. + * + *

Call `load()` to instantiate the `AdView` and load the `AdRequest`. `getView()` will return + * null only until `load` is called. + */ + public FlutterAdManagerBannerAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull List sizes, + @NonNull FlutterAdManagerAdRequest request, + @NonNull BannerAdCreator bannerAdCreator) { + super(adId); + Preconditions.checkNotNull(manager); + Preconditions.checkNotNull(adUnitId); + Preconditions.checkNotNull(sizes); + Preconditions.checkNotNull(request); + this.manager = manager; + this.adUnitId = adUnitId; + this.sizes = sizes; + this.request = request; + this.bannerAdCreator = bannerAdCreator; + } + + @Override + void load() { + adView = bannerAdCreator.createAdManagerAdView(); + if (this instanceof FluidAdManagerBannerAd) { + adView.setLayoutParams(new LayoutParams(MATCH_PARENT, WRAP_CONTENT)); + } + adView.setAdUnitId(adUnitId); + adView.setAppEventListener( + new AppEventListener() { + @Override + public void onAppEvent(String name, String data) { + manager.onAppEvent(adId, name, data); + } + }); + + final AdSize[] allSizes = new AdSize[sizes.size()]; + for (int i = 0; i < sizes.size(); i++) { + allSizes[i] = sizes.get(i).getAdSize(); + } + adView.setAdSizes(allSizes); + adView.setAdListener(new FlutterBannerAdListener(adId, manager, this)); + adView.loadAd(request.asAdManagerAdRequest(adUnitId)); + } + + @Override + public void onAdLoaded() { + if (adView != null) { + manager.onAdLoaded(adId, adView.getResponseInfo()); + } + } + + @Nullable + @Override + PlatformView getPlatformView() { + if (adView == null) { + return null; + } + return new FlutterPlatformView(adView); + } + + @Override + void dispose() { + if (adView != null) { + adView.destroy(); + adView = null; + } + } + + @Nullable + FlutterAdSize getAdSize() { + if (adView == null || adView.getAdSize() == null) { + return null; + } + return new FlutterAdSize(adView.getAdSize()); + } + + boolean isCollapsible() { + if (adView == null) { + return false; + } + + return adView.isCollapsible(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAd.java new file mode 100644 index 00000000..66607fc8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAd.java @@ -0,0 +1,143 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAd; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAdLoadCallback; +import com.google.android.gms.ads.admanager.AppEventListener; +import java.lang.ref.WeakReference; + +/** + * Wrapper around {@link com.google.android.gms.ads.admanager.AdManagerInterstitialAd} for the + * Google Mobile Ads Plugin. + */ +class FlutterAdManagerInterstitialAd extends FlutterAd.FlutterOverlayAd { + private static final String TAG = "FltGAMInterstitialAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final FlutterAdManagerAdRequest request; + @Nullable private AdManagerInterstitialAd ad; + @NonNull private final FlutterAdLoader flutterAdLoader; + + /** + * Constructs a `FlutterAdManagerInterstitialAd`. + * + *

Call `load()` to instantiate the `AdView` and load the `AdRequest`. `getView()` will return + * null only until `load` is called. + */ + public FlutterAdManagerInterstitialAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdManagerAdRequest request, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.flutterAdLoader = flutterAdLoader; + } + + @Override + void load() { + flutterAdLoader.loadAdManagerInterstitial( + adUnitId, + request.asAdManagerAdRequest(adUnitId), + new DelegatingAdManagerInterstitialAdCallbacks(this)); + } + + void onAdLoaded(AdManagerInterstitialAd ad) { + this.ad = ad; + ad.setAppEventListener(new DelegatingAdManagerInterstitialAdCallbacks(this)); + ad.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, ad.getResponseInfo()); + } + + void onAdFailedToLoad(LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterLoadAdError(loadAdError)); + } + + void onAppEvent(@NonNull String name, @NonNull String data) { + manager.onAppEvent(adId, name, data); + } + + @Override + public void show() { + if (ad == null) { + Log.e(TAG, "The interstitial wasn't loaded yet."); + return; + } + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to show interstitial before activity was bound to the plugin."); + return; + } + ad.setFullScreenContentCallback(new FlutterFullScreenContentCallback(manager, adId)); + ad.show(manager.getActivity()); + } + + @Override + public void setImmersiveMode(boolean immersiveModeEnabled) { + if (ad == null) { + Log.e(TAG, "The interstitial wasn't loaded yet."); + return; + } + ad.setImmersiveMode(immersiveModeEnabled); + } + + @Override + void dispose() { + ad = null; + } + + /** + * This class delegates various rewarded ad callbacks to FlutterAdManagerInterstitialAd. Maintains + * a weak reference to avoid memory leaks. + */ + private static final class DelegatingAdManagerInterstitialAdCallbacks + extends AdManagerInterstitialAdLoadCallback implements AppEventListener { + + private final WeakReference delegate; + + DelegatingAdManagerInterstitialAdCallbacks(FlutterAdManagerInterstitialAd delegate) { + this.delegate = new WeakReference<>(delegate); + } + + @Override + public void onAdLoaded(@NonNull AdManagerInterstitialAd interstitialAd) { + if (delegate.get() != null) { + delegate.get().onAdLoaded(interstitialAd); + } + } + + @Override + public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + if (delegate.get() != null) { + delegate.get().onAdFailedToLoad(loadAdError); + } + } + + @Override + public void onAppEvent(@NonNull String name, @NonNull String data) { + if (delegate.get() != null) { + delegate.get().onAppEvent(name, data); + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdRequest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdRequest.java new file mode 100644 index 00000000..e1c65877 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdRequest.java @@ -0,0 +1,359 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.os.Bundle; +import android.util.Pair; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.ads.mediation.admob.AdMobAdapter; +import com.google.android.gms.ads.AbstractAdRequestBuilder; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.mediation.MediationExtrasReceiver; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; + +class FlutterAdRequest { + @Nullable private final List keywords; + @Nullable private final String contentUrl; + @Nullable private final Boolean nonPersonalizedAds; + @Nullable private final List neighboringContentUrls; + @Nullable private final Integer httpTimeoutMillis; + @Nullable private final String mediationExtrasIdentifier; + + @SuppressWarnings("deprecation") // Keeping for compatibility + @Nullable + private final MediationNetworkExtrasProvider mediationNetworkExtrasProvider; + + @Nullable private final Map adMobExtras; + @NonNull private final String requestAgent; + @Nullable private final List mediationExtras; + + protected static class Builder { + @Nullable private List keywords; + @Nullable private String contentUrl; + @Nullable private Boolean nonPersonalizedAds; + @Nullable private List neighboringContentUrls; + @Nullable private Integer httpTimeoutMillis; + @Nullable private String mediationExtrasIdentifier; + + @SuppressWarnings("deprecation") // Keeping for compatibility + @Nullable + private MediationNetworkExtrasProvider mediationNetworkExtrasProvider; + + @Nullable private Map adMobExtras; + @NonNull private String requestAgent; + + @Nullable private List mediationExtras; + + @CanIgnoreReturnValue + Builder setRequestAgent(String requestAgent) { + this.requestAgent = requestAgent; + return this; + } + + @CanIgnoreReturnValue + Builder setKeywords(@Nullable List keywords) { + this.keywords = keywords; + return this; + } + + @CanIgnoreReturnValue + Builder setContentUrl(@Nullable String contentUrl) { + this.contentUrl = contentUrl; + return this; + } + + @CanIgnoreReturnValue + Builder setNonPersonalizedAds(@Nullable Boolean nonPersonalizedAds) { + this.nonPersonalizedAds = nonPersonalizedAds; + return this; + } + + @CanIgnoreReturnValue + Builder setNeighboringContentUrls(@Nullable List neighboringContentUrls) { + this.neighboringContentUrls = neighboringContentUrls; + return this; + } + + @CanIgnoreReturnValue + Builder setHttpTimeoutMillis(@Nullable Integer httpTimeoutMillis) { + this.httpTimeoutMillis = httpTimeoutMillis; + return this; + } + + @CanIgnoreReturnValue + Builder setMediationNetworkExtrasIdentifier(@Nullable String mediationExtrasIdentifier) { + this.mediationExtrasIdentifier = mediationExtrasIdentifier; + return this; + } + + @CanIgnoreReturnValue + @SuppressWarnings("deprecation") // Keeping for compatibility + Builder setMediationNetworkExtrasProvider( + @Nullable MediationNetworkExtrasProvider mediationNetworkExtrasProvider) { + this.mediationNetworkExtrasProvider = mediationNetworkExtrasProvider; + return this; + } + + @CanIgnoreReturnValue + Builder setAdMobExtras(@Nullable Map adMobExtras) { + this.adMobExtras = adMobExtras; + return this; + } + + @CanIgnoreReturnValue + Builder setMediationExtras(@Nullable List mediationExtras) { + this.mediationExtras = mediationExtras; + return this; + } + + @Nullable + protected List getKeywords() { + return keywords; + } + + @Nullable + protected String getContentUrl() { + return contentUrl; + } + + @Nullable + protected Boolean getNonPersonalizedAds() { + return nonPersonalizedAds; + } + + @Nullable + protected List getNeighboringContentUrls() { + return neighboringContentUrls; + } + + @Nullable + protected Integer getHttpTimeoutMillis() { + return httpTimeoutMillis; + } + + @Nullable + protected String getMediationExtrasIdentifier() { + return mediationExtrasIdentifier; + } + + @SuppressWarnings("deprecation") // Keeping for compatibility + @Nullable + protected MediationNetworkExtrasProvider getMediationNetworkExtrasProvider() { + return mediationNetworkExtrasProvider; + } + + @Nullable + protected Map getAdMobExtras() { + return adMobExtras; + } + + @NonNull + protected String getRequestAgent() { + return requestAgent; + } + + @Nullable + protected List getMediationExtras() { + return mediationExtras; + } + + FlutterAdRequest build() { + return new FlutterAdRequest( + keywords, + contentUrl, + nonPersonalizedAds, + neighboringContentUrls, + httpTimeoutMillis, + mediationExtrasIdentifier, + mediationNetworkExtrasProvider, + adMobExtras, + requestAgent, + mediationExtras); + } + } + + @SuppressWarnings("deprecation") // Keeping for compatibility + protected FlutterAdRequest( + @Nullable List keywords, + @Nullable String contentUrl, + @Nullable Boolean nonPersonalizedAds, + @Nullable List neighboringContentUrls, + @Nullable Integer httpTimeoutMillis, + @Nullable String mediationExtrasIdentifier, + @Nullable MediationNetworkExtrasProvider mediationNetworkExtrasProvider, + @Nullable Map adMobExtras, + String requestAgent, + @Nullable List mediationExtras) { + this.keywords = keywords; + this.contentUrl = contentUrl; + this.nonPersonalizedAds = nonPersonalizedAds; + this.neighboringContentUrls = neighboringContentUrls; + this.httpTimeoutMillis = httpTimeoutMillis; + this.mediationExtrasIdentifier = mediationExtrasIdentifier; + this.mediationNetworkExtrasProvider = mediationNetworkExtrasProvider; + this.adMobExtras = adMobExtras; + this.requestAgent = requestAgent; + this.mediationExtras = mediationExtras; + } + + /** Adds network extras to the ad request builder, if any. */ + private > void addNetworkExtras( + AbstractAdRequestBuilder builder, String adUnitId) { + Map, Bundle> networkExtras = new HashMap<>(); + if (mediationExtras != null) { + for (FlutterMediationExtras flutterExtras : mediationExtras) { + Pair, Bundle> pair = + flutterExtras.getMediationExtras(); + networkExtras.put(pair.first, pair.second); + } + } else if (mediationNetworkExtrasProvider != null) { + Map, Bundle> providedExtras = + mediationNetworkExtrasProvider.getMediationExtras(adUnitId, mediationExtrasIdentifier); + networkExtras.putAll(providedExtras); + } + + if (adMobExtras != null && !adMobExtras.isEmpty()) { + Bundle adMobBundle = new Bundle(); + for (Map.Entry extra : adMobExtras.entrySet()) { + adMobBundle.putString(extra.getKey(), extra.getValue()); + } + networkExtras.put(AdMobAdapter.class, adMobBundle); + } + + if (nonPersonalizedAds != null && nonPersonalizedAds) { + Bundle adMobBundle = networkExtras.get(AdMobAdapter.class); + if (adMobBundle == null) { + adMobBundle = new Bundle(); + } + adMobBundle.putString("npa", "1"); + networkExtras.put(AdMobAdapter.class, adMobBundle); + } + + for (Entry, Bundle> entry : networkExtras.entrySet()) { + builder.addNetworkExtrasBundle(entry.getKey(), entry.getValue()); + } + } + + /** Updates the {@link AdRequest.Builder} with the properties in this {@link FlutterAdRequest}. */ + protected > + AbstractAdRequestBuilder updateAdRequestBuilder( + AbstractAdRequestBuilder builder, String adUnitId) { + if (keywords != null) { + for (final String keyword : keywords) { + builder.addKeyword(keyword); + } + } + if (contentUrl != null) { + builder.setContentUrl(contentUrl); + } + addNetworkExtras(builder, adUnitId); + if (neighboringContentUrls != null) { + builder.setNeighboringContentUrls(neighboringContentUrls); + } + if (httpTimeoutMillis != null) { + builder.setHttpTimeoutMillis(httpTimeoutMillis); + } + builder.setRequestAgent(requestAgent); + return builder; + } + + AdRequest asAdRequest(String adUnitId) { + return ((AdRequest.Builder) updateAdRequestBuilder(new AdRequest.Builder(), adUnitId)).build(); + } + + @Nullable + protected List getKeywords() { + return keywords; + } + + @Nullable + protected String getContentUrl() { + return contentUrl; + } + + @Nullable + protected Boolean getNonPersonalizedAds() { + return nonPersonalizedAds; + } + + @Nullable + protected List getNeighboringContentUrls() { + return neighboringContentUrls; + } + + @Nullable + protected Integer getHttpTimeoutMillis() { + return httpTimeoutMillis; + } + + @Nullable + protected String getMediationExtrasIdentifier() { + return mediationExtrasIdentifier; + } + + @Nullable + protected Map getAdMobExtras() { + return adMobExtras; + } + + @NonNull + protected String getRequestAgent() { + return requestAgent; + } + + @Nullable + protected List getMediationExtras() { + return mediationExtras; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterAdRequest)) { + return false; + } + + FlutterAdRequest request = (FlutterAdRequest) o; + return Objects.equals(keywords, request.keywords) + && Objects.equals(contentUrl, request.contentUrl) + && Objects.equals(nonPersonalizedAds, request.nonPersonalizedAds) + && Objects.equals(neighboringContentUrls, request.neighboringContentUrls) + && Objects.equals(httpTimeoutMillis, request.httpTimeoutMillis) + && Objects.equals(mediationExtrasIdentifier, request.mediationExtrasIdentifier) + && Objects.equals(mediationNetworkExtrasProvider, request.mediationNetworkExtrasProvider) + && Objects.equals(adMobExtras, request.adMobExtras) + && Objects.equals(mediationExtras, request.mediationExtras); + } + + @Override + public int hashCode() { + return Objects.hash( + keywords, + contentUrl, + nonPersonalizedAds, + neighboringContentUrls, + httpTimeoutMillis, + mediationExtrasIdentifier, + mediationNetworkExtrasProvider, + mediationExtras); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdSize.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdSize.java new file mode 100644 index 00000000..d08ffa90 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdSize.java @@ -0,0 +1,200 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdSize; + +class FlutterAdSize { + @NonNull final AdSize size; + final int width; + final int height; + + /** Wrapper around static methods for {@link com.google.android.gms.ads.AdSize}. */ + static class AdSizeFactory { + + @SuppressWarnings("deprecation") + AdSize getPortraitAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getPortraitAnchoredAdaptiveBannerAdSize(context, width); + } + + @SuppressWarnings("deprecation") + AdSize getLandscapeAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getLandscapeAnchoredAdaptiveBannerAdSize(context, width); + } + + @SuppressWarnings("deprecation") + AdSize getCurrentOrientationAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width); + } + + AdSize getLargePortraitAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getLargePortraitAnchoredAdaptiveBannerAdSize(context, width); + } + + AdSize getLargeLandscapeAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getLargeLandscapeAnchoredAdaptiveBannerAdSize(context, width); + } + + AdSize getLargeAnchoredAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getLargeAnchoredAdaptiveBannerAdSize(context, width); + } + + AdSize getCurrentOrientationInlineAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(context, width); + } + + AdSize getLandscapeInlineAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getLandscapeInlineAdaptiveBannerAdSize(context, width); + } + + AdSize getPortraitInlineAdaptiveBannerAdSize(Context context, int width) { + return AdSize.getPortraitInlineAdaptiveBannerAdSize(context, width); + } + + AdSize getInlineAdaptiveBannerAdSize(int width, int maxHeight) { + return AdSize.getInlineAdaptiveBannerAdSize(width, maxHeight); + } + } + + static class AnchoredAdaptiveBannerAdSize extends FlutterAdSize { + final String orientation; + + @NonNull + private static AdSize getAdSize( + @NonNull Context context, + @NonNull AdSizeFactory factory, + @Nullable String orientation, + int width, + boolean isLarge) { + if (orientation == null) { + if (isLarge) { + return factory.getLargeAnchoredAdaptiveBannerAdSize(context, width); + } + return factory.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width); + } else if (orientation.equals("portrait")) { + if (isLarge) { + return factory.getLargePortraitAnchoredAdaptiveBannerAdSize(context, width); + } + return factory.getPortraitAnchoredAdaptiveBannerAdSize(context, width); + } else if (orientation.equals("landscape")) { + if (isLarge) { + return factory.getLargeLandscapeAnchoredAdaptiveBannerAdSize(context, width); + } + return factory.getLandscapeAnchoredAdaptiveBannerAdSize(context, width); + } else { + throw new IllegalArgumentException("Unexpected value for orientation: " + orientation); + } + } + + AnchoredAdaptiveBannerAdSize( + @NonNull Context context, + @NonNull AdSizeFactory factory, + @Nullable String orientation, + int width, + boolean isLarge) { + super(getAdSize(context, factory, orientation, width, isLarge)); + this.orientation = orientation; + } + } + + static class SmartBannerAdSize extends FlutterAdSize { + + @SuppressWarnings("deprecation") // Smart banner is already deprecated in Dart. + SmartBannerAdSize() { + super(AdSize.SMART_BANNER); + } + } + + static class FluidAdSize extends FlutterAdSize { + + FluidAdSize() { + super(AdSize.FLUID); + } + } + + static class InlineAdaptiveBannerAdSize extends FlutterAdSize { + + @Nullable final Integer orientation; + @Nullable final Integer maxHeight; + + private static AdSize getAdSize( + @NonNull AdSizeFactory adSizeFactory, + @NonNull Context context, + int width, + @Nullable Integer orientation, + @Nullable Integer maxHeight) { + if (orientation != null) { + return orientation == 0 + ? adSizeFactory.getPortraitInlineAdaptiveBannerAdSize(context, width) + : adSizeFactory.getLandscapeInlineAdaptiveBannerAdSize(context, width); + } else if (maxHeight != null) { + return adSizeFactory.getInlineAdaptiveBannerAdSize(width, maxHeight); + } else { + return adSizeFactory.getCurrentOrientationInlineAdaptiveBannerAdSize(context, width); + } + } + + InlineAdaptiveBannerAdSize( + @NonNull AdSizeFactory adSizeFactory, + @NonNull Context context, + int width, + @Nullable Integer orientation, + @Nullable Integer maxHeight) { + super(getAdSize(adSizeFactory, context, width, orientation, maxHeight)); + this.orientation = orientation; + this.maxHeight = maxHeight; + } + } + + FlutterAdSize(int width, int height) { + this(new AdSize(width, height)); + } + + FlutterAdSize(@NonNull AdSize size) { + this.size = size; + this.width = size.getWidth(); + this.height = size.getHeight(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterAdSize)) { + return false; + } + + final FlutterAdSize that = (FlutterAdSize) o; + + if (width != that.width) { + return false; + } + return height == that.height; + } + + @Override + public int hashCode() { + int result = width; + result = 31 * result + height; + return result; + } + + public AdSize getAdSize() { + return size; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdValue.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdValue.java new file mode 100644 index 00000000..52c639ad --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdValue.java @@ -0,0 +1,30 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; + +/** A wrapper for {@link com.google.android.gms.ads.AdValue}. */ +public class FlutterAdValue { + final int precisionType; + @NonNull final String currencyCode; + final long valueMicros; + + public FlutterAdValue(int precisionType, @NonNull String currencyCode, long valueMicros) { + this.precisionType = precisionType; + this.currencyCode = currencyCode; + this.valueMicros = valueMicros; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdapterStatus.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdapterStatus.java new file mode 100644 index 00000000..3ddbd4c0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdapterStatus.java @@ -0,0 +1,88 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import com.google.android.gms.ads.initialization.AdapterStatus; + +/** + * Wrapper around {@link com.google.android.gms.ads.initialization.AdapterStatus} for the Flutter + * Google Mobile Ads Plugin. + */ +class FlutterAdapterStatus { + @NonNull final AdapterInitializationState state; + @NonNull final String description; + @NonNull final Number latency; + + /** + * Represents {@link com.google.android.gms.ads.initialization.AdapterStatus.State} for the + * Flutter Google Mobile Ads Plugin. + */ + enum AdapterInitializationState { + NOT_READY, + READY + } + + FlutterAdapterStatus( + @NonNull AdapterInitializationState state, + @NonNull String description, + @NonNull Number latency) { + this.state = state; + this.description = description; + this.latency = latency; + } + + FlutterAdapterStatus(@NonNull AdapterStatus status) { + switch (status.getInitializationState()) { + case NOT_READY: + this.state = AdapterInitializationState.NOT_READY; + break; + case READY: + this.state = AdapterInitializationState.READY; + break; + default: + final String message = + String.format("Unable to handle state: %s", status.getInitializationState()); + throw new IllegalArgumentException(message); + } + + this.description = status.getDescription(); + this.latency = status.getLatency(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterAdapterStatus)) { + return false; + } + + final FlutterAdapterStatus that = (FlutterAdapterStatus) o; + if (state != that.state) { + return false; + } else if (!description.equals(that.description)) { + return false; + } + return latency.equals(that.latency); + } + + @Override + public int hashCode() { + int result = state.hashCode(); + result = 31 * result + description.hashCode(); + result = 31 * result + latency.hashCode(); + return result; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAd.java new file mode 100644 index 00000000..28e468f9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAd.java @@ -0,0 +1,130 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.appopen.AppOpenAd; +import com.google.android.gms.ads.appopen.AppOpenAd.AppOpenAdLoadCallback; +import io.flutter.util.Preconditions; +import java.lang.ref.WeakReference; + +/** A wrapper for {@link com.google.android.gms.ads.appopen.AppOpenAd}. */ +class FlutterAppOpenAd extends FlutterAd.FlutterOverlayAd { + + private static final String TAG = "FlutterAppOpenAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @Nullable private final FlutterAdRequest request; + @Nullable private final FlutterAdManagerAdRequest adManagerAdRequest; + @Nullable private AppOpenAd ad; + @NonNull private final FlutterAdLoader flutterAdLoader; + + FlutterAppOpenAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @Nullable FlutterAdRequest request, + @Nullable FlutterAdManagerAdRequest adManagerAdRequest, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + Preconditions.checkState( + request != null || adManagerAdRequest != null, + "One of request and adManagerAdRequest must be non-null."); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.adManagerAdRequest = adManagerAdRequest; + this.flutterAdLoader = flutterAdLoader; + } + + @Override + void load() { + if (request != null) { + flutterAdLoader.loadAppOpen( + adUnitId, request.asAdRequest(adUnitId), new DelegatingAppOpenAdLoadCallback(this)); + } else if (adManagerAdRequest != null) { + flutterAdLoader.loadAdManagerAppOpen( + adUnitId, + adManagerAdRequest.asAdManagerAdRequest(adUnitId), + new DelegatingAppOpenAdLoadCallback(this)); + } + } + + private void onAdLoaded(@NonNull AppOpenAd ad) { + this.ad = ad; + ad.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, ad.getResponseInfo()); + } + + private void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterLoadAdError(loadAdError)); + } + + @Override + void show() { + if (ad == null) { + Log.w(TAG, "Tried to show app open ad before it was loaded"); + return; + } + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to show app open ad before activity was bound to the plugin."); + return; + } + ad.setFullScreenContentCallback(new FlutterFullScreenContentCallback(manager, adId)); + ad.show(manager.getActivity()); + } + + @Override + void setImmersiveMode(boolean immersiveModeEnabled) { + if (ad == null) { + Log.w(TAG, "Tried to set immersive mode on app open ad before it was loaded"); + return; + } + ad.setImmersiveMode(immersiveModeEnabled); + } + + @Override + void dispose() { + ad = null; + } + + /** An AppOpenAdLoadCallback that just forwards events to a delegate. */ + private static final class DelegatingAppOpenAdLoadCallback extends AppOpenAdLoadCallback { + + private final WeakReference delegate; + + DelegatingAppOpenAdLoadCallback(FlutterAppOpenAd delegate) { + this.delegate = new WeakReference<>(delegate); + } + + @Override + public void onAdLoaded(@NonNull AppOpenAd appOpenAd) { + if (delegate.get() != null) { + delegate.get().onAdLoaded(appOpenAd); + } + } + + @Override + public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + if (delegate.get() != null) { + delegate.get().onAdFailedToLoad(loadAdError); + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterBannerAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterBannerAd.java new file mode 100644 index 00000000..ce4e1870 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterBannerAd.java @@ -0,0 +1,102 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdView; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.util.Preconditions; + +/** A wrapper for {@link AdView}. */ +class FlutterBannerAd extends FlutterAd implements FlutterAdLoadedListener { + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final FlutterAdSize size; + @NonNull private final FlutterAdRequest request; + @NonNull private final BannerAdCreator bannerAdCreator; + @Nullable private AdView adView; + + /** Constructs the FlutterBannerAd. */ + public FlutterBannerAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdRequest request, + @NonNull FlutterAdSize size, + @NonNull BannerAdCreator bannerAdCreator) { + super(adId); + Preconditions.checkNotNull(manager); + Preconditions.checkNotNull(adUnitId); + Preconditions.checkNotNull(request); + Preconditions.checkNotNull(size); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.size = size; + this.bannerAdCreator = bannerAdCreator; + } + + @Override + public void onAdLoaded() { + if (adView != null) { + manager.onAdLoaded(adId, adView.getResponseInfo()); + } + } + + @Override + void load() { + adView = bannerAdCreator.createAdView(); + adView.setAdUnitId(adUnitId); + adView.setAdSize(size.getAdSize()); + adView.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + adView.setAdListener(new FlutterBannerAdListener(adId, manager, this)); + adView.loadAd(request.asAdRequest(adUnitId)); + } + + @Nullable + @Override + public PlatformView getPlatformView() { + if (adView == null) { + return null; + } + return new FlutterPlatformView(adView); + } + + @Override + void dispose() { + if (adView != null) { + adView.destroy(); + adView = null; + } + } + + @Nullable + FlutterAdSize getAdSize() { + if (adView == null || adView.getAdSize() == null) { + return null; + } + return new FlutterAdSize(adView.getAdSize()); + } + + boolean isCollapsible() { + if (adView == null) { + return false; + } + + return adView.isCollapsible(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterDestroyableAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterDestroyableAd.java new file mode 100644 index 00000000..c1d9be8d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterDestroyableAd.java @@ -0,0 +1,22 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +/** Interface for a destroyable ad. */ +public interface FlutterDestroyableAd { + + /** Destroy any ads and free up references. */ + void destroy(); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterFullScreenContentCallback.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterFullScreenContentCallback.java new file mode 100644 index 00000000..3359853e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterFullScreenContentCallback.java @@ -0,0 +1,60 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.FullScreenContentCallback; + +/** + * Flutter implementation of {@link FullScreenContentCallback}. Forwards events to + * AdInstanceManager. + */ +class FlutterFullScreenContentCallback extends FullScreenContentCallback { + + @NonNull protected final AdInstanceManager manager; + + @NonNull protected final int adId; + + public FlutterFullScreenContentCallback(@NonNull AdInstanceManager manager, int adId) { + this.manager = manager; + this.adId = adId; + } + + @Override + public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { + manager.onFailedToShowFullScreenContent(adId, adError); + } + + @Override + public void onAdShowedFullScreenContent() { + manager.onAdShowedFullScreenContent(adId); + } + + @Override + public void onAdDismissedFullScreenContent() { + manager.onAdDismissedFullScreenContent(adId); + } + + @Override + public void onAdImpression() { + manager.onAdImpression(adId); + } + + @Override + public void onAdClicked() { + manager.onAdClicked(adId); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInitializationStatus.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInitializationStatus.java new file mode 100644 index 00000000..d4a07107 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInitializationStatus.java @@ -0,0 +1,44 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import com.google.android.gms.ads.initialization.AdapterStatus; +import com.google.android.gms.ads.initialization.InitializationStatus; +import java.util.HashMap; +import java.util.Map; + +/** + * Wrapper around {@link com.google.android.gms.ads.initialization.InitializationStatus} for the + * Flutter Google Mobile Ads Plugin. + */ +class FlutterInitializationStatus { + @NonNull final Map adapterStatuses; + + FlutterInitializationStatus(@NonNull Map adapterStatuses) { + this.adapterStatuses = adapterStatuses; + } + + FlutterInitializationStatus(@NonNull InitializationStatus initializationStatus) { + final HashMap newStatusMap = new HashMap<>(); + final Map adapterStatusMap = initializationStatus.getAdapterStatusMap(); + + for (Map.Entry status : adapterStatusMap.entrySet()) { + newStatusMap.put(status.getKey(), new FlutterAdapterStatus(status.getValue())); + } + + this.adapterStatuses = newStatusMap; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAd.java new file mode 100644 index 00000000..675278a1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAd.java @@ -0,0 +1,119 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.interstitial.InterstitialAd; +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; +import java.lang.ref.WeakReference; + +class FlutterInterstitialAd extends FlutterAd.FlutterOverlayAd { + private static final String TAG = "FlutterInterstitialAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final FlutterAdRequest request; + @Nullable private InterstitialAd ad; + @NonNull private final FlutterAdLoader flutterAdLoader; + + public FlutterInterstitialAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdRequest request, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.flutterAdLoader = flutterAdLoader; + } + + @Override + void load() { + if (manager != null && adUnitId != null && request != null) { + flutterAdLoader.loadInterstitial( + adUnitId, request.asAdRequest(adUnitId), new DelegatingInterstitialAdLoadCallback(this)); + } + } + + void onAdLoaded(InterstitialAd ad) { + this.ad = ad; + ad.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, ad.getResponseInfo()); + } + + void onAdFailedToLoad(LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterAd.FlutterLoadAdError(loadAdError)); + } + + @Override + void dispose() { + ad = null; + } + + @Override + public void show() { + if (ad == null) { + Log.e(TAG, "Error showing interstitial - the interstitial ad wasn't loaded yet."); + return; + } + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to show interstitial before activity was bound to the plugin."); + return; + } + ad.setFullScreenContentCallback(new FlutterFullScreenContentCallback(manager, adId)); + ad.show(manager.getActivity()); + } + + @Override + public void setImmersiveMode(boolean immersiveModeEnabled) { + if (ad == null) { + Log.e( + TAG, + "Error setting immersive mode in interstitial ad - the interstitial ad wasn't loaded yet."); + return; + } + ad.setImmersiveMode(immersiveModeEnabled); + } + + /** An InterstitialAdLoadCallback that just forwards events to a delegate. */ + private static final class DelegatingInterstitialAdLoadCallback + extends InterstitialAdLoadCallback { + + private final WeakReference delegate; + + DelegatingInterstitialAdLoadCallback(FlutterInterstitialAd delegate) { + this.delegate = new WeakReference<>(delegate); + } + + @Override + public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { + if (delegate.get() != null) { + delegate.get().onAdLoaded(interstitialAd); + } + } + + @Override + public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + if (delegate.get() != null) { + delegate.get().onAdFailedToLoad(loadAdError); + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMediationExtras.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMediationExtras.java new file mode 100644 index 00000000..21612988 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMediationExtras.java @@ -0,0 +1,68 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.os.Bundle; +import android.util.Pair; +import com.google.android.gms.ads.mediation.MediationExtrasReceiver; +import java.util.Map; +import java.util.Objects; + +/** + * Mediation Adapters that require extra parameters provide implementations of this interface to + * further be sent to the {@link com.google.android.gms.ads.AdRequest} + * + *

Implementation will receive the Map of Extras via the {@link + * FlutterMediationExtras#setMediationExtras} which the implementation must store and later parse to + * the proper pair of Class and Bundle values returned by {@link + * FlutterMediationExtras#getMediationExtras()} + */ +public abstract class FlutterMediationExtras { + Map extras; + /** + * Called when the {@link FlutterAdRequest} is parsed into an {@link + * com.google.android.gms.ads.AdRequest}. + * + * @return The parsed values to be sent to the {@link + * com.google.android.gms.ads.AdRequest.Builder#addNetworkExtrasBundle} + */ + public abstract Pair, Bundle> getMediationExtras(); + + /** + * Pair of key-values to be stored and later be parsed into a {@link Bundle}. + * + * @param extras Received from the dart layer through the MediationExtras class. + */ + public void setMediationExtras(Map extras) { + this.extras = extras; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterMediationExtras)) { + return false; + } + + FlutterMediationExtras mediationExtras = (FlutterMediationExtras) o; + return Objects.equals(extras, mediationExtras.extras); + } + + @Override + public int hashCode() { + return Objects.hash(extras); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMobileAdsWrapper.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMobileAdsWrapper.java new file mode 100644 index 00000000..83f0f783 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterMobileAdsWrapper.java @@ -0,0 +1,93 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.os.Build; +import android.util.Log; +import android.webkit.WebView; +import androidx.annotation.NonNull; +import com.google.android.gms.ads.MobileAds; +import com.google.android.gms.ads.OnAdInspectorClosedListener; +import com.google.android.gms.ads.RequestConfiguration; +import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.webviewflutter.WebViewFlutterAndroidExternalApi; + +/** A wrapper around static methods in {@link com.google.android.gms.ads.MobileAds}. */ +public class FlutterMobileAdsWrapper { + + private static final String TAG = "FlutterMobileAdsWrapper"; + + public FlutterMobileAdsWrapper() {} + + /** Initializes the sdk. */ + public void initialize( + @NonNull Context context, @NonNull OnInitializationCompleteListener listener) { + new Thread( + new Runnable() { + @Override + public void run() { + MobileAds.initialize(context, listener); + } + }) + .start(); + } + + /** Wrapper for setAppMuted. */ + public void setAppMuted(boolean muted) { + MobileAds.setAppMuted(muted); + } + + /** Wrapper for setAppVolume. */ + public void setAppVolume(double volume) { + MobileAds.setAppVolume((float) volume); + } + + /** Wrapper for disableMediationInitialization. */ + public void disableMediationInitialization(@NonNull Context context) { + MobileAds.disableMediationAdapterInitialization(context); + } + + /** Wrapper for getVersionString. */ + public String getVersionString() { + return MobileAds.getVersion().toString(); + } + + /** Wrapper for getRequestConfiguration. */ + public RequestConfiguration getRequestConfiguration() { + return MobileAds.getRequestConfiguration(); + } + + /** Wrapper for openDebugMenu. */ + public void openDebugMenu(Context context, String adUnitId) { + MobileAds.openDebugMenu(context, adUnitId); + } + + /** Open the ad inspector. */ + public void openAdInspector(Context context, OnAdInspectorClosedListener listener) { + MobileAds.openAdInspector(context, listener); + } + + /** Register the webView for monetization. */ + public void registerWebView(int webViewId, FlutterEngine flutterEngine) { + WebView webView = WebViewFlutterAndroidExternalApi.getWebView(flutterEngine, webViewId); + if (webView == null) { + Log.w(TAG, "MobileAds.registerWebView unable to find webView with id: " + webViewId); + } else { + MobileAds.registerWebView(webView); + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAd.java new file mode 100644 index 00000000..8230b1dd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAd.java @@ -0,0 +1,273 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.ads.nativetemplates.TemplateView; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAd.OnNativeAdLoadedListener; +import com.google.android.gms.ads.nativead.NativeAdOptions; +import com.google.android.gms.ads.nativead.NativeAdView; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateStyle; +import java.util.Map; + +/** A wrapper for {@link NativeAd}. */ +class FlutterNativeAd extends FlutterAd { + private static final String TAG = "FlutterNativeAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @Nullable private final NativeAdFactory adFactory; + @NonNull private final FlutterAdLoader flutterAdLoader; + @Nullable private FlutterAdRequest request; + @Nullable private FlutterAdManagerAdRequest adManagerRequest; + @Nullable private Map customOptions; + @Nullable private NativeAdView nativeAdView; + @Nullable private final FlutterNativeAdOptions nativeAdOptions; + @Nullable private final FlutterNativeTemplateStyle nativeTemplateStyle; + @Nullable private TemplateView templateView; + @NonNull private final Context context; + + static class Builder { + @Nullable private AdInstanceManager manager; + @Nullable private String adUnitId; + @Nullable private NativeAdFactory adFactory; + @Nullable private FlutterAdRequest request; + @Nullable private FlutterAdManagerAdRequest adManagerRequest; + @Nullable private Map customOptions; + @Nullable private Integer id; + @Nullable private FlutterNativeAdOptions nativeAdOptions; + @Nullable private FlutterAdLoader flutterAdLoader; + @Nullable private FlutterNativeTemplateStyle nativeTemplateStyle; + @NonNull private final Context context; + + Builder(Context context) { + this.context = context; + } + + @CanIgnoreReturnValue + public Builder setAdFactory(@NonNull NativeAdFactory adFactory) { + this.adFactory = adFactory; + return this; + } + + @CanIgnoreReturnValue + public Builder setId(int id) { + this.id = id; + return this; + } + + @CanIgnoreReturnValue + public Builder setCustomOptions(@Nullable Map customOptions) { + this.customOptions = customOptions; + return this; + } + + @CanIgnoreReturnValue + public Builder setManager(@NonNull AdInstanceManager manager) { + this.manager = manager; + return this; + } + + @CanIgnoreReturnValue + public Builder setAdUnitId(@NonNull String adUnitId) { + this.adUnitId = adUnitId; + return this; + } + + @CanIgnoreReturnValue + public Builder setRequest(@NonNull FlutterAdRequest request) { + this.request = request; + return this; + } + + @CanIgnoreReturnValue + public Builder setAdManagerRequest(@NonNull FlutterAdManagerAdRequest request) { + this.adManagerRequest = request; + return this; + } + + @CanIgnoreReturnValue + public Builder setNativeAdOptions(@Nullable FlutterNativeAdOptions nativeAdOptions) { + this.nativeAdOptions = nativeAdOptions; + return this; + } + + @CanIgnoreReturnValue + public Builder setFlutterAdLoader(@NonNull FlutterAdLoader flutterAdLoader) { + this.flutterAdLoader = flutterAdLoader; + return this; + } + + @CanIgnoreReturnValue + public Builder setNativeTemplateStyle( + @Nullable FlutterNativeTemplateStyle nativeTemplateStyle) { + this.nativeTemplateStyle = nativeTemplateStyle; + return this; + } + + FlutterNativeAd build() { + if (manager == null) { + throw new IllegalStateException("AdInstanceManager cannot be null."); + } else if (adUnitId == null) { + throw new IllegalStateException("AdUnitId cannot be null."); + } else if (adFactory == null && nativeTemplateStyle == null) { + throw new IllegalStateException("NativeAdFactory and nativeTemplateStyle cannot be null."); + } else if (request == null && adManagerRequest == null) { + throw new IllegalStateException("adRequest or addManagerRequest must be non-null."); + } + + final FlutterNativeAd nativeAd; + if (request == null) { + nativeAd = + new FlutterNativeAd( + context, + id, + manager, + adUnitId, + adFactory, + adManagerRequest, + flutterAdLoader, + customOptions, + nativeAdOptions, + nativeTemplateStyle); + } else { + nativeAd = + new FlutterNativeAd( + context, + id, + manager, + adUnitId, + adFactory, + request, + flutterAdLoader, + customOptions, + nativeAdOptions, + nativeTemplateStyle); + } + return nativeAd; + } + } + + protected FlutterNativeAd( + @NonNull Context context, + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull NativeAdFactory adFactory, + @NonNull FlutterAdRequest request, + @NonNull FlutterAdLoader flutterAdLoader, + @Nullable Map customOptions, + @Nullable FlutterNativeAdOptions nativeAdOptions, + @Nullable FlutterNativeTemplateStyle nativeTemplateStyle) { + super(adId); + this.context = context; + this.manager = manager; + this.adUnitId = adUnitId; + this.adFactory = adFactory; + this.request = request; + this.flutterAdLoader = flutterAdLoader; + this.customOptions = customOptions; + this.nativeAdOptions = nativeAdOptions; + this.nativeTemplateStyle = nativeTemplateStyle; + } + + protected FlutterNativeAd( + @NonNull Context context, + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull NativeAdFactory adFactory, + @NonNull FlutterAdManagerAdRequest adManagerRequest, + @NonNull FlutterAdLoader flutterAdLoader, + @Nullable Map customOptions, + @Nullable FlutterNativeAdOptions nativeAdOptions, + @Nullable FlutterNativeTemplateStyle nativeTemplateStyle) { + super(adId); + this.context = context; + this.manager = manager; + this.adUnitId = adUnitId; + this.adFactory = adFactory; + this.adManagerRequest = adManagerRequest; + this.flutterAdLoader = flutterAdLoader; + this.customOptions = customOptions; + this.nativeAdOptions = nativeAdOptions; + this.nativeTemplateStyle = nativeTemplateStyle; + } + + @Override + void load() { + final OnNativeAdLoadedListener loadedListener = new FlutterNativeAdLoadedListener(this); + final AdListener adListener = new FlutterNativeAdListener(adId, manager); + // Note we delegate loading the ad to FlutterAdLoader mainly for testing purposes. + // As of 20.0.0 of GMA, mockito is unable to mock AdLoader. + final NativeAdOptions options = + this.nativeAdOptions == null + ? new NativeAdOptions.Builder().build() + : nativeAdOptions.asNativeAdOptions(); + if (request != null) { + flutterAdLoader.loadNativeAd( + adUnitId, loadedListener, options, adListener, request.asAdRequest(adUnitId)); + } else if (adManagerRequest != null) { + AdManagerAdRequest adManagerAdRequest = adManagerRequest.asAdManagerAdRequest(adUnitId); + flutterAdLoader.loadAdManagerNativeAd( + adUnitId, loadedListener, options, adListener, adManagerAdRequest); + } else { + Log.e(TAG, "A null or invalid ad request was provided."); + } + } + + @Override + @Nullable + public PlatformView getPlatformView() { + if (nativeAdView != null) { + return new FlutterPlatformView(nativeAdView); + } else if (templateView != null) { + return new FlutterPlatformView(templateView); + } + return null; + } + + void onNativeAdLoaded(@NonNull NativeAd nativeAd) { + if (nativeTemplateStyle != null) { + templateView = nativeTemplateStyle.asTemplateView(context); + templateView.setNativeAd(nativeAd); + } else { + nativeAdView = adFactory.createNativeAd(nativeAd, customOptions); + } + nativeAd.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, nativeAd.getResponseInfo()); + } + + @Override + void dispose() { + if (nativeAdView != null) { + nativeAdView.destroy(); + nativeAdView = null; + } + if (templateView != null) { + templateView.destroyNativeAd(); + templateView = null; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptions.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptions.java new file mode 100644 index 00000000..fe2bb775 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptions.java @@ -0,0 +1,68 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.c language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.Nullable; +import com.google.android.gms.ads.nativead.NativeAdOptions; + +/** A wrapper for {@link com.google.android.gms.ads.nativead.NativeAdOptions}. */ +class FlutterNativeAdOptions { + + @Nullable final Integer adChoicesPlacement; + @Nullable final Integer mediaAspectRatio; + @Nullable final FlutterVideoOptions videoOptions; + @Nullable final Boolean requestCustomMuteThisAd; + @Nullable final Boolean shouldRequestMultipleImages; + @Nullable final Boolean shouldReturnUrlsForImageAssets; + + FlutterNativeAdOptions( + @Nullable Integer adChoicesPlacement, + @Nullable Integer mediaAspectRatio, + @Nullable FlutterVideoOptions videoOptions, + @Nullable Boolean requestCustomMuteThisAd, + @Nullable Boolean shouldRequestMultipleImages, + @Nullable Boolean shouldReturnUrlsForImageAssets) { + this.adChoicesPlacement = adChoicesPlacement; + this.mediaAspectRatio = mediaAspectRatio; + this.videoOptions = videoOptions; + this.requestCustomMuteThisAd = requestCustomMuteThisAd; + this.shouldRequestMultipleImages = shouldRequestMultipleImages; + this.shouldReturnUrlsForImageAssets = shouldReturnUrlsForImageAssets; + } + + NativeAdOptions asNativeAdOptions() { + NativeAdOptions.Builder builder = new NativeAdOptions.Builder(); + if (adChoicesPlacement != null) { + builder.setAdChoicesPlacement(adChoicesPlacement); + } + if (mediaAspectRatio != null) { + builder.setMediaAspectRatio(mediaAspectRatio); + } + if (videoOptions != null) { + builder.setVideoOptions(videoOptions.asVideoOptions()); + } + if (requestCustomMuteThisAd != null) { + builder.setRequestCustomMuteThisAd(requestCustomMuteThisAd); + } + if (shouldRequestMultipleImages != null) { + builder.setRequestMultipleImages(shouldRequestMultipleImages); + } + if (shouldReturnUrlsForImageAssets != null) { + builder.setReturnUrlsForImageAssets(shouldReturnUrlsForImageAssets); + } + return builder.build(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPaidEventListener.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPaidEventListener.java new file mode 100644 index 00000000..01ec96dd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPaidEventListener.java @@ -0,0 +1,38 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.NonNull; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.OnPaidEventListener; + +/** Implementation of {@link OnPaidEventListener} that sends events to {@link AdInstanceManager}. */ +public class FlutterPaidEventListener implements OnPaidEventListener { + @NonNull private final AdInstanceManager manager; + @NonNull private final FlutterAd ad; + + FlutterPaidEventListener(@NonNull AdInstanceManager manager, @NonNull FlutterAd ad) { + this.manager = manager; + this.ad = ad; + } + + @Override + public void onPaidEvent(AdValue adValue) { + FlutterAdValue value = + new FlutterAdValue( + adValue.getPrecisionType(), adValue.getCurrencyCode(), adValue.getValueMicros()); + manager.onPaidEvent(ad, value); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPlatformView.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPlatformView.java new file mode 100644 index 00000000..75ba3940 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterPlatformView.java @@ -0,0 +1,40 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.platform.PlatformView; + +/** A simple PlatformView that wraps a View and sets its reference to null on dispose(). */ +class FlutterPlatformView implements PlatformView { + + @Nullable private View view; + + FlutterPlatformView(@NonNull View view) { + this.view = view; + } + + @Override + public View getView() { + return view; + } + + @Override + public void dispose() { + this.view = null; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProvider.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProvider.java new file mode 100644 index 00000000..1322df6d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProvider.java @@ -0,0 +1,71 @@ +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import android.os.Bundle; +import androidx.annotation.Nullable; + +/** Class that helps detect whether the news or game template is being used. */ +class FlutterRequestAgentProvider { + + static final String GAME_VERSION_KEY = + "io.flutter.plugins.googlemobileads.FLUTTER_GAME_TEMPLATE_VERSION"; + static final String NEWS_VERSION_KEY = + "io.flutter.plugins.googlemobileads.FLUTTER_NEWS_TEMPLATE_VERSION"; + + @Nullable private String newsTemplateVersion; + @Nullable private String gameTemplateVersion; + + FlutterRequestAgentProvider(Context context) { + processGameAndNewsTemplateVersions(context); + } + + private void processGameAndNewsTemplateVersions(Context context) { + try { + ApplicationInfo info; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + info = + context + .getApplicationContext() + .getPackageManager() + .getApplicationInfo( + context.getPackageName(), + PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA)); + } else { + info = + context + .getApplicationContext() + .getPackageManager() + .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); + } + Bundle metaData = info.metaData; + if (metaData != null) { + gameTemplateVersion = info.metaData.getString(GAME_VERSION_KEY); + newsTemplateVersion = info.metaData.getString(NEWS_VERSION_KEY); + } + } catch (NameNotFoundException | ClassCastException e) { + // Do nothing + } + } + + String getRequestAgent() { + StringBuilder sb = new StringBuilder(); + sb.append(Constants.REQUEST_AGENT_PREFIX_VERSIONED); + if (newsTemplateVersion != null) { + sb.append("_"); + sb.append(Constants.REQUEST_AGENT_NEWS_TEMPLATE_PREFIX); + sb.append("-"); + sb.append(newsTemplateVersion); + } + if (gameTemplateVersion != null) { + sb.append("_"); + sb.append(Constants.REQUEST_AGENT_GAME_TEMPLATE_PREFIX); + sb.append("-"); + sb.append(gameTemplateVersion); + } + return sb.toString(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedAd.java new file mode 100644 index 00000000..ee4719e7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedAd.java @@ -0,0 +1,213 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.OnUserEarnedRewardListener; +import com.google.android.gms.ads.rewarded.OnAdMetadataChangedListener; +import com.google.android.gms.ads.rewarded.RewardItem; +import com.google.android.gms.ads.rewarded.RewardedAd; +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback; +import java.lang.ref.WeakReference; + +/** A wrapper for {@link RewardedAd}. */ +class FlutterRewardedAd extends FlutterAd.FlutterOverlayAd { + private static final String TAG = "FlutterRewardedAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final FlutterAdLoader flutterAdLoader; + @Nullable private final FlutterAdRequest request; + @Nullable private final FlutterAdManagerAdRequest adManagerRequest; + @Nullable RewardedAd rewardedAd; + + /** A wrapper for {@link RewardItem}. */ + static class FlutterRewardItem { + @NonNull final Integer amount; + @NonNull final String type; + + FlutterRewardItem(@NonNull Integer amount, @NonNull String type) { + this.amount = amount; + this.type = type; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } else if (!(other instanceof FlutterRewardItem)) { + return false; + } + + final FlutterRewardItem that = (FlutterRewardItem) other; + if (!amount.equals(that.amount)) { + return false; + } + return type.equals(that.type); + } + + @Override + public int hashCode() { + int result = amount.hashCode(); + result = 31 * result + type.hashCode(); + return result; + } + } + + /** Constructor for AdMob Ad Request. */ + public FlutterRewardedAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdRequest request, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.adManagerRequest = null; + this.flutterAdLoader = flutterAdLoader; + } + + /** Constructor for Ad Manager Ad request. */ + public FlutterRewardedAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdManagerAdRequest adManagerRequest, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.adManagerRequest = adManagerRequest; + this.request = null; + this.flutterAdLoader = flutterAdLoader; + } + + @Override + void load() { + final RewardedAdLoadCallback adLoadCallback = new DelegatingRewardedCallback(this); + if (request != null) { + flutterAdLoader.loadRewarded(adUnitId, request.asAdRequest(adUnitId), adLoadCallback); + } else if (adManagerRequest != null) { + flutterAdLoader.loadAdManagerRewarded( + adUnitId, adManagerRequest.asAdManagerAdRequest(adUnitId), adLoadCallback); + } else { + Log.e(TAG, "A null or invalid ad request was provided."); + } + } + + void onAdLoaded(@NonNull RewardedAd rewardedAd) { + FlutterRewardedAd.this.rewardedAd = rewardedAd; + rewardedAd.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, rewardedAd.getResponseInfo()); + } + + void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterLoadAdError(loadAdError)); + } + + @Override + public void show() { + if (rewardedAd == null) { + Log.e(TAG, "Error showing rewarded - the rewarded ad wasn't loaded yet."); + return; + } + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to show rewarded ad before activity was bound to the plugin."); + return; + } + rewardedAd.setFullScreenContentCallback(new FlutterFullScreenContentCallback(manager, adId)); + rewardedAd.setOnAdMetadataChangedListener(new DelegatingRewardedCallback(this)); + rewardedAd.show(manager.getActivity(), new DelegatingRewardedCallback(this)); + } + + @Override + public void setImmersiveMode(boolean immersiveModeEnabled) { + if (rewardedAd == null) { + Log.e( + TAG, "Error setting immersive mode in rewarded ad - the rewarded ad wasn't loaded yet."); + return; + } + rewardedAd.setImmersiveMode(immersiveModeEnabled); + } + + void onAdMetadataChanged() { + manager.onAdMetadataChanged(adId); + } + + void onUserEarnedReward(@NonNull RewardItem rewardItem) { + manager.onRewardedAdUserEarnedReward( + adId, new FlutterRewardItem(rewardItem.getAmount(), rewardItem.getType())); + } + + @Override + void dispose() { + rewardedAd = null; + } + + public void setServerSideVerificationOptions(FlutterServerSideVerificationOptions options) { + if (rewardedAd != null) { + rewardedAd.setServerSideVerificationOptions(options.asServerSideVerificationOptions()); + } else { + Log.e(TAG, "RewardedAd is null in setServerSideVerificationOptions"); + } + } + + /** + * This class delegates various rewarded ad callbacks to FlutterRewardedAd. Maintains a weak + * reference to avoid memory leaks. + */ + private static final class DelegatingRewardedCallback extends RewardedAdLoadCallback + implements OnAdMetadataChangedListener, OnUserEarnedRewardListener { + + private final WeakReference delegate; + + DelegatingRewardedCallback(FlutterRewardedAd delegate) { + this.delegate = new WeakReference<>(delegate); + } + + @Override + public void onAdLoaded(@NonNull RewardedAd rewardedAd) { + if (delegate.get() != null) { + delegate.get().onAdLoaded(rewardedAd); + } + } + + @Override + public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + if (delegate.get() != null) { + delegate.get().onAdFailedToLoad(loadAdError); + } + } + + @Override + public void onUserEarnedReward(@NonNull RewardItem rewardItem) { + if (delegate.get() != null) { + delegate.get().onUserEarnedReward(rewardItem); + } + } + + @Override + public void onAdMetadataChanged() { + if (delegate.get() != null) { + delegate.get().onAdMetadataChanged(); + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAd.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAd.java new file mode 100644 index 00000000..1ed36c6f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAd.java @@ -0,0 +1,187 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.OnUserEarnedRewardListener; +import com.google.android.gms.ads.rewarded.OnAdMetadataChangedListener; +import com.google.android.gms.ads.rewarded.RewardItem; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback; +import io.flutter.plugins.googlemobileads.FlutterRewardedAd.FlutterRewardItem; +import java.lang.ref.WeakReference; + +/** A wrapper for {@link RewardedInterstitialAd}. */ +class FlutterRewardedInterstitialAd extends FlutterAd.FlutterOverlayAd { + private static final String TAG = "FlutterRIAd"; + + @NonNull private final AdInstanceManager manager; + @NonNull private final String adUnitId; + @NonNull private final FlutterAdLoader flutterAdLoader; + @Nullable private final FlutterAdRequest request; + @Nullable private final FlutterAdManagerAdRequest adManagerRequest; + @Nullable RewardedInterstitialAd rewardedInterstitialAd; + + /** Constructor for AdMob Ad Request. */ + public FlutterRewardedInterstitialAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdRequest request, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.request = request; + this.adManagerRequest = null; + this.flutterAdLoader = flutterAdLoader; + } + + /** Constructor for Ad Manager Ad request. */ + public FlutterRewardedInterstitialAd( + int adId, + @NonNull AdInstanceManager manager, + @NonNull String adUnitId, + @NonNull FlutterAdManagerAdRequest adManagerRequest, + @NonNull FlutterAdLoader flutterAdLoader) { + super(adId); + this.manager = manager; + this.adUnitId = adUnitId; + this.adManagerRequest = adManagerRequest; + this.request = null; + this.flutterAdLoader = flutterAdLoader; + } + + @Override + void load() { + final RewardedInterstitialAdLoadCallback adLoadCallback = new DelegatingRewardedCallback(this); + if (request != null) { + flutterAdLoader.loadRewardedInterstitial( + adUnitId, request.asAdRequest(adUnitId), adLoadCallback); + } else if (adManagerRequest != null) { + flutterAdLoader.loadAdManagerRewardedInterstitial( + adUnitId, adManagerRequest.asAdManagerAdRequest(adUnitId), adLoadCallback); + } else { + Log.e(TAG, "A null or invalid ad request was provided."); + } + } + + void onAdLoaded(@NonNull RewardedInterstitialAd rewardedInterstitialAd) { + FlutterRewardedInterstitialAd.this.rewardedInterstitialAd = rewardedInterstitialAd; + rewardedInterstitialAd.setOnPaidEventListener(new FlutterPaidEventListener(manager, this)); + manager.onAdLoaded(adId, rewardedInterstitialAd.getResponseInfo()); + } + + void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + manager.onAdFailedToLoad(adId, new FlutterLoadAdError(loadAdError)); + } + + @Override + public void show() { + if (rewardedInterstitialAd == null) { + Log.e( + TAG, + "Error showing rewarded interstitial - the rewarded interstitial ad wasn't loaded yet."); + return; + } + if (manager.getActivity() == null) { + Log.e(TAG, "Tried to show rewarded interstitial ad before activity was bound to the plugin."); + return; + } + rewardedInterstitialAd.setFullScreenContentCallback( + new FlutterFullScreenContentCallback(manager, adId)); + rewardedInterstitialAd.setOnAdMetadataChangedListener(new DelegatingRewardedCallback(this)); + rewardedInterstitialAd.show(manager.getActivity(), new DelegatingRewardedCallback(this)); + } + + @Override + public void setImmersiveMode(boolean immersiveModeEnabled) { + if (rewardedInterstitialAd == null) { + Log.e( + TAG, + "Error setting immersive mode in rewarded interstitial ad - the rewarded interstitial ad wasn't loaded yet."); + return; + } + rewardedInterstitialAd.setImmersiveMode(immersiveModeEnabled); + } + + void onAdMetadataChanged() { + manager.onAdMetadataChanged(adId); + } + + void onUserEarnedReward(@NonNull RewardItem rewardItem) { + manager.onRewardedAdUserEarnedReward( + adId, new FlutterRewardItem(rewardItem.getAmount(), rewardItem.getType())); + } + + @Override + void dispose() { + rewardedInterstitialAd = null; + } + + public void setServerSideVerificationOptions(FlutterServerSideVerificationOptions options) { + if (rewardedInterstitialAd != null) { + rewardedInterstitialAd.setServerSideVerificationOptions( + options.asServerSideVerificationOptions()); + } else { + Log.e(TAG, "RewardedInterstitialAd is null in setServerSideVerificationOptions"); + } + } + + /** + * This class delegates various rewarded interstitial ad callbacks to + * FlutterRewardedInterstitialAd. Maintains a weak reference to avoid memory leaks. + */ + private static final class DelegatingRewardedCallback extends RewardedInterstitialAdLoadCallback + implements OnAdMetadataChangedListener, OnUserEarnedRewardListener { + + private final WeakReference delegate; + + DelegatingRewardedCallback(FlutterRewardedInterstitialAd delegate) { + this.delegate = new WeakReference<>(delegate); + } + + @Override + public void onAdLoaded(@NonNull RewardedInterstitialAd rewardedInterstitialAd) { + if (delegate.get() != null) { + delegate.get().onAdLoaded(rewardedInterstitialAd); + } + } + + @Override + public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { + if (delegate.get() != null) { + delegate.get().onAdFailedToLoad(loadAdError); + } + } + + @Override + public void onUserEarnedReward(@NonNull RewardItem rewardItem) { + if (delegate.get() != null) { + delegate.get().onUserEarnedReward(rewardItem); + } + } + + @Override + public void onAdMetadataChanged() { + if (delegate.get() != null) { + delegate.get().onAdMetadataChanged(); + } + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterServerSideVerificationOptions.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterServerSideVerificationOptions.java new file mode 100644 index 00000000..cc9a03d5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterServerSideVerificationOptions.java @@ -0,0 +1,57 @@ +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.Nullable; +import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions; +import java.util.Objects; + +/** A wrapper for {@link ServerSideVerificationOptions}. */ +class FlutterServerSideVerificationOptions { + + @Nullable private final String userId; + @Nullable private final String customData; + + public FlutterServerSideVerificationOptions( + @Nullable String userId, @Nullable String customData) { + this.userId = userId; + this.customData = customData; + } + + @Nullable + public String getUserId() { + return userId; + } + + @Nullable + public String getCustomData() { + return customData; + } + + /** Gets an equivalent {@link ServerSideVerificationOptions}. */ + public ServerSideVerificationOptions asServerSideVerificationOptions() { + ServerSideVerificationOptions.Builder builder = new ServerSideVerificationOptions.Builder(); + if (userId != null) { + builder.setUserId(userId); + } + if (customData != null) { + builder.setCustomData(customData); + } + return builder.build(); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof FlutterServerSideVerificationOptions)) { + return false; + } + FlutterServerSideVerificationOptions other = (FlutterServerSideVerificationOptions) obj; + return Objects.equals(other.userId, userId) && Objects.equals(other.customData, customData); + } + + @Override + public int hashCode() { + return Objects.hash(userId, customData); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterVideoOptions.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterVideoOptions.java new file mode 100644 index 00000000..25a29e6b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterVideoOptions.java @@ -0,0 +1,49 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.c language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import androidx.annotation.Nullable; +import com.google.android.gms.ads.VideoOptions; + +/** A wrapper for {@link com.google.android.gms.ads.VideoOptions}. */ +class FlutterVideoOptions { + @Nullable final Boolean clickToExpandRequested; + @Nullable final Boolean customControlsRequested; + @Nullable final Boolean startMuted; + + FlutterVideoOptions( + @Nullable Boolean clickToExpandRequested, + @Nullable Boolean customControlsRequested, + @Nullable Boolean startMuted) { + this.clickToExpandRequested = clickToExpandRequested; + this.customControlsRequested = customControlsRequested; + this.startMuted = startMuted; + } + + VideoOptions asVideoOptions() { + VideoOptions.Builder builder = new VideoOptions.Builder(); + if (clickToExpandRequested != null) { + builder.setClickToExpandRequested(clickToExpandRequested); + } + if (customControlsRequested != null) { + builder.setCustomControlsRequested(customControlsRequested); + } + if (startMuted != null) { + builder.setStartMuted(startMuted); + } + return builder.build(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsPlugin.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsPlugin.java new file mode 100644 index 00000000..87871b5e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsPlugin.java @@ -0,0 +1,724 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import com.google.android.gms.ads.AdInspectorError; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.MobileAds; +import com.google.android.gms.ads.OnAdInspectorClosedListener; +import com.google.android.gms.ads.RequestConfiguration; +import com.google.android.gms.ads.initialization.InitializationStatus; +import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAdView; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.StandardMethodCodec; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterOverlayAd; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateStyle; +import io.flutter.plugins.googlemobileads.usermessagingplatform.UserMessagingPlatformManager; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Flutter plugin accessing Google Mobile Ads API. + * + *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. + */ +public class GoogleMobileAdsPlugin implements FlutterPlugin, ActivityAware, MethodCallHandler { + + private static final String TAG = "GoogleMobileAdsPlugin"; + + private static T requireNonNull(T obj) { + if (obj == null) { + throw new IllegalArgumentException(); + } + return obj; + } + + // This is always null when not using v2 embedding. + @Nullable private FlutterPluginBinding pluginBinding; + @Nullable private AdInstanceManager instanceManager; + @Nullable private AdMessageCodec adMessageCodec; + @Nullable private AppStateNotifier appStateNotifier; + @Nullable private UserMessagingPlatformManager userMessagingPlatformManager; + private final Map nativeAdFactories = new HashMap<>(); + + @SuppressWarnings("deprecation") // Keeping for compatibility + @Nullable + private MediationNetworkExtrasProvider mediationNetworkExtrasProvider; + + private final FlutterMobileAdsWrapper flutterMobileAds; + /** + * Public constructor for the plugin. Dependency initialization is handled in lifecycle methods + * below. + */ + public GoogleMobileAdsPlugin() { + this.flutterMobileAds = new FlutterMobileAdsWrapper(); + } + + /** Constructor for testing. */ + @VisibleForTesting + protected GoogleMobileAdsPlugin( + @Nullable FlutterPluginBinding pluginBinding, + @Nullable AdInstanceManager instanceManager, + @NonNull FlutterMobileAdsWrapper flutterMobileAds) { + this.pluginBinding = pluginBinding; + this.instanceManager = instanceManager; + this.flutterMobileAds = flutterMobileAds; + } + + @VisibleForTesting + protected GoogleMobileAdsPlugin(@NonNull AppStateNotifier appStateNotifier) { + this.appStateNotifier = appStateNotifier; + this.flutterMobileAds = new FlutterMobileAdsWrapper(); + } + + /** + * Interface used to display a {@link com.google.android.gms.ads.nativead.NativeAd}. + * + *

Added to a {@link io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin} and creates + * {@link com.google.android.gms.ads.nativead.NativeAdView}s from Native Ads created in Dart. + */ + public interface NativeAdFactory { + /** + * Creates a {@link com.google.android.gms.ads.nativead.NativeAdView} with a {@link + * com.google.android.gms.ads.nativead.NativeAd}. + * + * @param nativeAd Ad information used to create a {@link + * com.google.android.gms.ads.nativead.NativeAd} + * @param customOptions Used to pass additional custom options to create the {@link + * com.google.android.gms.ads.nativead.NativeAdView}. Nullable. + * @return a {@link com.google.android.gms.ads.nativead.NativeAdView} that is overlaid on top of + * the FlutterView + */ + NativeAdView createNativeAd(NativeAd nativeAd, Map customOptions); + } + + /** + * Registers a {@link io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory} + * used to create {@link com.google.android.gms.ads.nativead.NativeAdView}s from a Native Ad + * created in Dart. + * + * @param engine maintains access to a GoogleMobileAdsPlugin instance + * @param factoryId a unique identifier for the ad factory. The Native Ad created in Dart includes + * a parameter that refers to this. + * @param nativeAdFactory creates {@link com.google.android.gms.ads.nativead.NativeAdView}s when + * Flutter NativeAds are created + * @return whether the factoryId is unique and the nativeAdFactory was successfully added + */ + public static boolean registerNativeAdFactory( + FlutterEngine engine, String factoryId, NativeAdFactory nativeAdFactory) { + final GoogleMobileAdsPlugin gmaPlugin = + (GoogleMobileAdsPlugin) engine.getPlugins().get(GoogleMobileAdsPlugin.class); + return registerNativeAdFactory(gmaPlugin, factoryId, nativeAdFactory); + } + + /** + * Registers a {@link MediationNetworkExtrasProvider} used to provide network extras to the plugin + * when it creates ad requests. + * + * @param engine The {@link FlutterEngine} which should have an attached instance of this plugin + * @param mediationNetworkExtrasProvider The {@link MediationNetworkExtrasProvider} which will be + * used to provide network extras when ad requests are created + * @return whether {@code mediationNetworkExtrasProvider} was registered to a {@code + * GoogleMobileAdsPlugin} associated with {@code engine} + * @deprecated Use {@link FlutterMediationExtras} instead. + */ + @Deprecated + public static boolean registerMediationNetworkExtrasProvider( + FlutterEngine engine, MediationNetworkExtrasProvider mediationNetworkExtrasProvider) { + final GoogleMobileAdsPlugin gmaPlugin = + (GoogleMobileAdsPlugin) engine.getPlugins().get(GoogleMobileAdsPlugin.class); + if (gmaPlugin == null) { + return false; + } + gmaPlugin.mediationNetworkExtrasProvider = mediationNetworkExtrasProvider; + if (gmaPlugin.adMessageCodec != null) { + gmaPlugin.adMessageCodec.setMediationNetworkExtrasProvider(mediationNetworkExtrasProvider); + } + return true; + } + + /** + * Unregisters any {@link MediationNetworkExtrasProvider} that have been previously registered + * with the plugin using {@code unregisterMediationNetworkExtrasProvider}. + * + * @param engine The {@link FlutterEngine} which should have an attached instance of this plugin + * @deprecated Use {@link FlutterMediationExtras} instead. + */ + @Deprecated + public static void unregisterMediationNetworkExtrasProvider(FlutterEngine engine) { + final GoogleMobileAdsPlugin gmaPlugin = + (GoogleMobileAdsPlugin) engine.getPlugins().get(GoogleMobileAdsPlugin.class); + if (gmaPlugin == null) { + return; + } + + if (gmaPlugin.adMessageCodec != null) { + gmaPlugin.adMessageCodec.setMediationNetworkExtrasProvider(null); + } + gmaPlugin.mediationNetworkExtrasProvider = null; + } + + private static boolean registerNativeAdFactory( + GoogleMobileAdsPlugin plugin, String factoryId, NativeAdFactory nativeAdFactory) { + if (plugin == null) { + final String message = + String.format( + "Could not find a %s instance. The plugin may have not been registered.", + GoogleMobileAdsPlugin.class.getSimpleName()); + throw new IllegalStateException(message); + } + + return plugin.addNativeAdFactory(factoryId, nativeAdFactory); + } + + /** + * Unregisters a {@link io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory} + * used to create {@link com.google.android.gms.ads.nativead.NativeAdView}s from a Native Ad + * created in Dart. + * + * @param engine maintains access to a GoogleMobileAdsPlugin instance + * @param factoryId a unique identifier for the ad factory. The Native ad created in Dart includes + * a parameter that refers to this + * @return the previous {@link + * io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory} associated with + * this factoryId, or null if there was none for this factoryId + */ + @Nullable + public static NativeAdFactory unregisterNativeAdFactory(FlutterEngine engine, String factoryId) { + final FlutterPlugin gmaPlugin = engine.getPlugins().get(GoogleMobileAdsPlugin.class); + if (gmaPlugin != null) { + return ((GoogleMobileAdsPlugin) gmaPlugin).removeNativeAdFactory(factoryId); + } + + return null; + } + + private boolean addNativeAdFactory(String factoryId, NativeAdFactory nativeAdFactory) { + if (nativeAdFactories.containsKey(factoryId)) { + final String errorMessage = + String.format( + "A NativeAdFactory with the following factoryId already exists: %s", factoryId); + Log.e(GoogleMobileAdsPlugin.class.getSimpleName(), errorMessage); + return false; + } + + nativeAdFactories.put(factoryId, nativeAdFactory); + return true; + } + + private NativeAdFactory removeNativeAdFactory(String factoryId) { + return nativeAdFactories.remove(factoryId); + } + + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + pluginBinding = binding; + adMessageCodec = + new AdMessageCodec( + binding.getApplicationContext(), + new FlutterRequestAgentProvider(binding.getApplicationContext())); + if (mediationNetworkExtrasProvider != null) { + adMessageCodec.setMediationNetworkExtrasProvider(mediationNetworkExtrasProvider); + } + final MethodChannel channel = + new MethodChannel( + binding.getBinaryMessenger(), + "plugins.flutter.io/google_mobile_ads", + new StandardMethodCodec(adMessageCodec)); + channel.setMethodCallHandler(this); + instanceManager = new AdInstanceManager(channel); + binding + .getPlatformViewRegistry() + .registerViewFactory( + "plugins.flutter.io/google_mobile_ads/ad_widget", + new GoogleMobileAdsViewFactory(instanceManager)); + appStateNotifier = new AppStateNotifier(binding.getBinaryMessenger()); + userMessagingPlatformManager = + new UserMessagingPlatformManager( + binding.getBinaryMessenger(), binding.getApplicationContext()); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + if (appStateNotifier != null) { + appStateNotifier.stop(); + appStateNotifier = null; + } + } + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + if (instanceManager != null) { + instanceManager.setActivity(binding.getActivity()); + } + if (adMessageCodec != null) { + adMessageCodec.setContext(binding.getActivity()); + } + if (userMessagingPlatformManager != null) { + userMessagingPlatformManager.setActivity(binding.getActivity()); + } + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + // Use the application context + if (adMessageCodec != null && pluginBinding != null) { + adMessageCodec.setContext(pluginBinding.getApplicationContext()); + } + if (instanceManager != null) { + instanceManager.setActivity(null); + } + if (userMessagingPlatformManager != null) { + userMessagingPlatformManager.setActivity(null); + } + } + + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + if (instanceManager != null) { + instanceManager.setActivity(binding.getActivity()); + } + if (adMessageCodec != null) { + adMessageCodec.setContext(binding.getActivity()); + } + if (userMessagingPlatformManager != null) { + userMessagingPlatformManager.setActivity(binding.getActivity()); + } + } + + @Override + public void onDetachedFromActivity() { + if (adMessageCodec != null && pluginBinding != null) { + adMessageCodec.setContext(pluginBinding.getApplicationContext()); + } + if (instanceManager != null) { + instanceManager.setActivity(null); + } + if (userMessagingPlatformManager != null) { + userMessagingPlatformManager.setActivity(null); + } + } + + @SuppressWarnings("deprecation") + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { + if (instanceManager == null || pluginBinding == null) { + Log.e(TAG, "method call received before instanceManager initialized: " + call.method); + return; + } + // Use activity as context if available. + Context context = + (instanceManager.getActivity() != null) + ? instanceManager.getActivity() + : pluginBinding.getApplicationContext(); + switch (call.method) { + case "_init": + // Internal init. This is necessary to cleanup state on hot restart. + instanceManager.disposeAllAds(); + result.success(null); + break; + case "MobileAds#initialize": + flutterMobileAds.initialize(context, new FlutterInitializationListener(result)); + break; + case "MobileAds#openAdInspector": + flutterMobileAds.openAdInspector( + context, + new OnAdInspectorClosedListener() { + @Override + public void onAdInspectorClosed(@Nullable AdInspectorError adInspectorError) { + if (adInspectorError != null) { + String errorCode = Integer.toString(adInspectorError.getCode()); + result.error( + errorCode, adInspectorError.getMessage(), adInspectorError.getDomain()); + } else { + result.success(null); + } + } + }); + break; + case "MobileAds#getRequestConfiguration": + result.success(flutterMobileAds.getRequestConfiguration()); + break; + case "MobileAds#updateRequestConfiguration": + RequestConfiguration.Builder builder = MobileAds.getRequestConfiguration().toBuilder(); + String maxAdContentRating = call.argument("maxAdContentRating"); + Integer tagForChildDirectedTreatment = call.argument("tagForChildDirectedTreatment"); + Integer tagForUnderAgeOfConsent = call.argument("tagForUnderAgeOfConsent"); + List testDeviceIds = call.argument("testDeviceIds"); + if (maxAdContentRating != null) { + builder.setMaxAdContentRating(maxAdContentRating); + } + if (tagForChildDirectedTreatment != null) { + builder.setTagForChildDirectedTreatment(tagForChildDirectedTreatment); + } + if (tagForUnderAgeOfConsent != null) { + builder.setTagForUnderAgeOfConsent(tagForUnderAgeOfConsent); + } + if (testDeviceIds != null) { + builder.setTestDeviceIds(testDeviceIds); + } + MobileAds.setRequestConfiguration(builder.build()); + result.success(null); + break; + case "MobileAds#registerWebView": + Integer webViewId = call.argument("webViewId"); + flutterMobileAds.registerWebView(webViewId, pluginBinding.getFlutterEngine()); + result.success(null); + break; + case "loadBannerAd": + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + call.argument("adId"), + instanceManager, + call.argument("adUnitId"), + call.argument("request"), + call.argument("size"), + getBannerAdCreator(context)); + instanceManager.trackAd(bannerAd, call.argument("adId")); + bannerAd.load(); + result.success(null); + break; + case "loadNativeAd": + final String factoryId = call.argument("factoryId"); + final NativeAdFactory factory = nativeAdFactories.get(factoryId); + final FlutterNativeTemplateStyle templateStyle = call.argument("nativeTemplateStyle"); + if (factory == null && templateStyle == null) { + final String message = + String.format("No NativeAdFactory with id: %s or nativeTemplateStyle", factoryId); + result.error("NativeAdError", message, null); + break; + } + + final FlutterNativeAd nativeAd = + new FlutterNativeAd.Builder(context) + .setManager(instanceManager) + .setAdUnitId(call.argument("adUnitId")) + .setAdFactory(factory) + .setRequest(call.argument("request")) + .setAdManagerRequest(call.argument("adManagerRequest")) + .setCustomOptions(call.>argument("customOptions")) + .setId(call.argument("adId")) + .setNativeAdOptions(call.argument("nativeAdOptions")) + .setFlutterAdLoader(new FlutterAdLoader(context)) + .setNativeTemplateStyle( + call.argument("nativeTemplateStyle")) + .build(); + instanceManager.trackAd(nativeAd, call.argument("adId")); + nativeAd.load(); + result.success(null); + break; + case "loadInterstitialAd": + final FlutterInterstitialAd interstitial = + new FlutterInterstitialAd( + call.argument("adId"), + instanceManager, + call.argument("adUnitId"), + call.argument("request"), + new FlutterAdLoader(context)); + instanceManager.trackAd(interstitial, call.argument("adId")); + interstitial.load(); + result.success(null); + break; + case "loadRewardedAd": + final String rewardedAdUnitId = requireNonNull(call.argument("adUnitId")); + final FlutterAdRequest rewardedAdRequest = call.argument("request"); + final FlutterAdManagerAdRequest rewardedAdManagerRequest = + call.argument("adManagerRequest"); + + final FlutterRewardedAd rewardedAd; + if (rewardedAdRequest != null) { + rewardedAd = + new FlutterRewardedAd( + call.argument("adId"), + requireNonNull(instanceManager), + rewardedAdUnitId, + rewardedAdRequest, + new FlutterAdLoader(context)); + } else if (rewardedAdManagerRequest != null) { + rewardedAd = + new FlutterRewardedAd( + call.argument("adId"), + requireNonNull(instanceManager), + rewardedAdUnitId, + rewardedAdManagerRequest, + new FlutterAdLoader(context)); + } else { + result.error("InvalidRequest", "A null or invalid ad request was provided.", null); + break; + } + + instanceManager.trackAd(rewardedAd, requireNonNull(call.argument("adId"))); + rewardedAd.load(); + result.success(null); + break; + case "loadAdManagerBannerAd": + final FlutterAdManagerBannerAd adManagerBannerAd = + new FlutterAdManagerBannerAd( + call.argument("adId"), + instanceManager, + call.argument("adUnitId"), + call.>argument("sizes"), + call.argument("request"), + getBannerAdCreator(context)); + instanceManager.trackAd(adManagerBannerAd, call.argument("adId")); + adManagerBannerAd.load(); + result.success(null); + break; + case "loadFluidAd": + final FluidAdManagerBannerAd fluidAd = + new FluidAdManagerBannerAd( + call.argument("adId"), + instanceManager, + call.argument("adUnitId"), + call.argument("request"), + getBannerAdCreator(context)); + instanceManager.trackAd(fluidAd, call.argument("adId")); + fluidAd.load(); + result.success(null); + break; + case "loadAdManagerInterstitialAd": + final FlutterAdManagerInterstitialAd adManagerInterstitialAd = + new FlutterAdManagerInterstitialAd( + call.argument("adId"), + requireNonNull(instanceManager), + requireNonNull(call.argument("adUnitId")), + call.argument("request"), + new FlutterAdLoader(context)); + instanceManager.trackAd( + adManagerInterstitialAd, requireNonNull(call.argument("adId"))); + adManagerInterstitialAd.load(); + result.success(null); + break; + case "loadRewardedInterstitialAd": + final String rewardedInterstitialAdUnitId = + requireNonNull(call.argument("adUnitId")); + final FlutterAdRequest rewardedInterstitialAdRequest = call.argument("request"); + final FlutterAdManagerAdRequest rewardedInterstitialAdManagerRequest = + call.argument("adManagerRequest"); + + final FlutterRewardedInterstitialAd rewardedInterstitialAd; + if (rewardedInterstitialAdRequest != null) { + rewardedInterstitialAd = + new FlutterRewardedInterstitialAd( + call.argument("adId"), + requireNonNull(instanceManager), + rewardedInterstitialAdUnitId, + rewardedInterstitialAdRequest, + new FlutterAdLoader(context)); + } else if (rewardedInterstitialAdManagerRequest != null) { + rewardedInterstitialAd = + new FlutterRewardedInterstitialAd( + call.argument("adId"), + requireNonNull(instanceManager), + rewardedInterstitialAdUnitId, + rewardedInterstitialAdManagerRequest, + new FlutterAdLoader(context)); + } else { + result.error("InvalidRequest", "A null or invalid ad request was provided.", null); + break; + } + + instanceManager.trackAd( + rewardedInterstitialAd, requireNonNull(call.argument("adId"))); + rewardedInterstitialAd.load(); + result.success(null); + break; + case "loadAppOpenAd": + final FlutterAppOpenAd appOpenAd = + new FlutterAppOpenAd( + call.argument("adId"), + requireNonNull(instanceManager), + requireNonNull(call.argument("adUnitId")), + call.argument("request"), + call.argument("adManagerRequest"), + new FlutterAdLoader(context)); + instanceManager.trackAd(appOpenAd, call.argument("adId")); + appOpenAd.load(); + result.success(null); + break; + case "disposeAd": + instanceManager.disposeAd(call.argument("adId")); + result.success(null); + break; + case "showAdWithoutView": + final boolean adShown = instanceManager.showAdWithId(call.argument("adId")); + if (!adShown) { + result.error("AdShowError", "Ad failed to show.", null); + break; + } + result.success(null); + break; + case "AdSize#getAnchoredAdaptiveBannerAdSize": + final FlutterAdSize.AnchoredAdaptiveBannerAdSize size = + new FlutterAdSize.AnchoredAdaptiveBannerAdSize( + context, + new FlutterAdSize.AdSizeFactory(), + call.argument("orientation"), + call.argument("width"), + /* isLarge = */ false); + if (AdSize.INVALID.equals(size.size)) { + result.success(null); + } else { + result.success(size.height); + } + break; + case "AdSize#getLargeAnchoredAdaptiveBannerAdSize": + final FlutterAdSize.AnchoredAdaptiveBannerAdSize largeSize = + new FlutterAdSize.AnchoredAdaptiveBannerAdSize( + context, + new FlutterAdSize.AdSizeFactory(), + call.argument("orientation"), + call.argument("width"), + /* isLarge = */ true); + if (AdSize.INVALID.equals(largeSize.size)) { + result.success(null); + } else { + result.success(largeSize.height); + } + break; + case "MobileAds#setAppMuted": + flutterMobileAds.setAppMuted(call.argument("muted")); + result.success(null); + break; + case "MobileAds#setAppVolume": + flutterMobileAds.setAppVolume(call.argument("volume")); + result.success(null); + break; + case "setImmersiveMode": + ((FlutterOverlayAd) instanceManager.adForId(call.argument("adId"))) + .setImmersiveMode(call.argument("immersiveModeEnabled")); + result.success(null); + break; + case "MobileAds#disableMediationInitialization": + flutterMobileAds.disableMediationInitialization(context); + result.success(null); + break; + case "MobileAds#getVersionString": + result.success(flutterMobileAds.getVersionString()); + break; + case "MobileAds#openDebugMenu": + String adUnitId = call.argument("adUnitId"); + flutterMobileAds.openDebugMenu(context, adUnitId); + result.success(null); + break; + case "getAdSize": + { + FlutterAd ad = instanceManager.adForId(call.argument("adId")); + if (ad == null) { + // This was called on a dart ad container that hasn't been loaded yet. + result.success(null); + } else if (ad instanceof FlutterBannerAd) { + result.success(((FlutterBannerAd) ad).getAdSize()); + } else if (ad instanceof FlutterAdManagerBannerAd) { + result.success(((FlutterAdManagerBannerAd) ad).getAdSize()); + } else { + result.error( + Constants.ERROR_CODE_UNEXPECTED_AD_TYPE, + "Unexpected ad type for getAdSize: " + ad, + null); + } + break; + } + case "isCollapsible": + { + FlutterAd ad = instanceManager.adForId(call.argument("adId")); + if (ad == null) { + result.success(false); + } else if (ad instanceof FlutterBannerAd) { + result.success(((FlutterBannerAd) ad).isCollapsible()); + } else if (ad instanceof FlutterAdManagerBannerAd) { + result.success(((FlutterAdManagerBannerAd) ad).isCollapsible()); + } else { + result.error( + Constants.ERROR_CODE_UNEXPECTED_AD_TYPE, + "Unexpected ad type for isCollapsible: " + ad, + null); + } + break; + } + case "setServerSideVerificationOptions": + { + FlutterAd ad = instanceManager.adForId(call.argument("adId")); + final FlutterServerSideVerificationOptions options = + call.argument("serverSideVerificationOptions"); + if (ad == null) { + Log.w(TAG, "Error - null ad in setServerSideVerificationOptions"); + } else if (ad instanceof FlutterRewardedAd) { + ((FlutterRewardedAd) ad).setServerSideVerificationOptions(options); + } else if (ad instanceof FlutterRewardedInterstitialAd) { + ((FlutterRewardedInterstitialAd) ad).setServerSideVerificationOptions(options); + } else { + Log.w(TAG, "Error - setServerSideVerificationOptions called on " + "non-rewarded ad"); + } + result.success(null); + break; + } + default: + result.notImplemented(); + } + } + + @VisibleForTesting + BannerAdCreator getBannerAdCreator(@NonNull Context context) { + return new BannerAdCreator(context); + } + + /** An {@link OnInitializationCompleteListener} that invokes result.success() at most once. */ + private static final class FlutterInitializationListener + implements OnInitializationCompleteListener { + + private final Result result; + private boolean isInitializationCompleted; + + private FlutterInitializationListener(@NonNull final Result result) { + this.result = result; + isInitializationCompleted = false; + } + + @Override + public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) { + // Make sure not to invoke this more than once, since Dart will throw an exception if success + // is invoked more than once. See b/193418432. + if (isInitializationCompleted) { + return; + } + try { + Class clazz = Class.forName("com.google.android.gms.ads.MobileAds"); + Method method = clazz.getDeclaredMethod("setPlugin", String.class); + method.setAccessible(true); + method.invoke(null, Constants.REQUEST_AGENT_PREFIX_VERSIONED); + } catch (Exception ignored) { + } + result.success(new FlutterInitializationStatus(initializationStatus)); + isInitializationCompleted = true; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsViewFactory.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsViewFactory.java new file mode 100644 index 00000000..43d6437f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsViewFactory.java @@ -0,0 +1,99 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.content.Context; +import android.graphics.Color; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.NonNull; +import io.flutter.BuildConfig; +import io.flutter.Log; +import io.flutter.plugin.common.StandardMessageCodec; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugin.platform.PlatformViewFactory; +import java.util.Locale; + +/** Displays loaded FlutterAds for an AdInstanceManager */ +final class GoogleMobileAdsViewFactory extends PlatformViewFactory { + @NonNull private final AdInstanceManager manager; + + private static class ErrorTextView implements PlatformView { + private final TextView textView; + + private ErrorTextView(Context context, String message) { + textView = new TextView(context); + textView.setText(message); + textView.setBackgroundColor(Color.RED); + textView.setTextColor(Color.YELLOW); + } + + @Override + public View getView() { + return textView; + } + + @Override + public void dispose() {} + } + + public GoogleMobileAdsViewFactory(@NonNull AdInstanceManager manager) { + super(StandardMessageCodec.INSTANCE); + this.manager = manager; + } + + @Override + public PlatformView create(Context context, int viewId, Object args) { + if (args == null) { + return getErrorView(context, 0); + } + final Integer adId = (Integer) args; + FlutterAd ad = manager.adForId(adId); + if (ad == null || ad.getPlatformView() == null) { + return getErrorView(context, adId); + } + return ad.getPlatformView(); + } + + /** + * Returns an ErrorView with a debug message for debug builds only. Otherwise just returns an + * empty PlatformView. + */ + private static PlatformView getErrorView(@NonNull final Context context, int adId) { + final String message = + String.format( + Locale.getDefault(), + "This ad may have not been loaded or has been disposed. " + + "Ad with the following id could not be found: %d.", + adId); + + if (BuildConfig.DEBUG) { + return new ErrorTextView(context, message); + } else { + Log.e(GoogleMobileAdsViewFactory.class.getSimpleName(), message); + return new PlatformView() { + @Override + public View getView() { + return new View(context); + } + + @Override + public void dispose() { + // Do nothing. + } + }; + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/MediationNetworkExtrasProvider.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/MediationNetworkExtrasProvider.java new file mode 100644 index 00000000..63d24906 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/MediationNetworkExtrasProvider.java @@ -0,0 +1,54 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.mediation.MediationExtrasReceiver; +import io.flutter.embedding.engine.FlutterEngine; +import java.util.Map; + +/** + * Provides network specific parameters when constructing an ad request. + * + *

After you register a {@code MediationNetworkExtrasProvider} using {@link + * GoogleMobileAdsPlugin#registerMediationNetworkExtrasProvider(FlutterEngine, + * MediationNetworkExtrasProvider)}, the plugin will use it to pass extras when constructing ad + * requests. + * + * @deprecated User {@link FlutterMediationExtras} instead. + */ +@Deprecated +public interface MediationNetworkExtrasProvider { + + /** + * Gets mediation extras that should be included for an ad request with the {@code adUnitId} and + * {@code identifier}, as a map from adapter classes to their corresponding extras bundle. You can + * refer to each network's documentation + * to see how to find the corresponding adapter class and create its extras. This will be called + * whenever the plugin creates an ad request. + * + * @param adUnitId The ad unit for the associated ad request. + * @param identifier An optional identifier that comes from the associated dart ad request object. + * This allows for additional control of which extras to include for an ad request, beyond + * just the ad unit. + * @return A map of mediation adapter classes to their extras that should be included in the ad + * request. If {@code null} is returned then no extras are added. + */ + @Nullable + Map, Bundle> getMediationExtras( + String adUnitId, @Nullable String identifier); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyle.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyle.java new file mode 100644 index 00000000..30b353e9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyle.java @@ -0,0 +1,47 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import android.graphics.Typeface; +import android.util.Log; + +public enum FlutterNativeTemplateFontStyle { + NORMAL, + BOLD, + ITALIC, + MONOSPACE; + + public static FlutterNativeTemplateFontStyle fromIntValue(int value) { + if (value >= 0 && value < FlutterNativeTemplateFontStyle.values().length) { + return FlutterNativeTemplateFontStyle.values()[value]; + } + Log.w("NativeTemplateFontStyle", "Invalid index for NativeTemplateFontStyle: " + value); + return NORMAL; + } + + Typeface getTypeface() { + switch (this) { + case NORMAL: + return Typeface.DEFAULT; + case BOLD: + return Typeface.DEFAULT_BOLD; + case ITALIC: + return Typeface.defaultFromStyle(Typeface.ITALIC); + case MONOSPACE: + return Typeface.MONOSPACE; + } + return Typeface.DEFAULT; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyle.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyle.java new file mode 100644 index 00000000..2d2f39dc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyle.java @@ -0,0 +1,180 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.ads.nativetemplates.NativeTemplateStyle; +import com.google.android.ads.nativetemplates.TemplateView; +import java.util.Objects; + +public final class FlutterNativeTemplateStyle { + + @NonNull final FlutterNativeTemplateType templateType; + @Nullable final ColorDrawable mainBackgroundColor; + @Nullable final FlutterNativeTemplateTextStyle callToActionStyle; + @Nullable final FlutterNativeTemplateTextStyle primaryTextStyle; + @Nullable final FlutterNativeTemplateTextStyle secondaryTextStyle; + @Nullable final FlutterNativeTemplateTextStyle tertiaryTextStyle; + + public FlutterNativeTemplateStyle( + @NonNull FlutterNativeTemplateType templateType, + @Nullable ColorDrawable mainBackgroundColor, + @Nullable FlutterNativeTemplateTextStyle callToActionStyle, + @Nullable FlutterNativeTemplateTextStyle primaryTextStyle, + @Nullable FlutterNativeTemplateTextStyle secondaryTextStyle, + @Nullable FlutterNativeTemplateTextStyle tertiaryTextStyle) { + this.templateType = templateType; + this.mainBackgroundColor = mainBackgroundColor; + this.callToActionStyle = callToActionStyle; + this.primaryTextStyle = primaryTextStyle; + this.secondaryTextStyle = secondaryTextStyle; + this.tertiaryTextStyle = tertiaryTextStyle; + } + + public NativeTemplateStyle asNativeTemplateStyle() { + NativeTemplateStyle.Builder builder = new NativeTemplateStyle.Builder(); + if (mainBackgroundColor != null) { + builder.withMainBackgroundColor(mainBackgroundColor); + } + if (callToActionStyle != null) { + if (callToActionStyle.getBackgroundColor() != null) { + builder.withCallToActionBackgroundColor(callToActionStyle.getBackgroundColor()); + } + if (callToActionStyle.getTextColor() != null) { + builder.withCallToActionTypefaceColor(callToActionStyle.getTextColor().getColor()); + } + if (callToActionStyle.getFontStyle() != null) { + builder.withCallToActionTextTypeface(callToActionStyle.getFontStyle().getTypeface()); + } + if (callToActionStyle.getSize() != null) { + builder.withCallToActionTextSize(callToActionStyle.getSize()); + } + } + if (primaryTextStyle != null) { + if (primaryTextStyle.getBackgroundColor() != null) { + builder.withPrimaryTextBackgroundColor(primaryTextStyle.getBackgroundColor()); + } + if (primaryTextStyle.getTextColor() != null) { + builder.withPrimaryTextTypefaceColor(primaryTextStyle.getTextColor().getColor()); + } + if (primaryTextStyle.getFontStyle() != null) { + builder.withPrimaryTextTypeface(primaryTextStyle.getFontStyle().getTypeface()); + } + if (primaryTextStyle.getSize() != null) { + builder.withPrimaryTextSize(primaryTextStyle.getSize()); + } + } + if (secondaryTextStyle != null) { + if (secondaryTextStyle.getBackgroundColor() != null) { + builder.withSecondaryTextBackgroundColor(secondaryTextStyle.getBackgroundColor()); + } + if (secondaryTextStyle.getTextColor() != null) { + builder.withSecondaryTextTypefaceColor(secondaryTextStyle.getTextColor().getColor()); + } + if (secondaryTextStyle.getFontStyle() != null) { + builder.withSecondaryTextTypeface(secondaryTextStyle.getFontStyle().getTypeface()); + } + if (secondaryTextStyle.getSize() != null) { + builder.withSecondaryTextSize(secondaryTextStyle.getSize()); + } + } + if (tertiaryTextStyle != null) { + if (tertiaryTextStyle.getBackgroundColor() != null) { + builder.withTertiaryTextBackgroundColor(tertiaryTextStyle.getBackgroundColor()); + } + if (tertiaryTextStyle.getTextColor() != null) { + builder.withTertiaryTextTypefaceColor(tertiaryTextStyle.getTextColor().getColor()); + } + if (tertiaryTextStyle.getFontStyle() != null) { + builder.withTertiaryTextTypeface(tertiaryTextStyle.getFontStyle().getTypeface()); + } + if (tertiaryTextStyle.getSize() != null) { + builder.withTertiaryTextSize(tertiaryTextStyle.getSize()); + } + } + return builder.build(); + } + + public TemplateView asTemplateView(Context context) { + LayoutInflater layoutInflater = + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + TemplateView templateView = + (TemplateView) layoutInflater.inflate(templateType.resourceId(), null); + templateView.setStyles(asNativeTemplateStyle()); + return templateView; + } + + @NonNull + public FlutterNativeTemplateType getTemplateType() { + return templateType; + } + + @Nullable + public ColorDrawable getMainBackgroundColor() { + return mainBackgroundColor; + } + + @Nullable + public FlutterNativeTemplateTextStyle getCallToActionStyle() { + return callToActionStyle; + } + + @Nullable + public FlutterNativeTemplateTextStyle getPrimaryTextStyle() { + return primaryTextStyle; + } + + @Nullable + public FlutterNativeTemplateTextStyle getSecondaryTextStyle() { + return secondaryTextStyle; + } + + @Nullable + public FlutterNativeTemplateTextStyle getTertiaryTextStyle() { + return tertiaryTextStyle; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterNativeTemplateStyle)) { + return false; + } + + FlutterNativeTemplateStyle other = (FlutterNativeTemplateStyle) o; + return templateType == other.templateType + && ((mainBackgroundColor == null && other.mainBackgroundColor == null) + || mainBackgroundColor.getColor() == other.mainBackgroundColor.getColor()) + && Objects.equals(callToActionStyle, other.callToActionStyle) + && Objects.equals(primaryTextStyle, other.primaryTextStyle) + && Objects.equals(secondaryTextStyle, other.secondaryTextStyle) + && Objects.equals(tertiaryTextStyle, other.tertiaryTextStyle); + } + + @Override + public int hashCode() { + return Objects.hash( + mainBackgroundColor == null ? null : mainBackgroundColor.getColor(), + callToActionStyle, + primaryTextStyle, + secondaryTextStyle, + tertiaryTextStyle); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyle.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyle.java new file mode 100644 index 00000000..36a1919a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyle.java @@ -0,0 +1,82 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import android.graphics.drawable.ColorDrawable; +import androidx.annotation.Nullable; +import java.util.Objects; + +public final class FlutterNativeTemplateTextStyle { + + @Nullable private final ColorDrawable textColor; + @Nullable private final ColorDrawable backgroundColor; + @Nullable private final FlutterNativeTemplateFontStyle fontStyle; + @Nullable private final Double size; + + public FlutterNativeTemplateTextStyle( + @Nullable ColorDrawable textColor, + @Nullable ColorDrawable backgroundColor, + @Nullable FlutterNativeTemplateFontStyle fontStyle, + @Nullable Double size) { + this.textColor = textColor; + this.backgroundColor = backgroundColor; + this.fontStyle = fontStyle; + this.size = size; + } + + @Nullable + public ColorDrawable getTextColor() { + return textColor; + } + + @Nullable + public ColorDrawable getBackgroundColor() { + return backgroundColor; + } + + @Nullable + public FlutterNativeTemplateFontStyle getFontStyle() { + return fontStyle; + } + + @Nullable + public Float getSize() { + return size == null ? null : size.floatValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (!(o instanceof FlutterNativeTemplateTextStyle)) { + return false; + } + + FlutterNativeTemplateTextStyle other = (FlutterNativeTemplateTextStyle) o; + return ((textColor == null && other.textColor == null) + || textColor.getColor() == other.textColor.getColor()) + && ((backgroundColor == null && other.backgroundColor == null) + || backgroundColor.getColor() == other.backgroundColor.getColor()) + && Objects.equals(size, other.size) + && Objects.equals(fontStyle, other.fontStyle); + } + + @Override + public int hashCode() { + Integer textColorValue = textColor == null ? null : textColor.getColor(); + Integer backgroundColorValue = backgroundColor == null ? null : backgroundColor.getColor(); + return Objects.hash(textColorValue, backgroundColorValue, size, fontStyle); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateType.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateType.java new file mode 100644 index 00000000..59d30581 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateType.java @@ -0,0 +1,41 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import android.util.Log; +import io.flutter.plugins.googlemobileads.R; + +public enum FlutterNativeTemplateType { + SMALL(R.layout.small_template_view_layout), + MEDIUM(R.layout.medium_template_view_layout); + + private final int resourceId; + + FlutterNativeTemplateType(int resourceId) { + this.resourceId = resourceId; + } + + public int resourceId() { + return resourceId; + } + + public static FlutterNativeTemplateType fromIntValue(int value) { + if (value >= 0 && value < FlutterNativeTemplateType.values().length) { + return FlutterNativeTemplateType.values()[value]; + } + Log.w("NativeTemplateType", "Invalid template type index: " + value); + return MEDIUM; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentDebugSettingsWrapper.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentDebugSettingsWrapper.java new file mode 100644 index 00000000..4cc57e38 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentDebugSettingsWrapper.java @@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import android.content.Context; +import androidx.annotation.Nullable; +import com.google.android.ump.ConsentDebugSettings; +import java.util.List; +import java.util.Objects; + +/** Wrapper for {@link ConsentDebugSettings}. */ +class ConsentDebugSettingsWrapper { + + @Nullable private final Integer debugGeography; + + @Nullable private final List testIdentifiers; + + ConsentDebugSettingsWrapper( + @Nullable Integer debugGeography, @Nullable List testIdentifiers) { + this.debugGeography = debugGeography; + this.testIdentifiers = testIdentifiers; + } + + @Nullable + Integer getDebugGeography() { + return debugGeography; + } + + @Nullable + List getTestIdentifiers() { + return testIdentifiers; + } + + /** Get the corresponding {@link ConsentDebugSettings}. */ + ConsentDebugSettings getAsConsentDebugSettings(Context context) { + ConsentDebugSettings.Builder builder = new ConsentDebugSettings.Builder(context); + if (debugGeography != null) { + builder.setDebugGeography(debugGeography); + } + if (testIdentifiers != null) { + for (String testIdentifier : testIdentifiers) { + builder.addTestDeviceHashedId(testIdentifier); + } + } + return builder.build(); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == this) { + return true; + } else if (!(obj instanceof ConsentDebugSettingsWrapper)) { + return false; + } + + ConsentDebugSettingsWrapper other = (ConsentDebugSettingsWrapper) obj; + return Objects.equals(debugGeography, other.getDebugGeography()) + && Objects.equals(testIdentifiers, other.getTestIdentifiers()); + } + + @Override + public int hashCode() { + return Objects.hash(debugGeography, testIdentifiers); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentRequestParametersWrapper.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentRequestParametersWrapper.java new file mode 100644 index 00000000..20568a64 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/ConsentRequestParametersWrapper.java @@ -0,0 +1,74 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import android.content.Context; +import androidx.annotation.Nullable; +import com.google.android.ump.ConsentRequestParameters; +import java.util.Objects; + +/** Wrapper for {@link ConsentRequestParameters}. */ +class ConsentRequestParametersWrapper { + + @Nullable private final Boolean tfuac; + + @Nullable private final ConsentDebugSettingsWrapper debugSettings; + + ConsentRequestParametersWrapper( + @Nullable Boolean tfuac, @Nullable ConsentDebugSettingsWrapper debugSettings) { + this.tfuac = tfuac; + this.debugSettings = debugSettings; + } + + @Nullable + Boolean getTfuac() { + return tfuac; + } + + @Nullable + ConsentDebugSettingsWrapper getDebugSettings() { + return debugSettings; + } + + /** Get as {@link ConsentRequestParameters}. */ + ConsentRequestParameters getAsConsentRequestParameters(Context context) { + ConsentRequestParameters.Builder builder = new ConsentRequestParameters.Builder(); + if (tfuac != null) { + builder.setTagForUnderAgeOfConsent(tfuac); + } + if (debugSettings != null) { + builder.setConsentDebugSettings(debugSettings.getAsConsentDebugSettings(context)); + } + return builder.build(); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == this) { + return true; + } else if (!(obj instanceof ConsentRequestParametersWrapper)) { + return false; + } + + ConsentRequestParametersWrapper other = (ConsentRequestParametersWrapper) obj; + return Objects.equals(tfuac, other.getTfuac()) + && Objects.equals(debugSettings, other.getDebugSettings()); + } + + @Override + public int hashCode() { + return Objects.hash(tfuac, debugSettings); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodec.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodec.java new file mode 100644 index 00000000..88aba3e0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodec.java @@ -0,0 +1,124 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.ump.ConsentForm; +import com.google.android.ump.FormError; +import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** Codec for UMP SDK. */ +public class UserMessagingCodec extends StandardMessageCodec { + + private static final byte VALUE_CONSENT_REQUEST_PARAMETERS = (byte) 129; + private static final byte VALUE_CONSENT_DEBUG_SETTINGS = (byte) 130; + private static final byte VALUE_CONSENT_FORM = (byte) 131; + private static final byte VALUE_FORM_ERROR = (byte) 132; + + private final Map consentFormMap; + + UserMessagingCodec() { + consentFormMap = new HashMap<>(); + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, @NonNull Object value) { + if (value instanceof ConsentRequestParametersWrapper) { + stream.write(VALUE_CONSENT_REQUEST_PARAMETERS); + ConsentRequestParametersWrapper params = (ConsentRequestParametersWrapper) value; + writeValue(stream, params.getTfuac()); + writeValue(stream, params.getDebugSettings()); + } else if (value instanceof ConsentDebugSettingsWrapper) { + stream.write(VALUE_CONSENT_DEBUG_SETTINGS); + ConsentDebugSettingsWrapper debugSettings = (ConsentDebugSettingsWrapper) value; + writeValue(stream, debugSettings.getDebugGeography()); + writeValue(stream, debugSettings.getTestIdentifiers()); + } else if (value instanceof ConsentForm) { + stream.write(VALUE_CONSENT_FORM); + writeValue(stream, value.hashCode()); + } else if (value instanceof FormError) { + stream.write(VALUE_FORM_ERROR); + FormError formError = (FormError) value; + writeValue(stream, formError.getErrorCode()); + writeValue(stream, formError.getMessage()); + } else { + super.writeValue(stream, value); + } + } + + @Nullable + private List asList(@Nullable Object maybeList) { + if (maybeList == null) { + return null; + } + List stringList = new ArrayList<>(); + if (maybeList instanceof List) { + List list = (List) maybeList; + for (Object obj : list) { + if (obj instanceof String) { + stringList.add((String) obj); + } + } + } + return stringList; + } + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + case VALUE_CONSENT_REQUEST_PARAMETERS: + { + Boolean tfuac = (Boolean) readValueOfType(buffer.get(), buffer); + ConsentDebugSettingsWrapper debugSettings = + (ConsentDebugSettingsWrapper) readValueOfType(buffer.get(), buffer); + return new ConsentRequestParametersWrapper(tfuac, debugSettings); + } + case VALUE_CONSENT_DEBUG_SETTINGS: + { + Integer debugGeoInt = (Integer) readValueOfType(buffer.get(), buffer); + List testIdentifiers = asList(readValueOfType(buffer.get(), buffer)); + return new ConsentDebugSettingsWrapper(debugGeoInt, testIdentifiers); + } + case VALUE_CONSENT_FORM: + { + Integer hash = (Integer) readValueOfType(buffer.get(), buffer); + return consentFormMap.get(hash); + } + case VALUE_FORM_ERROR: + { + Integer errorCode = (Integer) readValueOfType(buffer.get(), buffer); + String errorMessage = (String) readValueOfType(buffer.get(), buffer); + return new FormError(errorCode, errorMessage); + } + default: + return super.readValueOfType(type, buffer); + } + } + + void trackConsentForm(ConsentForm form) { + consentFormMap.put(form.hashCode(), form); + } + + void disposeConsentForm(ConsentForm form) { + consentFormMap.remove(form.hashCode()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManager.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManager.java new file mode 100644 index 00000000..dde12714 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManager.java @@ -0,0 +1,237 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import android.app.Activity; +import android.content.Context; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import com.google.android.ump.ConsentForm; +import com.google.android.ump.ConsentForm.OnConsentFormDismissedListener; +import com.google.android.ump.ConsentInformation; +import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateFailureListener; +import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateSuccessListener; +import com.google.android.ump.ConsentRequestParameters; +import com.google.android.ump.FormError; +import com.google.android.ump.UserMessagingPlatform; +import com.google.android.ump.UserMessagingPlatform.OnConsentFormLoadFailureListener; +import com.google.android.ump.UserMessagingPlatform.OnConsentFormLoadSuccessListener; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.StandardMethodCodec; + +/** Manages platform code for UMP SDK. */ +public class UserMessagingPlatformManager implements MethodCallHandler { + + private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/google_mobile_ads/ump"; + /** Use 0 for error code internal to the Flutter plugin. */ + private static final String INTERNAL_ERROR_CODE = "0"; + + private final UserMessagingCodec userMessagingCodec; + private final MethodChannel methodChannel; + private final Context context; + @Nullable private ConsentInformation consentInformation; + + @Nullable private Activity activity; + + public UserMessagingPlatformManager(BinaryMessenger binaryMessenger, Context context) { + userMessagingCodec = new UserMessagingCodec(); + methodChannel = + new MethodChannel( + binaryMessenger, METHOD_CHANNEL_NAME, new StandardMethodCodec(userMessagingCodec)); + methodChannel.setMethodCallHandler(this); + this.context = context; + } + + @VisibleForTesting + UserMessagingPlatformManager( + BinaryMessenger binaryMessenger, Context context, UserMessagingCodec userMessagingCodec) { + this.userMessagingCodec = userMessagingCodec; + methodChannel = + new MethodChannel( + binaryMessenger, METHOD_CHANNEL_NAME, new StandardMethodCodec(userMessagingCodec)); + methodChannel.setMethodCallHandler(this); + this.context = context; + } + + public void setActivity(@Nullable Activity activity) { + this.activity = activity; + } + + private ConsentInformation getConsentInformation() { + if (consentInformation != null) { + return consentInformation; + } + + consentInformation = UserMessagingPlatform.getConsentInformation(context); + return consentInformation; + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { + switch (call.method) { + case "ConsentInformation#reset": + { + getConsentInformation().reset(); + result.success(null); + break; + } + case "ConsentInformation#getConsentStatus": + { + result.success(getConsentInformation().getConsentStatus()); + break; + } + case "ConsentInformation#requestConsentInfoUpdate": + { + if (activity == null) { + result.error( + INTERNAL_ERROR_CODE, + "ConsentInformation#requestConsentInfoUpdate called before plugin has been registered to an activity.", + null); + break; + } + ConsentRequestParametersWrapper requestParamsWrapper = call.argument("params"); + ConsentRequestParameters consentRequestParameters = + (requestParamsWrapper == null) + ? new ConsentRequestParameters.Builder().build() + : requestParamsWrapper.getAsConsentRequestParameters(activity); + getConsentInformation() + .requestConsentInfoUpdate( + activity, + consentRequestParameters, + new OnConsentInfoUpdateSuccessListener() { + @Override + public void onConsentInfoUpdateSuccess() { + result.success(null); + } + }, + new OnConsentInfoUpdateFailureListener() { + @Override + public void onConsentInfoUpdateFailure(FormError error) { + result.error( + Integer.toString(error.getErrorCode()), error.getMessage(), null); + } + }); + break; + } + case "ConsentInformation#canRequestAds": + result.success(getConsentInformation().canRequestAds()); + break; + case "ConsentInformation#getPrivacyOptionsRequirementStatus": + switch (getConsentInformation().getPrivacyOptionsRequirementStatus()) { + case NOT_REQUIRED: + result.success(0); + break; + case REQUIRED: + result.success(1); + break; + default: + result.success(2); + } + break; + case "UserMessagingPlatform#loadAndShowConsentFormIfRequired": + if (activity == null) { + result.error( + INTERNAL_ERROR_CODE, + "UserMessagingPlatform#loadAndShowConsentFormIfRequired called before plugin has been registered to an activity.", + null); + break; + } + UserMessagingPlatform.loadAndShowConsentFormIfRequired( + activity, + loadAndShowError -> { + result.success(loadAndShowError); + }); + break; + case "UserMessagingPlatform#loadConsentForm": + UserMessagingPlatform.loadConsentForm( + context, + new OnConsentFormLoadSuccessListener() { + @Override + public void onConsentFormLoadSuccess(ConsentForm consentForm) { + userMessagingCodec.trackConsentForm(consentForm); + result.success(consentForm); + } + }, + new OnConsentFormLoadFailureListener() { + @Override + public void onConsentFormLoadFailure(FormError formError) { + result.error( + Integer.toString(formError.getErrorCode()), formError.getMessage(), null); + } + }); + break; + case "UserMessagingPlatform#showPrivacyOptionsForm": + if (activity == null) { + result.error( + INTERNAL_ERROR_CODE, + "UserMessagingPlatform#showPrivacyOptionsForm called before plugin has been registered to an activity.", + null); + break; + } + UserMessagingPlatform.showPrivacyOptionsForm( + activity, + loadAndShowError -> { + result.success(loadAndShowError); + }); + break; + case "ConsentInformation#isConsentFormAvailable": + { + result.success(getConsentInformation().isConsentFormAvailable()); + break; + } + case "ConsentForm#show": + { + ConsentForm consentForm = call.argument("consentForm"); + if (consentForm == null) { + result.error(INTERNAL_ERROR_CODE, "ConsentForm#show", null); + } else { + consentForm.show( + activity, + new OnConsentFormDismissedListener() { + @Override + public void onConsentFormDismissed(@Nullable FormError formError) { + if (formError != null) { + result.error( + Integer.toString(formError.getErrorCode()), formError.getMessage(), null); + } else { + result.success(null); + } + } + }); + } + break; + } + case "ConsentForm#dispose": + { + ConsentForm consentForm = call.argument("consentForm"); + if (consentForm == null) { + Log.w(INTERNAL_ERROR_CODE, "Called dispose on ad that has been freed"); + } else { + userMessagingCodec.disposeConsentForm(consentForm); + } + result.success(null); + break; + } + default: + result.notImplemented(); + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_outline_shape.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_outline_shape.xml new file mode 100644 index 00000000..3c657a12 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_outline_shape.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_rounded_corners_shape.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_rounded_corners_shape.xml new file mode 100644 index 00000000..d03599b8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/drawable/gnt_rounded_corners_shape.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_medium_template_view.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_medium_template_view.xml new file mode 100644 index 00000000..d4184b80 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_medium_template_view.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_small_template_view.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_small_template_view.xml new file mode 100644 index 00000000..189dbef4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/gnt_small_template_view.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/medium_template_view_layout.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/medium_template_view_layout.xml new file mode 100644 index 00000000..d84dc6ce --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/medium_template_view_layout.xml @@ -0,0 +1,8 @@ + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/small_template_view_layout.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/small_template_view_layout.xml new file mode 100644 index 00000000..792d1517 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/layout/small_template_view_layout.xml @@ -0,0 +1,8 @@ + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/attrs.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/attrs.xml new file mode 100644 index 00000000..36d477b8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/attrs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/colors.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/colors.xml new file mode 100644 index 00000000..7cbddaa4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/colors.xml @@ -0,0 +1,13 @@ + + + #00F4F4F4 + #00A3A3A3 + #000000 + #FFFFFF + #FF0000 + #00FF00 + #4285f4 + #3A6728 + #808080 + #E0E0E0 + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/dimens.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/dimens.xml new file mode 100644 index 00000000..29ee0585 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/main/res/values/dimens.xml @@ -0,0 +1,21 @@ + + + 0.4 + 0.25 + 1.0 + 0.2 + 10dp + 5dp + 12sp + 15sp + 25dp + 20dp + 30dp + 0dp + 10dp + 10sp + 30dp + 50dp + 0dp + 0dp + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/AdMessageCodecTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/AdMessageCodecTest.java new file mode 100644 index 00000000..f1b80ac6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/AdMessageCodecTest.java @@ -0,0 +1,547 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.util.Pair; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.RequestConfiguration; +import com.google.android.gms.ads.mediation.MediationExtrasReceiver; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterAdapterResponseInfo; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterResponseInfo; +import io.flutter.plugins.googlemobileads.FlutterAdSize.AdSizeFactory; +import io.flutter.plugins.googlemobileads.FlutterAdSize.AnchoredAdaptiveBannerAdSize; +import io.flutter.plugins.googlemobileads.FlutterAdSize.InlineAdaptiveBannerAdSize; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateFontStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateTextStyle; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateType; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link AdMessageCodec}. */ +@RunWith(RobolectricTestRunner.class) +public class AdMessageCodecTest { + AdMessageCodec codec; + AdSizeFactory mockAdSizeFactory; + FlutterRequestAgentProvider mockFlutterRequestAgentProvider; + + @Before + public void setup() { + mockAdSizeFactory = mock(AdSizeFactory.class); + mockFlutterRequestAgentProvider = mock(FlutterRequestAgentProvider.class); + codec = + new AdMessageCodec(mock(Context.class), mockAdSizeFactory, mockFlutterRequestAgentProvider); + } + + @Test + public void encodeAdapterInitializationState() { + final ByteBuffer message = + codec.encodeMessage(FlutterAdapterStatus.AdapterInitializationState.NOT_READY); + + assertEquals( + codec.decodeMessage((ByteBuffer) message.position(0)), + FlutterAdapterStatus.AdapterInitializationState.NOT_READY); + } + + @Test + public void encodeAdapterStatus() { + final ByteBuffer message = + codec.encodeMessage( + new FlutterAdapterStatus( + FlutterAdapterStatus.AdapterInitializationState.READY, "desc", 24)); + + final FlutterAdapterStatus result = + (FlutterAdapterStatus) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals( + result, + new FlutterAdapterStatus( + FlutterAdapterStatus.AdapterInitializationState.READY, "desc", 24)); + } + + @Test + public void encodeInitializationStatus() { + final ByteBuffer message = + codec.encodeMessage( + new FlutterInitializationStatus( + Collections.singletonMap( + "table", + new FlutterAdapterStatus( + FlutterAdapterStatus.AdapterInitializationState.NOT_READY, + "desc", + 56.66)))); + + final FlutterInitializationStatus initStatus = + (FlutterInitializationStatus) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(initStatus.adapterStatuses.size(), 1); + final FlutterAdapterStatus adapterStatus = initStatus.adapterStatuses.get("table"); + assertEquals( + adapterStatus, + new FlutterAdapterStatus( + FlutterAdapterStatus.AdapterInitializationState.NOT_READY, "desc", 56.66)); + } + + @Test + public void decodeServerSideVerificationOptions() { + FlutterServerSideVerificationOptions options = + new FlutterServerSideVerificationOptions("user-id", "custom-data"); + + ByteBuffer message = codec.encodeMessage(options); + + FlutterServerSideVerificationOptions decodedOptions = + (FlutterServerSideVerificationOptions) + codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(decodedOptions, options); + + // With userId = null. + options = new FlutterServerSideVerificationOptions(null, "custom-data"); + message = codec.encodeMessage(options); + decodedOptions = + (FlutterServerSideVerificationOptions) + codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(decodedOptions, options); + + // With customData = null. + options = new FlutterServerSideVerificationOptions("user-Id", null); + message = codec.encodeMessage(options); + decodedOptions = + (FlutterServerSideVerificationOptions) + codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(decodedOptions, options); + + // With userId and customData = null. + options = new FlutterServerSideVerificationOptions(null, null); + message = codec.encodeMessage(options); + decodedOptions = + (FlutterServerSideVerificationOptions) + codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(decodedOptions, options); + } + + @Test + public void encodeAnchoredAdaptiveBannerAdSize() { + AdSize mockAdSize = mock(AdSize.class); + doReturn(mockAdSize) + .when(mockAdSizeFactory) + .getPortraitAnchoredAdaptiveBannerAdSize(any(Context.class), anyInt()); + + doReturn(mockAdSize) + .when(mockAdSizeFactory) + .getLandscapeAnchoredAdaptiveBannerAdSize(any(Context.class), anyInt()); + + doReturn(mockAdSize) + .when(mockAdSizeFactory) + .getCurrentOrientationAnchoredAdaptiveBannerAdSize(any(Context.class), anyInt()); + + final AnchoredAdaptiveBannerAdSize portraitAnchoredAdaptiveAdSize = + new AnchoredAdaptiveBannerAdSize(mock(Context.class), mockAdSizeFactory, "portrait", 23, false); + final ByteBuffer portraitData = codec.encodeMessage(portraitAnchoredAdaptiveAdSize); + + final AnchoredAdaptiveBannerAdSize portraitResult = + (AnchoredAdaptiveBannerAdSize) codec.decodeMessage((ByteBuffer) portraitData.position(0)); + assertEquals(portraitResult.size, mockAdSize); + + final AnchoredAdaptiveBannerAdSize landscapeAnchoredAdaptiveAdSize = + new AnchoredAdaptiveBannerAdSize(mock(Context.class), mockAdSizeFactory, "landscape", 34, false); + final ByteBuffer landscapeData = codec.encodeMessage(landscapeAnchoredAdaptiveAdSize); + + final AnchoredAdaptiveBannerAdSize landscapeResult = + (AnchoredAdaptiveBannerAdSize) codec.decodeMessage((ByteBuffer) landscapeData.position(0)); + assertEquals(landscapeResult.size, mockAdSize); + + final AnchoredAdaptiveBannerAdSize anchoredAdaptiveAdSize = + new AnchoredAdaptiveBannerAdSize(mock(Context.class), mockAdSizeFactory, null, 45, false); + final ByteBuffer data = codec.encodeMessage(anchoredAdaptiveAdSize); + + final AnchoredAdaptiveBannerAdSize result = + (AnchoredAdaptiveBannerAdSize) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result.size, mockAdSize); + } + + @Test + public void encodeSmartBannerAdSize() { + final ByteBuffer data = codec.encodeMessage(new FlutterAdSize.SmartBannerAdSize()); + + final FlutterAdSize.SmartBannerAdSize result = + (FlutterAdSize.SmartBannerAdSize) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result.size, AdSize.SMART_BANNER); + } + + @Test + public void encodeFluidAdSize() { + final ByteBuffer data = codec.encodeMessage(new FlutterAdSize.FluidAdSize()); + + final FlutterAdSize.FluidAdSize result = + (FlutterAdSize.FluidAdSize) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result.size, AdSize.FLUID); + } + + @Test + public void nativeAdOptionsNull() { + final ByteBuffer data = + codec.encodeMessage(new FlutterNativeAdOptions(null, null, null, null, null, null)); + + final FlutterNativeAdOptions result = + (FlutterNativeAdOptions) codec.decodeMessage((ByteBuffer) data.position(0)); + assertNull(result.adChoicesPlacement); + assertNull(result.mediaAspectRatio); + assertNull(result.videoOptions); + assertNull(result.requestCustomMuteThisAd); + assertNull(result.shouldRequestMultipleImages); + assertNull(result.shouldReturnUrlsForImageAssets); + } + + @Test + public void nativeAdOptions() { + FlutterVideoOptions videoOptions = new FlutterVideoOptions(true, false, true); + + final ByteBuffer data = + codec.encodeMessage(new FlutterNativeAdOptions(1, 2, videoOptions, false, true, false)); + + final FlutterNativeAdOptions result = + (FlutterNativeAdOptions) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result.adChoicesPlacement, (Integer) 1); + assertEquals(result.mediaAspectRatio, (Integer) 2); + assertEquals(result.videoOptions.clickToExpandRequested, true); + assertEquals(result.videoOptions.customControlsRequested, false); + assertEquals(result.videoOptions.startMuted, true); + assertFalse(result.requestCustomMuteThisAd); + assertTrue(result.shouldRequestMultipleImages); + assertFalse(result.shouldReturnUrlsForImageAssets); + } + + @Test + public void color() { + ColorDrawable colorDrawable = new ColorDrawable(Color.argb(3, 2, 3, 4)); + ByteBuffer data = codec.encodeMessage(colorDrawable); + ColorDrawable result = (ColorDrawable) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result.getColor(), colorDrawable.getColor()); + assertEquals(result.getAlpha(), colorDrawable.getAlpha()); + } + + @Test + public void nativeTemplateType() { + for (FlutterNativeTemplateType type : FlutterNativeTemplateType.values()) { + ByteBuffer data = codec.encodeMessage(type); + FlutterNativeTemplateType result = + (FlutterNativeTemplateType) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result, type); + } + } + + @Test + public void nativeTemplateFontStyle() { + for (FlutterNativeTemplateFontStyle style : FlutterNativeTemplateFontStyle.values()) { + ByteBuffer data = codec.encodeMessage(style); + FlutterNativeTemplateFontStyle result = + (FlutterNativeTemplateFontStyle) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result, style); + } + } + + @Test + public void nativeTemplateTextStyle() { + FlutterNativeTemplateTextStyle style = + new FlutterNativeTemplateTextStyle( + new ColorDrawable(Color.RED), + new ColorDrawable(Color.BLUE), + FlutterNativeTemplateFontStyle.BOLD, + 12.); + ByteBuffer data = codec.encodeMessage(style); + FlutterNativeTemplateTextStyle result = + (FlutterNativeTemplateTextStyle) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(result, style); + } + + @Test + public void nativeTemplateTextStyle_nullProperties() { + FlutterNativeTemplateTextStyle style = + new FlutterNativeTemplateTextStyle(null, null, null, null); + ByteBuffer data = codec.encodeMessage(style); + FlutterNativeTemplateTextStyle result = + (FlutterNativeTemplateTextStyle) codec.decodeMessage((ByteBuffer) data.position(0)); + assertEquals(style, result); + } + + @Test + public void nativeTemplateStyle_nullProperties() { + FlutterNativeTemplateStyle style = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.MEDIUM, null, null, null, null, null); + + ByteBuffer data = codec.encodeMessage(style); + FlutterNativeTemplateStyle result = + (FlutterNativeTemplateStyle) codec.decodeMessage((ByteBuffer) data.position(0)); + + assertEquals(result, style); + } + + @Test + public void nativeTemplateStyle_definedProperties() { + FlutterNativeTemplateTextStyle ctaStyle = + new FlutterNativeTemplateTextStyle(null, null, null, null); + FlutterNativeTemplateTextStyle primaryStyle = + new FlutterNativeTemplateTextStyle( + new ColorDrawable(Color.YELLOW), + new ColorDrawable(Color.RED), + FlutterNativeTemplateFontStyle.ITALIC, + 24.); + FlutterNativeTemplateTextStyle secondaryStyle = + new FlutterNativeTemplateTextStyle( + new ColorDrawable(Color.BLUE), new ColorDrawable(Color.GREEN), null, 24.); + FlutterNativeTemplateTextStyle tertiaryStyle = + new FlutterNativeTemplateTextStyle( + new ColorDrawable(Color.YELLOW), null, FlutterNativeTemplateFontStyle.ITALIC, null); + + FlutterNativeTemplateStyle style = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.MEDIUM, + new ColorDrawable(Color.BLACK), + ctaStyle, + primaryStyle, + secondaryStyle, + tertiaryStyle); + + ByteBuffer data = codec.encodeMessage(style); + FlutterNativeTemplateStyle result = + (FlutterNativeTemplateStyle) codec.decodeMessage((ByteBuffer) data.position(0)); + + assertEquals(result, style); + } + + @Test + public void videoOptionsNull() { + final ByteBuffer data = codec.encodeMessage(new FlutterVideoOptions(null, null, null)); + + final FlutterVideoOptions result = + (FlutterVideoOptions) codec.decodeMessage((ByteBuffer) data.position(0)); + assertNull(result.clickToExpandRequested); + assertNull(result.customControlsRequested); + assertNull(result.startMuted); + } + + public void encodeEmptyFlutterAdRequest() { + FlutterAdRequest adRequest = new FlutterAdRequest.Builder().build(); + final ByteBuffer message = codec.encodeMessage(adRequest); + + final FlutterAdRequest decodedRequest = + (FlutterAdRequest) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(adRequest, decodedRequest); + } + + public void encodeEmptyFlutterAdManagerAdRequest() { + FlutterAdManagerAdRequest adRequest = new FlutterAdManagerAdRequest.Builder().build(); + final ByteBuffer message = codec.encodeMessage(adRequest); + + final FlutterAdManagerAdRequest decodedRequest = + (FlutterAdManagerAdRequest) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(adRequest, decodedRequest); + } + + @Test + public void encodeFlutterAdRequest() { + Map extras = Collections.singletonMap("key", "value"); + List mediationExtras = new ArrayList<>(); + DummyMediationExtras randomExtra = new DummyMediationExtras(); + Map flutterRandomExtra = new HashMap<>(); + flutterRandomExtra.put("TEST_KEY", "TEST_VALUE"); + randomExtra.extras = flutterRandomExtra; + mediationExtras.add(randomExtra); + FlutterAdRequest adRequest = + new FlutterAdRequest.Builder() + .setKeywords(Arrays.asList("1", "2", "3")) + .setContentUrl("contentUrl") + .setNonPersonalizedAds(false) + .setNeighboringContentUrls(Arrays.asList("example.com", "test.com")) + .setHttpTimeoutMillis(1000) + .setMediationNetworkExtrasIdentifier("identifier") + .setAdMobExtras(extras) + .setMediationExtras(mediationExtras) + .build(); + final ByteBuffer message = codec.encodeMessage(adRequest); + + final FlutterAdRequest decodedRequest = + (FlutterAdRequest) codec.decodeMessage((ByteBuffer) message.position(0)); + assert decodedRequest != null; + assertEquals(adRequest, decodedRequest); + assertEquals(flutterRandomExtra, decodedRequest.getMediationExtras().get(0).extras); + } + + @Test + public void encodeFlutterAdManagerAdRequest() { + List mediationExtras = new ArrayList<>(); + DummyMediationExtras randomExtra = new DummyMediationExtras(); + Map flutterRandomExtra = new HashMap<>(); + flutterRandomExtra.put("TEST_KEY", "TEST_VALUE"); + randomExtra.extras = flutterRandomExtra; + mediationExtras.add(randomExtra); + doReturn("mock-request-agent").when(mockFlutterRequestAgentProvider).getRequestAgent(); + FlutterAdManagerAdRequest.Builder builder = new FlutterAdManagerAdRequest.Builder(); + builder.setKeywords(Arrays.asList("1", "2", "3")); + builder.setContentUrl("contentUrl"); + builder.setCustomTargeting(Collections.singletonMap("apple", "banana")); + builder.setCustomTargetingLists( + Collections.singletonMap("cherry", Collections.singletonList("pie"))); + builder.setNonPersonalizedAds(true); + builder.setPublisherProvidedId("pub-provided-id"); + builder.setMediationNetworkExtrasIdentifier("identifier"); + builder.setAdMobExtras(Collections.singletonMap("key", "value")); + builder.setMediationExtras(mediationExtras); + + FlutterAdManagerAdRequest flutterAdManagerAdRequest = builder.build(); + + final ByteBuffer message = codec.encodeMessage(flutterAdManagerAdRequest); + FlutterAdManagerAdRequest decodedAdRequest = + (FlutterAdManagerAdRequest) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(decodedAdRequest, flutterAdManagerAdRequest); + assertEquals(decodedAdRequest.getRequestAgent(), "mock-request-agent"); + assertEquals(flutterRandomExtra, decodedAdRequest.getMediationExtras().get(0).extras); + } + + @Test + public void encodeFlutterAdSize() { + final ByteBuffer message = codec.encodeMessage(new FlutterAdSize(1, 2)); + + assertEquals(codec.decodeMessage((ByteBuffer) message.position(0)), new FlutterAdSize(1, 2)); + } + + @Test + public void encodeFlutterRewardItem() { + final ByteBuffer message = + codec.encodeMessage(new FlutterRewardedAd.FlutterRewardItem(23, "coins")); + + assertEquals( + codec.decodeMessage((ByteBuffer) message.position(0)), + new FlutterRewardedAd.FlutterRewardItem(23, "coins")); + } + + @Test + public void encodeFlutterResponseInfo() { + List adapterResponseInfos = new ArrayList<>(); + Map adUnitMapping = Collections.singletonMap("key", "value"); + adapterResponseInfos.add( + new FlutterAdapterResponseInfo( + "adapter-class", + 9999, + "description", + adUnitMapping, + null, + "adSourceName", + "adSourceId", + "adSourceInstanceName", + "adSourceInstanceId")); + FlutterAdapterResponseInfo loadedAdapterResponseInfo = + new FlutterAdapterResponseInfo( + "loaded-adapter-class", + 1234, + "description", + adUnitMapping, + null, + "adSourceName", + "adSourceId", + "adSourceInstanceName", + "adSourceInstanceId"); + Map responseExtras = Collections.singletonMap("key", "value"); + FlutterResponseInfo info = + new FlutterResponseInfo( + "responseId", + "className", + adapterResponseInfos, + loadedAdapterResponseInfo, + responseExtras); + final ByteBuffer message = + codec.encodeMessage(new FlutterBannerAd.FlutterLoadAdError(1, "domain", "message", info)); + + final FlutterAd.FlutterLoadAdError error = + (FlutterAd.FlutterLoadAdError) codec.decodeMessage((ByteBuffer) message.position(0)); + assertNotNull(error); + assertEquals(error.code, 1); + assertEquals(error.domain, "domain"); + assertEquals(error.message, "message"); + assertEquals(error.responseInfo, info); + } + + public void encodeInlineAdaptiveBanner() { + AdSize adSize = new AdSize(100, 101); + doReturn(adSize) + .when(mockAdSizeFactory) + .getCurrentOrientationInlineAdaptiveBannerAdSize(any(Context.class), eq(100)); + + InlineAdaptiveBannerAdSize size = + new InlineAdaptiveBannerAdSize(mockAdSizeFactory, mock(Context.class), 100, null, null); + final ByteBuffer data = codec.encodeMessage(size); + final InlineAdaptiveBannerAdSize result = + (InlineAdaptiveBannerAdSize) codec.decodeMessage((ByteBuffer) data.position(0)); + + assertEquals(result.width, 100); + assertNull(result.maxHeight); + assertNull(result.orientation); + } + + public void encodeRequestConfiguration() { + RequestConfiguration.Builder requestConfigurationBuilder = new RequestConfiguration.Builder(); + requestConfigurationBuilder.setMaxAdContentRating( + RequestConfiguration.MAX_AD_CONTENT_RATING_MA); + requestConfigurationBuilder.setTagForChildDirectedTreatment( + RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE); + requestConfigurationBuilder.setTagForUnderAgeOfConsent( + RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_FALSE); + requestConfigurationBuilder.setTestDeviceIds(Arrays.asList("test-device-id")); + RequestConfiguration requestConfiguration = requestConfigurationBuilder.build(); + + final ByteBuffer data = codec.encodeMessage(requestConfiguration); + final RequestConfiguration result = + (RequestConfiguration) codec.decodeMessage((ByteBuffer) data.position(0)); + + assertEquals(result.getMaxAdContentRating(), RequestConfiguration.MAX_AD_CONTENT_RATING_MA); + assertEquals( + result.getTagForChildDirectedTreatment(), + RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE); + assertEquals( + result.getTagForUnderAgeOfConsent(), + RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_FALSE); + assertEquals(result.getTestDeviceIds(), Arrays.asList("test-device-id")); + } +} + +class DummyMediationExtras extends FlutterMediationExtras { + @Override + public Pair, Bundle> getMediationExtras() { + return null; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAdTest.java new file mode 100644 index 00000000..de385bdc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FluidAdManagerBannerAdTest.java @@ -0,0 +1,202 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.view.View.OnLayoutChangeListener; +import android.view.ViewGroup.LayoutParams; +import android.widget.ScrollView; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.admanager.AdManagerAdView; +import com.google.android.gms.ads.admanager.AppEventListener; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FluidAdManagerBannerAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FluidAdManagerBannerAdTest { + + private AdInstanceManager mockManager; + private AdManagerAdRequest mockAdRequest; + private AdManagerAdView mockAdView; + // The system under test. + private FluidAdManagerBannerAd fluidAd; + + @Before + public void setup() { + // Setup mock dependencies for flutterBannerAd. + BinaryMessenger mockMessenger = mock(BinaryMessenger.class); + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + FlutterAdManagerAdRequest mockFlutterAdRequest = mock(FlutterAdManagerAdRequest.class); + mockAdRequest = mock(AdManagerAdRequest.class); + when(mockFlutterAdRequest.asAdManagerAdRequest(anyString())).thenReturn(mockAdRequest); + BannerAdCreator bannerAdCreator = mock(BannerAdCreator.class); + mockAdView = mock(AdManagerAdView.class); + doReturn(mockAdView).when(bannerAdCreator).createAdManagerAdView(); + fluidAd = + new FluidAdManagerBannerAd(1, mockManager, "testId", mockFlutterAdRequest, bannerAdCreator); + } + + @Test + public void failedToLoad() { + final LoadAdError loadError = mock(LoadAdError.class); + ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn("id").when(responseInfo).getResponseId(); + doReturn("className").when(responseInfo).getMediationAdapterClassName(); + doReturn(1).when(loadError).getCode(); + doReturn("2").when(loadError).getDomain(); + doReturn("3").when(loadError).getMessage(); + doReturn(null).when(loadError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdFailedToLoad(loadError); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + + fluidAd.load(); + + verify(mockAdView).setLayoutParams(any(LayoutParams.class)); + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAppEventListener(any(AppEventListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSizes(AdSize.FLUID); + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadWithListenerCallbacks() { + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdLoaded(); + listener.onAdImpression(); + listener.onAdClosed(); + listener.onAdOpened(); + listener.onAdClicked(); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAdView).getResponseInfo(); + fluidAd.load(); + + verify(mockAdView).setLayoutParams(any(LayoutParams.class)); + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSizes(AdSize.FLUID); + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClosed(eq(1)); + verify(mockManager).onAdOpened(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + + // Verify that ad is correctly put into container view. + FluidAdManagerBannerAd spy = spy(fluidAd); + ScrollView mockContainer = mock(ScrollView.class); + doReturn(mockContainer).when(spy).createContainerView(); + assertEquals(spy.getPlatformView().getView(), mockAdView); + verify(mockContainer).setClipChildren(false); + verify(mockContainer).setVerticalScrollBarEnabled(false); + verify(mockContainer).setHorizontalScrollBarEnabled(false); + + // Height changed callback. + ArgumentCaptor layoutChangeCaptor = + ArgumentCaptor.forClass(OnLayoutChangeListener.class); + verify(mockAdView).addOnLayoutChangeListener(layoutChangeCaptor.capture()); + doReturn(10).when(mockAdView).getMeasuredHeight(); + + layoutChangeCaptor.getValue().onLayoutChange(mockAdView, 0, 0, 10, 10, 0, 0, 0, 0); + verify(mockManager).onFluidAdHeightChanged(eq(1), eq(10)); + } + + @Test + public void appEventListener() { + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppEventListener listener = invocation.getArgument(0); + listener.onAppEvent("appEvent", "data"); + return null; + } + }) + .when(mockAdView) + .setAppEventListener(any(AppEventListener.class)); + + fluidAd.load(); + + verify(mockManager).onAppEvent(eq(1), eq("appEvent"), eq("data")); + } + + @Test + public void dispose() { + fluidAd.load(); + + FluidAdManagerBannerAd spy = spy(fluidAd); + ScrollView mockContainer = mock(ScrollView.class); + doReturn(mockContainer).when(spy).createContainerView(); + + assertEquals(spy.getPlatformView().getView(), mockAdView); + PlatformView platformView = spy.getPlatformView(); + assertNotNull(platformView); + + spy.dispose(); + verify(mockAdView).destroy(); + assertNull(spy.getPlatformView()); + // Check that the platform view still retains a reference to the view until + // dispose is called on it. + assertNotNull(platformView.getView()); + platformView.dispose(); + assertNull(platformView.getView()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequestTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequestTest.java new file mode 100644 index 00000000..72ced72d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerAdRequestTest.java @@ -0,0 +1,111 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.os.Bundle; +import com.google.ads.mediation.admob.AdMobAdapter; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import io.flutter.plugins.googlemobileads.FlutterAdManagerAdRequest.Builder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterAdManagerAdRequest}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterAdManagerAdRequestTest { + + @Test + public void testAsAdRequest_noParams() { + FlutterAdManagerAdRequest flutterAdRequest = new Builder().build(); + AdManagerAdRequest adRequest = flutterAdRequest.asAdManagerAdRequest("test-ad-unit"); + assertNull(adRequest.getContentUrl()); + assertTrue(adRequest.getNeighboringContentUrls().isEmpty()); + assertTrue(adRequest.getKeywords().isEmpty()); + assertTrue(adRequest.getCustomTargeting().isEmpty()); + assertNull(adRequest.getPublisherProvidedId()); + assertNull(adRequest.getNetworkExtrasBundle(AdMobAdapter.class)); + } + + @Test + public void testAsAdRequest_allParams() { + MediationNetworkExtrasProvider provider = mock(MediationNetworkExtrasProvider.class); + Bundle bundle = new Bundle(); + bundle.putString("npa", "0"); + doReturn(Collections.singletonMap(AdMobAdapter.class, bundle)) + .when(provider) + .getMediationExtras(eq("test-ad-unit"), eq("identifier")); + + Builder builder = new Builder(); + builder.setKeywords(Collections.singletonList("keyword")); + builder.setContentUrl("content-url"); + builder.setNeighboringContentUrls(Collections.singletonList("neighbor")); + builder.setHttpTimeoutMillis(100); + builder.setNonPersonalizedAds(true); + builder.setMediationNetworkExtrasIdentifier("identifier"); + builder.setMediationNetworkExtrasProvider(provider); + builder.setCustomTargeting(Collections.singletonMap("targetingKey", "targetingValue")); + List targetingList = new ArrayList<>(); + targetingList.add("targetingValue1"); + targetingList.add("targetingValue2"); + + builder.setCustomTargetingLists(Collections.singletonMap("targetingKey", targetingList)); + builder.setPublisherProvidedId("pubProvidedId"); + builder.build(); + + AdManagerAdRequest adRequest = builder.build().asAdManagerAdRequest("test-ad-unit"); + + assertEquals(adRequest.getKeywords(), Collections.singleton("keyword")); + assertEquals(adRequest.getContentUrl(), "content-url"); + assertEquals(adRequest.getNeighboringContentUrls(), Collections.singletonList("neighbor")); + // Previous value of "npa" should get overridden. + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("npa"), "1"); + assertEquals(adRequest.getPublisherProvidedId(), "pubProvidedId"); + assertFalse(adRequest.getCustomTargeting().isEmpty()); + // If custom targeting keys match, the values are overwritten. + assertEquals( + adRequest.getCustomTargeting().get("targetingKey"), "targetingValue1,targetingValue2"); + } + + @Test + public void testAsAdRequestMediationNetworkExtras() { + MediationNetworkExtrasProvider provider = mock(MediationNetworkExtrasProvider.class); + Bundle bundle = new Bundle(); + bundle.putString("key", "value"); + doReturn(Collections.singletonMap(AdMobAdapter.class, bundle)) + .when(provider) + .getMediationExtras(eq("test-ad-unit"), eq("identifier")); + + Builder builder = new Builder(); + builder + .setMediationNetworkExtrasIdentifier("identifier") + .setMediationNetworkExtrasProvider(provider) + .setNonPersonalizedAds(true); + + AdManagerAdRequest adRequest = builder.build().asAdManagerAdRequest("test-ad-unit"); + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("key"), "value"); + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("npa"), "1"); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAdTest.java new file mode 100644 index 00000000..afd4fb9c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerBannerAdTest.java @@ -0,0 +1,184 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.admanager.AdManagerAdView; +import com.google.android.gms.ads.admanager.AppEventListener; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import java.util.ArrayList; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterAdManagerBannerAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterAdManagerBannerAdTest { + + private AdInstanceManager mockManager; + private AdManagerAdRequest mockAdRequest; + private AdSize adSize; + private AdManagerAdView mockAdView; + + // The system under test. + private FlutterAdManagerBannerAd flutterBannerAd; + + @Before + public void setup() { + // Setup mock dependencies for flutterBannerAd. + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + FlutterAdManagerAdRequest mockFlutterAdRequest = mock(FlutterAdManagerAdRequest.class); + mockAdRequest = mock(AdManagerAdRequest.class); + FlutterAdSize mockFlutterAdSize = mock(FlutterAdSize.class); + adSize = new AdSize(1, 2); + when(mockFlutterAdRequest.asAdManagerAdRequest(anyString())).thenReturn(mockAdRequest); + when(mockFlutterAdSize.getAdSize()).thenReturn(adSize); + List sizes = new ArrayList<>(); + sizes.add(mockFlutterAdSize); + BannerAdCreator bannerAdCreator = mock(BannerAdCreator.class); + mockAdView = mock(AdManagerAdView.class); + doReturn(mockAdView).when(bannerAdCreator).createAdManagerAdView(); + flutterBannerAd = + new FlutterAdManagerBannerAd( + 1, mockManager, "testId", sizes, mockFlutterAdRequest, bannerAdCreator); + } + + @Test + public void failedToLoad() { + final LoadAdError loadError = mock(LoadAdError.class); + ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn("id").when(responseInfo).getResponseId(); + doReturn("className").when(responseInfo).getMediationAdapterClassName(); + doReturn(1).when(loadError).getCode(); + doReturn("2").when(loadError).getDomain(); + doReturn("3").when(loadError).getMessage(); + doReturn(null).when(loadError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdFailedToLoad(loadError); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + + flutterBannerAd.load(); + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAppEventListener(any(AppEventListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSizes(adSize); + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadWithListenerCallbacks() { + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdLoaded(); + listener.onAdImpression(); + listener.onAdClosed(); + listener.onAdOpened(); + listener.onAdClicked(); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAdView).getResponseInfo(); + flutterBannerAd.load(); + + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSizes(adSize); + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClosed(eq(1)); + verify(mockManager).onAdOpened(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + assertEquals(flutterBannerAd.getPlatformView().getView(), mockAdView); + } + + @Test + public void appEventListener() { + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppEventListener listener = invocation.getArgument(0); + listener.onAppEvent("appEvent", "data"); + return null; + } + }) + .when(mockAdView) + .setAppEventListener(any(AppEventListener.class)); + + flutterBannerAd.load(); + + verify(mockManager).onAppEvent(eq(1), eq("appEvent"), eq("data")); + } + + @Test + public void dispose() { + flutterBannerAd.load(); + + assertEquals(flutterBannerAd.getPlatformView().getView(), mockAdView); + PlatformView platformView = flutterBannerAd.getPlatformView(); + assertNotNull(platformView); + + flutterBannerAd.dispose(); + verify(mockAdView).destroy(); + assertNull(flutterBannerAd.getPlatformView()); + // Check that the platform view still retains a reference to the view until + // dispose is called on it. + assertNotNull(platformView.getView()); + platformView.dispose(); + assertNull(platformView.getView()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAdTest.java new file mode 100644 index 00000000..e6b4cb03 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdManagerInterstitialAdTest.java @@ -0,0 +1,284 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.FullScreenContentCallback; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAd; +import com.google.android.gms.ads.admanager.AdManagerInterstitialAdLoadCallback; +import com.google.android.gms.ads.admanager.AppEventListener; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterAdManagerInterstitialAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterAdManagerInterstitialAdTest { + + private AdInstanceManager mockManager; + private FlutterAdLoader mockFlutterAdLoader; + private AdManagerAdRequest mockRequest; + // The system under test. + private FlutterAdManagerInterstitialAd flutterAdManagerInterstitialAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + final FlutterAdManagerAdRequest mockFlutterRequest = mock(FlutterAdManagerAdRequest.class); + mockRequest = mock(AdManagerAdRequest.class); + mockFlutterAdLoader = mock(FlutterAdLoader.class); + when(mockFlutterRequest.asAdManagerAdRequest(anyString())).thenReturn(mockRequest); + flutterAdManagerInterstitialAd = + new FlutterAdManagerInterstitialAd( + 1, mockManager, "testId", mockFlutterRequest, mockFlutterAdLoader); + } + + @Test + public void loadAdManagerInterstitialAd_failedToLoad() { + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdManagerInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(AdManagerInterstitialAdLoadCallback.class)); + + flutterAdManagerInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerInterstitial( + eq("testId"), eq(mockRequest), any(AdManagerInterstitialAdLoadCallback.class)); + + FlutterLoadAdError flutterLoadAdError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(flutterLoadAdError)); + } + + @Test + public void loadAdManagerInterstitialAd_showSuccess() { + final AdManagerInterstitialAd mockAdManagerAd = mock(AdManagerInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdManagerInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAdManagerAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(AdManagerInterstitialAdLoadCallback.class)); + + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAdManagerAd).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAdManagerAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + flutterAdManagerInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerInterstitial( + eq("testId"), eq(mockRequest), any(AdManagerInterstitialAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(1, responseInfo); + verify(mockAdManagerAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterAdManagerInterstitialAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + + // Setup mocks for show(). + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdDismissedFullScreenContent(); + callback.onAdClicked(); + return null; + } + }) + .when(mockAdManagerAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterAdManagerInterstitialAd.show(); + verify(mockAdManagerAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAdManagerAd).show(mockManager.getActivity()); + verify(mockAdManagerAd).setAppEventListener(any(AppEventListener.class)); + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + assertNull(flutterAdManagerInterstitialAd.getPlatformView()); + } + + @Test + public void loadAdManagerInterstitialAd_setImmersiveMode() { + final AdManagerInterstitialAd mockAdManagerAd = mock(AdManagerInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdManagerInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + adLoadCallback.onAdLoaded(mockAdManagerAd); + // Pass back null for ad + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(AdManagerInterstitialAdLoadCallback.class)); + + flutterAdManagerInterstitialAd.load(); + flutterAdManagerInterstitialAd.setImmersiveMode(true); + verify(mockAdManagerAd).setImmersiveMode(true); + } + + @Test + public void loadAdManagerInterstitialAd_showFailure() { + final AdManagerInterstitialAd mockAdManagerAd = mock(AdManagerInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdManagerInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAdManagerAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(AdManagerInterstitialAdLoadCallback.class)); + doReturn(mock(ResponseInfo.class)).when(mockAdManagerAd).getResponseInfo(); + flutterAdManagerInterstitialAd.load(); + final AdError adError = new AdError(-1, "test", "error"); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockAdManagerAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterAdManagerInterstitialAd.show(); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void loadAdManagerInterstitialAd_appEvent() { + final AdManagerInterstitialAd mockAdManagerAd = mock(AdManagerInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdManagerInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAdManagerAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(AdManagerInterstitialAdLoadCallback.class)); + + doReturn(mock(ResponseInfo.class)).when(mockAdManagerAd).getResponseInfo(); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppEventListener listener = invocation.getArgument(0); + listener.onAppEvent("test", "data"); + return null; + } + }) + .when(mockAdManagerAd) + .setAppEventListener(any(AppEventListener.class)); + + flutterAdManagerInterstitialAd.load(); + + verify(mockAdManagerAd).setAppEventListener(any(AppEventListener.class)); + verify(mockManager).onAppEvent(eq(1), eq("test"), eq("data")); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdRequestTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdRequestTest.java new file mode 100644 index 00000000..b826b0a3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAdRequestTest.java @@ -0,0 +1,96 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.os.Bundle; +import com.google.ads.mediation.admob.AdMobAdapter; +import com.google.android.gms.ads.AdRequest; +import io.flutter.plugins.googlemobileads.FlutterAdRequest.Builder; +import java.util.Collections; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterAdRequest}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterAdRequestTest { + + @Test + public void testAsAdRequest_noParams() { + FlutterAdRequest flutterAdRequest = new Builder().build(); + AdRequest adRequest = flutterAdRequest.asAdRequest("test-ad-unit"); + assertNull(adRequest.getContentUrl()); + assertTrue(adRequest.getNeighboringContentUrls().isEmpty()); + assertTrue(adRequest.getKeywords().isEmpty()); + assertNull(adRequest.getNetworkExtrasBundle(AdMobAdapter.class)); + } + + @Test + public void testAsAdRequest_allParams() { + MediationNetworkExtrasProvider provider = mock(MediationNetworkExtrasProvider.class); + Bundle bundle = new Bundle(); + bundle.putString("npa", "0"); + doReturn(Collections.singletonMap(AdMobAdapter.class, bundle)) + .when(provider) + .getMediationExtras(eq("test-ad-unit"), eq("identifier")); + + FlutterAdRequest flutterAdRequest = + new Builder() + .setKeywords(Collections.singletonList("keyword")) + .setContentUrl("content-url") + .setNeighboringContentUrls(Collections.singletonList("neighbor")) + .setHttpTimeoutMillis(100) + .setNonPersonalizedAds(true) + .setMediationNetworkExtrasIdentifier("identifier") + .setMediationNetworkExtrasProvider(provider) + .build(); + + AdRequest adRequest = flutterAdRequest.asAdRequest("test-ad-unit"); + + assertEquals(adRequest.getKeywords(), Collections.singleton("keyword")); + assertEquals(adRequest.getContentUrl(), "content-url"); + assertEquals(adRequest.getNeighboringContentUrls(), Collections.singletonList("neighbor")); + // Previous value of "npa" should get overridden. + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("npa"), "1"); + } + + @Test + public void testAsAdRequestMediationNetworkExtras() { + MediationNetworkExtrasProvider provider = mock(MediationNetworkExtrasProvider.class); + Bundle bundle = new Bundle(); + bundle.putString("key", "value"); + doReturn(Collections.singletonMap(AdMobAdapter.class, bundle)) + .when(provider) + .getMediationExtras(eq("test-ad-unit"), eq("identifier")); + + FlutterAdRequest flutterAdRequest = + new Builder() + .setMediationNetworkExtrasIdentifier("identifier") + .setMediationNetworkExtrasProvider(provider) + .setNonPersonalizedAds(true) + .build(); + + AdRequest adRequest = flutterAdRequest.asAdRequest("test-ad-unit"); + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("key"), "value"); + assertEquals(adRequest.getNetworkExtrasBundle(AdMobAdapter.class).get("npa"), "1"); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAdTest.java new file mode 100644 index 00000000..6f924dde --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterAppOpenAdTest.java @@ -0,0 +1,458 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.FullScreenContentCallback; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.appopen.AppOpenAd; +import com.google.android.gms.ads.appopen.AppOpenAd.AppOpenAdLoadCallback; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterAppOpenAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterAppOpenAdTest { + + private FlutterAdLoader mockFlutterAdLoader; + private AdInstanceManager mockManager; + private AdManagerAdRequest mockAdManagerAdRequest; + private AdRequest mockAdRequest; + private AppOpenAd mockAd; + + // The system under test. + private FlutterAppOpenAd flutterAppOpenAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + mockFlutterAdLoader = mock(FlutterAdLoader.class); + mockAd = mock(AppOpenAd.class); + } + + private void setupAdmobMocks() { + FlutterAdRequest mockFlutterAdRequest = mock(FlutterAdRequest.class); + mockAdRequest = mock(AdRequest.class); + when(mockFlutterAdRequest.asAdRequest(anyString())).thenReturn(mockAdRequest); + flutterAppOpenAd = + new FlutterAppOpenAd( + 1, mockManager, "testId", mockFlutterAdRequest, null, mockFlutterAdLoader); + } + + private void setupAdManagerMocks() { + FlutterAdManagerAdRequest mockAdManagerFlutterRequest = mock(FlutterAdManagerAdRequest.class); + mockAdManagerAdRequest = mock(AdManagerAdRequest.class); + when(mockAdManagerFlutterRequest.asAdManagerAdRequest(anyString())) + .thenReturn(mockAdManagerAdRequest); + flutterAppOpenAd = + new FlutterAppOpenAd( + 1, mockManager, "testId", null, mockAdManagerFlutterRequest, mockFlutterAdLoader); + } + + @Test + public void loadAdManager_failedToLoad() { + setupAdManagerMocks(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerAppOpen( + anyString(), any(AdManagerAdRequest.class), any(AppOpenAdLoadCallback.class)); + + flutterAppOpenAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerAppOpen( + eq("testId"), eq(mockAdManagerAdRequest), any(AppOpenAdLoadCallback.class)); + + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadAdmob_failedToLoad() { + setupAdmobMocks(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAppOpen(anyString(), any(AdRequest.class), any(AppOpenAdLoadCallback.class)); + + flutterAppOpenAd.load(); + + verify(mockFlutterAdLoader) + .loadAppOpen(eq("testId"), eq(mockAdRequest), any(AppOpenAdLoadCallback.class)); + + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadAdManager_success() { + // Setup mocks for loading. + setupAdManagerMocks(); + + final AppOpenAd mockAd = mock(AppOpenAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerAppOpen( + anyString(), any(AdManagerAdRequest.class), any(AppOpenAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + // Load an ad and verify correct ad loader method is called. + flutterAppOpenAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerAppOpen( + eq("testId"), eq(mockAdManagerAdRequest), any(AppOpenAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterAppOpenAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + } + + @Test + public void loadAdmob_success() { + // Setup mocks for loading. + setupAdmobMocks(); + + final AppOpenAd mockAd = mock(AppOpenAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAppOpen(anyString(), any(AdRequest.class), any(AppOpenAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + // Load an ad and verify correct ad loader method is called. + flutterAppOpenAd.load(); + + verify(mockFlutterAdLoader) + .loadAppOpen(eq("testId"), eq(mockAdRequest), any(AppOpenAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterAppOpenAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + } + + /** Helper for loading an ad manager ad. */ + private void loadAdManagerAd() { + setupAdManagerMocks(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerAppOpen( + anyString(), any(AdManagerAdRequest.class), any(AppOpenAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + // Load an ad and verify correct ad loader method is called. + flutterAppOpenAd.load(); + } + + /** Helper for loading an admob ad. */ + private void loadAdmobAd() { + // Setup mocks for loading. + setupAdmobMocks(); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAppOpen(anyString(), any(AdRequest.class), any(AppOpenAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + flutterAppOpenAd.load(); + } + + @Test + public void loadAdManager_showSuccess() { + loadAdManagerAd(); + + // Setup mocks for show(). + final FullScreenContentCallback[] fullScreenContentCallback = new FullScreenContentCallback[1]; + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + fullScreenContentCallback[0] = invocation.getArgument(0); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = fullScreenContentCallback[0]; + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdClicked(); + callback.onAdDismissedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .show(any(Activity.class)); + + // Show the ad and verify callbacks are set up properly. + flutterAppOpenAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity())); + + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + + assertNull(flutterAppOpenAd.getPlatformView()); + } + + @Test + public void loadAdmob_showSuccess() { + loadAdmobAd(); + // Setup mocks for show(). + final FullScreenContentCallback[] fullScreenContentCallback = new FullScreenContentCallback[1]; + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + fullScreenContentCallback[0] = invocation.getArgument(0); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = fullScreenContentCallback[0]; + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdDismissedFullScreenContent(); + ; + return null; + } + }) + .when(mockAd) + .show(any(Activity.class)); + + // Show the ad and verify callbacks are set up properly. + flutterAppOpenAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity())); + + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + + assertNull(flutterAppOpenAd.getPlatformView()); + } + + @Test + public void loadAdmob_failToShow() { + loadAdmobAd(); + + // Setup mocks for triggering fail to show callback. + final AdError adError = new AdError(0, "ad", "error"); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterAppOpenAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void loadAdManager_failToShow() { + loadAdManagerAd(); + + // Setup mocks for triggering fail to show callback. + final AdError adError = new AdError(0, "ad", "error"); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterAppOpenAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void setImmersiveMode() { + setupAdmobMocks(); + final AppOpenAd mockAd = mock(AppOpenAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AppOpenAdLoadCallback adLoadCallback = invocation.getArgument(2); + adLoadCallback.onAdLoaded(mockAd); + // Pass back null for ad + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAppOpen(anyString(), any(AdRequest.class), any(AppOpenAdLoadCallback.class)); + flutterAppOpenAd.load(); + flutterAppOpenAd.setImmersiveMode(false); + verify(mockAd).setImmersiveMode(eq(false)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterBannerAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterBannerAdTest.java new file mode 100644 index 00000000..ff0c8cd3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterBannerAdTest.java @@ -0,0 +1,182 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterBannerAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterBannerAdTest { + + private AdInstanceManager mockManager; + private AdView mockAdView; + private AdRequest mockAdRequest; + private AdSize adSize; + + // The system under test. + private FlutterBannerAd flutterBannerAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + final FlutterAdRequest mockFlutterRequest = mock(FlutterAdRequest.class); + mockAdRequest = mock(AdRequest.class); + final FlutterAdSize mockFlutterAdSize = mock(FlutterAdSize.class); + adSize = new AdSize(1, 2); + when(mockFlutterRequest.asAdRequest(anyString())).thenReturn(mockAdRequest); + when(mockFlutterAdSize.getAdSize()).thenReturn(adSize); + BannerAdCreator bannerAdCreator = mock(BannerAdCreator.class); + mockAdView = mock(AdView.class); + doReturn(mockAdView).when(bannerAdCreator).createAdView(); + flutterBannerAd = + new FlutterBannerAd( + 1, mockManager, "testId", mockFlutterRequest, mockFlutterAdSize, bannerAdCreator); + } + + @Test + public void failedToLoad() { + final LoadAdError loadError = mock(LoadAdError.class); + doReturn(1).when(loadError).getCode(); + doReturn("2").when(loadError).getDomain(); + doReturn("3").when(loadError).getMessage(); + doReturn(null).when(loadError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdFailedToLoad(loadError); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + + flutterBannerAd.load(); + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSize(adSize); + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadWithListenerCallbacks() { + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + AdListener listener = invocation.getArgument(0); + listener.onAdLoaded(); + listener.onAdImpression(); + listener.onAdClicked(); + listener.onAdClosed(); + listener.onAdOpened(); + return null; + } + }) + .when(mockAdView) + .setAdListener(any(AdListener.class)); + + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAdView).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAdView) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + flutterBannerAd.load(); + + verify(mockAdView).loadAd(eq(mockAdRequest)); + verify(mockAdView).setAdListener(any(AdListener.class)); + verify(mockAdView).setAdUnitId(eq("testId")); + verify(mockAdView).setAdSize(adSize); + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + verify(mockManager).onAdClosed(eq(1)); + verify(mockManager).onAdOpened(eq(1)); + assertEquals(flutterBannerAd.getPlatformView().getView(), mockAdView); + verify(mockAdView).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterBannerAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + } + + @Test + public void dispose() { + flutterBannerAd.load(); + + assertEquals(flutterBannerAd.getPlatformView().getView(), mockAdView); + PlatformView platformView = flutterBannerAd.getPlatformView(); + assertNotNull(platformView); + + flutterBannerAd.dispose(); + verify(mockAdView).destroy(); + assertNull(flutterBannerAd.getPlatformView()); + // Check that the platform view still retains a reference to the view until + // dispose is called on it. + assertNotNull(platformView.getView()); + platformView.dispose(); + assertNull(platformView.getView()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAdTest.java new file mode 100644 index 00000000..75e76e17 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterInterstitialAdTest.java @@ -0,0 +1,233 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.FullScreenContentCallback; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.interstitial.InterstitialAd; +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterInterstitialAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterInterstitialAdTest { + + private AdInstanceManager mockManager; + private FlutterAdLoader mockFlutterAdLoader; + private AdRequest mockAdRequest; + + // The system under test. + private FlutterInterstitialAd flutterInterstitialAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + final FlutterAdRequest mockFlutterRequest = mock(FlutterAdRequest.class); + mockAdRequest = mock(AdRequest.class); + mockFlutterAdLoader = mock(FlutterAdLoader.class); + when(mockFlutterRequest.asAdRequest(anyString())).thenReturn(mockAdRequest); + + flutterInterstitialAd = + new FlutterInterstitialAd( + 1, mockManager, "testId", mockFlutterRequest, mockFlutterAdLoader); + } + + @Test + public void loadInterstitialAd_failedToLoad() { + final LoadAdError loadAdError = mock(LoadAdError.class); + ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn("id").when(responseInfo).getResponseId(); + doReturn("className").when(responseInfo).getMediationAdapterClassName(); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + InterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadInterstitial(anyString(), any(AdRequest.class), any(InterstitialAdLoadCallback.class)); + + flutterInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadInterstitial(eq("testId"), eq(mockAdRequest), any(InterstitialAdLoadCallback.class)); + + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadInterstitialAd_showSuccess() { + final InterstitialAd mockAd = mock(InterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + InterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadInterstitial(anyString(), any(AdRequest.class), any(InterstitialAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + flutterInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadInterstitial(eq("testId"), eq(mockAdRequest), any(InterstitialAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterInterstitialAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + + // Setup mocks for show(). + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdClicked(); + callback.onAdDismissedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterInterstitialAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity())); + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + assertNull(flutterInterstitialAd.getPlatformView()); + } + + @Test + public void loadInterstitialAd_showFailure() { + final InterstitialAd mockAd = mock(InterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + InterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadInterstitial(anyString(), any(AdRequest.class), any(InterstitialAdLoadCallback.class)); + doReturn(mock(ResponseInfo.class)).when(mockAd).getResponseInfo(); + flutterInterstitialAd.load(); + final AdError adError = new AdError(1, "2", "3"); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterInterstitialAd.show(); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void loadInterstitialAd_setImmersiveMode() { + final InterstitialAd mockAd = mock(InterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + InterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + adLoadCallback.onAdLoaded(mockAd); + // Pass back null for ad + return null; + } + }) + .when(mockFlutterAdLoader) + .loadInterstitial(anyString(), any(AdRequest.class), any(InterstitialAdLoadCallback.class)); + flutterInterstitialAd.load(); + flutterInterstitialAd.setImmersiveMode(true); + verify(mockAd).setImmersiveMode(true); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptionsTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptionsTest.java new file mode 100644 index 00000000..2afbba27 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdOptionsTest.java @@ -0,0 +1,64 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; + +import com.google.android.gms.ads.VideoOptions; +import com.google.android.gms.ads.nativead.NativeAdOptions; +import org.junit.Test; +import org.mockito.Mockito; + +/** Tests for {@link FlutterNativeAdOptions}. */ +public class FlutterNativeAdOptionsTest { + + @Test + public void testAsAdOptions_null() { + FlutterNativeAdOptions flutterNativeAdOptions = + new FlutterNativeAdOptions(null, null, null, null, null, null); + + NativeAdOptions nativeAdOptions = flutterNativeAdOptions.asNativeAdOptions(); + NativeAdOptions defaultOptions = new NativeAdOptions.Builder().build(); + assertEquals(nativeAdOptions.getAdChoicesPlacement(), defaultOptions.getAdChoicesPlacement()); + assertEquals(nativeAdOptions.getMediaAspectRatio(), defaultOptions.getMediaAspectRatio()); + assertEquals(nativeAdOptions.getVideoOptions(), defaultOptions.getVideoOptions()); + assertEquals( + nativeAdOptions.shouldRequestMultipleImages(), + defaultOptions.shouldRequestMultipleImages()); + assertEquals( + nativeAdOptions.shouldReturnUrlsForImageAssets(), + defaultOptions.shouldReturnUrlsForImageAssets()); + } + + @Test + public void testAsAdOptions() { + FlutterVideoOptions mockFlutterVideoOptions = Mockito.mock(FlutterVideoOptions.class); + VideoOptions mockVideoOptions = Mockito.mock(VideoOptions.class); + doReturn(mockVideoOptions).when(mockFlutterVideoOptions).asVideoOptions(); + + FlutterNativeAdOptions flutterNativeAdOptions = + new FlutterNativeAdOptions(1, 2, mockFlutterVideoOptions, true, false, true); + + NativeAdOptions nativeAdOptions = flutterNativeAdOptions.asNativeAdOptions(); + assertEquals(nativeAdOptions.getAdChoicesPlacement(), 1); + assertEquals(nativeAdOptions.getMediaAspectRatio(), 2); + assertFalse(nativeAdOptions.shouldRequestMultipleImages()); + assertTrue(nativeAdOptions.shouldReturnUrlsForImageAssets()); + assertEquals(nativeAdOptions.getVideoOptions(), mockVideoOptions); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdTest.java new file mode 100644 index 00000000..58f02338 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterNativeAdTest.java @@ -0,0 +1,375 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.content.Context; +import androidx.test.core.app.ApplicationProvider; +import com.google.android.ads.nativetemplates.TemplateView; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAd.OnNativeAdLoadedListener; +import com.google.android.gms.ads.nativead.NativeAdOptions; +import com.google.android.gms.ads.nativead.NativeAdView; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.platform.PlatformView; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory; +import io.flutter.plugins.googlemobileads.nativetemplates.FlutterNativeTemplateStyle; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterNativeAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterNativeAdTest { + + private AdInstanceManager testManager; + private final FlutterAdRequest request = new FlutterAdRequest.Builder().build(); + + @Before + public void setup() { + testManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(testManager).getActivity(); + } + + @Test + public void loadNativeAdWithAdManagerAdRequest() { + final FlutterAdManagerAdRequest mockFlutterRequest = mock(FlutterAdManagerAdRequest.class); + final AdManagerAdRequest mockRequest = mock(AdManagerAdRequest.class); + when(mockFlutterRequest.asAdManagerAdRequest(anyString())).thenReturn(mockRequest); + FlutterAdLoader mockLoader = mock(FlutterAdLoader.class); + NativeAdFactory mockNativeAdFactory = mock(NativeAdFactory.class); + @SuppressWarnings("unchecked") + Map mockOptions = mock(Map.class); + FlutterNativeAdOptions mockFlutterNativeAdOptions = mock(FlutterNativeAdOptions.class); + NativeAdOptions mockNativeAdOptions = mock(NativeAdOptions.class); + doReturn(mockNativeAdOptions).when(mockFlutterNativeAdOptions).asNativeAdOptions(); + final FlutterNativeAd nativeAd = + new FlutterNativeAd( + ApplicationProvider.getApplicationContext(), + 1, + testManager, + "testId", + mockNativeAdFactory, + mockFlutterRequest, + mockLoader, + mockOptions, + mockFlutterNativeAdOptions, + null); + + final ResponseInfo responseInfo = mock(ResponseInfo.class); + final NativeAd mockNativeAd = mock(NativeAd.class); + doReturn(responseInfo).when(mockNativeAd).getResponseInfo(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + OnNativeAdLoadedListener adLoadCallback = invocation.getArgument(1); + adLoadCallback.onNativeAdLoaded(mockNativeAd); + + AdListener listener = invocation.getArgument(3); + listener.onAdOpened(); + listener.onAdClosed(); + listener.onAdClicked(); + listener.onAdImpression(); + listener.onAdLoaded(); + listener.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockLoader) + .loadAdManagerNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + any(NativeAdOptions.class), + any(AdListener.class), + eq(mockRequest)); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockNativeAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + nativeAd.load(); + verify(mockLoader) + .loadAdManagerNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + eq(mockNativeAdOptions), + any(AdListener.class), + eq(mockRequest)); + + verify(mockNativeAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + verify(mockNativeAdFactory).createNativeAd(eq(mockNativeAd), eq(mockOptions)); + verify(testManager).onAdOpened(eq(1)); + verify(testManager).onAdClosed(eq(1)); + verify(testManager).onAdClicked(eq(1)); + verify(testManager).onAdImpression(eq(1)); + verify(testManager).onAdLoaded(eq(1), eq(responseInfo)); + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(testManager).onAdFailedToLoad(eq(1), eq(expectedError)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(testManager).onPaidEvent(eq(nativeAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + } + + @Test + public void loadNativeAdWithAdRequest() { + final FlutterAdRequest mockFlutterRequest = mock(FlutterAdRequest.class); + final AdRequest mockRequest = mock(AdRequest.class); + when(mockFlutterRequest.asAdRequest(anyString())).thenReturn(mockRequest); + FlutterAdLoader mockLoader = mock(FlutterAdLoader.class); + NativeAdFactory mockNativeAdFactory = mock(GoogleMobileAdsPlugin.NativeAdFactory.class); + NativeAdView mockNativeAdView = mock(NativeAdView.class); + doReturn(mockNativeAdView) + .when(mockNativeAdFactory) + .createNativeAd(any(NativeAd.class), any(Map.class)); + @SuppressWarnings("unchecked") + Map mockOptions = mock(Map.class); + FlutterNativeAdOptions mockFlutterNativeAdOptions = mock(FlutterNativeAdOptions.class); + NativeAdOptions mockNativeAdOptions = mock(NativeAdOptions.class); + doReturn(mockNativeAdOptions).when(mockFlutterNativeAdOptions).asNativeAdOptions(); + final FlutterNativeAd nativeAd = + new FlutterNativeAd( + ApplicationProvider.getApplicationContext(), + 1, + testManager, + "testId", + mockNativeAdFactory, + mockFlutterRequest, + mockLoader, + mockOptions, + mockFlutterNativeAdOptions, + null); + + final ResponseInfo responseInfo = mock(ResponseInfo.class); + final NativeAd mockNativeAd = mock(NativeAd.class); + doReturn(responseInfo).when(mockNativeAd).getResponseInfo(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnNativeAdLoadedListener adLoadCallback = invocation.getArgument(1); + adLoadCallback.onNativeAdLoaded(mockNativeAd); + + AdListener listener = invocation.getArgument(3); + listener.onAdOpened(); + listener.onAdClosed(); + listener.onAdClicked(); + listener.onAdImpression(); + listener.onAdLoaded(); + listener.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockLoader) + .loadNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + any(NativeAdOptions.class), + any(AdListener.class), + eq(mockRequest)); + + nativeAd.load(); + verify(mockLoader) + .loadNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + eq(mockNativeAdOptions), + any(AdListener.class), + eq(mockRequest)); + + verify(mockNativeAdFactory).createNativeAd(eq(mockNativeAd), eq(mockOptions)); + verify(testManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(testManager).onAdOpened(eq(1)); + verify(testManager).onAdClosed(eq(1)); + verify(testManager).onAdClicked(eq(1)); + verify(testManager).onAdImpression(eq(1)); + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(testManager).onAdFailedToLoad(eq(1), eq(expectedError)); + + // Check that platform view is defined. + PlatformView platformView = nativeAd.getPlatformView(); + assertEquals(platformView.getView(), mockNativeAdView); + // getPlatformView() should be null after dispose() is invoked, but the platform view should + // still return the view. + nativeAd.dispose(); + assertNull(nativeAd.getPlatformView()); + assertNotNull(platformView.getView()); + // Platform view's reference to the view isn't cleared until dispose() is invoked on it. + platformView.dispose(); + assertNull(platformView.getView()); + } + + @Test + public void testLoadWithNativeTemplates() { + final FlutterAdRequest mockFlutterRequest = mock(FlutterAdRequest.class); + final AdRequest mockRequest = mock(AdRequest.class); + when(mockFlutterRequest.asAdRequest(anyString())).thenReturn(mockRequest); + FlutterAdLoader mockLoader = mock(FlutterAdLoader.class); + NativeAdFactory mockNativeAdFactory = mock(GoogleMobileAdsPlugin.NativeAdFactory.class); + @SuppressWarnings("unchecked") + Map mockOptions = mock(Map.class); + FlutterNativeAdOptions mockFlutterNativeAdOptions = mock(FlutterNativeAdOptions.class); + NativeAdOptions mockNativeAdOptions = mock(NativeAdOptions.class); + doReturn(mockNativeAdOptions).when(mockFlutterNativeAdOptions).asNativeAdOptions(); + TemplateView mockTemplateView = mock(TemplateView.class); + FlutterNativeTemplateStyle mockStyle = mock(FlutterNativeTemplateStyle.class); + doReturn(mockTemplateView).when(mockStyle).asTemplateView(any()); + + final FlutterNativeAd nativeAd = + new FlutterNativeAd( + ApplicationProvider.getApplicationContext(), + 1, + testManager, + "testId", + mockNativeAdFactory, + mockFlutterRequest, + mockLoader, + mockOptions, + mockFlutterNativeAdOptions, + mockStyle); + + final ResponseInfo responseInfo = mock(ResponseInfo.class); + final NativeAd mockNativeAd = mock(NativeAd.class); + doReturn(responseInfo).when(mockNativeAd).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnNativeAdLoadedListener adLoadCallback = invocation.getArgument(1); + adLoadCallback.onNativeAdLoaded(mockNativeAd); + + AdListener listener = invocation.getArgument(3); + listener.onAdOpened(); + return null; + } + }) + .when(mockLoader) + .loadNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + any(NativeAdOptions.class), + any(AdListener.class), + eq(mockRequest)); + + nativeAd.load(); + verify(mockLoader) + .loadNativeAd( + eq("testId"), + any(OnNativeAdLoadedListener.class), + eq(mockNativeAdOptions), + any(AdListener.class), + eq(mockRequest)); + + verify(testManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockNativeAdFactory, never()).createNativeAd(eq(mockNativeAd), eq(mockOptions)); + verify(mockStyle).asTemplateView(any(Context.class)); + + // Check that platform view is defined and equal to the template view. + PlatformView platformView = nativeAd.getPlatformView(); + assertEquals(platformView.getView(), mockTemplateView); + } + + @Test(expected = IllegalStateException.class) + public void nativeAdBuilderNullManager() { + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(null) + .setAdUnitId("testId") + .setAdFactory(mock(GoogleMobileAdsPlugin.NativeAdFactory.class)) + .setRequest(request) + .build(); + } + + @Test(expected = IllegalStateException.class) + public void nativeAdBuilderNullAdUnitId() { + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(testManager) + .setAdUnitId(null) + .setAdFactory(mock(GoogleMobileAdsPlugin.NativeAdFactory.class)) + .setRequest(request) + .build(); + } + + @Test(expected = IllegalStateException.class) + public void nativeAdBuilderNullAdFactory() { + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(testManager) + .setAdUnitId("testId") + .setAdFactory(null) + .setRequest(request) + .build(); + } + + @Test(expected = IllegalStateException.class) + public void nativeAdBuilderNullRequest() { + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(testManager) + .setAdUnitId("testId") + .setAdFactory(mock(GoogleMobileAdsPlugin.NativeAdFactory.class)) + .build(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProviderTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProviderTest.java new file mode 100644 index 00000000..c457f87a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRequestAgentProviderTest.java @@ -0,0 +1,118 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static android.os.Build.VERSION_CODES.S; +import static android.os.Build.VERSION_CODES.TIRAMISU; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import android.os.Bundle; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +/** Tests {@link FlutterRequestAgentProvider}. */ +@RunWith(RobolectricTestRunner.class) +@Config(sdk = {S, TIRAMISU}) +public class FlutterRequestAgentProviderTest { + + private Context mockContext; + private PackageManager mockPackageManager; + private ApplicationInfo mockApplicationInfo; + private static final String PACKAGE_NAME = "some.test.package"; + private Bundle metaData; + + @Before + public void setUp() throws NameNotFoundException { + mockContext = mock(Context.class); + mockPackageManager = mock(PackageManager.class); + mockApplicationInfo = mock(ApplicationInfo.class); + metaData = new Bundle(); + mockApplicationInfo.metaData = metaData; + doReturn(mockContext).when(mockContext).getApplicationContext(); + doReturn(mockPackageManager).when(mockContext).getPackageManager(); + doReturn(PACKAGE_NAME).when(mockContext).getPackageName(); + if (Build.VERSION.SDK_INT >= TIRAMISU) { + doReturn(mockApplicationInfo) + .when(mockPackageManager) + .getApplicationInfo(eq(PACKAGE_NAME), any()); + } else { + doReturn(mockApplicationInfo) + .when(mockPackageManager) + .getApplicationInfo(eq(PACKAGE_NAME), eq(PackageManager.GET_META_DATA)); + } + } + + @Test + public void testGetRequestAgent_noTemplateMetadata() { + FlutterRequestAgentProvider sut = new FlutterRequestAgentProvider(mockContext); + String requestAgent = sut.getRequestAgent(); + assertEquals(requestAgent, Constants.REQUEST_AGENT_PREFIX_VERSIONED); + } + + @Test + public void testGetRequestAgent_newsTemplateMetadata() { + metaData.putString(FlutterRequestAgentProvider.NEWS_VERSION_KEY, "1.2.54"); + FlutterRequestAgentProvider sut = new FlutterRequestAgentProvider(mockContext); + String requestAgent = sut.getRequestAgent(); + assertEquals( + requestAgent, + Constants.REQUEST_AGENT_PREFIX_VERSIONED + + "_" + + Constants.REQUEST_AGENT_NEWS_TEMPLATE_PREFIX + + "-1.2.54"); + } + + @Test + public void testGetRequestAgent_gameTemplateMetadata() { + metaData.putString(FlutterRequestAgentProvider.GAME_VERSION_KEY, "1.2.54"); + FlutterRequestAgentProvider sut = new FlutterRequestAgentProvider(mockContext); + String requestAgent = sut.getRequestAgent(); + assertEquals( + requestAgent, + Constants.REQUEST_AGENT_PREFIX_VERSIONED + + "_" + + Constants.REQUEST_AGENT_GAME_TEMPLATE_PREFIX + + "-1.2.54"); + } + + @Test + public void testGetRequestAgent_gameAndNewsTemplateMetadata() { + metaData.putString(FlutterRequestAgentProvider.NEWS_VERSION_KEY, "1.2.54"); + metaData.putString(FlutterRequestAgentProvider.GAME_VERSION_KEY, "asdfg"); + FlutterRequestAgentProvider sut = new FlutterRequestAgentProvider(mockContext); + String requestAgent = sut.getRequestAgent(); + assertEquals( + requestAgent, + Constants.REQUEST_AGENT_PREFIX_VERSIONED + + "_" + + Constants.REQUEST_AGENT_NEWS_TEMPLATE_PREFIX + + "-1.2.54" + + "_" + + Constants.REQUEST_AGENT_GAME_TEMPLATE_PREFIX + + "-asdfg"); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedAdTest.java new file mode 100644 index 00000000..e1926eb8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedAdTest.java @@ -0,0 +1,373 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.FullScreenContentCallback; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.OnUserEarnedRewardListener; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.rewarded.OnAdMetadataChangedListener; +import com.google.android.gms.ads.rewarded.RewardItem; +import com.google.android.gms.ads.rewarded.RewardedAd; +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback; +import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import io.flutter.plugins.googlemobileads.FlutterRewardedAd.FlutterRewardItem; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterRewardedAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterRewardedAdTest { + + private FlutterAdLoader mockFlutterAdLoader; + private AdInstanceManager mockManager; + private AdManagerAdRequest mockAdManagerAdRequest; + private AdRequest mockAdRequest; + + // The system under test. + private FlutterRewardedAd flutterRewardedAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + mockFlutterAdLoader = mock(FlutterAdLoader.class); + } + + private void setupAdmobMocks() { + FlutterAdRequest mockFlutterAdRequest = mock(FlutterAdRequest.class); + mockAdRequest = mock(AdRequest.class); + when(mockFlutterAdRequest.asAdRequest(anyString())).thenReturn(mockAdRequest); + flutterRewardedAd = + new FlutterRewardedAd(1, mockManager, "testId", mockFlutterAdRequest, mockFlutterAdLoader); + } + + private void setupAdManagerMocks() { + FlutterAdManagerAdRequest mockAdManagerFlutterRequest = mock(FlutterAdManagerAdRequest.class); + mockAdManagerAdRequest = mock(AdManagerAdRequest.class); + when(mockAdManagerFlutterRequest.asAdManagerAdRequest(anyString())) + .thenReturn(mockAdManagerAdRequest); + flutterRewardedAd = + new FlutterRewardedAd( + 1, mockManager, "testId", mockAdManagerFlutterRequest, mockFlutterAdLoader); + } + + @Test + public void loadAdManagerRewardedAd_failedToLoad() { + setupAdManagerMocks(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewarded( + anyString(), any(AdManagerAdRequest.class), any(RewardedAdLoadCallback.class)); + + flutterRewardedAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewarded( + eq("testId"), eq(mockAdManagerAdRequest), any(RewardedAdLoadCallback.class)); + + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadAdManagerRewardedAd_showSuccessWithReward() { + setupAdManagerMocks(); + + final RewardedAd mockAd = mock(RewardedAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewarded( + anyString(), any(AdManagerAdRequest.class), any(RewardedAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + flutterRewardedAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewarded( + eq("testId"), eq(mockAdManagerAdRequest), any(RewardedAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterRewardedAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + + // Setup mocks for show(). + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdClicked(); + callback.onAdDismissedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + final RewardItem mockRewardItem = mock(RewardItem.class); + doReturn(5).when(mockRewardItem).getAmount(); + doReturn("$$").when(mockRewardItem).getType(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnUserEarnedRewardListener listener = invocation.getArgument(1); + listener.onUserEarnedReward(mockRewardItem); + return null; + } + }) + .when(mockAd) + .show(any(Activity.class), any(OnUserEarnedRewardListener.class)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnAdMetadataChangedListener listener = invocation.getArgument(0); + listener.onAdMetadataChanged(); + return null; + } + }) + .when(mockAd) + .setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + + flutterRewardedAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity()), any(OnUserEarnedRewardListener.class)); + verify(mockAd).setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + verify(mockManager).onRewardedAdUserEarnedReward(1, new FlutterRewardItem(5, "$$")); + verify(mockManager).onAdMetadataChanged(eq(1)); + + assertNull(flutterRewardedAd.getPlatformView()); + } + + @Test + public void loadRewardedAdWithAdManagerRequest_nullServerSideOptions() { + setupAdManagerMocks(); + + final FlutterRewardedAd mockFlutterAd = spy(flutterRewardedAd); + final RewardedAd mockAd = mock(RewardedAd.class); + final LoadAdError loadAdError = new LoadAdError(1, "2", "3", null, null); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewarded( + anyString(), any(AdManagerAdRequest.class), any(RewardedAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + mockFlutterAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewarded( + eq("testId"), eq(mockAdManagerAdRequest), any(RewardedAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + mockFlutterAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity()), any(OnUserEarnedRewardListener.class)); + verify(mockAd).setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + } + + @Test + public void loadRewardedAdFailToShow() { + setupAdmobMocks(); + final RewardedAd mockRewardedAd = mock(RewardedAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockRewardedAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadRewarded(anyString(), any(AdRequest.class), any(RewardedAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockRewardedAd).getResponseInfo(); + flutterRewardedAd.load(); + + verify(mockFlutterAdLoader) + .loadRewarded(eq("testId"), eq(mockAdRequest), any(RewardedAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + final AdError adError = new AdError(0, "ad", "error"); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockRewardedAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterRewardedAd.show(); + verify(mockRewardedAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void loadRewardedAd_setImmersiveMode() { + setupAdmobMocks(); + + final RewardedAd mockRewardedAd = mock(RewardedAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + adLoadCallback.onAdLoaded(mockRewardedAd); + // Pass back null for ad + return null; + } + }) + .when(mockFlutterAdLoader) + .loadRewarded(anyString(), any(AdRequest.class), any(RewardedAdLoadCallback.class)); + + flutterRewardedAd.load(); + flutterRewardedAd.setImmersiveMode(true); + verify(mockRewardedAd).setImmersiveMode(true); + } + + @Test + public void setServerSideVerificationOptions() { + setupAdManagerMocks(); + final RewardedAd mockAd = mock(RewardedAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewarded( + anyString(), any(AdManagerAdRequest.class), any(RewardedAdLoadCallback.class)); + + flutterRewardedAd.load(); + + FlutterServerSideVerificationOptions fltSsv = mock(FlutterServerSideVerificationOptions.class); + ServerSideVerificationOptions ssv = mock(ServerSideVerificationOptions.class); + doReturn(ssv).when(fltSsv).asServerSideVerificationOptions(); + + flutterRewardedAd.setServerSideVerificationOptions(fltSsv); + verify(mockAd).setServerSideVerificationOptions(eq(ssv)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAdTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAdTest.java new file mode 100644 index 00000000..7237d566 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterRewardedInterstitialAdTest.java @@ -0,0 +1,393 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentCaptor.forClass; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdValue; +import com.google.android.gms.ads.FullScreenContentCallback; +import com.google.android.gms.ads.LoadAdError; +import com.google.android.gms.ads.OnUserEarnedRewardListener; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.google.android.gms.ads.rewarded.OnAdMetadataChangedListener; +import com.google.android.gms.ads.rewarded.RewardItem; +import com.google.android.gms.ads.rewarded.ServerSideVerificationOptions; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd; +import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterLoadAdError; +import io.flutter.plugins.googlemobileads.FlutterRewardedAd.FlutterRewardItem; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterRewardedInterstitialAd}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterRewardedInterstitialAdTest { + + private FlutterAdLoader mockFlutterAdLoader; + private AdInstanceManager mockManager; + private AdManagerAdRequest mockAdManagerAdRequest; + private AdRequest mockAdRequest; + + // The system under test. + private FlutterRewardedInterstitialAd flutterRewardedInterstitialAd; + + @Before + public void setup() { + mockManager = spy(new AdInstanceManager(mock(MethodChannel.class))); + doReturn(mock(Activity.class)).when(mockManager).getActivity(); + mockFlutterAdLoader = mock(FlutterAdLoader.class); + } + + private void setupAdmobMocks() { + FlutterAdRequest mockFlutterAdRequest = mock(FlutterAdRequest.class); + mockAdRequest = mock(AdRequest.class); + when(mockFlutterAdRequest.asAdRequest(anyString())).thenReturn(mockAdRequest); + flutterRewardedInterstitialAd = + new FlutterRewardedInterstitialAd( + 1, mockManager, "testId", mockFlutterAdRequest, mockFlutterAdLoader); + } + + private void setupAdManagerMocks() { + FlutterAdManagerAdRequest mockAdManagerFlutterRequest = mock(FlutterAdManagerAdRequest.class); + mockAdManagerAdRequest = mock(AdManagerAdRequest.class); + when(mockAdManagerFlutterRequest.asAdManagerAdRequest(anyString())) + .thenReturn(mockAdManagerAdRequest); + flutterRewardedInterstitialAd = + new FlutterRewardedInterstitialAd( + 1, mockManager, "testId", mockAdManagerFlutterRequest, mockFlutterAdLoader); + } + + @Test + public void loadAdManagerRewardedInterstitialAd_failedToLoad() { + setupAdManagerMocks(); + final LoadAdError loadAdError = mock(LoadAdError.class); + doReturn(1).when(loadAdError).getCode(); + doReturn("2").when(loadAdError).getDomain(); + doReturn("3").when(loadAdError).getMessage(); + doReturn(null).when(loadAdError).getResponseInfo(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdFailedToLoad(loadAdError); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(RewardedInterstitialAdLoadCallback.class)); + + flutterRewardedInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + eq("testId"), + eq(mockAdManagerAdRequest), + any(RewardedInterstitialAdLoadCallback.class)); + + FlutterLoadAdError expectedError = new FlutterLoadAdError(loadAdError); + verify(mockManager).onAdFailedToLoad(eq(1), eq(expectedError)); + } + + @Test + public void loadAdManagerRewardedInterstitialAd_showSuccessWithReward() { + setupAdManagerMocks(); + + final RewardedInterstitialAd mockAd = mock(RewardedInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(RewardedInterstitialAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + final AdValue adValue = mock(AdValue.class); + doReturn(1).when(adValue).getPrecisionType(); + doReturn("Dollars").when(adValue).getCurrencyCode(); + doReturn(1000L).when(adValue).getValueMicros(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + FlutterPaidEventListener listener = invocation.getArgument(0); + listener.onPaidEvent(adValue); + return null; + } + }) + .when(mockAd) + .setOnPaidEventListener(any(FlutterPaidEventListener.class)); + + flutterRewardedInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + eq("testId"), + eq(mockAdManagerAdRequest), + any(RewardedInterstitialAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + verify(mockAd).setOnPaidEventListener(any(FlutterPaidEventListener.class)); + final ArgumentCaptor adValueCaptor = forClass(FlutterAdValue.class); + verify(mockManager).onPaidEvent(eq(flutterRewardedInterstitialAd), adValueCaptor.capture()); + assertEquals(adValueCaptor.getValue().currencyCode, "Dollars"); + assertEquals(adValueCaptor.getValue().precisionType, 1); + assertEquals(adValueCaptor.getValue().valueMicros, 1000L); + + // Setup mocks for show(). + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + callback.onAdImpression(); + callback.onAdClicked(); + callback.onAdDismissedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + final RewardItem mockRewardItem = mock(RewardItem.class); + doReturn(5).when(mockRewardItem).getAmount(); + doReturn("$$").when(mockRewardItem).getType(); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnUserEarnedRewardListener listener = invocation.getArgument(1); + listener.onUserEarnedReward(mockRewardItem); + return null; + } + }) + .when(mockAd) + .show(any(Activity.class), any(OnUserEarnedRewardListener.class)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + OnAdMetadataChangedListener listener = invocation.getArgument(0); + listener.onAdMetadataChanged(); + return null; + } + }) + .when(mockAd) + .setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + + flutterRewardedInterstitialAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity()), any(OnUserEarnedRewardListener.class)); + verify(mockAd).setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + verify(mockManager).onAdShowedFullScreenContent(eq(1)); + verify(mockManager).onAdImpression(eq(1)); + verify(mockManager).onAdClicked(eq(1)); + verify(mockManager).onAdDismissedFullScreenContent(eq(1)); + verify(mockManager).onRewardedAdUserEarnedReward(1, new FlutterRewardItem(5, "$$")); + verify(mockManager).onAdMetadataChanged(eq(1)); + + assertNull(flutterRewardedInterstitialAd.getPlatformView()); + } + + @Test + public void loadRewardedInterstitialAdWithAdManagerRequest_nullServerSideOptions() { + setupAdManagerMocks(); + + final FlutterRewardedInterstitialAd mockFlutterAd = spy(flutterRewardedInterstitialAd); + final RewardedInterstitialAd mockAd = mock(RewardedInterstitialAd.class); + final LoadAdError loadAdError = new LoadAdError(1, "2", "3", null, null); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(RewardedInterstitialAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockAd).getResponseInfo(); + + mockFlutterAd.load(); + + verify(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + eq("testId"), + eq(mockAdManagerAdRequest), + any(RewardedInterstitialAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdShowedFullScreenContent(); + return null; + } + }) + .when(mockAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + mockFlutterAd.show(); + verify(mockAd).setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockAd).show(eq(mockManager.getActivity()), any(OnUserEarnedRewardListener.class)); + verify(mockAd).setOnAdMetadataChangedListener(any(OnAdMetadataChangedListener.class)); + } + + @Test + public void loadRewardedInterstitialAd_failToShow() { + setupAdmobMocks(); + + final RewardedInterstitialAd mockRewardedInterstitialAd = mock(RewardedInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockRewardedInterstitialAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadRewardedInterstitial( + anyString(), any(AdRequest.class), any(RewardedInterstitialAdLoadCallback.class)); + final ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn(responseInfo).when(mockRewardedInterstitialAd).getResponseInfo(); + flutterRewardedInterstitialAd.load(); + + verify(mockFlutterAdLoader) + .loadRewardedInterstitial( + eq("testId"), eq(mockAdRequest), any(RewardedInterstitialAdLoadCallback.class)); + + verify(mockManager).onAdLoaded(eq(1), eq(responseInfo)); + final AdError adError = new AdError(0, "ad", "error"); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + FullScreenContentCallback callback = invocation.getArgument(0); + callback.onAdFailedToShowFullScreenContent(adError); + return null; + } + }) + .when(mockRewardedInterstitialAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + + flutterRewardedInterstitialAd.show(); + verify(mockRewardedInterstitialAd) + .setFullScreenContentCallback(any(FullScreenContentCallback.class)); + verify(mockManager).onFailedToShowFullScreenContent(eq(1), eq(adError)); + } + + @Test + public void loadRewardedInterstitialAd_setImmersiveMode() { + setupAdmobMocks(); + + final RewardedInterstitialAd mockRewardedInterstitialAd = mock(RewardedInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + adLoadCallback.onAdLoaded(mockRewardedInterstitialAd); + // Pass back null for ad + return null; + } + }) + .when(mockFlutterAdLoader) + .loadRewardedInterstitial( + anyString(), any(AdRequest.class), any(RewardedInterstitialAdLoadCallback.class)); + + flutterRewardedInterstitialAd.load(); + flutterRewardedInterstitialAd.setImmersiveMode(true); + verify(mockRewardedInterstitialAd).setImmersiveMode(true); + } + + @Test + public void setServerSideVerificationOptions() { + setupAdManagerMocks(); + final RewardedInterstitialAd mockAd = mock(RewardedInterstitialAd.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RewardedInterstitialAdLoadCallback adLoadCallback = invocation.getArgument(2); + // Pass back null for ad + adLoadCallback.onAdLoaded(mockAd); + return null; + } + }) + .when(mockFlutterAdLoader) + .loadAdManagerRewardedInterstitial( + anyString(), + any(AdManagerAdRequest.class), + any(RewardedInterstitialAdLoadCallback.class)); + + flutterRewardedInterstitialAd.load(); + + FlutterServerSideVerificationOptions fltSsv = mock(FlutterServerSideVerificationOptions.class); + ServerSideVerificationOptions ssv = mock(ServerSideVerificationOptions.class); + doReturn(ssv).when(fltSsv).asServerSideVerificationOptions(); + + flutterRewardedInterstitialAd.setServerSideVerificationOptions(fltSsv); + verify(mockAd).setServerSideVerificationOptions(eq(ssv)); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterVideoOptionsTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterVideoOptionsTest.java new file mode 100644 index 00000000..55efe9bc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/FlutterVideoOptionsTest.java @@ -0,0 +1,50 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.google.android.gms.ads.VideoOptions; +import org.junit.Test; + +/** Tests for {@link FlutterVideoOptions}. */ +public class FlutterVideoOptionsTest { + + @Test + public void testVideoOptions_null() { + FlutterVideoOptions flutterVideoOptions = new FlutterVideoOptions(null, null, null); + + VideoOptions videoOptions = flutterVideoOptions.asVideoOptions(); + VideoOptions defaultOptions = new VideoOptions.Builder().build(); + assertEquals( + videoOptions.getClickToExpandRequested(), defaultOptions.getClickToExpandRequested()); + assertEquals( + videoOptions.getCustomControlsRequested(), defaultOptions.getCustomControlsRequested()); + assertEquals(videoOptions.getStartMuted(), defaultOptions.getStartMuted()); + } + + @Test + public void testVideoOptions() { + FlutterVideoOptions flutterVideoOptions = new FlutterVideoOptions(true, false, true); + + VideoOptions videoOptions = flutterVideoOptions.asVideoOptions(); + + assertTrue(videoOptions.getClickToExpandRequested()); + assertFalse(videoOptions.getCustomControlsRequested()); + assertTrue(videoOptions.getStartMuted()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsTest.java new file mode 100644 index 00000000..a25e8a88 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsTest.java @@ -0,0 +1,1035 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads; + +import static org.hamcrest.Matchers.hasEntry; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import androidx.test.core.app.ApplicationProvider; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AdInspectorError; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.AdapterResponseInfo; +import com.google.android.gms.ads.OnAdInspectorClosedListener; +import com.google.android.gms.ads.RequestConfiguration; +import com.google.android.gms.ads.ResponseInfo; +import com.google.android.gms.ads.admanager.AdManagerAdView; +import com.google.android.gms.ads.initialization.InitializationStatus; +import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAdView; +import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.StandardMethodCodec; +import io.flutter.plugin.platform.PlatformViewRegistry; +import io.flutter.plugins.googlemobileads.FlutterAd.FlutterResponseInfo; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.hamcrest.Matcher; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; + +/** Tests {@link AdInstanceManager}. */ +@RunWith(RobolectricTestRunner.class) +public class GoogleMobileAdsTest { + private AdInstanceManager testManager; + private final FlutterAdRequest request = new FlutterAdRequest.Builder().build(); + private Activity mockActivity; + private Context mockContext; + private FlutterPluginBinding mockFlutterPluginBinding; + private static BinaryMessenger mockMessenger; + private static FlutterRequestAgentProvider mockFlutterRequestAgentProvider = + mock(FlutterRequestAgentProvider.class); + + private static MethodCall getLastMethodCall() { + Robolectric.flushForegroundThreadScheduler(); + final ArgumentCaptor byteBufferCaptor = ArgumentCaptor.forClass(ByteBuffer.class); + verify(mockMessenger) + .send( + eq("plugins.flutter.io/google_mobile_ads"), + byteBufferCaptor.capture(), + (BinaryMessenger.BinaryReply) isNull()); + + return new StandardMethodCodec(new AdMessageCodec(null, mockFlutterRequestAgentProvider)) + .decodeMethodCall((ByteBuffer) byteBufferCaptor.getValue().position(0)); + } + + @Before + public void setup() { + mockMessenger = mock(BinaryMessenger.class); + mockActivity = mock(Activity.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + Runnable runnable = invocation.getArgument(0); + runnable.run(); + return null; + } + }) + .when(mockActivity) + .runOnUiThread(ArgumentMatchers.any(Runnable.class)); + mockFlutterRequestAgentProvider = mock(FlutterRequestAgentProvider.class); + MethodChannel methodChannel = + new MethodChannel( + mockMessenger, + "plugins.flutter.io/google_mobile_ads", + new StandardMethodCodec( + new AdMessageCodec(mockActivity, mockFlutterRequestAgentProvider))); + testManager = new AdInstanceManager(methodChannel); + testManager.setActivity(mockActivity); + mockContext = mock(Context.class); + mockFlutterPluginBinding = mock(FlutterPluginBinding.class); + doReturn(mockContext).when(mockFlutterPluginBinding).getApplicationContext(); + } + + @Test + public void loadAd() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 1, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + assertNotNull(testManager.adForId(0)); + assertEquals(bannerAd, testManager.adForId(0)); + assertEquals(0, testManager.adIdFor(bannerAd).intValue()); + } + + @Test + public void disposeAd_banner() { + FlutterBannerAd bannerAd = mock(FlutterBannerAd.class); + + testManager.trackAd(bannerAd, 2); + assertNotNull(testManager.adForId(2)); + assertNotNull(testManager.adIdFor(bannerAd)); + testManager.disposeAd(2); + verify(bannerAd).dispose(); + assertNull(testManager.adForId(2)); + assertNull(testManager.adIdFor(bannerAd)); + } + + @Test + public void disposeAd_adManagerBanner() { + FlutterAdManagerBannerAd adManagerBannerAd = mock(FlutterAdManagerBannerAd.class); + + testManager.trackAd(adManagerBannerAd, 2); + assertNotNull(testManager.adForId(2)); + assertNotNull(testManager.adIdFor(adManagerBannerAd)); + testManager.disposeAd(2); + verify(adManagerBannerAd).dispose(); + assertNull(testManager.adForId(2)); + assertNull(testManager.adIdFor(adManagerBannerAd)); + } + + @Test + public void disposeAd_native() { + FlutterNativeAd flutterNativeAd = mock(FlutterNativeAd.class); + + testManager.trackAd(flutterNativeAd, 2); + assertNotNull(testManager.adForId(2)); + assertNotNull(testManager.adIdFor(flutterNativeAd)); + testManager.disposeAd(2); + verify(flutterNativeAd).dispose(); + assertNull(testManager.adForId(2)); + assertNull(testManager.adIdFor(flutterNativeAd)); + } + + @Test + public void flutterAdListener_onAdLoaded() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + AdError adError = mock(AdError.class); + doReturn(1).when(adError).getCode(); + doReturn("domain").when(adError).getDomain(); + doReturn("message").when(adError).getMessage(); + + Bundle credentials = new Bundle(); + credentials.putString("key", "value"); + + AdapterResponseInfo adapterInfo = mock(AdapterResponseInfo.class); + doReturn("adapter-class").when(adapterInfo).getAdapterClassName(); + doReturn(adError).when(adapterInfo).getAdError(); + doReturn(123L).when(adapterInfo).getLatencyMillis(); + doReturn(credentials).when(adapterInfo).getCredentials(); + doReturn("description").when(adapterInfo).toString(); + + AdapterResponseInfo adapterInfoWithNullError = mock(AdapterResponseInfo.class); + doReturn("adapter-class").when(adapterInfoWithNullError).getAdapterClassName(); + doReturn(null).when(adapterInfoWithNullError).getAdError(); + doReturn(123L).when(adapterInfoWithNullError).getLatencyMillis(); + doReturn(null).when(adapterInfoWithNullError).getCredentials(); + doReturn("description").when(adapterInfoWithNullError).toString(); + + List adapterResponses = new ArrayList<>(); + adapterResponses.add(adapterInfo); + adapterResponses.add(adapterInfoWithNullError); + + ResponseInfo responseInfo = mock(ResponseInfo.class); + doReturn("response-id").when(responseInfo).getResponseId(); + doReturn("class-name").when(responseInfo).getMediationAdapterClassName(); + doReturn(adapterResponses).when(responseInfo).getAdapterResponses(); + + testManager.onAdLoaded(0, responseInfo); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdLoaded")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + assertThat( + call.arguments, (Matcher) hasEntry("responseInfo", new FlutterResponseInfo(responseInfo))); + } + + @Test + public void flutterAdListener_onAdLoaded_responseInfoNull() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + testManager.onAdLoaded(0, null); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdLoaded")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + assertThat(call.arguments, (Matcher) hasEntry("responseInfo", null)); + } + + @Test + public void flutterAdListener_onAdFailedToLoad() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + testManager.onAdFailedToLoad(0, new FlutterAd.FlutterLoadAdError(1, "hi", "friend", null)); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdFailedToLoad")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + //noinspection rawtypes + assertThat( + call.arguments, + (Matcher) + hasEntry("loadAdError", new FlutterAd.FlutterLoadAdError(1, "hi", "friend", null))); + } + + @Test + public void flutterAdListener_onAppEvent() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + testManager.onAppEvent(0, "color", "red"); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAppEvent")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("name", "color")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("data", "red")); + } + + @Test + public void flutterAdListener_onAdOpened() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + testManager.onAdOpened(0); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdOpened")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + } + + @Test + public void flutterAdListener_onNativeAdClicked() { + final FlutterNativeAd nativeAd = + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(testManager) + .setAdUnitId("testId") + .setRequest(request) + .setAdFactory( + new GoogleMobileAdsPlugin.NativeAdFactory() { + @Override + public NativeAdView createNativeAd( + NativeAd nativeAd, Map customOptions) { + return null; + } + }) + .setId(0) + .build(); + testManager.trackAd(nativeAd, 0); + + testManager.onAdClicked(0); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdClicked")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + } + + @Test + public void flutterAdListener_onNativeAdImpression() { + final FlutterNativeAd nativeAd = + new FlutterNativeAd.Builder(ApplicationProvider.getApplicationContext()) + .setManager(testManager) + .setAdUnitId("testId") + .setRequest(request) + .setAdFactory( + new GoogleMobileAdsPlugin.NativeAdFactory() { + @Override + public NativeAdView createNativeAd( + NativeAd nativeAd, Map customOptions) { + return null; + } + }) + .setId(0) + .build(); + testManager.trackAd(nativeAd, 0); + + testManager.onAdImpression(0); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdImpression")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + } + + @Test + public void flutterAdListener_onAdClosed() { + final FlutterBannerAd bannerAd = + new FlutterBannerAd( + 0, + testManager, + "testId", + request, + new FlutterAdSize(1, 2), + mock(BannerAdCreator.class)); + testManager.trackAd(bannerAd, 0); + + testManager.onAdClosed(0); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onAdClosed")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + } + + @Test + public void flutterAdListener_onRewardedAdUserEarnedReward() { + FlutterAdLoader mockFlutterAdLoader = mock(FlutterAdLoader.class); + final FlutterRewardedAd ad = + new FlutterRewardedAd(0, testManager, "testId", request, mockFlutterAdLoader); + testManager.trackAd(ad, 0); + + testManager.onRewardedAdUserEarnedReward( + 0, new FlutterRewardedAd.FlutterRewardItem(23, "coins")); + + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("eventName", "onRewardedAdUserEarnedReward")); + //noinspection rawtypes + assertThat(call.arguments, (Matcher) hasEntry("adId", 0)); + //noinspection rawtypes + assertThat( + call.arguments, + (Matcher) hasEntry("rewardItem", new FlutterRewardedAd.FlutterRewardItem(23, "coins"))); + } + + @Test + public void internalInitDisposesAds() { + // Set up testManager so that two ads have already been loaded and tracked. + final FlutterRewardedAd rewarded = mock(FlutterRewardedAd.class); + final FlutterBannerAd banner = mock(FlutterBannerAd.class); + + testManager.trackAd(rewarded, 0); + testManager.trackAd(banner, 1); + + assertEquals(testManager.adIdFor(rewarded), (Integer) 0); + assertEquals(testManager.adIdFor(banner), (Integer) 1); + assertEquals(testManager.adForId(0), rewarded); + assertEquals(testManager.adForId(1), banner); + + // Check that ads are removed and disposed when "_init" is called. + AdInstanceManager testManagerSpy = spy(testManager); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin( + mockFlutterPluginBinding, testManagerSpy, new FlutterMobileAdsWrapper()); + Result result = mock(Result.class); + MethodCall methodCall = new MethodCall("_init", null); + plugin.onMethodCall(methodCall, result); + + verify(testManagerSpy).disposeAllAds(); + verify(result).success(null); + verify(rewarded).dispose(); + verify(banner).dispose(); + assertNull(testManager.adForId(0)); + assertNull(testManager.adForId(1)); + assertNull(testManager.adIdFor(rewarded)); + assertNull(testManager.adIdFor(banner)); + } + + @Test + public void initializeCallbackInvokedTwice() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + final InitializationStatus mockInitStatus = mock(InitializationStatus.class); + doAnswer( + new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + // Invoke init listener twice. + OnInitializationCompleteListener listener = invocation.getArgument(1); + listener.onInitializationComplete(mockInitStatus); + listener.onInitializationComplete(mockInitStatus); + return null; + } + }) + .when(mockMobileAds) + .initialize( + ArgumentMatchers.any(Context.class), + ArgumentMatchers.any(OnInitializationCompleteListener.class)); + + MethodCall methodCall = new MethodCall("MobileAds#initialize", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(ArgumentMatchers.any(FlutterInitializationStatus.class)); + } + + @Test + public void openAdInspector_error() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + doAnswer( + invocation -> { + OnAdInspectorClosedListener listener = invocation.getArgument(1); + final AdInspectorError error = mock(AdInspectorError.class); + doReturn(1).when(error).getCode(); + doReturn("domain").when(error).getDomain(); + doReturn("message").when(error).getMessage(); + listener.onAdInspectorClosed(error); + return null; + }) + .when(mockMobileAds) + .openAdInspector( + ArgumentMatchers.any(Context.class), + ArgumentMatchers.any(OnAdInspectorClosedListener.class)); + + MethodCall methodCall = new MethodCall("MobileAds#openAdInspector", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).error(eq("1"), eq("message"), eq("domain")); + } + + @Test + public void openAdInspector_success() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + doAnswer( + invocation -> { + OnAdInspectorClosedListener listener = invocation.getArgument(1); + listener.onAdInspectorClosed(null); + return null; + }) + .when(mockMobileAds) + .openAdInspector( + ArgumentMatchers.any(Context.class), + ArgumentMatchers.any(OnAdInspectorClosedListener.class)); + + MethodCall methodCall = new MethodCall("MobileAds#openAdInspector", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(null); + } + + @Test + public void registerWebView() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + MethodCall methodCall = + new MethodCall("MobileAds#registerWebView", Collections.singletonMap("webViewId", 1)); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(null); + } + + @Test + public void testPluginUsesActivityWhenAvailable() { + FlutterMobileAdsWrapper flutterMobileAdsWrapper = mock(FlutterMobileAdsWrapper.class); + BinaryMessenger mockBinaryMessenger = mock(BinaryMessenger.class); + doReturn(ApplicationProvider.getApplicationContext()) + .when(mockFlutterPluginBinding) + .getApplicationContext(); + doReturn(mockBinaryMessenger).when(mockFlutterPluginBinding).getBinaryMessenger(); + PlatformViewRegistry mockPlatformViewRegistry = mock(PlatformViewRegistry.class); + + doReturn(mockPlatformViewRegistry).when(mockFlutterPluginBinding).getPlatformViewRegistry(); + + GoogleMobileAdsPlugin plugin = new GoogleMobileAdsPlugin(null, null, flutterMobileAdsWrapper); + plugin.onAttachedToEngine(mockFlutterPluginBinding); + + MethodCall methodCall = new MethodCall("MobileAds#initialize", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + // Check that we use application context if activity is not available. + verify(flutterMobileAdsWrapper) + .initialize(eq(ApplicationProvider.getApplicationContext()), any()); + + // Activity should be used instead of application context + ActivityPluginBinding activityPluginBinding = mock(ActivityPluginBinding.class); + doReturn(mockActivity).when(activityPluginBinding).getActivity(); + plugin.onAttachedToActivity(activityPluginBinding); + + plugin.onMethodCall(methodCall, result); + + verify(flutterMobileAdsWrapper).initialize(eq(mockActivity), any()); + } + + @Test + public void testGetRequestConfiguration() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + RequestConfiguration.Builder rcb = new RequestConfiguration.Builder(); + rcb.setMaxAdContentRating(RequestConfiguration.MAX_AD_CONTENT_RATING_MA); + rcb.setTagForChildDirectedTreatment(RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE); + rcb.setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE); + rcb.setTestDeviceIds(new ArrayList(Arrays.asList("id1", "id2"))); + RequestConfiguration rc = rcb.build(); + doReturn(rc).when(mockMobileAds).getRequestConfiguration(); + + MethodCall methodCall = new MethodCall("MobileAds#getRequestConfiguration", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(rc); + } + + @Test(expected = IllegalArgumentException.class) + public void trackAdThrowsErrorForDuplicateId() { + final FlutterBannerAd banner = mock(FlutterBannerAd.class); + testManager.trackAd(banner, 0); + testManager.trackAd(banner, 0); + } + + @Test + public void testOnPaidEvent() { + final FlutterBannerAd banner = mock(FlutterBannerAd.class); + final FlutterAdValue flutterAdValue = new FlutterAdValue(1, "code", 1L); + testManager.trackAd(banner, 1); + testManager.onPaidEvent(banner, flutterAdValue); + final MethodCall call = getLastMethodCall(); + assertEquals("onAdEvent", call.method); + //noinspection rawtypes + Map args = (Map) call.arguments; + assertEquals(args.get("eventName"), "onPaidEvent"); + assertEquals(args.get("adId"), 1); + assertEquals(args.get("valueMicros"), 1L); + assertEquals(args.get("precision"), 1); + assertEquals(args.get("currencyCode"), "code"); + } + + @Test + public void testSetAppMuted() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + // Create a map for passing arguments to the MethodCall + HashMap trueArguments = new HashMap<>(); + trueArguments.put("muted", true); + + // Invoke the setAppMuted method with the arguments. + MethodCall methodCall = new MethodCall("MobileAds#setAppMuted", trueArguments); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + // Verify that mockMobileAds.setAppMuted() was called with the correct value. + verify(mockMobileAds).setAppMuted(eq(true)); + + // Create a map for passing arguments to the MethodCall + HashMap falseArguments = new HashMap<>(); + falseArguments.put("muted", false); + + // Invoke the setAppMuted method with the arguments. + MethodCall falseMethodCall = new MethodCall("MobileAds#setAppMuted", falseArguments); + Result falseResult = mock(Result.class); + plugin.onMethodCall(falseMethodCall, falseResult); + + // Verify that mockMobileAds.setAppMuted() was called with the correct value. + verify(mockMobileAds).setAppMuted(eq(false)); + } + + @Test + public void testSetAppVolume() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + // Create a map for passing arguments to the MethodCall. + HashMap fullVolumeArguments = new HashMap<>(); + fullVolumeArguments.put("volume", 1.0); + + // Invoke the setAppVolume method with the arguments. + MethodCall methodCall = new MethodCall("MobileAds#setAppVolume", fullVolumeArguments); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + // Verify that mockMobileAds.setAppVolume() was called with the correct value. + verify(mockMobileAds).setAppVolume(eq(1.0)); + } + + @Test + public void testDisableMediationInitialization() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + // Invoke the disableMediationInitialization method. + MethodCall methodCall = new MethodCall("MobileAds#disableMediationInitialization", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + Robolectric.flushForegroundThreadScheduler(); + // Verify that mockMobileAds.disableMediationInitialization() was called. + verify(mockMobileAds).disableMediationInitialization(ArgumentMatchers.any(Context.class)); + } + + @Test + public void testGetVersionString() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + // Stub getVersionString() to return a value. + doReturn("Test-SDK-Version").when(mockMobileAds).getVersionString(); + + // Invoke the getVersionString method. + MethodCall methodCall = new MethodCall("MobileAds#getVersionString", null); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + // Verify that mockMobileAds.getVersionString() was called and a value is returned. + verify(mockMobileAds).getVersionString(); + verify(result).success("Test-SDK-Version"); + } + + @Test + public void testOpenDebugMenu() { + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + MethodCall methodCall = + new MethodCall( + "MobileAds#openDebugMenu", Collections.singletonMap("adUnitId", "test-ad-unit")); + Result result = mock(Result.class); + + plugin.onMethodCall(methodCall, result); + + verify(mockMobileAds).openDebugMenu(eq(mockActivity), eq("test-ad-unit")); + verify(result).success(isNull()); + } + + @Test + public void testGetAnchoredAdaptiveBannerAdSize() { + // Setup mocks + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + + BinaryMessenger mockBinaryMessenger = mock(BinaryMessenger.class); + FlutterPluginBinding mockActivityPluginBinding = mock(FlutterPluginBinding.class); + PlatformViewRegistry mockPlatformViewRegistry = mock(PlatformViewRegistry.class); + + Context context = ApplicationProvider.getApplicationContext(); + + doReturn(context).when(mockActivityPluginBinding).getApplicationContext(); + doReturn(mockBinaryMessenger).when(mockActivityPluginBinding).getBinaryMessenger(); + doReturn(mockPlatformViewRegistry).when(mockActivityPluginBinding).getPlatformViewRegistry(); + + plugin.onAttachedToEngine(mockActivityPluginBinding); + + // Test for portrait Banner AdSize. + HashMap arguments = new HashMap<>(); + arguments.put("orientation", "portrait"); + arguments.put("width", 23); + + AdSize adSize = AdSize.getPortraitAnchoredAdaptiveBannerAdSize(context, 23); + MethodCall methodCall = new MethodCall("AdSize#getAnchoredAdaptiveBannerAdSize", arguments); + Result result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + + adSize = AdSize.getLargePortraitAnchoredAdaptiveBannerAdSize(context, 23); + methodCall = new MethodCall("AdSize#getLargeAnchoredAdaptiveBannerAdSize", arguments); + result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + + // Test for landscape Banner AdSize. + arguments = new HashMap<>(); + arguments.put("orientation", "landscape"); + arguments.put("width", 23); + + adSize = AdSize.getLandscapeAnchoredAdaptiveBannerAdSize(context, 23); + methodCall = new MethodCall("AdSize#getAnchoredAdaptiveBannerAdSize", arguments); + result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + + adSize = AdSize.getLargeLandscapeAnchoredAdaptiveBannerAdSize(context, 23); + methodCall = new MethodCall("AdSize#getLargeAnchoredAdaptiveBannerAdSize", arguments); + result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + + // Test for current orientation (inferred) Banner AdSize. + arguments = new HashMap<>(); + arguments.put("width", 23); + + adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, 23); + methodCall = new MethodCall("AdSize#getAnchoredAdaptiveBannerAdSize", arguments); + result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + + adSize = AdSize.getLargeAnchoredAdaptiveBannerAdSize(context, 23); + methodCall = new MethodCall("AdSize#getLargeAnchoredAdaptiveBannerAdSize", arguments); + result = mock(Result.class); + plugin.onMethodCall(methodCall, result); + + verify(result).success(adSize.getHeight()); + } + + public void testGetAdSize_bannerAd() { + // Setup mocks + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + BannerAdCreator bannerAdCreator = mock(BannerAdCreator.class); + AdView adView = mock(AdView.class); + doReturn(adView).when(bannerAdCreator).createAdView(); + doReturn(bannerAdCreator) + .when(pluginSpy) + .getBannerAdCreator(ArgumentMatchers.any(Context.class)); + + // Load a banner ad + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + loadArgs.put("adUnitId", "test-ad-unit"); + loadArgs.put("request", new FlutterAdRequest.Builder().build()); + loadArgs.put("size", new FlutterAdSize(1, 2)); + + MethodCall loadBannerMethodCall = new MethodCall("loadBannerAd", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(loadBannerMethodCall, result); + verify(result).success(null); + + // Mock response for adView.getAdSize(); + AdSize adSize = mock(AdSize.class); + doReturn(adSize).when(adView).getAdSize(); + + // Method call for getAdSize. + Result getAdSizeResult = mock(Result.class); + Map getAdSizeArgs = Collections.singletonMap("adId", (Object) 1); + MethodCall getAdSizeMethodCall = new MethodCall("getAdSize", getAdSizeArgs); + pluginSpy.onMethodCall(getAdSizeMethodCall, getAdSizeResult); + + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(FlutterAdSize.class); + verify(getAdSizeResult).success(argumentCaptor.capture()); + assertEquals(argumentCaptor.getValue().getAdSize(), adSize); + } + + @Test + public void testGetAdSize_adManagerBannerAd() { + // Setup mocks + AdInstanceManager testManagerSpy = spy(testManager); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, testManagerSpy, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + BannerAdCreator bannerAdCreator = mock(BannerAdCreator.class); + AdManagerAdView adView = mock(AdManagerAdView.class); + doReturn(adView).when(bannerAdCreator).createAdManagerAdView(); + doReturn(bannerAdCreator) + .when(pluginSpy) + .getBannerAdCreator(ArgumentMatchers.any(Context.class)); + + // Load a banner ad + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + loadArgs.put("adUnitId", "test-ad-unit"); + loadArgs.put("request", new FlutterAdManagerAdRequest.Builder().build()); + loadArgs.put("sizes", Collections.singletonList(new FlutterAdSize(1, 2))); + + MethodCall loadBannerMethodCall = new MethodCall("loadAdManagerBannerAd", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(loadBannerMethodCall, result); + verify(result).success(null); + + // Mock response for adView.getAdSize(); + AdSize adSize = mock(AdSize.class); + doReturn(adSize).when(adView).getAdSize(); + + // Method call for getAdSize. + Result getAdSizeResult = mock(Result.class); + Map getAdSizeArgs = Collections.singletonMap("adId", (Object) 1); + MethodCall getAdSizeMethodCall = new MethodCall("getAdSize", getAdSizeArgs); + pluginSpy.onMethodCall(getAdSizeMethodCall, getAdSizeResult); + + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(FlutterAdSize.class); + verify(getAdSizeResult).success(argumentCaptor.capture()); + assertEquals(argumentCaptor.getValue().getAdSize(), adSize); + } + + @Test + public void testAppStateNotifyDetachFromEngine() { + AppStateNotifier notifier = mock(AppStateNotifier.class); + GoogleMobileAdsPlugin plugin = new GoogleMobileAdsPlugin(notifier); + plugin.onDetachedFromEngine(null); + verify(notifier).stop(); + } + + @Test + public void testServerSideVerificationOptions_rewardedAd() { + // Setup mocks + AdInstanceManager mockManager = mock(AdInstanceManager.class); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, mockManager, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + + // Pretend that a rewarded ad has already been loaded with id 1 + FlutterRewardedAd mockRewardedAd = mock(FlutterRewardedAd.class); + doReturn(mockRewardedAd).when(mockManager).adForId(1); + + // Make a ssv method call + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + FlutterServerSideVerificationOptions mockFlutterSsv = + mock(FlutterServerSideVerificationOptions.class); + loadArgs.put("serverSideVerificationOptions", mockFlutterSsv); + + // Successful call + MethodCall methodCall = new MethodCall("setServerSideVerificationOptions", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(methodCall, result); + + verify(mockRewardedAd).setServerSideVerificationOptions(eq(mockFlutterSsv)); + verify(result).success(null); + } + + @Test + public void testServerSideVerificationOptions_rewardedInterstitialAd() { + // Setup mocks + AdInstanceManager mockManager = mock(AdInstanceManager.class); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, mockManager, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + + // Pretend that a rewarded interstitial ad has already been loaded with id 1 + FlutterRewardedInterstitialAd mockAd = mock(FlutterRewardedInterstitialAd.class); + doReturn(mockAd).when(mockManager).adForId(1); + + // Make a ssv method call + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + FlutterServerSideVerificationOptions mockFlutterSsv = + mock(FlutterServerSideVerificationOptions.class); + loadArgs.put("serverSideVerificationOptions", mockFlutterSsv); + + // Successful call + MethodCall methodCall = new MethodCall("setServerSideVerificationOptions", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(methodCall, result); + + verify(mockAd).setServerSideVerificationOptions(eq(mockFlutterSsv)); + verify(result).success(null); + } + + @Test + public void testServerSideVerificationOptions_invalidAdId() { + // Setup mocks + AdInstanceManager mockManager = mock(AdInstanceManager.class); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, mockManager, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + + // AdId matches a banner ad instead of rewarded or rewarded interstitial + FlutterBannerAd mockAd = mock(FlutterBannerAd.class); + doReturn(mockAd).when(mockManager).adForId(1); + + // Make a ssv method call without any ads having loaded + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + FlutterServerSideVerificationOptions mockFlutterSsv = + mock(FlutterServerSideVerificationOptions.class); + loadArgs.put("serverSideVerificationOptions", mockFlutterSsv); + + // Successful call + MethodCall methodCall = new MethodCall("setServerSideVerificationOptions", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(methodCall, result); + + // result.success() still invoked, resulting in no-op + verifyNoInteractions(mockAd); + verify(result).success(null); + } + + @Test + public void testServerSideVerificationOptions_invalidAdType() { + // Setup mocks + AdInstanceManager mockManager = mock(AdInstanceManager.class); + FlutterMobileAdsWrapper mockMobileAds = mock(FlutterMobileAdsWrapper.class); + GoogleMobileAdsPlugin plugin = + new GoogleMobileAdsPlugin(mockFlutterPluginBinding, mockManager, mockMobileAds); + GoogleMobileAdsPlugin pluginSpy = spy(plugin); + + // Make a ssv method call without any ads having loaded + Map loadArgs = new HashMap<>(); + loadArgs.put("adId", 1); + FlutterServerSideVerificationOptions mockFlutterSsv = + mock(FlutterServerSideVerificationOptions.class); + loadArgs.put("serverSideVerificationOptions", mockFlutterSsv); + + // Successful call + MethodCall methodCall = new MethodCall("setServerSideVerificationOptions", loadArgs); + Result result = mock(Result.class); + pluginSpy.onMethodCall(methodCall, result); + + // result.success() still invoked, resulting in no-op + verify(result).success(null); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyleTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyleTest.java new file mode 100644 index 00000000..e14929ef --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateFontStyleTest.java @@ -0,0 +1,40 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterNativeTemplateFontStyle}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterNativeTemplateFontStyleTest { + + @Test + public void testFromIntValue() { + for (int i = 0; i < FlutterNativeTemplateFontStyle.values().length; i++) { + FlutterNativeTemplateFontStyle style = FlutterNativeTemplateFontStyle.fromIntValue(i); + assertEquals(style, FlutterNativeTemplateFontStyle.values()[i]); + } + } + + @Test + public void testFromIntValue_unknownValue() { + FlutterNativeTemplateFontStyle type = FlutterNativeTemplateFontStyle.fromIntValue(-1); + assertEquals(type, FlutterNativeTemplateFontStyle.NORMAL); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyleTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyleTest.java new file mode 100644 index 00000000..b0826c58 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateStyleTest.java @@ -0,0 +1,215 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import com.google.android.ads.nativetemplates.NativeTemplateStyle; +import com.google.android.ads.nativetemplates.TemplateView; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterNativeTemplateStyle}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterNativeTemplateStyleTest { + + private Context mockContext = mock(Context.class); + private LayoutInflater mockLayoutInflater = mock(LayoutInflater.class); + private TemplateView mockTemplateView = mock(TemplateView.class); + + @Before + public void setup() { + doReturn(mockLayoutInflater) + .when(mockContext) + .getSystemService(eq(Context.LAYOUT_INFLATER_SERVICE)); + doReturn(mockTemplateView).when(mockLayoutInflater).inflate(anyInt(), isNull()); + } + + @Test + public void testAsTemplateView_noStylesDefined() { + FlutterNativeTemplateStyle flutterNativeTemplateStyle = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.MEDIUM, null, null, null, null, null); + + FlutterNativeTemplateStyle spy = spy(flutterNativeTemplateStyle); + NativeTemplateStyle mockNativeTemplateStyle = mock(NativeTemplateStyle.class); + doReturn(mockNativeTemplateStyle).when(spy).asNativeTemplateStyle(); + + TemplateView templateView = spy.asTemplateView(mockContext); + + verify(mockLayoutInflater).inflate(eq(FlutterNativeTemplateType.MEDIUM.resourceId()), isNull()); + verify(mockTemplateView).setStyles(eq(mockNativeTemplateStyle)); + assertEquals(templateView, mockTemplateView); + } + + @Test + public void testAsTemplateView_stylesDefined() { + ColorDrawable mainBackgroundColor = new ColorDrawable(Color.argb(1, 2, 3, 4)); + FlutterNativeTemplateTextStyle ctaStyle = mock(FlutterNativeTemplateTextStyle.class); + FlutterNativeTemplateTextStyle primaryStyle = mock(FlutterNativeTemplateTextStyle.class); + FlutterNativeTemplateTextStyle secondaryStyle = mock(FlutterNativeTemplateTextStyle.class); + FlutterNativeTemplateTextStyle tertiaryStyle = mock(FlutterNativeTemplateTextStyle.class); + + FlutterNativeTemplateStyle flutterNativeTemplateStyle = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.SMALL, + mainBackgroundColor, + ctaStyle, + primaryStyle, + secondaryStyle, + tertiaryStyle); + + FlutterNativeTemplateStyle spy = spy(flutterNativeTemplateStyle); + NativeTemplateStyle mockNativeTemplateStyle = mock(NativeTemplateStyle.class); + doReturn(mockNativeTemplateStyle).when(spy).asNativeTemplateStyle(); + + TemplateView templateView = spy.asTemplateView(mockContext); + + verify(mockLayoutInflater).inflate(eq(FlutterNativeTemplateType.SMALL.resourceId()), isNull()); + verify(mockTemplateView).setStyles(eq(mockNativeTemplateStyle)); + assertEquals(templateView, mockTemplateView); + } + + @Test + public void testAsNativeTemplateStyle_noStylesDefined() { + FlutterNativeTemplateStyle flutterNativeTemplateStyle = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.MEDIUM, null, null, null, null, null); + + NativeTemplateStyle templateStyle = flutterNativeTemplateStyle.asNativeTemplateStyle(); + + // Values should match that of an empty template style with the same type + NativeTemplateStyle defaultStyle = new NativeTemplateStyle.Builder().build(); + assertEquals(templateStyle.getMainBackgroundColor(), defaultStyle.getMainBackgroundColor()); + assertEquals( + templateStyle.getCallToActionBackgroundColor(), + defaultStyle.getCallToActionBackgroundColor()); + assertEquals( + templateStyle.getCallToActionTextSize(), defaultStyle.getCallToActionTextSize(), 0); + assertEquals( + templateStyle.getCallToActionTextTypeface(), defaultStyle.getCallToActionTextTypeface()); + assertEquals( + templateStyle.getCallToActionTypefaceColor(), defaultStyle.getCallToActionTypefaceColor()); + assertEquals( + templateStyle.getPrimaryTextBackgroundColor(), + defaultStyle.getPrimaryTextBackgroundColor()); + assertEquals(templateStyle.getPrimaryTextSize(), defaultStyle.getPrimaryTextSize(), 0); + assertEquals(templateStyle.getPrimaryTextTypeface(), defaultStyle.getPrimaryTextTypeface()); + assertEquals( + templateStyle.getPrimaryTextTypefaceColor(), defaultStyle.getPrimaryTextTypefaceColor()); + assertEquals( + templateStyle.getSecondaryTextBackgroundColor(), + defaultStyle.getSecondaryTextBackgroundColor()); + assertEquals(templateStyle.getSecondaryTextSize(), defaultStyle.getSecondaryTextSize(), 0); + assertEquals(templateStyle.getSecondaryTextTypeface(), defaultStyle.getSecondaryTextTypeface()); + assertEquals( + templateStyle.getSecondaryTextTypefaceColor(), + defaultStyle.getSecondaryTextTypefaceColor()); + assertEquals( + templateStyle.getTertiaryTextBackgroundColor(), + defaultStyle.getTertiaryTextBackgroundColor()); + assertEquals(templateStyle.getTertiaryTextSize(), defaultStyle.getTertiaryTextSize(), 0); + assertEquals(templateStyle.getTertiaryTextTypeface(), defaultStyle.getTertiaryTextTypeface()); + assertEquals( + templateStyle.getTertiaryTextTypefaceColor(), defaultStyle.getTertiaryTextTypefaceColor()); + } + + @Test + public void testAsNativeTemplateStyle_stylesDefined() { + ColorDrawable mainBackgroundColor = new ColorDrawable(Color.argb(1, 2, 3, 4)); + FlutterNativeTemplateTextStyle ctaStyle = mock(FlutterNativeTemplateTextStyle.class); + doReturn(new ColorDrawable(Color.MAGENTA)).when(ctaStyle).getBackgroundColor(); + doReturn(new ColorDrawable(Color.LTGRAY)).when(ctaStyle).getTextColor(); + doReturn(null).when(ctaStyle).getFontStyle(); + doReturn(100f).when(ctaStyle).getSize(); + + FlutterNativeTemplateTextStyle primaryStyle = mock(FlutterNativeTemplateTextStyle.class); + doReturn(new ColorDrawable(Color.BLUE)).when(primaryStyle).getBackgroundColor(); + doReturn(new ColorDrawable(Color.GREEN)).when(primaryStyle).getTextColor(); + FlutterNativeTemplateFontStyle mockPrimaryFontStyle = + mock(FlutterNativeTemplateFontStyle.class); + Typeface mockPrimaryTypeface = mock(Typeface.class); + doReturn(mockPrimaryTypeface).when(mockPrimaryFontStyle).getTypeface(); + doReturn(mockPrimaryFontStyle).when(primaryStyle).getFontStyle(); + doReturn(200f).when(primaryStyle).getSize(); + + FlutterNativeTemplateTextStyle secondaryStyle = mock(FlutterNativeTemplateTextStyle.class); + doReturn(new ColorDrawable(Color.BLACK)).when(secondaryStyle).getBackgroundColor(); + doReturn(new ColorDrawable(Color.RED)).when(secondaryStyle).getTextColor(); + FlutterNativeTemplateFontStyle mockSecondaryFontStyle = + mock(FlutterNativeTemplateFontStyle.class); + Typeface mockSecondaryTypeface = mock(Typeface.class); + doReturn(mockSecondaryTypeface).when(mockSecondaryFontStyle).getTypeface(); + doReturn(mockSecondaryFontStyle).when(secondaryStyle).getFontStyle(); + doReturn(300f).when(secondaryStyle).getSize(); + + FlutterNativeTemplateTextStyle tertiaryStyle = mock(FlutterNativeTemplateTextStyle.class); + doReturn(new ColorDrawable(Color.TRANSPARENT)).when(tertiaryStyle).getBackgroundColor(); + doReturn(new ColorDrawable(Color.DKGRAY)).when(tertiaryStyle).getTextColor(); + FlutterNativeTemplateFontStyle mockTertiaryFontStyle = + mock(FlutterNativeTemplateFontStyle.class); + Typeface mockTertiaryTypeface = mock(Typeface.class); + doReturn(mockTertiaryTypeface).when(mockTertiaryFontStyle).getTypeface(); + doReturn(mockTertiaryFontStyle).when(tertiaryStyle).getFontStyle(); + doReturn(1000f).when(tertiaryStyle).getSize(); + + FlutterNativeTemplateStyle flutterNativeTemplateStyle = + new FlutterNativeTemplateStyle( + FlutterNativeTemplateType.SMALL, + mainBackgroundColor, + ctaStyle, + primaryStyle, + secondaryStyle, + tertiaryStyle); + + NativeTemplateStyle templateStyle = flutterNativeTemplateStyle.asNativeTemplateStyle(); + + assertEquals(templateStyle.getMainBackgroundColor(), mainBackgroundColor); + assertEquals(templateStyle.getCallToActionBackgroundColor().getColor(), Color.MAGENTA); + assertEquals(templateStyle.getCallToActionTypefaceColor(), (Integer) Color.LTGRAY); + assertEquals(templateStyle.getCallToActionTextSize(), 100f, 0); + assertNull(templateStyle.getCallToActionTextTypeface()); + + assertEquals(templateStyle.getPrimaryTextBackgroundColor().getColor(), Color.BLUE); + assertEquals(templateStyle.getPrimaryTextTypefaceColor(), (Integer) Color.GREEN); + assertEquals(templateStyle.getPrimaryTextSize(), 200f, 0); + assertEquals(templateStyle.getPrimaryTextTypeface(), mockPrimaryTypeface); + + assertEquals(templateStyle.getSecondaryTextBackgroundColor().getColor(), Color.BLACK); + assertEquals(templateStyle.getSecondaryTextTypefaceColor(), (Integer) Color.RED); + assertEquals(templateStyle.getSecondaryTextSize(), 300f, 0); + assertEquals(templateStyle.getSecondaryTextTypeface(), mockSecondaryTypeface); + + assertEquals(templateStyle.getTertiaryTextBackgroundColor().getColor(), Color.TRANSPARENT); + assertEquals(templateStyle.getTertiaryTextTypefaceColor(), (Integer) Color.DKGRAY); + assertEquals(templateStyle.getTertiaryTextSize(), 1000f, 0); + assertEquals(templateStyle.getTertiaryTextTypeface(), mockTertiaryTypeface); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyleTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyleTest.java new file mode 100644 index 00000000..a73151c7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTextStyleTest.java @@ -0,0 +1,42 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import android.graphics.drawable.ColorDrawable; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterNativeTemplateTextStyle}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterNativeTemplateTextStyleTest { + + @Test + public void testGetters() { + ColorDrawable textColor = mock(ColorDrawable.class); + ColorDrawable backgroundColor = mock(ColorDrawable.class); + FlutterNativeTemplateFontStyle fontStyle = mock(FlutterNativeTemplateFontStyle.class); + Double size = 1.; + FlutterNativeTemplateTextStyle style = + new FlutterNativeTemplateTextStyle(textColor, backgroundColor, fontStyle, size); + assertEquals(style.getTextColor(), textColor); + assertEquals(style.getBackgroundColor(), backgroundColor); + assertEquals(style.getFontStyle(), fontStyle); + assertEquals(style.getSize(), 1f, 0); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTypeTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTypeTest.java new file mode 100644 index 00000000..ed04e6d8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/nativetemplates/FlutterNativeTemplateTypeTest.java @@ -0,0 +1,40 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.nativetemplates; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link FlutterNativeTemplateType}. */ +@RunWith(RobolectricTestRunner.class) +public class FlutterNativeTemplateTypeTest { + + @Test + public void testFromIntValue() { + for (int i = 0; i < FlutterNativeTemplateType.values().length; i++) { + FlutterNativeTemplateType type = FlutterNativeTemplateType.fromIntValue(i); + assertEquals(type, FlutterNativeTemplateType.values()[i]); + } + } + + @Test + public void testFromIntValue_unknownValue() { + FlutterNativeTemplateType type = FlutterNativeTemplateType.fromIntValue(-1); + assertEquals(type, FlutterNativeTemplateType.MEDIUM); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodecTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodecTest.java new file mode 100644 index 00000000..ad6e1c75 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingCodecTest.java @@ -0,0 +1,146 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; + +import com.google.android.ump.ConsentForm; +import com.google.android.ump.FormError; +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link UserMessagingCodec}. */ +@RunWith(RobolectricTestRunner.class) +public class UserMessagingCodecTest { + + private UserMessagingCodec codec; + + @Before + public void setup() { + codec = new UserMessagingCodec(); + } + + @Test + public void testConsentRequestParameters_null() { + ConsentRequestParametersWrapper params = new ConsentRequestParametersWrapper(null, null); + final ByteBuffer message = codec.encodeMessage(params); + ConsentRequestParametersWrapper decoded = + (ConsentRequestParametersWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(params, decoded); + } + + @Test + public void testConsentRequestParameters_tfuacNull_debugSettingsDefined() { + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(null, null); + ConsentRequestParametersWrapper params = + new ConsentRequestParametersWrapper(null, debugSettings); + final ByteBuffer message = codec.encodeMessage(params); + ConsentRequestParametersWrapper decoded = + (ConsentRequestParametersWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(params, decoded); + } + + @Test + public void testConsentRequestParameters_tfuacDefined_debugSettingsNull() { + ConsentRequestParametersWrapper params = new ConsentRequestParametersWrapper(true, null); + final ByteBuffer message = codec.encodeMessage(params); + ConsentRequestParametersWrapper decoded = + (ConsentRequestParametersWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(params, decoded); + } + + @Test + public void testConsentRequestParameters_tfuacDefined_debugSettingsDefined() { + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(null, null); + ConsentRequestParametersWrapper params = + new ConsentRequestParametersWrapper(true, debugSettings); + final ByteBuffer message = codec.encodeMessage(params); + ConsentRequestParametersWrapper decoded = + (ConsentRequestParametersWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(params, decoded); + } + + @Test + public void testConsentDebugSettings_null() { + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(null, null); + final ByteBuffer message = codec.encodeMessage(debugSettings); + ConsentDebugSettingsWrapper decoded = + (ConsentDebugSettingsWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(debugSettings, decoded); + } + + @Test + public void testConsentDebugSettings_debugGeographyDefined_testIdsNull() { + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(1, null); + final ByteBuffer message = codec.encodeMessage(debugSettings); + ConsentDebugSettingsWrapper decoded = + (ConsentDebugSettingsWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(debugSettings, decoded); + } + + @Test + public void testConsentDebugSettings_debugGeographyNull_testIdsDefined() { + List testIds = Collections.singletonList("first"); + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(null, testIds); + final ByteBuffer message = codec.encodeMessage(debugSettings); + ConsentDebugSettingsWrapper decoded = + (ConsentDebugSettingsWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(debugSettings, decoded); + } + + @Test + public void testConsentDebugSettings_debugGeographyDefined_testIdsDefined() { + List testIds = Collections.singletonList("first"); + ConsentDebugSettingsWrapper debugSettings = new ConsentDebugSettingsWrapper(4, testIds); + final ByteBuffer message = codec.encodeMessage(debugSettings); + ConsentDebugSettingsWrapper decoded = + (ConsentDebugSettingsWrapper) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(debugSettings, decoded); + } + + @Test + public void testConsentForm() { + ConsentForm form = mock(ConsentForm.class); + codec.trackConsentForm(form); + final ByteBuffer message = codec.encodeMessage(form); + + ConsentForm decoded = (ConsentForm) codec.decodeMessage((ByteBuffer) message.position(0)); + assertEquals(form, decoded); + + // Untrack consent form and verify that value is null + codec.disposeConsentForm(form); + decoded = (ConsentForm) codec.decodeMessage((ByteBuffer) message.position(0)); + assertNull(decoded); + } + + @Test + public void testFormError() { + FormError formError = new FormError(123, "testMessage"); + + final ByteBuffer message = codec.encodeMessage(formError); + FormError decoded = (FormError) codec.decodeMessage((ByteBuffer) message.position(0)); + + assert decoded != null; + assertEquals(formError.getErrorCode(), decoded.getErrorCode()); + assertEquals(formError.getMessage(), decoded.getMessage()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManagerTest.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManagerTest.java new file mode 100644 index 00000000..7c578248 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/android/src/test/java/io/flutter/plugins/googlemobileads/usermessagingplatform/UserMessagingPlatformManagerTest.java @@ -0,0 +1,364 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileads.usermessagingplatform; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import android.app.Activity; +import android.content.Context; +import androidx.test.core.app.ApplicationProvider; +import com.google.android.ump.ConsentForm; +import com.google.android.ump.ConsentForm.OnConsentFormDismissedListener; +import com.google.android.ump.ConsentInformation; +import com.google.android.ump.ConsentInformation.ConsentStatus; +import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateFailureListener; +import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateSuccessListener; +import com.google.android.ump.ConsentInformation.PrivacyOptionsRequirementStatus; +import com.google.android.ump.ConsentRequestParameters; +import com.google.android.ump.FormError; +import com.google.android.ump.UserMessagingPlatform; +import com.google.android.ump.UserMessagingPlatform.OnConsentFormLoadFailureListener; +import com.google.android.ump.UserMessagingPlatform.OnConsentFormLoadSuccessListener; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel.Result; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.robolectric.RobolectricTestRunner; + +/** Tests for {@link UserMessagingPlatformManager}. */ +@RunWith(RobolectricTestRunner.class) +public class UserMessagingPlatformManagerTest { + + private Context context; + private BinaryMessenger mockMessenger; + private UserMessagingPlatformManager manager; + private UserMessagingCodec userMessagingCodec; + private Activity activity; + + private MockedStatic mockedUmp; + private ConsentInformation mockConsentInformation; + + @Before + public void setup() { + userMessagingCodec = mock(UserMessagingCodec.class); + context = ApplicationProvider.getApplicationContext(); + mockMessenger = mock(BinaryMessenger.class); + manager = new UserMessagingPlatformManager(mockMessenger, context, userMessagingCodec); + activity = mock(Activity.class); + mockConsentInformation = mock(ConsentInformation.class); + mockedUmp = Mockito.mockStatic(UserMessagingPlatform.class); + mockedUmp + .when( + () -> { + UserMessagingPlatform.getConsentInformation(any()); + }) + .thenReturn(mockConsentInformation); + } + + @After + public void tearDown() { + mockedUmp.close(); + } + + @Test + public void testConsentInformation_reset() { + Map args = Collections.emptyMap(); + MethodCall methodCall = new MethodCall("ConsentInformation#reset", args); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(mockConsentInformation).reset(); + verify(result).success(isNull()); + } + + @Test + public void testConsentInformation_getConsentStatus() { + doReturn(ConsentStatus.REQUIRED).when(mockConsentInformation).getConsentStatus(); + Map args = Collections.emptyMap(); + MethodCall methodCall = new MethodCall("ConsentInformation#getConsentStatus", args); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(ConsentStatus.REQUIRED)); + } + + @Test + public void testConsentInformation_requestConsentInfoUpdate_activityNotSet() { + manager.setActivity(null); + MethodCall methodCall = new MethodCall("ConsentInformation#requestConsentInfoUpdate", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result) + .error( + eq("0"), + eq( + "ConsentInformation#requestConsentInfoUpdate called before plugin has been " + + "registered to an activity."), + isNull()); + } + + @Test + public void testConsentInformation_requestConsentInfoUpdate_success() { + manager.setActivity(activity); + ConsentRequestParametersWrapper paramsWrapper = mock(ConsentRequestParametersWrapper.class); + ConsentRequestParameters params = mock(ConsentRequestParameters.class); + doReturn(params).when(paramsWrapper).getAsConsentRequestParameters(any()); + Map args = new HashMap<>(); + args.put("params", paramsWrapper); + MethodCall methodCall = new MethodCall("ConsentInformation#requestConsentInfoUpdate", args); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor successCaptor = + ArgumentCaptor.forClass(OnConsentInfoUpdateSuccessListener.class); + ArgumentCaptor errorCaptor = + ArgumentCaptor.forClass(OnConsentInfoUpdateFailureListener.class); + verify(mockConsentInformation) + .requestConsentInfoUpdate( + eq(activity), eq(params), successCaptor.capture(), errorCaptor.capture()); + + successCaptor.getValue().onConsentInfoUpdateSuccess(); + verify(result).success(isNull()); + + FormError formError = mock(FormError.class); + doReturn(1).when(formError).getErrorCode(); + doReturn("message").when(formError).getMessage(); + errorCaptor.getValue().onConsentInfoUpdateFailure(formError); + verify(result).error(eq("1"), eq("message"), isNull()); + } + + @Test + public void testConsentInformation_isConsentFormAvailable() { + doReturn(false).when(mockConsentInformation).isConsentFormAvailable(); + Map args = + Collections.singletonMap("consentInformation", mockConsentInformation); + MethodCall methodCall = new MethodCall("ConsentInformation#isConsentFormAvailable", args); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(false)); + } + + @Test + public void testConsentInformation_canRequestAds() { + doReturn(true).when(mockConsentInformation).canRequestAds(); + MethodCall methodCall = new MethodCall("ConsentInformation#canRequestAds", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(true)); + } + + @Test + public void testConsentInformation_getPrivacyOptionsRequirementStatus_notRequiredReturns0() { + doReturn(PrivacyOptionsRequirementStatus.NOT_REQUIRED) + .when(mockConsentInformation) + .getPrivacyOptionsRequirementStatus(); + MethodCall methodCall = + new MethodCall("ConsentInformation#getPrivacyOptionsRequirementStatus", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(0)); + } + + @Test + public void testConsentInformation_getPrivacyOptionsRequirementStatus_requiredReturns1() { + doReturn(PrivacyOptionsRequirementStatus.REQUIRED) + .when(mockConsentInformation) + .getPrivacyOptionsRequirementStatus(); + MethodCall methodCall = + new MethodCall("ConsentInformation#getPrivacyOptionsRequirementStatus", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(1)); + } + + @Test + public void testConsentInformation_getPrivacyOptionsRequirementStatus_requiredReturns2() { + doReturn(PrivacyOptionsRequirementStatus.UNKNOWN) + .when(mockConsentInformation) + .getPrivacyOptionsRequirementStatus(); + MethodCall methodCall = + new MethodCall("ConsentInformation#getPrivacyOptionsRequirementStatus", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + verify(result).success(eq(2)); + } + + @Test + public void testUserMessagingPlatform_loadConsentFormAndDispose() { + MethodCall methodCall = new MethodCall("UserMessagingPlatform#loadConsentForm", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor successCaptor = + ArgumentCaptor.forClass(OnConsentFormLoadSuccessListener.class); + ArgumentCaptor errorCaptor = + ArgumentCaptor.forClass(OnConsentFormLoadFailureListener.class); + mockedUmp.verify( + () -> + UserMessagingPlatform.loadConsentForm( + eq(context), successCaptor.capture(), errorCaptor.capture())); + + ConsentForm consentForm = mock(ConsentForm.class); + successCaptor.getValue().onConsentFormLoadSuccess(consentForm); + + verify(result).success(eq(consentForm)); + verify(userMessagingCodec).trackConsentForm(consentForm); + + FormError formError = mock(FormError.class); + errorCaptor.getValue().onConsentFormLoadFailure(formError); + + // Dispose + Map args = Collections.singletonMap("consentForm", consentForm); + methodCall = new MethodCall("ConsentForm#dispose", args); + manager.onMethodCall(methodCall, result); + + verify(userMessagingCodec).disposeConsentForm(consentForm); + verify(result).success(null); + } + + @Test + public void testUserMessagingPlatform_loadAndShowConsentFormIfRequired() { + manager.setActivity(activity); + MethodCall methodCall = + new MethodCall("UserMessagingPlatform#loadAndShowConsentFormIfRequired", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(OnConsentFormDismissedListener.class); + mockedUmp.verify( + () -> + UserMessagingPlatform.loadAndShowConsentFormIfRequired( + eq(activity), listenerCaptor.capture())); + listenerCaptor.getValue().onConsentFormDismissed(null); + verify(result).success(isNull()); + } + + @Test + public void testUserMessagingPlatform_loadAndShowConsentFormIfRequired_withFormError() { + manager.setActivity(activity); + FormError mockFormError = mock(FormError.class); + MethodCall methodCall = + new MethodCall("UserMessagingPlatform#loadAndShowConsentFormIfRequired", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(OnConsentFormDismissedListener.class); + mockedUmp.verify( + () -> + UserMessagingPlatform.loadAndShowConsentFormIfRequired( + eq(activity), listenerCaptor.capture())); + listenerCaptor.getValue().onConsentFormDismissed(mockFormError); + verify(result).success(mockFormError); + } + + @Test + public void testUserMessagingPlatform_showPrivacyOptionsForm() { + manager.setActivity(activity); + MethodCall methodCall = new MethodCall("UserMessagingPlatform#showPrivacyOptionsForm", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(OnConsentFormDismissedListener.class); + mockedUmp.verify( + () -> UserMessagingPlatform.showPrivacyOptionsForm(eq(activity), listenerCaptor.capture())); + listenerCaptor.getValue().onConsentFormDismissed(null); + verify(result).success(isNull()); + } + + @Test + public void testUserMessagingPlatform_showPrivacyOptionsForm_withFormError() { + manager.setActivity(activity); + FormError mockFormError = mock(FormError.class); + MethodCall methodCall = new MethodCall("UserMessagingPlatform#showPrivacyOptionsForm", null); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(OnConsentFormDismissedListener.class); + mockedUmp.verify( + () -> UserMessagingPlatform.showPrivacyOptionsForm(eq(activity), listenerCaptor.capture())); + listenerCaptor.getValue().onConsentFormDismissed(mockFormError); + verify(result).success(mockFormError); + } + + @Test + public void testConsentForm_show() { + manager.setActivity(activity); + ConsentForm consentForm = mock(ConsentForm.class); + Map args = Collections.singletonMap("consentForm", consentForm); + MethodCall methodCall = new MethodCall("ConsentForm#show", args); + Result result = mock(Result.class); + + manager.onMethodCall(methodCall, result); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(OnConsentFormDismissedListener.class); + verify(consentForm).show(eq(activity), listenerCaptor.capture()); + + listenerCaptor.getValue().onConsentFormDismissed(null); + verify(result).success(isNull()); + + FormError formError = mock(FormError.class); + doReturn(1).when(formError).getErrorCode(); + doReturn("message").when(formError).getMessage(); + listenerCaptor.getValue().onConsentFormDismissed(formError); + verify(result).error(eq("1"), eq("message"), isNull()); + } + + @Test + public void testConsentForm_show_errorNoConsentForm() { + MethodCall methodCall = new MethodCall("ConsentForm#show", null); + Result result = mock(Result.class); + manager.onMethodCall(methodCall, result); + verify(result).error(eq("0"), eq("ConsentForm#show"), isNull()); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/README.md b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/README.md new file mode 100644 index 00000000..f7ee7a40 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/README.md @@ -0,0 +1,8 @@ +# google_mobile_ads_example + +Demonstrates how to use the google_mobile_ads plugin. + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](http://flutter.io/). diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/analysis_options.yaml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/analysis_options.yaml new file mode 100644 index 00000000..9b541d2a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/analysis_options.yaml @@ -0,0 +1,15 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include: ../../../analysis_options.yaml diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/build.gradle b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/build.gradle new file mode 100644 index 00000000..c1b39b6a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/build.gradle @@ -0,0 +1,70 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + compileSdk 36 + + namespace 'io.flutter.plugins.googlemobileadsexample' + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "io.flutter.plugins.googlemobileadsexample" + minSdkVersion flutter.minSdkVersion + targetSdkVersion 34 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled true + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } + + compileOptions { + sourceCompatibility JavaLanguageVersion.of(17) + targetCompatibility JavaLanguageVersion.of(17) + } +} + +flutter { + source '../..' +} + +dependencies { + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.robolectric:robolectric:4.14.1' + testImplementation 'org.mockito:mockito-core:5.15.2' + androidTestImplementation 'org.robolectric:robolectric:4.10.3' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/AndroidManifest.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..d587c223 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/MainActivity.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/MainActivity.java new file mode 100644 index 00000000..59fc22db --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/MainActivity.java @@ -0,0 +1,34 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileadsexample; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin; +import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory; + +public class MainActivity extends FlutterActivity { + @Override + public void configureFlutterEngine(FlutterEngine flutterEngine) { + super.configureFlutterEngine(flutterEngine); + final NativeAdFactory factory = new NativeAdFactoryExample(getLayoutInflater()); + GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "adFactoryExample", factory); + } + + @Override + public void cleanUpFlutterEngine(FlutterEngine flutterEngine) { + GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "adFactoryExample"); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/NativeAdFactoryExample.java b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/NativeAdFactoryExample.java new file mode 100644 index 00000000..8047c5bd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/java/io/flutter/plugins/googlemobileadsexample/NativeAdFactoryExample.java @@ -0,0 +1,114 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io.flutter.plugins.googlemobileadsexample; + +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RatingBar; +import android.widget.TextView; +import com.google.android.gms.ads.nativead.MediaView; +import com.google.android.gms.ads.nativead.NativeAd; +import com.google.android.gms.ads.nativead.NativeAdView; +import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory; +import java.util.Map; + +class NativeAdFactoryExample implements NativeAdFactory { + private final LayoutInflater layoutInflater; + + NativeAdFactoryExample(LayoutInflater layoutInflater) { + this.layoutInflater = layoutInflater; + } + + @Override + public NativeAdView createNativeAd(NativeAd nativeAd, Map customOptions) { + final NativeAdView adView = (NativeAdView) layoutInflater.inflate(R.layout.my_native_ad, null); + + // Set the media view. + adView.setMediaView((MediaView) adView.findViewById(R.id.ad_media)); + + // Set other ad assets. + adView.setHeadlineView(adView.findViewById(R.id.ad_headline)); + adView.setBodyView(adView.findViewById(R.id.ad_body)); + adView.setCallToActionView(adView.findViewById(R.id.ad_call_to_action)); + adView.setIconView(adView.findViewById(R.id.ad_app_icon)); + adView.setPriceView(adView.findViewById(R.id.ad_price)); + adView.setStarRatingView(adView.findViewById(R.id.ad_stars)); + adView.setStoreView(adView.findViewById(R.id.ad_store)); + adView.setAdvertiserView(adView.findViewById(R.id.ad_advertiser)); + + // The headline and mediaContent are guaranteed to be in every NativeAd. + ((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline()); + adView.getMediaView().setMediaContent(nativeAd.getMediaContent()); + + // These assets aren't guaranteed to be in every NativeAd, so it's important to + // check before trying to display them. + if (nativeAd.getBody() == null) { + adView.getBodyView().setVisibility(View.INVISIBLE); + } else { + adView.getBodyView().setVisibility(View.VISIBLE); + ((TextView) adView.getBodyView()).setText(nativeAd.getBody()); + } + + if (nativeAd.getCallToAction() == null) { + adView.getCallToActionView().setVisibility(View.INVISIBLE); + } else { + adView.getCallToActionView().setVisibility(View.VISIBLE); + ((Button) adView.getCallToActionView()).setText(nativeAd.getCallToAction()); + } + + if (nativeAd.getIcon() == null) { + adView.getIconView().setVisibility(View.GONE); + } else { + ((ImageView) adView.getIconView()).setImageDrawable(nativeAd.getIcon().getDrawable()); + adView.getIconView().setVisibility(View.VISIBLE); + } + + if (nativeAd.getPrice() == null) { + adView.getPriceView().setVisibility(View.INVISIBLE); + } else { + adView.getPriceView().setVisibility(View.VISIBLE); + ((TextView) adView.getPriceView()).setText(nativeAd.getPrice()); + } + + if (nativeAd.getStore() == null) { + adView.getStoreView().setVisibility(View.INVISIBLE); + } else { + adView.getStoreView().setVisibility(View.VISIBLE); + ((TextView) adView.getStoreView()).setText(nativeAd.getStore()); + } + + if (nativeAd.getStarRating() == null) { + adView.getStarRatingView().setVisibility(View.INVISIBLE); + } else { + ((RatingBar) adView.getStarRatingView()).setRating(nativeAd.getStarRating().floatValue()); + adView.getStarRatingView().setVisibility(View.VISIBLE); + } + + if (nativeAd.getAdvertiser() == null) { + adView.getAdvertiserView().setVisibility(View.INVISIBLE); + } else { + adView.getAdvertiserView().setVisibility(View.VISIBLE); + ((TextView) adView.getAdvertiserView()).setText(nativeAd.getAdvertiser()); + } + + // This method tells the Google Mobile Ads SDK that you have finished populating your + // native ad view with this native ad. + adView.setNativeAd(nativeAd); + + return adView; + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/layout/my_native_ad.xml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/layout/my_native_ad.xml new file mode 100644 index 00000000..4dd1cef4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/android/app/src/main/res/layout/my_native_ad.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/main.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/main.m new file mode 100644 index 00000000..80af04fa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/Runner/main.m @@ -0,0 +1,24 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "AppDelegate.h" +#import +#import + +int main(int argc, char *argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdRequestTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdRequestTest.m new file mode 100644 index 00000000..89aa5c84 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdRequestTest.m @@ -0,0 +1,145 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAd_Internal.h" +#import "FLTMediationNetworkExtrasProvider.h" + +@interface FLTAdRequestTest : XCTestCase +@end + +@interface TestGADAdNetworkExtras : NSObject +@end + +@implementation TestGADAdNetworkExtras +@end + +@implementation FLTAdRequestTest + +- (void)testAsAdRequestAllParams { + // Proxy [GADRequest init] to return a partial mock of a real GADRequest. + GADRequest *gadRequestSpy = OCMPartialMock([GADRequest request]); + id gadRequestClassMock = OCMClassMock([GADRequest class]); + OCMStub([gadRequestClassMock request]).andReturn(gadRequestSpy); + + // Set values for all params. + FLTAdRequest *fltAdRequest = [[FLTAdRequest alloc] init]; + fltAdRequest.contentURL = @"contentURL"; + NSArray *keywords = @[ @"keyword1", @"keyword2" ]; + fltAdRequest.keywords = keywords; + fltAdRequest.nonPersonalizedAds = YES; + fltAdRequest.mediationExtrasIdentifier = @"identifier"; + NSArray *neighbors = @[ @"neighbor1", @"neighbor2" ]; + fltAdRequest.neighboringContentURLs = neighbors; + + // Mock FLTMediationNetworkExtrasProvider. + GADExtras *extras = [[GADExtras alloc] init]; + TestGADAdNetworkExtras *testExtras = [[TestGADAdNetworkExtras alloc] init]; + NSArray> *extrasArray = @[ extras, testExtras ]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + // Create a GADRequest and verify properties are set correctly. + GADRequest *gadRequest = [fltAdRequest asGADRequest:@"test-ad-unit"]; + + XCTAssertEqualObjects(gadRequest.contentURL, @"contentURL"); + XCTAssertEqualObjects(gadRequest.keywords, keywords); + XCTAssertEqualObjects(gadRequest.neighboringContentURLStrings, neighbors); + GADExtras *updatedExtras = [gadRequest adNetworkExtrasFor:[GADExtras class]]; + XCTAssertEqualObjects(updatedExtras, extras); + XCTAssertEqualObjects(updatedExtras.additionalParameters[@"npa"], @"1"); + OCMVerify( + [gadRequestSpy registerAdNetworkExtras:[OCMArg isEqual:testExtras]]); +} + +- (void)testAsAdRequestNoParams { + // Proxy [GADRequest init] to return a partial mock of a real GADRequest. + GADRequest *gadRequestSpy = OCMPartialMock([GADRequest request]); + id gadRequestClassMock = OCMClassMock([GADRequest class]); + OCMStub([gadRequestClassMock request]).andReturn(gadRequestSpy); + + // Create a GADRequest with no additional params. + FLTAdRequest *fltAdRequest = [[FLTAdRequest alloc] init]; + GADRequest *gadRequest = [fltAdRequest asGADRequest:@"test-ad-unit"]; + + // Verify parameters are empty or nil. + XCTAssertNil(gadRequest.contentURL); + XCTAssertNil(gadRequest.keywords); + XCTAssertNil(gadRequest.neighboringContentURLStrings); + XCTAssertNil([gadRequest adNetworkExtrasFor:[GADExtras class]]); +} + +- (void)testGADExtrasAddedWhenNpaSpecified { + // Proxy [GADRequest init] to return a partial mock of a real GADRequest. + GADRequest *gadRequestSpy = OCMPartialMock([GADRequest request]); + id gadRequestClassMock = OCMClassMock([GADRequest class]); + OCMStub([gadRequestClassMock request]).andReturn(gadRequestSpy); + + // Create a GADRequest with NPA set, and a FLTMediationNetworkExtrasProvider + // that returns an empty array. + FLTAdRequest *fltAdRequest = [[FLTAdRequest alloc] init]; + fltAdRequest.nonPersonalizedAds = YES; + fltAdRequest.mediationExtrasIdentifier = @"identifier"; + + NSArray> *extrasArray = @[]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + GADRequest *gadRequest = [fltAdRequest asGADRequest:@"test-ad-unit"]; + + // GADExtras should be added with npa = 1. + GADExtras *updatedExtras = [gadRequest adNetworkExtrasFor:[GADExtras class]]; + XCTAssertEqualObjects(updatedExtras.additionalParameters[@"npa"], @"1"); +} + +- (void)testGADExtrasWithoutNpa { + // Proxy [GADRequest init] to return a partial mock of a real GADRequest. + GADRequest *gadRequestSpy = OCMPartialMock([GADRequest request]); + id gadRequestClassMock = OCMClassMock([GADRequest class]); + OCMStub([gadRequestClassMock request]).andReturn(gadRequestSpy); + + // Extras should be added even if npa is not set. + FLTAdRequest *fltAdRequest = [[FLTAdRequest alloc] init]; + fltAdRequest.mediationExtrasIdentifier = @"identifier"; + + TestGADAdNetworkExtras *testExtras = [[TestGADAdNetworkExtras alloc] init]; + NSArray> *extrasArray = @[ testExtras ]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + GADRequest *gadRequest = [fltAdRequest asGADRequest:@"test-ad-unit"]; + + XCTAssertNil([gadRequest adNetworkExtrasFor:[GADExtras class]]); + OCMVerify( + [gadRequestSpy registerAdNetworkExtras:[OCMArg isEqual:testExtras]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdUtilTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdUtilTest.m new file mode 100644 index 00000000..77d8122e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAdUtilTest.m @@ -0,0 +1,97 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdUtil.h" +#import "FLTConstants.h" + +@interface FLTAdUtilTest : XCTestCase +@end + +@implementation FLTAdUtilTest { + NSBundle *_mockMainBundle; +} + +- (void)setUp { + id mockBundle = OCMClassMock([NSBundle class]); + OCMStub(ClassMethod([mockBundle mainBundle])).andReturn(mockBundle); + _mockMainBundle = mockBundle; +} + +- (void)testRequestAgent_noTemplateMetadata { + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTNewsTemplateVersion"]]) + .andReturn(nil); + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTGameTemplateVersion"]]) + .andReturn(nil); + XCTAssertEqualObjects([FLTAdUtil requestAgent], FLT_REQUEST_AGENT_VERSIONED); +} + +- (void)testRequestAgent_newsTemplateMetadata { + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTNewsTemplateVersion"]]) + .andReturn(@"v1.2.3"); + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTGameTemplateVersion"]]) + .andReturn(nil); + NSString *expected = [NSString + stringWithFormat:@"%@%@", FLT_REQUEST_AGENT_VERSIONED, @"_News-v1.2.3"]; + XCTAssertEqualObjects([FLTAdUtil requestAgent], expected); +} + +- (void)testRequestAgent_gameTemplateMetadata { + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTNewsTemplateVersion"]]) + .andReturn(nil); + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTGameTemplateVersion"]]) + .andReturn(@"123456"); + NSString *expected = [NSString + stringWithFormat:@"%@%@", FLT_REQUEST_AGENT_VERSIONED, @"_Game-123456"]; + XCTAssertEqualObjects([FLTAdUtil requestAgent], expected); +} + +- (void)testRequestAgent_gameAndNewsTemplateMetadata { + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTNewsTemplateVersion"]]) + .andReturn(@"123456"); + OCMStub( + [_mockMainBundle + objectForInfoDictionaryKey:[OCMArg + isEqual:@"FLTGameTemplateVersion"]]) + .andReturn(@"789z"); + NSString *expected = + [NSString stringWithFormat:@"%@%@%@", FLT_REQUEST_AGENT_VERSIONED, + @"_News-123456", @"_Game-789z"]; + XCTAssertEqualObjects([FLTAdUtil requestAgent], expected); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAppOpenAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAppOpenAdTest.m new file mode 100644 index 00000000..1122044e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTAppOpenAdTest.m @@ -0,0 +1,185 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTAppOpenAdTest : XCTestCase +@end + +@implementation FLTAppOpenAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadShowGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + + [self testLoadShowAppOpenAd:request gadOrGAMRequest:gadRequest]; +} + +- (void)testLoadShowGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + FLTServerSideVerificationOptions *serverSideVerificationOptions = + OCMClassMock([FLTServerSideVerificationOptions class]); + GADServerSideVerificationOptions *gadOptions = + OCMClassMock([GADServerSideVerificationOptions class]); + OCMStub([serverSideVerificationOptions asGADServerSideVerificationOptions]) + .andReturn(gadOptions); + + [self testLoadShowAppOpenAd:request gadOrGAMRequest:gamRequest]; +} + +// Helper method for testing with FLTAdRequest and FLTGAMAdRequest. +- (void)testLoadShowAppOpenAd:(FLTAdRequest *)request + gadOrGAMRequest:(GADRequest *)gadOrGAMRequest { + FLTAppOpenAd *ad = [[FLTAppOpenAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + // Stub the load call to invoke successful load callback. + id appOpenClassMock = OCMClassMock([GADAppOpenAd class]); + OCMStub(ClassMethod([appOpenClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADAppOpenAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(appOpenClassMock, nil); + }); + // Stub setting of FullScreenContentDelegate to invoke delegate callbacks. + NSError *error = OCMClassMock([NSError class]); + OCMStub([appOpenClassMock setFullScreenContentDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + id delegate; + [invocation getArgument:&delegate atIndex:2]; + XCTAssertEqual(delegate, ad); + [delegate adDidRecordImpression:appOpenClassMock]; + [delegate adDidRecordClick:appOpenClassMock]; + [delegate adDidDismissFullScreenContent:appOpenClassMock]; + [delegate adWillPresentFullScreenContent:appOpenClassMock]; + [delegate adWillDismissFullScreenContent:appOpenClassMock]; + [delegate ad:appOpenClassMock + didFailToPresentFullScreenContentWithError:error]; + }); + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([appOpenClassMock responseInfo]).andReturn(responseInfo); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([appOpenClassMock + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + // Call load and check expected interactions with mocks. + [ad load]; + + OCMVerify(ClassMethod([appOpenClassMock + loadWithAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadOrGAMRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:responseInfo]]); + OCMVerify( + [appOpenClassMock setFullScreenContentDelegate:[OCMArg isEqual:ad]]); + XCTAssertEqual(ad.appOpenAd, appOpenClassMock); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + [ad show]; + + OCMVerify([appOpenClassMock presentFromRootViewController:[OCMArg isNil]]); + + // Verify full screen callbacks. + OCMVerify([mockManager adWillPresentFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adWillDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordImpression:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + didFailToPresentFullScreenContentWithError:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +- (void)testFailedToLoadGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + [self testFailedToLoad:request]; +} + +- (void)testFailedToLoadGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + [self testFailedToLoad:request]; +} + +// Helper for testing failed to load. +- (void)testFailedToLoad:(FLTAdRequest *)request { + FLTAppOpenAd *ad = [[FLTAppOpenAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id appOpenClassMock = OCMClassMock([GADAppOpenAd class]); + NSError *error = OCMClassMock([NSError class]); + OCMStub(ClassMethod([appOpenClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADAppOpenAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(nil, error); + }); + + [ad load]; + + OCMVerify(ClassMethod([appOpenClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTBannerAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTBannerAdTest.m new file mode 100644 index 00000000..278875cd --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTBannerAdTest.m @@ -0,0 +1,126 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTBannerAdTest : XCTestCase +@end + +@implementation FLTBannerAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testDelegates { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTBannerAd *bannerAd = + [[FLTBannerAd alloc] initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:mockRootViewController + adId:@1]; + bannerAd.manager = mockManager; + + [bannerAd load]; + + XCTAssertEqual(bannerAd.bannerView.delegate, bannerAd); + + GADBannerView *bannerMock = OCMClassMock([GADBannerView class]); + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([bannerMock responseInfo]).andReturn(responseInfo); + + [bannerAd.bannerView.delegate bannerViewDidReceiveAd:bannerMock]; + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:bannerAd] + responseInfo:[OCMArg isEqual:responseInfo]]); + + [bannerAd.bannerView.delegate bannerViewDidDismissScreen:bannerMock]; + OCMVerify([mockManager onBannerDidDismissScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate bannerViewWillDismissScreen:bannerMock]; + OCMVerify([mockManager onBannerWillDismissScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate bannerViewWillPresentScreen:bannerMock]; + OCMVerify([mockManager onBannerWillPresentScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate bannerViewDidRecordImpression:bannerMock]; + OCMVerify([mockManager onBannerImpression:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate bannerViewDidRecordClick:bannerMock]; + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:bannerAd]]); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + + bannerAd.bannerView.paidEventHandler(adValue); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:bannerAd] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + NSString *domain = @"domain"; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:domain code:1 userInfo:userInfo]; + [bannerAd.bannerView.delegate bannerView:OCMClassMock([GADBannerView class]) + didFailToReceiveAdWithError:error]; + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:bannerAd] + error:[OCMArg isEqual:error]]); +} + +- (void)testLoad { + FLTAdRequest *request = [[FLTAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTBannerAd *ad = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:[[FLTAdSize alloc] initWithWidth:@(1) height:@(2)] + request:request + rootViewController:mockRootViewController + adId:@1]; + + XCTAssertEqual(ad.bannerView.adUnitID, @"testId"); + XCTAssertEqual(ad.bannerView.rootViewController, mockRootViewController); + + FLTBannerAd *mockBannerAd = OCMPartialMock(ad); + GADBannerView *mockView = OCMClassMock([GADBannerView class]); + OCMStub([mockBannerAd bannerView]).andReturn(mockView); + [mockBannerAd load]; + + OCMVerify([mockView loadRequest:[OCMArg checkWithBlock:^BOOL(id obj) { + GADRequest *requestArg = obj; + return + [requestArg.keywords isEqualToArray:@[ @"apple" ]]; + }]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTFluidGAMBannerAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTFluidGAMBannerAdTest.m new file mode 100644 index 00000000..5ca92fa9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTFluidGAMBannerAdTest.m @@ -0,0 +1,204 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTFluidGAMBannerAdTest : XCTestCase +@end + +@implementation FLTFluidGAMBannerAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testDelegates { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTFluidGAMBannerAd *fluidAd = [[FLTFluidGAMBannerAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTGAMAdRequest alloc] init] + rootViewController:mockRootViewController + adId:@1]; + fluidAd.manager = mockManager; + + [fluidAd load]; + GAMBannerView *adView = (GAMBannerView *)fluidAd.bannerView; + XCTAssertEqual(adView.appEventDelegate, fluidAd); + XCTAssertEqual(adView.delegate, fluidAd); + + [fluidAd.bannerView.delegate + bannerViewDidReceiveAd:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:fluidAd] + responseInfo:[OCMArg isEqual:adView.responseInfo]]); + + [fluidAd.bannerView.delegate + bannerViewDidDismissScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerDidDismissScreen:[OCMArg isEqual:fluidAd]]); + + [fluidAd.bannerView.delegate + bannerViewWillDismissScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerWillDismissScreen:[OCMArg isEqual:fluidAd]]); + + [fluidAd.bannerView.delegate + bannerViewWillPresentScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerWillPresentScreen:[OCMArg isEqual:fluidAd]]); + + [fluidAd.bannerView.delegate + bannerViewDidRecordImpression:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerImpression:[OCMArg isEqual:fluidAd]]); + + [fluidAd.bannerView.delegate + bannerViewDidRecordClick:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:fluidAd]]); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + + fluidAd.bannerView.paidEventHandler(adValue); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:fluidAd] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + NSString *domain = @"domain"; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:domain code:1 userInfo:userInfo]; + [fluidAd.bannerView.delegate bannerView:OCMClassMock([GADBannerView class]) + didFailToReceiveAdWithError:error]; + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:fluidAd] + error:[OCMArg isEqual:error]]); + + [adView.appEventDelegate adView:adView + didReceiveAppEvent:@"appEvent" + withInfo:@"info"]; + OCMVerify([mockManager onAppEvent:[OCMArg isEqual:fluidAd] + name:[OCMArg isEqual:@"appEvent"] + data:[OCMArg isEqual:@"info"]]); +} + +- (void)testPlatformViewSetup { + // Setup mocks + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + + id scrollViewClassMock = OCMClassMock([UIScrollView class]); + OCMStub([scrollViewClassMock alloc]).andReturn(scrollViewClassMock); + OCMStub([scrollViewClassMock initWithFrame:CGRectZero]) + .andReturn(scrollViewClassMock); + + id gamBannerClassMock = OCMClassMock([GAMBannerView class]); + OCMStub([gamBannerClassMock alloc]).andReturn(gamBannerClassMock); + OCMStub([gamBannerClassMock initWithAdSize:GADAdSizeFluid]) + .andReturn(gamBannerClassMock); + + // Create and load an ad. + FLTFluidGAMBannerAd *fluidAd = [[FLTFluidGAMBannerAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTGAMAdRequest alloc] init] + rootViewController:mockRootViewController + adId:@1]; + fluidAd.manager = mockManager; + + // Mimic successful loading of an ad. + [fluidAd load]; + [fluidAd.bannerView.delegate + bannerViewDidReceiveAd:OCMClassMock([GADBannerView class])]; + + // The banner view should be contained within a scrollview. + XCTAssertEqualObjects(fluidAd.view, scrollViewClassMock); + OCMVerify([(UIScrollView *)scrollViewClassMock + addSubview:[OCMArg isKindOfClass:GAMBannerView.class]]); + OCMVerify([(UIScrollView *)scrollViewClassMock + setShowsHorizontalScrollIndicator:NO]); + OCMVerify( + [(UIScrollView *)scrollViewClassMock setShowsVerticalScrollIndicator:NO]); + + [scrollViewClassMock stopMocking]; + [gamBannerClassMock stopMocking]; +} + +- (void)testSizeChangedEvent { + // Setup mocks + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + + // Create and load an ad. + FLTFluidGAMBannerAd *fluidAd = [[FLTFluidGAMBannerAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTGAMAdRequest alloc] init] + rootViewController:mockRootViewController + adId:@1]; + fluidAd.manager = mockManager; + + // Mimic successful loading of an ad. + [fluidAd load]; + [fluidAd.bannerView.delegate + bannerViewDidReceiveAd:OCMClassMock([GADBannerView class])]; + + [fluidAd.bannerView.adSizeDelegate + adView:fluidAd.bannerView + willChangeAdSizeTo:GADAdSizeFromCGSize(CGSizeMake(0, 25))]; + OCMVerify([mockManager onFluidAdHeightChanged:fluidAd height:25]); +} + +- (void)testLoad { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTFluidGAMBannerAd *ad = + [[FLTFluidGAMBannerAd alloc] initWithAdUnitId:@"testId" + request:request + rootViewController:mockRootViewController + adId:@1]; + + XCTAssertEqual(ad.bannerView.adUnitID, @"testId"); + XCTAssertEqual(ad.bannerView.rootViewController, mockRootViewController); + + FLTBannerAd *mockBannerAd = OCMPartialMock(ad); + GADBannerView *mockView = OCMClassMock([GADBannerView class]); + OCMStub([mockBannerAd bannerView]).andReturn(mockView); + [mockBannerAd load]; + + OCMVerify([mockView loadRequest:[OCMArg checkWithBlock:^BOOL(id obj) { + GADRequest *requestArg = obj; + return + [requestArg.keywords isEqualToArray:@[ @"apple" ]]; + }]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMAdRequestTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMAdRequestTest.m new file mode 100644 index 00000000..44b7a1c8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMAdRequestTest.m @@ -0,0 +1,152 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAd_Internal.h" +#import "FLTMediationNetworkExtrasProvider.h" + +@interface FLTGAMAdRequestTest : XCTestCase +@end + +@interface TestGAMAdNetworkExtras : NSObject +@end + +@implementation TestGAMAdNetworkExtras +@end + +@implementation FLTGAMAdRequestTest + +- (void)testAsAdRequestAllParams { + // Proxy [GAMRequest init] to return a partial mock of a real GAMRequest. + GAMRequest *gamRequestSpy = OCMPartialMock([GAMRequest request]); + id gamRequestClassMock = OCMClassMock([GAMRequest class]); + OCMStub([gamRequestClassMock request]).andReturn(gamRequestSpy); + + // Set values for all params. + FLTGAMAdRequest *fltGAMAdRequest = [[FLTGAMAdRequest alloc] init]; + fltGAMAdRequest.contentURL = @"contentURL"; + NSArray *keywords = @[ @"keyword1", @"keyword2" ]; + fltGAMAdRequest.keywords = keywords; + fltGAMAdRequest.nonPersonalizedAds = YES; + fltGAMAdRequest.mediationExtrasIdentifier = @"identifier"; + NSArray *neighbors = @[ @"neighbor1", @"neighbor2" ]; + fltGAMAdRequest.neighboringContentURLs = neighbors; + fltGAMAdRequest.customTargeting = @{@"key" : @"value"}; + fltGAMAdRequest.pubProvidedID = @"pubProvidedId"; + fltGAMAdRequest.customTargetingLists = @{@"key" : @[ @"value1", @"value2" ]}; + + // Mock FLTMediationNetworkExtrasProvider. + GADExtras *extras = [[GADExtras alloc] init]; + TestGAMAdNetworkExtras *testExtras = [[TestGAMAdNetworkExtras alloc] init]; + NSArray> *extrasArray = @[ extras, testExtras ]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltGAMAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + // Create a GAMRequest and verify properties are set correctly. + GAMRequest *gamRequest = [fltGAMAdRequest asGAMRequest:@"test-ad-unit"]; + + XCTAssertEqualObjects(gamRequest.contentURL, @"contentURL"); + XCTAssertEqualObjects(gamRequest.keywords, keywords); + XCTAssertEqualObjects(gamRequest.neighboringContentURLStrings, neighbors); + XCTAssertEqualObjects(gamRequest.customTargeting[@"key"], @"value1,value2"); + XCTAssertEqualObjects(gamRequest.publisherProvidedID, @"pubProvidedId"); + GADExtras *updatedExtras = [gamRequest adNetworkExtrasFor:[GADExtras class]]; + XCTAssertEqualObjects(updatedExtras, extras); + XCTAssertEqualObjects(updatedExtras.additionalParameters[@"npa"], @"1"); + OCMVerify( + [gamRequestSpy registerAdNetworkExtras:[OCMArg isEqual:testExtras]]); +} + +- (void)testAsAdRequestNoParams { + // Proxy [GAMRequest init] to return a partial mock of a real GAMRequest. + GAMRequest *gamRequestSpy = OCMPartialMock([GAMRequest request]); + id gamRequestClassMock = OCMClassMock([GAMRequest class]); + OCMStub([gamRequestClassMock request]).andReturn(gamRequestSpy); + + // Create a GAMRequest with no additional params. + FLTGAMAdRequest *fltGAMAdRequest = [[FLTGAMAdRequest alloc] init]; + GAMRequest *gamRequest = [fltGAMAdRequest asGAMRequest:@"test-ad-unit"]; + + // Verify parameters are empty or nil. + XCTAssertNil(gamRequest.contentURL); + XCTAssertNil(gamRequest.keywords); + XCTAssertNil(gamRequest.neighboringContentURLStrings); + XCTAssertNil([gamRequest adNetworkExtrasFor:[GADExtras class]]); + XCTAssertNil(gamRequest.publisherProvidedID); + XCTAssertTrue(gamRequest.customTargeting.count == 0); +} + +- (void)testGADExtrasAddedWhenNpaSpecified { + // Proxy [GAMRequest init] to return a partial mock of a real GAMRequest. + GAMRequest *gamRequestSpy = OCMPartialMock([GAMRequest request]); + id gamRequestClassMock = OCMClassMock([GAMRequest class]); + OCMStub([gamRequestClassMock request]).andReturn(gamRequestSpy); + + // Create a GAMRequest with NPA set, and a FLTMediationNetworkExtrasProvider + // that returns an empty array. + FLTGAMAdRequest *fltGAMAdRequest = [[FLTGAMAdRequest alloc] init]; + fltGAMAdRequest.nonPersonalizedAds = YES; + fltGAMAdRequest.mediationExtrasIdentifier = @"identifier"; + + NSArray> *extrasArray = @[]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltGAMAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + GAMRequest *gamRequest = [fltGAMAdRequest asGAMRequest:@"test-ad-unit"]; + + // GADExtras should be added with npa = 1. + GADExtras *updatedExtras = [gamRequest adNetworkExtrasFor:[GADExtras class]]; + XCTAssertEqualObjects(updatedExtras.additionalParameters[@"npa"], @"1"); +} + +- (void)testGADExtrasWithoutNpa { + // Proxy [GAMRequest init] to return a partial mock of a real GAMRequest. + GAMRequest *gamRequestSpy = OCMPartialMock([GAMRequest request]); + id gamRequestClassMock = OCMClassMock([GAMRequest class]); + OCMStub([gamRequestClassMock request]).andReturn(gamRequestSpy); + + // Extras should be added even if npa is not set. + FLTGAMAdRequest *fltGAMAdRequest = [[FLTGAMAdRequest alloc] init]; + fltGAMAdRequest.mediationExtrasIdentifier = @"identifier"; + + TestGAMAdNetworkExtras *testExtras = [[TestGAMAdNetworkExtras alloc] init]; + NSArray> *extrasArray = @[ testExtras ]; + id extrasProvider = + OCMProtocolMock(@protocol(FLTMediationNetworkExtrasProvider)); + OCMStub([extrasProvider getMediationExtras:[OCMArg isEqual:@"test-ad-unit"] + mediationExtrasIdentifier:@"identifier"]) + .andReturn(extrasArray); + + fltGAMAdRequest.mediationNetworkExtrasProvider = extrasProvider; + + GADRequest *gamRequest = [fltGAMAdRequest asGAMRequest:@"test-ad-unit"]; + + XCTAssertNil([gamRequest adNetworkExtrasFor:[GADExtras class]]); + OCMVerify( + [gamRequestSpy registerAdNetworkExtras:[OCMArg isEqual:testExtras]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMBannerAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMBannerAdTest.m new file mode 100644 index 00000000..1baf1f4c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGAMBannerAdTest.m @@ -0,0 +1,137 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTGAMBannerAdTest : XCTestCase +@end + +@implementation FLTGAMBannerAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testDelegates { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTGAMBannerAd *bannerAd = [[FLTGAMBannerAd alloc] + initWithAdUnitId:@"testId" + sizes:@[ [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)] ] + request:[[FLTGAMAdRequest alloc] init] + rootViewController:mockRootViewController + adId:@1]; + bannerAd.manager = mockManager; + + [bannerAd load]; + GAMBannerView *adView = (GAMBannerView *)bannerAd.bannerView; + XCTAssertEqual(adView.appEventDelegate, bannerAd); + XCTAssertEqual(adView.delegate, bannerAd); + + [bannerAd.bannerView.delegate + bannerViewDidReceiveAd:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:bannerAd] + responseInfo:[OCMArg isEqual:adView.responseInfo]]); + + [bannerAd.bannerView.delegate + bannerViewDidDismissScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerDidDismissScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate + bannerViewWillDismissScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerWillDismissScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate + bannerViewWillPresentScreen:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerWillPresentScreen:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate + bannerViewDidRecordImpression:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager onBannerImpression:[OCMArg isEqual:bannerAd]]); + + [bannerAd.bannerView.delegate + bannerViewDidRecordClick:OCMClassMock([GADBannerView class])]; + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:bannerAd]]); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + + bannerAd.bannerView.paidEventHandler(adValue); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:bannerAd] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + NSString *domain = @"domain"; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:domain code:1 userInfo:userInfo]; + [bannerAd.bannerView.delegate bannerView:OCMClassMock([GADBannerView class]) + didFailToReceiveAdWithError:error]; + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:bannerAd] + error:[OCMArg isEqual:error]]); + + [adView.appEventDelegate adView:adView + didReceiveAppEvent:@"appEvent" + withInfo:@"info"]; + OCMVerify([mockManager onAppEvent:[OCMArg isEqual:bannerAd] + name:[OCMArg isEqual:@"appEvent"] + data:[OCMArg isEqual:@"info"]]); +} + +- (void)testLoad { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + UIViewController *mockRootViewController = + OCMClassMock([UIViewController class]); + FLTGAMBannerAd *ad = [[FLTGAMBannerAd alloc] + initWithAdUnitId:@"testId" + sizes:@[ [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)] ] + request:request + rootViewController:mockRootViewController + adId:@1]; + + XCTAssertEqual(ad.bannerView.adUnitID, @"testId"); + XCTAssertEqual(ad.bannerView.rootViewController, mockRootViewController); + + FLTBannerAd *mockBannerAd = OCMPartialMock(ad); + GADBannerView *mockView = OCMClassMock([GADBannerView class]); + OCMStub([mockBannerAd bannerView]).andReturn(mockView); + [mockBannerAd load]; + + OCMVerify([mockView loadRequest:[OCMArg checkWithBlock:^BOOL(id obj) { + GADRequest *requestArg = obj; + return + [requestArg.keywords isEqualToArray:@[ @"apple" ]]; + }]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGamInterstitialAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGamInterstitialAdTest.m new file mode 100644 index 00000000..da46fba0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGamInterstitialAdTest.m @@ -0,0 +1,173 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTGAMInterstitialAdTest : XCTestCase +@end + +@implementation FLTGAMInterstitialAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadShowInterstitialAd { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gadRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gadRequest); + + FLTGAMInterstitialAd *ad = + [[FLTGAMInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id interstitialClassMock = OCMClassMock([GAMInterstitialAd class]); + OCMStub(ClassMethod([interstitialClassMock + loadWithAdManagerAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GAMInterstitialAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(interstitialClassMock, nil); + }); + NSError *error = OCMClassMock([NSError class]); + OCMStub([interstitialClassMock setFullScreenContentDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + id delegate; + [invocation getArgument:&delegate atIndex:2]; + XCTAssertEqual(delegate, ad); + [delegate adDidRecordImpression:interstitialClassMock]; + [delegate adDidRecordClick:interstitialClassMock]; + [delegate adDidDismissFullScreenContent:interstitialClassMock]; + [delegate adWillPresentFullScreenContent:interstitialClassMock]; + [delegate adWillDismissFullScreenContent:interstitialClassMock]; + [delegate ad:interstitialClassMock + didFailToPresentFullScreenContentWithError:error]; + }); + + OCMStub([interstitialClassMock setAppEventDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + id delegate; + [invocation getArgument:&delegate atIndex:2]; + XCTAssertEqual(delegate, ad); + [delegate interstitialAd:interstitialClassMock + didReceiveAppEvent:@"event" + withInfo:@"info"]; + }); + + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([interstitialClassMock responseInfo]).andReturn(responseInfo); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([interstitialClassMock + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + // Call load and verify interactions with mocks. + [ad load]; + + OCMVerify(ClassMethod([interstitialClassMock + loadWithAdManagerAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:responseInfo]]); + OCMVerify( + [interstitialClassMock setFullScreenContentDelegate:[OCMArg isEqual:ad]]); + XCTAssertEqual(ad.interstitial, interstitialClassMock); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + // Show the ad + [ad show]; + + OCMVerify( + [interstitialClassMock presentFromRootViewController:[OCMArg isNil]]); + + // Verify full screen callbacks. + OCMVerify([mockManager adWillPresentFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adWillDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordImpression:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + didFailToPresentFullScreenContentWithError:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); + + // Verify app event + OCMVerify([mockManager onAppEvent:ad + name:[OCMArg isEqual:@"event"] + data:[OCMArg isEqual:@"info"]]); +} + +- (void)testFailToLoad { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gadRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gadRequest); + + FLTGAMInterstitialAd *ad = + [[FLTGAMInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id interstitialClassMock = OCMClassMock([GAMInterstitialAd class]); + NSError *error = OCMClassMock([NSError class]); + OCMStub(ClassMethod([interstitialClassMock + loadWithAdManagerAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GAMInterstitialAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(nil, error); + }); + + [ad load]; + + OCMVerify(ClassMethod([interstitialClassMock + loadWithAdManagerAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsPluginMethodCallsTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsPluginMethodCallsTest.m new file mode 100644 index 00000000..ff7d8bde --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsPluginMethodCallsTest.m @@ -0,0 +1,712 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "google_mobile_ads/FLTAdInstanceManager_Internal.h" +#import "google_mobile_ads/FLTAdUtil.h" +#import "google_mobile_ads/FLTGoogleMobileAdsPlugin.h" +#import "google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h" +#import "google_mobile_ads/FLTMobileAds_Internal.h" + +@interface FLTGoogleMobileAdsPluginMethodCallsTest : XCTestCase +@end + +@interface FLTGoogleMobileAdsPlugin () +@property UIViewController *rootController; +@end + +@implementation FLTGoogleMobileAdsPluginMethodCallsTest { + FLTGoogleMobileAdsPlugin *_fltGoogleMobileAdsPlugin; + FLTAdInstanceManager *_mockAdInstanceManager; +} + +- (void)setUp { + id messenger = + OCMProtocolMock(@protocol(FlutterBinaryMessenger)); + FLTAdInstanceManager *manager = + [[FLTAdInstanceManager alloc] initWithBinaryMessenger:messenger]; + _mockAdInstanceManager = OCMPartialMock(manager); + _fltGoogleMobileAdsPlugin = [[FLTGoogleMobileAdsPlugin alloc] init]; + [_fltGoogleMobileAdsPlugin setValue:_mockAdInstanceManager + forKey:@"_manager"]; +} + +- (void)testDisposeAd { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"disposeAd" + arguments:@{@"adId" : @1}]; + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([_mockAdInstanceManager dispose:@1]); +} + +- (void)testLoadRewardedAd { + FLTAdRequest *request = [[FLTAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"loadRewardedAd" + arguments:@{ + @"adId" : @2, + @"adUnitId" : @"testId", + @"request" : request, + }]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + BOOL (^verificationBlock)(FLTRewardedAd *) = ^BOOL(FLTRewardedAd *ad) { + FLTAdRequest *adRequest = [ad valueForKey:@"_adRequest"]; + NSString *adUnit = [ad valueForKey:@"_adUnitId"]; + XCTAssertEqualObjects(adRequest, request); + XCTAssertEqualObjects(adUnit, @"testId"); + return YES; + }; + OCMVerify([_mockAdInstanceManager + loadAd:[OCMArg checkWithBlock:verificationBlock]]); +} + +- (void)testInternalInit { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"_init" arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([_mockAdInstanceManager disposeAllAds]); +} + +- (void)testMobileAdsInitialize { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + GADInitializationStatus *mockInitStatus = + OCMClassMock([GADInitializationStatus class]); + OCMStub([mockInitStatus adapterStatusesByClassName]).andReturn(@{}); + OCMStub([gadMobileAdsClassMock startWithCompletionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + // Invoke the init handler twice. + __unsafe_unretained GADInitializationCompletionHandler + completionHandler; + [invocation getArgument:&completionHandler atIndex:2]; + completionHandler(mockInitStatus); + completionHandler(mockInitStatus); + }); + + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#initialize" + arguments:@{}]; + __block int resultInvokedCount = 0; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvokedCount += 1; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + XCTAssertEqual(resultInvokedCount, 1); + XCTAssertEqual( + [((FLTInitializationStatus *)returnedResult) adapterStatuses].count, 0); +} + +- (void)testSetSameAppKeyEnabledYes { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + GADRequestConfiguration *gadRequestConfigurationMock = + OCMClassMock([GADRequestConfiguration class]); + OCMStub([gadMobileAdsClassMock requestConfiguration]) + .andReturn(gadRequestConfigurationMock); + + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#setSameAppKeyEnabled" + arguments:@{@"isEnabled" : @(YES)}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([gadRequestConfigurationMock + setPublisherFirstPartyIDEnabled:[OCMArg isEqual:@(YES)]]); +} + +- (void)testRegisterWebView { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + + WKWebView *mockWebView = OCMClassMock([WKWebView class]); + id fltAdUtilMock = OCMClassMock([FLTAdUtil class]); + OCMStub(ClassMethod([fltAdUtilMock getWebView:[OCMArg any] + flutterPluginRegistry:[OCMArg any]])) + .andReturn(mockWebView); + + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#registerWebView" + arguments:@{@"webViewId" : @(1)}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); +} + +- (void)testSetSameAppKeyEnabledNo { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + GADRequestConfiguration *gadRequestConfigurationMock = + OCMClassMock([GADRequestConfiguration class]); + OCMStub([gadMobileAdsClassMock requestConfiguration]) + .andReturn(gadRequestConfigurationMock); + + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#setSameAppKeyEnabled" + arguments:@{@"isEnabled" : @0}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([gadRequestConfigurationMock setPublisherFirstPartyIDEnabled:NO]); + + FlutterMethodCall *methodCallWithBool = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#setSameAppKeyEnabled" + arguments:@{@"isEnabled" : @NO}]; + + __block bool resultInvokedWithBool = false; + __block id _Nullable returnedResultWithBool; + FlutterResult resultWithBool = ^(id _Nullable result) { + resultInvokedWithBool = true; + returnedResultWithBool = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCallWithBool + result:resultWithBool]; + + XCTAssertTrue(resultInvokedWithBool); + XCTAssertNil(returnedResultWithBool); + OCMVerify([gadRequestConfigurationMock setPublisherFirstPartyIDEnabled:NO]); +} + +- (void)testSetAppMuted { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#setAppMuted" + arguments:@{@"muted" : @(YES)}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + NSTimeInterval timeout = 5.0; + NSDate *startTime = [NSDate date]; + while (!GADMobileAds.sharedInstance.applicationMuted && [[NSDate date] timeIntervalSinceDate:startTime] < timeout) { + [NSThread sleepForTimeInterval:0.1]; + } + XCTAssertTrue(GADMobileAds.sharedInstance.applicationMuted); + + methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#setAppMuted" + arguments:@{@"muted" : @(NO)}]; + + resultInvoked = false; + result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + startTime = [NSDate date]; + while (GADMobileAds.sharedInstance.applicationMuted && [[NSDate date] timeIntervalSinceDate:startTime] < timeout) { + [NSThread sleepForTimeInterval:0.1]; + } + XCTAssertFalse(GADMobileAds.sharedInstance.applicationMuted); +} + +- (void)testSetAppVolume { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#setAppVolume" + arguments:@{@"volume" : @1.0f}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + XCTAssertEqual(GADMobileAds.sharedInstance.applicationVolume, 1.0f); +} + +- (void)testDisableSDKCrashReporting { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#disableSDKCrashReporting" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([gadMobileAdsClassMock disableSDKCrashReporting]); +} + +- (void)testDisableMediationInitialization { + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#disableMediationInitialization" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([gadMobileAdsClassMock disableMediationInitialization]); +} + +- (void)testGetVersionString { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#getVersionString" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual( + returnedResult, + GADGetStringFromVersionNumber(GADMobileAds.sharedInstance.versionNumber)); +} + +- (void)testOpenDebugMenu { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#openDebugMenu" + arguments:@{@"adUnitId" : @"test-ad-unit"}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + FLTGoogleMobileAdsPlugin *mockPlugin = + OCMPartialMock(_fltGoogleMobileAdsPlugin); + UIViewController *mockUIViewController = OCMClassMock(UIViewController.class); + OCMStub([mockPlugin rootController]).andReturn(mockUIViewController); + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + OCMVerify([mockUIViewController + presentViewController:[OCMArg isKindOfClass:[GADDebugOptionsViewController + class]] + animated:[OCMArg any] + completion:[OCMArg isNil]]); + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, nil); +} + +- (void)testOpenAdInspectorSuccess { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#openAdInspector" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + + OCMStub([gadMobileAdsClassMock + presentAdInspectorFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained GADAdInspectorCompletionHandler completionHandler; + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(nil); + }); + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + OCMVerify([gadMobileAdsClassMock + presentAdInspectorFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, nil); +} + +- (void)testOpenAdInspectorError { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"MobileAds#openAdInspector" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + id gadMobileAdsClassMock = OCMClassMock([GADMobileAds class]); + OCMStub(ClassMethod([gadMobileAdsClassMock sharedInstance])) + .andReturn((GADMobileAds *)gadMobileAdsClassMock); + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey : @"message", + }; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + + OCMStub([gadMobileAdsClassMock + presentAdInspectorFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained GADAdInspectorCompletionHandler completionHandler; + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(error); + }); + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + OCMVerify([gadMobileAdsClassMock + presentAdInspectorFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); + XCTAssertTrue(resultInvoked); + FlutterError *resultError = (FlutterError *)returnedResult; + + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.message, @"message"); + XCTAssertEqualObjects(resultError.details, @"domain"); +} + +- (void)testGetRequestConfiguration { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"MobileAds#getRequestConfiguration" + arguments:@{}]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, + [GADMobileAds.sharedInstance requestConfiguration]); +} + +- (void)testGetAnchoredAdaptiveBannerAdSize { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"AdSize#getLargeAnchoredAdaptiveBannerAdSize" + arguments:@{ + @"orientation" : @"portrait", + @"width" : @23, + }]; + + __block bool resultInvoked = false; + __block id _Nullable returnedResult; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual( + [returnedResult doubleValue], + GADLargePortraitAnchoredAdaptiveBannerAdSizeWithWidth(23).size.height); + + methodCall = [FlutterMethodCall + methodCallWithMethodName:@"AdSize#getLargeAnchoredAdaptiveBannerAdSize" + arguments:@{ + @"orientation" : @"landscape", + @"width" : @34, + }]; + + resultInvoked = false; + result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual( + [returnedResult doubleValue], + GADLargeLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(34).size.height); + + methodCall = [FlutterMethodCall + methodCallWithMethodName:@"AdSize#getLargeAnchoredAdaptiveBannerAdSize" + arguments:@{ + @"width" : @45, + }]; + + resultInvoked = false; + result = ^(id _Nullable result) { + resultInvoked = true; + returnedResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual([returnedResult doubleValue], + GADLargeAnchoredAdaptiveBannerAdSizeWithWidth(45) + .size.height); +} + +- (void)testGetAdSize_bannerAd { + // Method calls to load a banner ad. + FlutterMethodCall *loadAdMethodCall = [FlutterMethodCall + methodCallWithMethodName:@"loadBannerAd" + arguments:@{ + @"adId" : @(1), + @"adUnitId" : @"ad-unit-id", + @"size" : [[FLTAdSize alloc] initWithWidth:@1 height:@2], + @"request" : [[FLTAdRequest alloc] init], + }]; + + __block bool loadAdResultInvoked = false; + __block id _Nullable returnedLoadAdResult; + FlutterResult loadAdResult = ^(id _Nullable result) { + loadAdResultInvoked = true; + returnedLoadAdResult = result; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:loadAdMethodCall + result:loadAdResult]; + + XCTAssertTrue(loadAdResultInvoked); + XCTAssertNil(returnedLoadAdResult); + + // Method call to get the ad size. + __block bool getAdSizeResultInvoked = false; + __block FLTAdSize *_Nullable returnedGetAdSizeResult; + FlutterResult getAdSizeResult = ^(id _Nullable result) { + getAdSizeResultInvoked = true; + returnedGetAdSizeResult = result; + }; + + FlutterMethodCall *getAdSizeMethodCall = + [FlutterMethodCall methodCallWithMethodName:@"getAdSize" + arguments:@{@"adId" : @(1)}]; + [_fltGoogleMobileAdsPlugin handleMethodCall:getAdSizeMethodCall + result:getAdSizeResult]; + + XCTAssertTrue(getAdSizeResultInvoked); + XCTAssertEqualObjects(returnedGetAdSizeResult.width, @1); + XCTAssertEqualObjects(returnedGetAdSizeResult.height, @2); +} + +- (void)testServerSideVerificationOptions_rewardedAd { + // Mock having already loaded an ad + FLTRewardedAd *mockAd = OCMClassMock([FLTRewardedAd class]); + OCMStub([_mockAdInstanceManager adFor:[OCMArg isEqual:@1]]).andReturn(mockAd); + + // Method calls to set ssv + FLTServerSideVerificationOptions *mockSSV = + OCMClassMock([FLTServerSideVerificationOptions class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"setServerSideVerificationOptions" + arguments:@{ + @"adId" : @(1), + @"adUnitId" : @"ad-unit-id", + @"serverSideVerificationOptions" : mockSSV, + }]; + + __block bool resultInvoked = false; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + OCMVerify([mockAd setServerSideVerificationOptions:[OCMArg isEqual:mockSSV]]); +} + +- (void)testServerSideVerificationOptions_rewardedInterstitialAd { + // Mock having already loaded an ad + FLTRewardedInterstitialAd *mockAd = + OCMClassMock([FLTRewardedInterstitialAd class]); + OCMStub([_mockAdInstanceManager adFor:[OCMArg isEqual:@1]]).andReturn(mockAd); + + // Method calls to set ssv + FLTServerSideVerificationOptions *mockSSV = + OCMClassMock([FLTServerSideVerificationOptions class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"setServerSideVerificationOptions" + arguments:@{ + @"adId" : @(1), + @"adUnitId" : @"ad-unit-id", + @"serverSideVerificationOptions" : mockSSV, + }]; + + __block bool resultInvoked = false; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + XCTAssertTrue(resultInvoked); + OCMVerify([mockAd setServerSideVerificationOptions:[OCMArg isEqual:mockSSV]]); +} + +- (void)testServerSideVerificationOptions_nullAd { + // Try to set ssv without any ads being loaded + FLTServerSideVerificationOptions *mockSSV = + OCMClassMock([FLTServerSideVerificationOptions class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"setServerSideVerificationOptions" + arguments:@{ + @"adId" : @(1), + @"adUnitId" : @"ad-unit-id", + @"serverSideVerificationOptions" : mockSSV, + }]; + + __block bool resultInvoked = false; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + // Result still invoked - no op + XCTAssertTrue(resultInvoked); +} + +- (void)testServerSideVerificationOptions_invalidAdType { + // Mock having already loaded an ad that does not support ssv + // Strict mock will fail if there are any interactions + FLTBannerAd *mockAd = OCMStrictClassMock([FLTBannerAd class]); + OCMStub([_mockAdInstanceManager adFor:[OCMArg isEqual:@1]]).andReturn(mockAd); + + // Try to set ssv without any ads being loaded + FLTServerSideVerificationOptions *mockSSV = + OCMClassMock([FLTServerSideVerificationOptions class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"setServerSideVerificationOptions" + arguments:@{ + @"adId" : @(1), + @"adUnitId" : @"ad-unit-id", + @"serverSideVerificationOptions" : mockSSV, + }]; + + __block bool resultInvoked = false; + FlutterResult result = ^(id _Nullable result) { + resultInvoked = true; + }; + + [_fltGoogleMobileAdsPlugin handleMethodCall:methodCall result:result]; + + // Result still invoked - no op + XCTAssertTrue(resultInvoked); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsReaderWriterTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsReaderWriterTest.m new file mode 100644 index 00000000..bf273249 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsReaderWriterTest.m @@ -0,0 +1,816 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "google_mobile_ads/FLTAdInstanceManager_Internal.h" +#import "google_mobile_ads/FLTAdUtil.h" +#import "google_mobile_ads/FLTAd_Internal.h" +#import "google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.h" +#import "google_mobile_ads/FLTGoogleMobileAdsPlugin.h" +#import "google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h" +#import "google_mobile_ads/FLTMediationExtras.h" +#import "google_mobile_ads/FLTMobileAds_Internal.h" +#import "google_mobile_ads/FLTNativeTemplateColor.h" +#import "google_mobile_ads/FLTNativeTemplateFontStyle.h" +#import "google_mobile_ads/FLTNativeTemplateStyle.h" +#import "google_mobile_ads/FLTNativeTemplateTextStyle.h" +#import "google_mobile_ads/FLTNativeTemplateType.h" + +@interface FLTGoogleMobileAdsReaderWriterTest : XCTestCase +@end + +@interface FLTTestAdSizeFactory : FLTAdSizeFactory +@property(readonly) GADAdSize testAdSize; +@end + +@interface _FlutterMediationExtras : NSObject +@end + +@implementation FLTGoogleMobileAdsReaderWriterTest { + FlutterStandardMessageCodec *_messageCodec; + FLTGoogleMobileAdsReaderWriter *_readerWriter; +} + +- (void)setUp { + id fltAdUtilMock = OCMClassMock([FLTAdUtil class]); + OCMStub(ClassMethod([fltAdUtilMock requestAgent])) + .andReturn(@"request-agent"); + _readerWriter = [[FLTGoogleMobileAdsReaderWriter alloc] + initWithFactory:[[FLTTestAdSizeFactory alloc] init]]; + _messageCodec = + [FlutterStandardMessageCodec codecWithReaderWriter:_readerWriter]; +} + +- (void)testEncodeDecodeAdSize { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + NSData *encodedMessage = [_messageCodec encode:size]; + + FLTAdSize *decodedSize = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decodedSize.width, @(1)); + XCTAssertEqualObjects(decodedSize.height, @(2)); +} + +- (void)testEncodeDecodeRequestConfiguration { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + GADMaxAdContentRatingMatureAudience; + GADMobileAds.sharedInstance.requestConfiguration + .tagForChildDirectedTreatment = @YES; + GADMobileAds.sharedInstance.requestConfiguration.tagForUnderAgeOfConsent = + @NO; + NSArray *testDeviceIds = + [[NSArray alloc] initWithObjects:@"test-device-id", nil]; + GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = + testDeviceIds; + NSData *encodedMessage = + [_messageCodec encode:GADMobileAds.sharedInstance.requestConfiguration]; + + GADRequestConfiguration *decodedSize = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decodedSize.maxAdContentRating, + GADMaxAdContentRatingMatureAudience); + XCTAssertEqualObjects(decodedSize.testDeviceIdentifiers, testDeviceIds); +} + +- (void)testEncodeDecodeInlineAdaptiveBannerAdSize_currentOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(25, 10)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory currentOrientationInlineAdaptiveBannerSizeWithWidth:@(23)]) + .andReturn(testAdSize); + + FLTInlineAdaptiveBannerSize *inlineAdaptiveBannerSize = + [[FLTInlineAdaptiveBannerSize alloc] initWithFactory:factory + width:@(23) + maxHeight:NULL + orientation:NULL]; + + NSData *encodedMessage = [_messageCodec encode:inlineAdaptiveBannerSize]; + + FLTInlineAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); + XCTAssertEqualObjects(decodedSize.maxHeight, + inlineAdaptiveBannerSize.maxHeight); + XCTAssertEqualObjects(decodedSize.orientation, + inlineAdaptiveBannerSize.orientation); +} + +- (void)testEncodeDecodeInlineAdaptiveBannerAdSize_portraitOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(25, 10)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory portraitOrientationInlineAdaptiveBannerSizeWithWidth:@(23)]) + .andReturn(testAdSize); + + FLTInlineAdaptiveBannerSize *inlineAdaptiveBannerSize = + [[FLTInlineAdaptiveBannerSize alloc] initWithFactory:factory + width:@(23) + maxHeight:NULL + orientation:@0]; + + NSData *encodedMessage = [_messageCodec encode:inlineAdaptiveBannerSize]; + + FLTInlineAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); + XCTAssertEqualObjects(decodedSize.maxHeight, + inlineAdaptiveBannerSize.maxHeight); + XCTAssertEqualObjects(decodedSize.orientation, + inlineAdaptiveBannerSize.orientation); +} + +- (void)testEncodeDecodeInlineAdaptiveBannerAdSize_landscapeOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(25, 10)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory landscapeInlineAdaptiveBannerAdSizeWithWidth:@(23)]) + .andReturn(testAdSize); + + FLTInlineAdaptiveBannerSize *inlineAdaptiveBannerSize = + [[FLTInlineAdaptiveBannerSize alloc] initWithFactory:factory + width:@(23) + maxHeight:NULL + orientation:@1]; + + NSData *encodedMessage = [_messageCodec encode:inlineAdaptiveBannerSize]; + + FLTInlineAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); + XCTAssertEqualObjects(decodedSize.maxHeight, + inlineAdaptiveBannerSize.maxHeight); + XCTAssertEqualObjects(decodedSize.orientation, + inlineAdaptiveBannerSize.orientation); +} + +- (void)testEncodeDecodeInlineAdaptiveBannerAdSize_withMaxHeight { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(25, 10)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory inlineAdaptiveBannerAdSizeWithWidthAndMaxHeight:@(23) + maxHeight:@50]) + .andReturn(testAdSize); + + FLTInlineAdaptiveBannerSize *inlineAdaptiveBannerSize = + [[FLTInlineAdaptiveBannerSize alloc] initWithFactory:factory + width:@(23) + maxHeight:@50 + orientation:nil]; + + NSData *encodedMessage = [_messageCodec encode:inlineAdaptiveBannerSize]; + + FLTInlineAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); + XCTAssertEqualObjects(decodedSize.maxHeight, + inlineAdaptiveBannerSize.maxHeight); + XCTAssertEqualObjects(decodedSize.orientation, + inlineAdaptiveBannerSize.orientation); +} + +- (void)testEncodeDecodeAnchoredAdaptiveBannerAdSize_portraitOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(23, 34)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory portraitAnchoredAdaptiveBannerAdSizeWithWidth:@(23)]) + .andReturn(testAdSize); + + FLTAnchoredAdaptiveBannerSize *size = + [[FLTAnchoredAdaptiveBannerSize alloc] initWithFactory:factory + orientation:@"portrait" + width:@(23) + isLarge:false]; + NSData *encodedMessage = [_messageCodec encode:size]; + + FLTAnchoredAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); +} + +- (void)testEncodeDecodeAnchoredAdaptiveBannerAdSize_landscapeOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(34, 45)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub([factory landscapeAnchoredAdaptiveBannerAdSizeWithWidth:@(34)]) + .andReturn(testAdSize); + + FLTAnchoredAdaptiveBannerSize *size = + [[FLTAnchoredAdaptiveBannerSize alloc] initWithFactory:factory + orientation:@"landscape" + width:@(34) + isLarge:false]; + NSData *encodedMessage = [_messageCodec encode:size]; + + FLTAnchoredAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); +} + +- (void)testEncodeDecodeAnchoredAdaptiveBannerAdSize_currentOrientation { + GADAdSize testAdSize = GADAdSizeFromCGSize(CGSizeMake(45, 56)); + + FLTAdSizeFactory *factory = OCMClassMock([FLTAdSizeFactory class]); + OCMStub( + [factory currentOrientationAnchoredAdaptiveBannerAdSizeWithWidth:@(45)]) + .andReturn(testAdSize); + + FLTAnchoredAdaptiveBannerSize *size = + [[FLTAnchoredAdaptiveBannerSize alloc] initWithFactory:factory + orientation:NULL + width:@(45) + isLarge:false]; + NSData *encodedMessage = [_messageCodec encode:size]; + + FLTAnchoredAdaptiveBannerSize *decodedSize = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedSize.size.size.width, testAdSize.size.width); +} + +- (void)testEncodeDecodeSmartBannerAdSize { + FLTSmartBannerSize *size = + [[FLTSmartBannerSize alloc] initWithOrientation:@"landscape"]; + + NSData *encodedMessage = [_messageCodec encode:size]; + FLTSmartBannerSize *decodedSize = [_messageCodec decode:encodedMessage]; + + XCTAssertTrue([decodedSize isKindOfClass:FLTSmartBannerSize.class]); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + XCTAssertEqual(decodedSize.size.size.width, + kGADAdSizeSmartBannerPortrait.size.width); + XCTAssertEqual(decodedSize.size.size.height, + kGADAdSizeSmartBannerPortrait.size.height); +#pragma clang diagnostic pop +} + +- (void)testEncodeDecodeFluidAdSize { + FLTFluidSize *size = [[FLTFluidSize alloc] init]; + + NSData *encodedMessage = [_messageCodec encode:size]; + FLTFluidSize *decodedSize = [_messageCodec decode:encodedMessage]; + + XCTAssertTrue([decodedSize isKindOfClass:FLTFluidSize.class]); + XCTAssertEqual(decodedSize.size.size.width, GADAdSizeFluid.size.width); + XCTAssertEqual(decodedSize.size.size.height, GADAdSizeFluid.size.height); +} + +- (void)testEncodeDecodeAdRequest { + id mediationExtras = + [[_FlutterMediationExtras alloc] init]; + mediationExtras.extras = @{@"test_key" : @"test_value"}; + FLTAdRequest *request = [[FLTAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + request.contentURL = @"banana"; + request.nonPersonalizedAds = YES; + NSArray *contentURLs = @[ @"url-1.com", @"url-2.com" ]; + request.neighboringContentURLs = contentURLs; + request.mediationExtrasIdentifier = @"identifier"; + request.adMobExtras = @{@"key" : @"value"}; + NSArray> *mediationExtrasArray = + @[ mediationExtras ]; + request.mediationExtras = mediationExtrasArray; + NSData *encodedMessage = [_messageCodec encode:request]; + + FLTAdRequest *decodedRequest = [_messageCodec decode:encodedMessage]; + XCTAssertTrue([decodedRequest.keywords isEqualToArray:@[ @"apple" ]]); + XCTAssertEqualObjects(decodedRequest.contentURL, @"banana"); + XCTAssertTrue(decodedRequest.nonPersonalizedAds); + XCTAssertEqualObjects(decodedRequest.neighboringContentURLs, contentURLs); + XCTAssertEqualObjects(decodedRequest.mediationExtrasIdentifier, + @"identifier"); + XCTAssertEqualObjects(decodedRequest.adMobExtras, @{@"key" : @"value"}); + XCTAssertEqualObjects(decodedRequest.requestAgent, @"request-agent"); + XCTAssertEqualObjects(decodedRequest.mediationExtras[0].extras, + @{@"test_key" : @"test_value"}); +} + +- (void)testEncodeDecodeGAMAdRequest { + id mediationExtras = + [[_FlutterMediationExtras alloc] init]; + mediationExtras.extras = @{@"test_key" : @"test_value"}; + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + request.contentURL = @"banana"; + request.customTargeting = @{@"table" : @"linen"}; + request.customTargetingLists = @{@"go" : @[ @"lakers" ]}; + request.nonPersonalizedAds = YES; + NSArray *contentURLs = @[ @"url-1.com", @"url-2.com" ]; + request.neighboringContentURLs = contentURLs; + request.pubProvidedID = @"pub-id"; + request.mediationExtrasIdentifier = @"identifier"; + request.adMobExtras = @{@"key" : @"value"}; + NSArray> *mediationExtrasArray = + @[ mediationExtras ]; + request.mediationExtras = mediationExtrasArray; + NSData *encodedMessage = [_messageCodec encode:request]; + + FLTGAMAdRequest *decodedRequest = [_messageCodec decode:encodedMessage]; + XCTAssertTrue([decodedRequest.keywords isEqualToArray:@[ @"apple" ]]); + XCTAssertEqualObjects(decodedRequest.contentURL, @"banana"); + XCTAssertTrue([decodedRequest.customTargeting + isEqualToDictionary:@{@"table" : @"linen"}]); + XCTAssertTrue([decodedRequest.customTargetingLists + isEqualToDictionary:@{@"go" : @[ @"lakers" ]}]); + XCTAssertTrue(decodedRequest.nonPersonalizedAds); + XCTAssertEqualObjects(decodedRequest.neighboringContentURLs, contentURLs); + XCTAssertEqualObjects(decodedRequest.pubProvidedID, @"pub-id"); + XCTAssertEqualObjects(decodedRequest.mediationExtrasIdentifier, + @"identifier"); + XCTAssertEqualObjects(decodedRequest.adMobExtras, @{@"key" : @"value"}); + XCTAssertEqualObjects(decodedRequest.requestAgent, @"request-agent"); + XCTAssertEqualObjects(decodedRequest.mediationExtras[0].extras, + @{@"test_key" : @"test_value"}); +} + +- (void)testEncodeDecodeRewardItem { + FLTRewardItem *item = [[FLTRewardItem alloc] initWithAmount:@(1) + type:@"apple"]; + NSData *encodedMessage = [_messageCodec encode:item]; + + FLTRewardItem *decodedItem = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decodedItem.amount, @(1)); + XCTAssertEqualObjects(decodedItem.type, @"apple"); +} + +- (void)testEncodeDecodeServerSideVerification { + FLTServerSideVerificationOptions *serverSideVerificationOptions = + [[FLTServerSideVerificationOptions alloc] init]; + serverSideVerificationOptions.customRewardString = @"reward"; + serverSideVerificationOptions.userIdentifier = @"user-id"; + NSData *encodedMessage = [_messageCodec encode:serverSideVerificationOptions]; + + FLTServerSideVerificationOptions *decoded = + [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decoded.customRewardString, + serverSideVerificationOptions.customRewardString); + XCTAssertEqualObjects(decoded.userIdentifier, + serverSideVerificationOptions.userIdentifier); + + // With customRewardString not defined. + serverSideVerificationOptions = + [[FLTServerSideVerificationOptions alloc] init]; + serverSideVerificationOptions.userIdentifier = @"user-id"; + encodedMessage = [_messageCodec encode:serverSideVerificationOptions]; + decoded = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decoded.customRewardString, + serverSideVerificationOptions.customRewardString); + XCTAssertEqualObjects(decoded.userIdentifier, + serverSideVerificationOptions.userIdentifier); + + // With userId not defined. + serverSideVerificationOptions = + [[FLTServerSideVerificationOptions alloc] init]; + serverSideVerificationOptions.customRewardString = @"reward"; + encodedMessage = [_messageCodec encode:serverSideVerificationOptions]; + decoded = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decoded.customRewardString, + serverSideVerificationOptions.customRewardString); + XCTAssertEqualObjects(decoded.userIdentifier, + serverSideVerificationOptions.userIdentifier); + + // Both undefined. + serverSideVerificationOptions = + [[FLTServerSideVerificationOptions alloc] init]; + encodedMessage = [_messageCodec encode:serverSideVerificationOptions]; + decoded = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decoded.customRewardString, + serverSideVerificationOptions.customRewardString); + XCTAssertEqualObjects(decoded.userIdentifier, + serverSideVerificationOptions.userIdentifier); +} + +- (void)testEncodeDecodeNSError { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"message"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + + NSData *encodedMessage = [_messageCodec encode:error]; + + NSError *decodedError = [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedError.code, 1); + XCTAssertEqualObjects(decodedError.domain, @"domain"); + XCTAssertEqualObjects(decodedError.localizedDescription, @"message"); +} + +- (void)testEncodeDecodeFLTGADLoadError { + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + GADAdNetworkResponseInfo *mockAdNetworkResponseInfo = + OCMClassMock([GADAdNetworkResponseInfo class]); + NSString *identifier = @"test-identifier"; + NSString *className = @"test-class-name"; + OCMStub([mockResponseInfo responseIdentifier]).andReturn(identifier); + OCMStub(mockResponseInfo.loadedAdNetworkResponseInfo) + .andReturn(mockAdNetworkResponseInfo); + OCMStub(mockAdNetworkResponseInfo.adNetworkClassName).andReturn(className); + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey : @"message", + GADErrorUserInfoKeyResponseInfo : mockResponseInfo + }; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + FLTLoadAdError *loadAdError = [[FLTLoadAdError alloc] initWithError:error]; + + NSData *encodedMessage = [_messageCodec encode:loadAdError]; + FLTLoadAdError *decodedError = [_messageCodec decode:encodedMessage]; + + XCTAssertEqual(decodedError.code, 1); + XCTAssertEqualObjects(decodedError.domain, @"domain"); + XCTAssertEqualObjects(decodedError.message, @"message"); + XCTAssertEqualObjects(decodedError.responseInfo.adNetworkClassName, + className); + XCTAssertEqualObjects(decodedError.responseInfo.responseIdentifier, + identifier); + XCTAssertTrue(decodedError.responseInfo.adNetworkInfoArray.count == 0); +} + +- (void)testEncodeDecodeFLTGADLoadErrorWithResponseInfo { + GADAdNetworkResponseInfo *mockNetworkResponse = + OCMClassMock([GADAdNetworkResponseInfo class]); + OCMStub([mockNetworkResponse adNetworkClassName]).andReturn(@"adapter-class"); + + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + GADAdNetworkResponseInfo *mockAdNetworkResponseInfo = + OCMClassMock([GADAdNetworkResponseInfo class]); + NSString *identifier = @"test-identifier"; + NSString *className = @"test-class-name"; + OCMStub([mockResponseInfo responseIdentifier]).andReturn(identifier); + OCMStub(mockResponseInfo.loadedAdNetworkResponseInfo) + .andReturn(mockAdNetworkResponseInfo); + OCMStub(mockAdNetworkResponseInfo.adNetworkClassName).andReturn(className); + OCMStub([mockResponseInfo adNetworkInfoArray]).andReturn(@[ + mockNetworkResponse + ]); + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey : @"message", + GADErrorUserInfoKeyResponseInfo : mockResponseInfo + }; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + FLTLoadAdError *loadAdError = [[FLTLoadAdError alloc] initWithError:error]; + + NSData *encodedMessage = [_messageCodec encode:loadAdError]; + FLTLoadAdError *decodedError = [_messageCodec decode:encodedMessage]; + + XCTAssertEqual(decodedError.code, 1); + XCTAssertEqualObjects(decodedError.domain, @"domain"); + XCTAssertEqualObjects(decodedError.message, @"message"); + XCTAssertEqualObjects(decodedError.responseInfo.adNetworkClassName, + className); + XCTAssertEqualObjects(decodedError.responseInfo.responseIdentifier, + identifier); + XCTAssertTrue(decodedError.responseInfo.adNetworkInfoArray.count == 1); + XCTAssertEqualObjects(decodedError.responseInfo.adNetworkInfoArray.firstObject + .adNetworkClassName, + @"adapter-class"); +} + +- (void)testEncodeDecodeFLTGADResponseInfo { + NSDictionary *descriptionsDict = @{@"descriptions" : @"dict"}; + NSDictionary *adUnitMappingsDict = @{@"credentials" : @"dict"}; + + NSError *error = OCMClassMock([NSError class]); + OCMStub([error domain]).andReturn(@"domain"); + OCMStub([error code]).andReturn(1); + OCMStub([error localizedDescription]).andReturn(@"error"); + + GADAdNetworkResponseInfo *mockGADResponseInfo = + OCMClassMock([GADAdNetworkResponseInfo class]); + OCMStub([mockGADResponseInfo adNetworkClassName]).andReturn(@"adapter-class"); + OCMStub([mockGADResponseInfo latency]).andReturn(123.1234); + OCMStub([mockGADResponseInfo dictionaryRepresentation]) + .andReturn(descriptionsDict); + OCMStub([mockGADResponseInfo adUnitMapping]).andReturn(adUnitMappingsDict); + OCMStub([mockGADResponseInfo error]).andReturn(error); + + GADAdNetworkResponseInfo *mockLoadedGADResponseInfo = + OCMClassMock([GADAdNetworkResponseInfo class]); + OCMStub([mockLoadedGADResponseInfo adNetworkClassName]) + .andReturn(@"loaded-adapter"); + OCMStub([mockLoadedGADResponseInfo latency]).andReturn(123.1234); + OCMStub([mockLoadedGADResponseInfo dictionaryRepresentation]) + .andReturn(descriptionsDict); + OCMStub([mockLoadedGADResponseInfo adUnitMapping]) + .andReturn(adUnitMappingsDict); + OCMStub([mockLoadedGADResponseInfo error]).andReturn(error); + OCMStub([mockLoadedGADResponseInfo adSourceName]).andReturn(@"adSourceName"); + OCMStub([mockLoadedGADResponseInfo adSourceID]).andReturn(@"adSourceID"); + OCMStub([mockLoadedGADResponseInfo adSourceInstanceName]) + .andReturn(@"adSourceInstanceName"); + OCMStub([mockLoadedGADResponseInfo adSourceInstanceID]) + .andReturn(@"adSourceInstanceID"); + + FLTGADAdNetworkResponseInfo *adNetworkResponseInfo = + [[FLTGADAdNetworkResponseInfo alloc] + initWithResponseInfo:mockGADResponseInfo]; + FLTGADAdNetworkResponseInfo *loadedNetworkResponseInfo = + [[FLTGADAdNetworkResponseInfo alloc] + initWithResponseInfo:mockLoadedGADResponseInfo]; + + FLTGADResponseInfo *responseInfo = [[FLTGADResponseInfo alloc] init]; + responseInfo.adNetworkClassName = @"class-name"; + responseInfo.responseIdentifier = @"identifier"; + responseInfo.adNetworkInfoArray = @[ adNetworkResponseInfo ]; + responseInfo.loadedAdNetworkResponseInfo = loadedNetworkResponseInfo; + responseInfo.extrasDictionary = @{@"key" : @"value"}; + + NSData *encodedMessage = [_messageCodec encode:responseInfo]; + FLTGADResponseInfo *decodedResponseInfo = + [_messageCodec decode:encodedMessage]; + + XCTAssertEqualObjects(decodedResponseInfo.adNetworkClassName, @"class-name"); + XCTAssertEqualObjects(decodedResponseInfo.responseIdentifier, @"identifier"); + XCTAssertEqualObjects(decodedResponseInfo.extrasDictionary, + @{@"key" : @"value"}); + XCTAssertEqual(decodedResponseInfo.adNetworkInfoArray.count, 1); + + FLTGADAdNetworkResponseInfo *decodedInfo = + decodedResponseInfo.adNetworkInfoArray.firstObject; + + XCTAssertEqualObjects(decodedInfo.adNetworkClassName, @"adapter-class"); + XCTAssertEqualObjects(decodedInfo.latency, @(123123)); + XCTAssertEqualObjects(decodedInfo.dictionaryDescription, + @"{\n descriptions = dict;\n}"); + XCTAssertEqualObjects(decodedInfo.adUnitMapping, adUnitMappingsDict); + XCTAssertEqual(decodedInfo.error.code, 1); + XCTAssertEqualObjects(decodedInfo.error.domain, @"domain"); + XCTAssertEqualObjects(decodedInfo.error.localizedDescription, @"error"); + + FLTGADAdNetworkResponseInfo *decodedLoadedInfo = + decodedResponseInfo.loadedAdNetworkResponseInfo; + XCTAssertEqualObjects(decodedLoadedInfo.adNetworkClassName, + @"loaded-adapter"); + XCTAssertEqualObjects(decodedLoadedInfo.latency, @(123123)); + XCTAssertEqualObjects(decodedLoadedInfo.dictionaryDescription, + @"{\n descriptions = dict;\n}"); + XCTAssertEqualObjects(decodedLoadedInfo.adUnitMapping, adUnitMappingsDict); + XCTAssertEqual(decodedLoadedInfo.error.code, 1); + XCTAssertEqualObjects(decodedLoadedInfo.error.domain, @"domain"); + XCTAssertEqualObjects(decodedLoadedInfo.error.localizedDescription, @"error"); + XCTAssertEqualObjects(decodedLoadedInfo.adSourceName, @"adSourceName"); + XCTAssertEqualObjects(decodedLoadedInfo.adSourceID, @"adSourceID"); + XCTAssertEqualObjects(decodedLoadedInfo.adSourceInstanceName, + @"adSourceInstanceName"); + XCTAssertEqualObjects(decodedLoadedInfo.adSourceInstanceID, + @"adSourceInstanceID"); +} + +- (void)testEncodeDecodeFLTGADLoadErrorWithEmptyValues { + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([mockResponseInfo responseIdentifier]).andReturn(nil); + OCMStub([mockResponseInfo.loadedAdNetworkResponseInfo adNetworkClassName]) + .andReturn(nil); + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey : @"message", + GADErrorUserInfoKeyResponseInfo : mockResponseInfo + }; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + FLTLoadAdError *loadAdError = [[FLTLoadAdError alloc] initWithError:error]; + + NSData *encodedMessage = [_messageCodec encode:loadAdError]; + FLTLoadAdError *decodedError = [_messageCodec decode:encodedMessage]; + + XCTAssertEqual(decodedError.code, 1); + XCTAssertEqualObjects(decodedError.domain, @"domain"); + XCTAssertEqualObjects(decodedError.message, @"message"); + XCTAssertNil(decodedError.responseInfo.adNetworkClassName); + XCTAssertNil(decodedError.responseInfo.responseIdentifier); +} + +- (void)testEncodeDecodeAdapterStatus { + FLTAdapterStatus *status = [[FLTAdapterStatus alloc] init]; + status.state = @(1); + status.statusDescription = @"desc"; + status.latency = @(23); + + NSData *encodedMessage = [_messageCodec encode:status]; + + FLTAdapterStatus *decodedStatus = [_messageCodec decode:encodedMessage]; + XCTAssertEqualObjects(decodedStatus.state, @(1)); + XCTAssertEqualObjects(decodedStatus.statusDescription, @"desc"); + XCTAssertEqualObjects(decodedStatus.latency, @(23)); +} + +- (void)testEncodeDecodeInitializationStatus { + FLTInitializationStatus *status = [[FLTInitializationStatus alloc] init]; + status.adapterStatuses = @{@"name" : [[FLTAdapterStatus alloc] init]}; + + NSData *encodedMessage = [_messageCodec encode:status]; + + FLTInitializationStatus *decodedStatus = + [_messageCodec decode:encodedMessage]; + XCTAssertEqual(decodedStatus.adapterStatuses.count, 1); + XCTAssertEqualObjects(decodedStatus.adapterStatuses.allKeys[0], @"name"); + XCTAssertNil(decodedStatus.adapterStatuses.allValues[0].state); + XCTAssertNil(decodedStatus.adapterStatuses.allValues[0].statusDescription); + XCTAssertNil(decodedStatus.adapterStatuses.allValues[0].latency); +} + +- (void)testEncodeDecodeNativeTemplateType { + FLTNativeTemplateType *templateType = + [[FLTNativeTemplateType alloc] initWithInt:1]; + NSData *encodedMessage = [_messageCodec encode:templateType]; + + FLTNativeTemplateType *decodedTemplateType = + [_messageCodec decode:encodedMessage]; + [self assertEqualTemplateTypes:templateType second:decodedTemplateType]; +} + +- (void)testEncodeDecodeNativeTemplateFontStyle { + FLTNativeTemplateFontStyleWrapper *fontStyle = + [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:2]; + NSData *encodedMessage = [_messageCodec encode:fontStyle]; + + FLTNativeTemplateFontStyleWrapper *decoded = + [_messageCodec decode:encodedMessage]; + [self assertEqualTemplateFontStyles:fontStyle second:decoded]; +} + +- (void)testEncodeDecodeNativeTemplateColor { + FLTNativeTemplateColor *color = + [[FLTNativeTemplateColor alloc] initWithAlpha:@2.0f + red:@3.0f + green:@4.0f + blue:@5.0f]; + NSData *encodedMessage = [_messageCodec encode:color]; + + FLTNativeTemplateColor *decoded = [_messageCodec decode:encodedMessage]; + [self assertEqualTemplateColors:color second:decoded]; +} + +- (void)testEncodeDecodeNativeTemplateTextStyle { + FLTNativeTemplateColor *textColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@2.0f + red:@3.0f + green:@4.0f + blue:@5.0f]; + FLTNativeTemplateColor *backgroundColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@6.0f + red:@7.0f + green:@8.0f + blue:@9.0f]; + FLTNativeTemplateFontStyleWrapper *fontStyle = + [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:1]; + + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:fontStyle + size:@15.0f]; + NSData *encodedMessage = [_messageCodec encode:textStyle]; + + FLTNativeTemplateTextStyle *decoded = [_messageCodec decode:encodedMessage]; + [self assertEqualTextStyles:textStyle second:decoded]; +} + +- (void)testEncodeDecodeNativeTemplateStyle { + FLTNativeTemplateType *templateType = + [[FLTNativeTemplateType alloc] initWithInt:0]; + FLTNativeTemplateColor *mainBackgroundColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@2.0f + red:@3.0f + green:@4.0f + blue:@5.0f]; + + FLTNativeTemplateColor *ctaTextColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@2.0f + red:@3.0f + green:@4.0f + blue:@5.0f]; + FLTNativeTemplateColor *ctaBackgroundColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@6.0f + red:@7.0f + green:@8.0f + blue:@9.0f]; + FLTNativeTemplateFontStyleWrapper *ctaFontStyle = + [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:1]; + + FLTNativeTemplateTextStyle *ctaTextStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:ctaTextColor + backgroundColor:ctaBackgroundColor + fontStyle:ctaFontStyle + size:@15.0f]; + FLTNativeTemplateTextStyle *primaryTextStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:nil + backgroundColor:nil + fontStyle:nil + size:nil]; + + FLTNativeTemplateTextStyle *secondaryTextStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:nil + backgroundColor:nil + fontStyle:nil + size:@30.0f]; + + FLTNativeTemplateColor *tertiaryTextColor = + [[FLTNativeTemplateColor alloc] initWithAlpha:@12.0f + red:@13.0f + green:@14.0f + blue:@15.0f]; + FLTNativeTemplateTextStyle *tertiaryTextStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:tertiaryTextColor + backgroundColor:nil + fontStyle:nil + size:@45.0f]; + + FLTNativeTemplateStyle *style = + [[FLTNativeTemplateStyle alloc] initWithTemplateType:templateType + mainBackgroundColor:mainBackgroundColor + callToActionStyle:ctaTextStyle + primaryTextStyle:primaryTextStyle + secondaryTextStyle:secondaryTextStyle + tertiaryTextStyle:tertiaryTextStyle + cornerRadius:@20.0f]; + + NSData *encodedMessage = [_messageCodec encode:style]; + FLTNativeTemplateStyle *decoded = [_messageCodec decode:encodedMessage]; + + [self assertEqualTemplateTypes:style.templateType + second:decoded.templateType]; + [self assertEqualTemplateColors:style.mainBackgroundColor + second:decoded.mainBackgroundColor]; + [self assertEqualTextStyles:style.callToActionStyle + second:decoded.callToActionStyle]; + [self assertEqualTextStyles:style.primaryTextStyle + second:decoded.primaryTextStyle]; + [self assertEqualTextStyles:style.secondaryTextStyle + second:decoded.secondaryTextStyle]; + [self assertEqualTextStyles:style.tertiaryTextStyle + second:decoded.tertiaryTextStyle]; + XCTAssertEqual(style.cornerRadius.floatValue, + decoded.cornerRadius.floatValue); +} + +#pragma mark - Helper methods to compare native templates types + +- (void)assertEqualTextStyles:(FLTNativeTemplateTextStyle *)first + second:(FLTNativeTemplateTextStyle *)second { + [self assertEqualTemplateColors:first.textColor second:second.textColor]; + [self assertEqualTemplateColors:first.backgroundColor + second:second.backgroundColor]; + + XCTAssertEqual(first.fontStyle.intValue, second.fontStyle.intValue); + XCTAssertEqual(first.size.floatValue, second.size.floatValue); +} + +- (void)assertEqualTemplateFontStyles:(FLTNativeTemplateFontStyleWrapper *)first + second: + (FLTNativeTemplateFontStyleWrapper *)second { + XCTAssertEqual(first.intValue, second.intValue); +} + +- (void)assertEqualTemplateColors:(FLTNativeTemplateColor *)first + second:(FLTNativeTemplateColor *)second { + XCTAssertEqual(first.alpha.floatValue, second.alpha.floatValue); + XCTAssertEqual(first.red.floatValue, second.red.floatValue); + XCTAssertEqual(first.blue.floatValue, second.blue.floatValue); + XCTAssertEqual(first.green.floatValue, second.green.floatValue); +} + +- (void)assertEqualTemplateTypes:(FLTNativeTemplateType *)first + second:(FLTNativeTemplateType *)second { + XCTAssertEqual(first.intValue, second.intValue); +} + +@end + +@implementation FLTTestAdSizeFactory +- (instancetype)initWithAdSize:(GADAdSize)testAdSize { + self = [super init]; + if (self) { + _testAdSize = testAdSize; + } + return self; +} + +- (GADAdSize)portraitAnchoredAdaptiveBannerAdSizeWithWidth:(NSNumber *)width { + return GADAdSizeFromCGSize(CGSizeMake(width.doubleValue, 0)); +} + +- (GADAdSize)landscapeAnchoredAdaptiveBannerAdSizeWithWidth:(NSNumber *)width { + return GADAdSizeFromCGSize(CGSizeMake(width.doubleValue, 0)); +} + +- (GADAdSize)currentOrientationAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *)width { + return GADAdSizeFromCGSize(CGSizeMake(width.doubleValue, 0)); +} +@end + +@implementation _FlutterMediationExtras + +@synthesize extras; + +- (id _Nonnull)getMediationExtras { + return OCMProtocolMock(@protocol(GADAdNetworkExtras)); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsTest.m new file mode 100644 index 00000000..427b5e3d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTGoogleMobileAdsTest.m @@ -0,0 +1,472 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" +#import "FLTGoogleMobileAdsCollection_Internal.h" +#import "FLTGoogleMobileAdsPlugin.h" +#import "FLTGoogleMobileAdsReaderWriter_Internal.h" +#import "FLTMobileAds_Internal.h" + +@interface FLTGoogleMobileAdsTest : XCTestCase +@end + +@implementation FLTGoogleMobileAdsTest { + FLTAdInstanceManager *_manager; + NSObject *_mockMessenger; + NSObject *_methodCodec; +} + +static NSString *channel = @"plugins.flutter.io/google_mobile_ads"; + +- (void)setUp { + _mockMessenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger)); + _manager = + [[FLTAdInstanceManager alloc] initWithBinaryMessenger:_mockMessenger]; + _methodCodec = [FlutterStandardMethodCodec + codecWithReaderWriter:[[FLTGoogleMobileAdsReaderWriter alloc] init]]; +} + +- (void)testAdInstanceManagerLoadAd { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + FLTBannerAd *bannerAd = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@1]; + + FLTBannerAd *mockBannerAd = OCMPartialMock(bannerAd); + OCMStub([mockBannerAd load]); + + [_manager loadAd:bannerAd]; + + OCMVerify([mockBannerAd load]); + XCTAssertEqual([_manager adFor:@(1)], bannerAd); + XCTAssertEqualObjects([_manager adIdFor:bannerAd], @(1)); +} + +- (void)testAdInstanceManagerDisposeAd { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + FLTBannerAd *bannerAd = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@1]; + FLTBannerAd *mockBannerAd = OCMPartialMock(bannerAd); + OCMStub([mockBannerAd load]); + + [_manager loadAd:bannerAd]; + [_manager dispose:@(1)]; + + XCTAssertNil([_manager adFor:@(1)]); + XCTAssertNil([_manager adIdFor:bannerAd]); +} + +- (void)testAdInstanceManagerDisposeAllAds { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + FLTBannerAd *bannerAd1 = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@1]; + FLTBannerAd *mockBannerAd1 = OCMPartialMock(bannerAd1); + OCMStub([mockBannerAd1 load]); + + FLTBannerAd *bannerAd2 = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@2]; + FLTBannerAd *mockBannerAd2 = OCMPartialMock(bannerAd2); + OCMStub([mockBannerAd2 load]); + + [_manager loadAd:bannerAd1]; + [_manager loadAd:bannerAd2]; + [_manager disposeAllAds]; + + XCTAssertNil([_manager adFor:@(1)]); + XCTAssertNil([_manager adIdFor:bannerAd1]); + XCTAssertNil([_manager adFor:@(2)]); + XCTAssertNil([_manager adIdFor:bannerAd2]); +} + +- (void)testAdInstanceManagerOnAdLoaded { + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:@"testAdUnitId" + request:[[FLTAdRequest alloc] init] + nativeAdFactory:OCMProtocolMock(@protocol(FLTNativeAdFactory)) + customOptions:nil + rootViewController:OCMClassMock([UIViewController class]) + adId:@1 + nativeAdOptions:nil + nativeTemplateStyle:nil]; + [_manager loadAd:ad]; + + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + FLTGADResponseInfo *fltResponseInfo = + [[FLTGADResponseInfo alloc] initWithResponseInfo:responseInfo]; + [_manager onAdLoaded:ad responseInfo:responseInfo]; + NSData *data = [_methodCodec + encodeMethodCall:[FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : @"onAdLoaded", + @"responseInfo" : fltResponseInfo, + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testAdInstanceManagerOnAdFailedToLoad { + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:@"testAdUnitId" + request:[[FLTAdRequest alloc] init] + nativeAdFactory:OCMProtocolMock(@protocol(FLTNativeAdFactory)) + customOptions:nil + rootViewController:OCMClassMock([UIViewController class]) + adId:@1 + nativeAdOptions:nil + nativeTemplateStyle:nil]; + [_manager loadAd:ad]; + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"message"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + + FLTLoadAdError *loadAdError = [[FLTLoadAdError alloc] initWithError:error]; + [_manager onAdFailedToLoad:ad error:error]; + NSData *data = [_methodCodec + encodeMethodCall:[FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : @"onAdFailedToLoad", + @"loadAdError" : loadAdError, + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testAdInstanceManagerOnAdFailedToShow { + FLTInterstitialAd *ad = OCMClassMock([FLTInterstitialAd class]); + OCMStub([ad adId]).andReturn(@1); + [_manager loadAd:ad]; + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"message"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + + [_manager didFailToPresentFullScreenContentWithError:ad error:error]; + NSData *data = [_methodCodec + encodeMethodCall:[FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : + @"didFailToPresentFullScreenCon" + @"tentWithError", + @"error" : error, + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testAdInstanceManagerOnAppEvent { + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:@"testAdUnitId" + request:[[FLTAdRequest alloc] init] + nativeAdFactory:OCMProtocolMock(@protocol(FLTNativeAdFactory)) + customOptions:nil + rootViewController:OCMClassMock([UIViewController class]) + adId:@1 + nativeAdOptions:nil + nativeTemplateStyle:nil]; + FlutterMethodChannel *mockMethodChannel = + OCMClassMock([FlutterMethodChannel class]); + [_manager setValue:mockMethodChannel forKey:@"_channel"]; + [_manager loadAd:ad]; + + [_manager onAppEvent:ad name:@"color" data:@"red"]; + + NSDictionary *arguments = @{ + @"adId" : @1, + @"eventName" : @"onAppEvent", + @"name" : @"color", + @"data" : @"red" + }; + OCMVerify([mockMethodChannel invokeMethod:@"onAdEvent" arguments:arguments]); +} + +- (void)testAdInstanceManagerOnNativeAdEvents { + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:@"testAdUnitId" + request:[[FLTAdRequest alloc] init] + nativeAdFactory:OCMProtocolMock(@protocol(FLTNativeAdFactory)) + customOptions:nil + rootViewController:OCMClassMock([UIViewController class]) + adId:@1 + nativeAdOptions:nil + nativeTemplateStyle:nil]; + [_manager loadAd:ad]; + + [_manager adDidRecordClick:ad]; + NSData *clickData = [self getDataForEvent:@"adDidRecordClick" adId:@1]; + OCMVerify([_mockMessenger sendOnChannel:channel message:clickData]); + + [_manager onNativeAdImpression:ad]; + NSData *impressionData = [self getDataForEvent:@"onNativeAdImpression" + adId:@1]; + OCMVerify([_mockMessenger sendOnChannel:channel message:impressionData]); + + [_manager onNativeAdWillPresentScreen:ad]; + NSData *presentScreenData = + [self getDataForEvent:@"onNativeAdWillPresentScreen" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:presentScreenData])); + + [_manager onNativeAdDidDismissScreen:ad]; + NSData *didDismissData = [self getDataForEvent:@"onNativeAdDidDismissScreen" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didDismissData])); + + [_manager onNativeAdWillDismissScreen:ad]; + NSData *willDismissData = [self getDataForEvent:@"onNativeAdWillDismissScreen" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:willDismissData])); +} + +- (void)testAdInstanceManagerOnRewardedAdUserEarnedReward { + FLTRewardedAd *ad = + [[FLTRewardedAd alloc] initWithAdUnitId:@"testId" + request:[[FLTAdRequest alloc] init] + adId:@1]; + [_manager loadAd:ad]; + + [_manager onRewardedAdUserEarnedReward:ad + reward:[[FLTRewardItem alloc] + initWithAmount:@(1) + type:@"type"]]; + NSData *data = [_methodCodec + encodeMethodCall:[FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : + @"onRewardedAdUserEarnedReward", + @"rewardItem" : + [[FLTRewardItem alloc] + initWithAmount:@(1) + type:@"type"] + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testAdInstanceManagerOnRewardedInterstitialAdUserEarnedReward { + FLTRewardedInterstitialAd *ad = [[FLTRewardedInterstitialAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTAdRequest alloc] init] + adId:@1]; + [_manager loadAd:ad]; + + [_manager + onRewardedInterstitialAdUserEarnedReward:ad + reward:[[FLTRewardItem alloc] + initWithAmount:@(1) + type:@"type"]]; + NSData *data = [_methodCodec + encodeMethodCall: + [FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : + @"onRewardedInterstitialAdUserEarnedReward", + @"rewardItem" : [[FLTRewardItem alloc] + initWithAmount:@(1) + type:@"type"] + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testAdInstanceManagerOnPaidEvent { + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:@"testAdUnitId" + request:[[FLTAdRequest alloc] init] + nativeAdFactory:OCMProtocolMock(@protocol(FLTNativeAdFactory)) + customOptions:nil + rootViewController:OCMClassMock([UIViewController class]) + adId:@1 + nativeAdOptions:nil + nativeTemplateStyle:nil]; + [_manager loadAd:ad]; + + NSDecimalNumber *valueDecimal = [[NSDecimalNumber alloc] initWithInt:1]; + FLTAdValue *value = [[FLTAdValue alloc] initWithValue:valueDecimal + precision:12 + currencyCode:@"code"]; + + [_manager onPaidEvent:ad value:value]; + NSData *data = [_methodCodec + encodeMethodCall:[FlutterMethodCall + methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : @"onPaidEvent", + @"valueMicros" : value.valueMicros, + @"precision" : + [NSNumber numberWithInteger:12], + @"currencyCode" : @"code" + }]]; + OCMVerify([_mockMessenger sendOnChannel:channel message:data]); +} + +- (void)testBannerEvents { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + FLTBannerAd *ad = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@1]; + FLTBannerAd *mockBannerAd = OCMPartialMock(ad); + OCMStub([mockBannerAd load]); + + [_manager loadAd:ad]; + + [_manager onBannerImpression:ad]; + NSData *impressionData = [self getDataForEvent:@"onBannerImpression" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:impressionData])); + + [_manager onBannerWillDismissScreen:ad]; + NSData *willDismissData = [self getDataForEvent:@"onBannerWillDismissScreen" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:willDismissData])); + + [_manager onBannerDidDismissScreen:ad]; + NSData *didDismissData = [self getDataForEvent:@"onBannerDidDismissScreen" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didDismissData])); + + [_manager onBannerWillPresentScreen:ad]; + NSData *willPresentData = [self getDataForEvent:@"onBannerWillPresentScreen" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:willPresentData])); +} + +- (void)testFullScreenEventsRewardedAd { + FLTRewardedAd *rewardedAd = + [[FLTRewardedAd alloc] initWithAdUnitId:@"testId" + request:[[FLTAdRequest alloc] init] + adId:@1]; + [_manager loadAd:rewardedAd]; + + [_manager adWillPresentFullScreenContent:rewardedAd]; + NSData *didPresentData = + [self getDataForEvent:@"adWillPresentFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didPresentData])); + + [_manager adDidDismissFullScreenContent:rewardedAd]; + NSData *didDismissData = + [self getDataForEvent:@"adDidDismissFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didDismissData])); + + [_manager adWillDismissFullScreenContent:rewardedAd]; + NSData *willDismissData = + [self getDataForEvent:@"adWillDismissFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:willDismissData])); + + [_manager adDidRecordImpression:rewardedAd]; + NSData *impressionData = [self getDataForEvent:@"adDidRecordImpression" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:impressionData])); +} + +- (void)testFullScreenEventsRewardedInterstitialAd { + FLTRewardedInterstitialAd *rewardedInterstitialAd = + [[FLTRewardedInterstitialAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTAdRequest alloc] init] + adId:@1]; + [_manager loadAd:rewardedInterstitialAd]; + + [_manager adWillPresentFullScreenContent:rewardedInterstitialAd]; + NSData *didPresentData = + [self getDataForEvent:@"adWillPresentFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didPresentData])); + + [_manager adDidDismissFullScreenContent:rewardedInterstitialAd]; + NSData *didDismissData = + [self getDataForEvent:@"adDidDismissFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:didDismissData])); + + [_manager adWillDismissFullScreenContent:rewardedInterstitialAd]; + NSData *willDismissData = + [self getDataForEvent:@"adWillDismissFullScreenContent" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:willDismissData])); + + [_manager adDidRecordImpression:rewardedInterstitialAd]; + NSData *impressionData = [self getDataForEvent:@"adDidRecordImpression" + adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:impressionData])); +} + +- (void)testEventSentForDisposedAd { + FLTAdSize *size = [[FLTAdSize alloc] initWithWidth:@(1) height:@(2)]; + FLTBannerAd *bannerAd = [[FLTBannerAd alloc] + initWithAdUnitId:@"testId" + size:size + request:[[FLTAdRequest alloc] init] + rootViewController:OCMClassMock([UIViewController class]) + adId:@1]; + FLTBannerAd *mockBannerAd = OCMPartialMock(bannerAd); + OCMStub([mockBannerAd load]); + + [_manager loadAd:bannerAd]; + [_manager dispose:@(1)]; + + XCTAssertNil([_manager adFor:@(1)]); + XCTAssertNil([_manager adIdFor:bannerAd]); + + GADBannerView *mockGADBannerView = OCMClassMock([GADBannerView class]); + [bannerAd bannerViewDidRecordImpression:mockGADBannerView]; + + NSData *impressionData = [self getDataForEvent:@"onBannerImpression" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:impressionData])); +} + +// Helper method to create encoded data for an event and ad id. +- (NSData *)getDataForEvent:(NSString *)name adId:(NSNumber *)adId { + return [_methodCodec + encodeMethodCall:[FlutterMethodCall methodCallWithMethodName:@"onAdEvent" + arguments:@{ + @"adId" : @1, + @"eventName" : name + }]]; +} + +- (void)testAdClick { + FLTRewardedInterstitialAd *rewardedInterstitialAd = + [[FLTRewardedInterstitialAd alloc] + initWithAdUnitId:@"testId" + request:[[FLTAdRequest alloc] init] + adId:@1]; + + [_manager adDidRecordClick:rewardedInterstitialAd]; + NSData *impressionData = [self getDataForEvent:@"adDidRecordClick" adId:@1]; + OCMVerify(([_mockMessenger sendOnChannel:channel message:impressionData])); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTInterstitialAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTInterstitialAdTest.m new file mode 100644 index 00000000..d3ef3c13 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTInterstitialAdTest.m @@ -0,0 +1,154 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTInterstitialAdTest : XCTestCase +@end + +@implementation FLTInterstitialAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadShowInterstitialAd { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + + FLTInterstitialAd *ad = [[FLTInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id interstitialClassMock = OCMClassMock([GADInterstitialAd class]); + OCMStub(ClassMethod([interstitialClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADInterstitialAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(interstitialClassMock, nil); + }); + NSError *error = OCMClassMock([NSError class]); + OCMStub([interstitialClassMock setFullScreenContentDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + id delegate; + [invocation getArgument:&delegate atIndex:2]; + XCTAssertEqual(delegate, ad); + [delegate adDidRecordImpression:interstitialClassMock]; + [delegate adDidRecordClick:interstitialClassMock]; + [delegate adDidDismissFullScreenContent:interstitialClassMock]; + [delegate adWillPresentFullScreenContent:interstitialClassMock]; + [delegate adWillDismissFullScreenContent:interstitialClassMock]; + [delegate ad:interstitialClassMock + didFailToPresentFullScreenContentWithError:error]; + }); + + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([interstitialClassMock responseInfo]).andReturn(mockResponseInfo); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([interstitialClassMock + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + // Call load and verify interactions with mocks. + [ad load]; + + OCMVerify(ClassMethod([interstitialClassMock + loadWithAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:mockResponseInfo]]); + OCMVerify( + [interstitialClassMock setFullScreenContentDelegate:[OCMArg isEqual:ad]]); + XCTAssertEqual(ad.interstitial, interstitialClassMock); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + // Show the ad + [ad show]; + + OCMVerify( + [interstitialClassMock presentFromRootViewController:[OCMArg isNil]]); + + // Verify full screen callbacks. + OCMVerify([mockManager adWillPresentFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adWillDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordImpression:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + didFailToPresentFullScreenContentWithError:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +- (void)testFailedToLoad { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + + FLTInterstitialAd *ad = [[FLTInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id interstitialClassMock = OCMClassMock([GADInterstitialAd class]); + NSError *error = OCMClassMock([NSError class]); + OCMStub(ClassMethod([interstitialClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADInterstitialAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(nil, error); + }); + + [ad load]; + + OCMVerify(ClassMethod([interstitialClassMock + loadWithAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTNativeAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTNativeAdTest.m new file mode 100644 index 00000000..4c3b8cb2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTNativeAdTest.m @@ -0,0 +1,197 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" +#import "FLTNativeTemplateStyle.h" + +@interface FLTNativeAdTest : XCTestCase +@end + +@implementation FLTNativeAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadNativeAd { + FLTAdRequest *request = [[FLTAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + [self testLoadNativeAd:request customOptions:NULL]; +} + +- (void)testLoadNativeAdWithGAMRequest { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = @[ @"apple" ]; + [self testLoadNativeAd:request + customOptions:OCMClassMock([NSDictionary class])]; +} + +- (void)testLoadNativeAd:(FLTAdRequest *)gadOrGAMRequest + customOptions: + (NSDictionary *_Nullable)customOptions { + id mockNativeAdFactory = OCMProtocolMock(@protocol(FLTNativeAdFactory)); + FLTNativeAdOptions *mockNativeAdOptions = + OCMClassMock([FLTNativeAdOptions class]); + GADAdLoaderOptions *mockGADAdLoaderOptions = + OCMClassMock([GADAdLoaderOptions class]); + OCMStub([mockNativeAdOptions asGADAdLoaderOptions]) + .andReturn([NSArray arrayWithObject:mockGADAdLoaderOptions]); + UIViewController *mockViewController = OCMClassMock([UIViewController class]); + + FLTNativeAd *ad = [[FLTNativeAd alloc] initWithAdUnitId:@"testAdUnitId" + request:gadOrGAMRequest + nativeAdFactory:mockNativeAdFactory + customOptions:customOptions + rootViewController:mockViewController + adId:@1 + nativeAdOptions:mockNativeAdOptions + nativeTemplateStyle:nil]; + ad.manager = mockManager; + + XCTAssertEqual(ad.adLoader.adUnitID, @"testAdUnitId"); + XCTAssertEqual(ad.adLoader.delegate, ad); + OCMVerify([mockNativeAdOptions asGADAdLoaderOptions]); + + FLTNativeAd *mockNativeAd = OCMPartialMock(ad); + GADAdLoader *mockLoader = OCMPartialMock([ad adLoader]); + OCMStub([mockNativeAd adLoader]).andReturn(mockLoader); + [mockNativeAd load]; + + OCMVerify([mockLoader loadRequest:[OCMArg checkWithBlock:^BOOL(id obj) { + GADRequest *requestArg = obj; + return [requestArg.keywords + isEqualToArray:@[ @"apple" ]]; + }]]); + + // Check that nil is used instead of null when customOptions is Null + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + GADNativeAd *mockGADNativeAd = OCMClassMock([GADNativeAd class]); + OCMStub([mockGADNativeAd responseInfo]).andReturn(mockResponseInfo); + [ad adLoader:mockLoader didReceiveNativeAd:mockGADNativeAd]; + if ([NSNull.null isEqual:customOptions] || customOptions == nil) { + OCMVerify([mockNativeAdFactory createNativeAd:mockGADNativeAd + customOptions:[OCMArg isNil]]); + } else { + OCMVerify([mockNativeAdFactory + createNativeAd:mockGADNativeAd + customOptions:[OCMArg isEqual:customOptions]]); + } + + OCMStub( + [mockGADNativeAd setDelegate:[OCMArg checkWithBlock:^BOOL(id obj) { + id delegate = obj; + [delegate nativeAdDidRecordClick:mockGADNativeAd]; + [delegate nativeAdDidRecordImpression:mockGADNativeAd]; + [delegate nativeAdWillPresentScreen:mockGADNativeAd]; + [delegate nativeAdDidDismissScreen:mockGADNativeAd]; + [delegate nativeAdWillDismissScreen:mockGADNativeAd]; + return YES; + }]]); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([mockGADNativeAd + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + + // Check ad loader delegate methods forward to ad instance manager. + [(id)ad.adLoader.delegate + adLoader:mockLoader + didReceiveNativeAd:mockGADNativeAd]; + + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:mockResponseInfo]]); + + NSError *error = OCMClassMock([NSError class]); + [(id)ad.adLoader.delegate adLoader:mockLoader + didFailToReceiveAdWithError:error]; + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); + + OCMVerify([mockGADNativeAd setPaidEventHandler:[OCMArg any]]); + + // Check GADNativeAdDelegate methods forward to ad instance manager. + OCMVerify([mockGADNativeAd setDelegate:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + OCMVerify([mockManager onNativeAdImpression:[OCMArg isEqual:ad]]); + OCMVerify([mockManager onNativeAdWillPresentScreen:[OCMArg isEqual:ad]]); + OCMVerify([mockManager onNativeAdDidDismissScreen:[OCMArg isEqual:ad]]); + OCMVerify([mockManager onNativeAdWillDismissScreen:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); +} + +// Check that native templates are used when template style is provided. +- (void)testLoadNativeAdNativeTemplateStyle { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + id mockNativeAdFactory = OCMProtocolMock(@protocol(FLTNativeAdFactory)); + FLTNativeAdOptions *mockNativeAdOptions = + OCMClassMock([FLTNativeAdOptions class]); + GADAdLoaderOptions *mockGADAdLoaderOptions = + OCMClassMock([GADAdLoaderOptions class]); + OCMStub([mockNativeAdOptions asGADAdLoaderOptions]) + .andReturn([NSArray arrayWithObject:mockGADAdLoaderOptions]); + UIViewController *mockViewController = OCMClassMock([UIViewController class]); + FLTNativeTemplateStyle *templateStyle = + OCMClassMock([FLTNativeTemplateStyle class]); + UIView *mockTemplateView = OCMClassMock([UIView class]); + OCMStub([templateStyle getDisplayedView:[OCMArg any]]) + .andReturn(mockTemplateView); + + FLTNativeAd *ad = [[FLTNativeAd alloc] initWithAdUnitId:@"testAdUnitId" + request:request + nativeAdFactory:mockNativeAdFactory + customOptions:nil + rootViewController:mockViewController + adId:@1 + nativeAdOptions:mockNativeAdOptions + nativeTemplateStyle:templateStyle]; + ad.manager = mockManager; + + FLTNativeAd *mockNativeAd = OCMPartialMock(ad); + GADAdLoader *mockLoader = OCMPartialMock([ad adLoader]); + OCMStub([mockNativeAd adLoader]).andReturn(mockLoader); + [mockNativeAd load]; + + GADResponseInfo *mockResponseInfo = OCMClassMock([GADResponseInfo class]); + GADNativeAd *mockGADNativeAd = OCMClassMock([GADNativeAd class]); + OCMStub([mockGADNativeAd responseInfo]).andReturn(mockResponseInfo); + [ad adLoader:mockLoader didReceiveNativeAd:mockGADNativeAd]; + + OCMVerify([templateStyle getDisplayedView:[OCMArg isEqual:mockGADNativeAd]]); + XCTAssertEqual(ad.view, mockTemplateView); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedAdTest.m new file mode 100644 index 00000000..71d6f66d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedAdTest.m @@ -0,0 +1,239 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTRewardedAdTest : XCTestCase +@end + +@implementation FLTRewardedAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadShowRewardedAdGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + + [self testLoadShowRewardedAd:request gadOrGAMRequest:gadRequest]; +} + +- (void)testLoadShowRewardedAdGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + + [self testLoadShowRewardedAd:request gadOrGAMRequest:gamRequest]; +} + +// Helper method for testing with FLTAdRequest and FLTGAMAdRequest. +- (void)testLoadShowRewardedAd:(FLTAdRequest *)request + gadOrGAMRequest:(GADRequest *)gadOrGAMRequest { + FLTRewardedAd *ad = [[FLTRewardedAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + // Stub the load call to invoke successful load callback. + id rewardedClassMock = OCMClassMock([GADRewardedAd class]); + OCMStub(ClassMethod([rewardedClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADRewardedAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(rewardedClassMock, nil); + }); + // Stub setting of FullScreenContentDelegate to invoke delegate callbacks. + NSError *error = OCMClassMock([NSError class]); + __block id fullScreenContentDelegate; + OCMStub([rewardedClassMock setFullScreenContentDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + [invocation getArgument:&fullScreenContentDelegate atIndex:2]; + XCTAssertEqual(fullScreenContentDelegate, ad); + }); + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([rewardedClassMock responseInfo]).andReturn(responseInfo); + // Stub presentFromRootViewController to invoke reward callback. + GADAdReward *mockReward = OCMClassMock([GADAdReward class]); + OCMStub([mockReward amount]).andReturn(@1.0); + OCMStub([mockReward type]).andReturn(@"type"); + OCMStub([rewardedClassMock adReward]).andReturn(mockReward); + OCMStub([rewardedClassMock presentFromRootViewController:[OCMArg any] + userDidEarnRewardHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + GADUserDidEarnRewardHandler rewardHandler; + [invocation getArgument:&rewardHandler atIndex:3]; + rewardHandler(); + }); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([rewardedClassMock + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + + // Setup mock for UIApplication.sharedInstance + id uiApplicationClassMock = OCMClassMock([UIApplication class]); + OCMStub(ClassMethod([uiApplicationClassMock sharedApplication])) + .andReturn(uiApplicationClassMock); + + // Call load and check expected interactions with mocks. + [ad load]; + + OCMVerify(ClassMethod([rewardedClassMock + loadWithAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadOrGAMRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:responseInfo]]); + OCMVerify( + [rewardedClassMock setFullScreenContentDelegate:[OCMArg isEqual:ad]]); + XCTAssertEqual(ad.rewardedAd, rewardedClassMock); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + // Set SSV and verify interactions with mocks + FLTServerSideVerificationOptions *serverSideVerificationOptions = + OCMClassMock([FLTServerSideVerificationOptions class]); + GADServerSideVerificationOptions *gadOptions = + OCMClassMock([GADServerSideVerificationOptions class]); + OCMStub([serverSideVerificationOptions asGADServerSideVerificationOptions]) + .andReturn(gadOptions); + + [ad setServerSideVerificationOptions:serverSideVerificationOptions]; + + OCMVerify([rewardedClassMock + setServerSideVerificationOptions:[OCMArg isEqual:gadOptions]]); + + // Show the ad and verify callbacks invoked + [ad show]; + + OCMVerify([rewardedClassMock presentFromRootViewController:[OCMArg isNil] + userDidEarnRewardHandler:[OCMArg any]]); + + [fullScreenContentDelegate adWillPresentFullScreenContent:rewardedClassMock]; + OCMVerify([mockManager adWillPresentFullScreenContent:[OCMArg isEqual:ad]]); + // Verify that we hide status bar +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + OCMVerify([uiApplicationClassMock setStatusBarHidden:YES]); +#pragma clang diagnostic pop + + [fullScreenContentDelegate adDidRecordImpression:rewardedClassMock]; + OCMVerify([mockManager adDidRecordImpression:[OCMArg isEqual:ad]]); + + [fullScreenContentDelegate adDidRecordClick:rewardedClassMock]; + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + + [fullScreenContentDelegate adDidDismissFullScreenContent:rewardedClassMock]; + OCMVerify([mockManager adDidDismissFullScreenContent:[OCMArg isEqual:ad]]); + + [fullScreenContentDelegate adWillDismissFullScreenContent:rewardedClassMock]; + OCMVerify([mockManager adWillDismissFullScreenContent:[OCMArg isEqual:ad]]); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + OCMVerify([uiApplicationClassMock setStatusBarHidden:NO]); +#pragma clang diagnostic pop + + [ad ad:rewardedClassMock didFailToPresentFullScreenContentWithError:error]; + OCMVerify([mockManager + didFailToPresentFullScreenContentWithError:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); + + // Verify reward callback. + OCMVerify([mockManager + onRewardedAdUserEarnedReward:[OCMArg isEqual:ad] + reward:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTRewardItem *reward = (FLTRewardItem *)obj; + XCTAssertEqual(reward.amount, @1.0); + XCTAssertEqual(reward.type, @"type"); + return true; + }]]); + + // Explicitly stop mocking. There is an issue when running tests on Github + // actions where the mock does not get deallocated properly, so without this + // other test cases will fail. + [rewardedClassMock stopMocking]; +} + +- (void)testFailedToLoadGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + [self testFailedToLoad:request]; +} + +- (void)testFailedToLoadGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + [self testFailedToLoad:request]; +} + +// Helper for testing failed to load. +- (void)testFailedToLoad:(FLTAdRequest *)request { + FLTRewardedAd *ad = [[FLTRewardedAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id rewardedClassMock = OCMClassMock([GADRewardedAd class]); + NSError *error = OCMClassMock([NSError class]); + OCMStub(ClassMethod([rewardedClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADRewardedAd *ad, NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(nil, error); + }); + + [ad load]; + + OCMVerify(ClassMethod([rewardedClassMock loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedInterstitialAdTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedInterstitialAdTest.m new file mode 100644 index 00000000..0c547563 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTRewardedInterstitialAdTest.m @@ -0,0 +1,232 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" + +@interface FLTRewardedInterstitialAdTest : XCTestCase +@end + +@implementation FLTRewardedInterstitialAdTest { + FLTAdInstanceManager *mockManager; +} + +- (void)setUp { + mockManager = (OCMClassMock([FLTAdInstanceManager class])); +} + +- (void)testLoadShowRewardedInterstitialAdGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + + [self testLoadShowRewardedInterstitialAd:request gadOrGAMRequest:gadRequest]; +} + +- (void)testLoadShowRewardedInterstitialAdGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + + [self testLoadShowRewardedInterstitialAd:request gadOrGAMRequest:gamRequest]; +} + +// Helper method for testing with FLTAdRequest and FLTGAMAdRequest. +- (void)testLoadShowRewardedInterstitialAd:(FLTAdRequest *)request + gadOrGAMRequest:(GADRequest *)gadOrGAMRequest { + FLTRewardedInterstitialAd *ad = + [[FLTRewardedInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + // Stub the load call to invoke successful load callback. + id rewardedInterstitialClassMock = + OCMClassMock([GADRewardedInterstitialAd class]); + OCMStub(ClassMethod([rewardedInterstitialClassMock + loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADRewardedInterstitialAd *ad, + NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(rewardedInterstitialClassMock, nil); + }); + // Stub setting of FullScreenContentDelegate to invoke delegate callbacks. + NSError *error = OCMClassMock([NSError class]); + OCMStub( + [rewardedInterstitialClassMock setFullScreenContentDelegate:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + id delegate; + [invocation getArgument:&delegate atIndex:2]; + XCTAssertEqual(delegate, ad); + [delegate adDidRecordImpression:rewardedInterstitialClassMock]; + [delegate adDidRecordClick:rewardedInterstitialClassMock]; + [delegate adDidDismissFullScreenContent:rewardedInterstitialClassMock]; + [delegate adWillPresentFullScreenContent:rewardedInterstitialClassMock]; + [delegate adWillDismissFullScreenContent:rewardedInterstitialClassMock]; + [delegate ad:rewardedInterstitialClassMock + didFailToPresentFullScreenContentWithError:error]; + }); + GADResponseInfo *responseInfo = OCMClassMock([GADResponseInfo class]); + OCMStub([rewardedInterstitialClassMock responseInfo]).andReturn(responseInfo); + // Stub presentFromRootViewController to invoke reward callback. + GADAdReward *mockReward = OCMClassMock([GADAdReward class]); + OCMStub([mockReward amount]).andReturn(@1.0); + OCMStub([mockReward type]).andReturn(@"type"); + OCMStub([rewardedInterstitialClassMock adReward]).andReturn(mockReward); + OCMStub([rewardedInterstitialClassMock + presentFromRootViewController:[OCMArg any] + userDidEarnRewardHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + GADUserDidEarnRewardHandler rewardHandler; + [invocation getArgument:&rewardHandler atIndex:3]; + rewardHandler(); + }); + + // Mock callback of paid event handler. + GADAdValue *adValue = OCMClassMock([GADAdValue class]); + OCMStub([adValue value]).andReturn(NSDecimalNumber.one); + OCMStub([adValue precision]).andReturn(GADAdValuePrecisionEstimated); + OCMStub([adValue currencyCode]).andReturn(@"currencyCode"); + OCMStub([rewardedInterstitialClassMock + setPaidEventHandler:[OCMArg checkWithBlock:^BOOL(id obj) { + GADPaidEventHandler handler = obj; + handler(adValue); + return YES; + }]]); + // Call load and check expected interactions with mocks. + [ad load]; + + OCMVerify(ClassMethod([rewardedInterstitialClassMock + loadWithAdUnitID:[OCMArg isEqual:@"testId"] + request:[OCMArg isEqual:gadOrGAMRequest] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdLoaded:[OCMArg isEqual:ad] + responseInfo:[OCMArg isEqual:responseInfo]]); + OCMVerify([rewardedInterstitialClassMock + setFullScreenContentDelegate:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + onPaidEvent:[OCMArg isEqual:ad] + value:[OCMArg checkWithBlock:^BOOL(id obj) { + FLTAdValue *adValue = obj; + XCTAssertEqualObjects( + adValue.valueMicros, + [[NSDecimalNumber alloc] initWithInt:1000000]); + XCTAssertEqual(adValue.precision, GADAdValuePrecisionEstimated); + XCTAssertEqualObjects(adValue.currencyCode, @"currencyCode"); + return TRUE; + }]]); + + // Set SSV and verify interactions with mocks + FLTServerSideVerificationOptions *serverSideVerificationOptions = + OCMClassMock([FLTServerSideVerificationOptions class]); + GADServerSideVerificationOptions *gadOptions = + OCMClassMock([GADServerSideVerificationOptions class]); + OCMStub([serverSideVerificationOptions asGADServerSideVerificationOptions]) + .andReturn(gadOptions); + + [ad setServerSideVerificationOptions:serverSideVerificationOptions]; + + OCMVerify([rewardedInterstitialClassMock + setServerSideVerificationOptions:[OCMArg isEqual:gadOptions]]); + + // Show the ad and verify callbacks are invoked + [ad show]; + + OCMVerify([rewardedInterstitialClassMock + presentFromRootViewController:[OCMArg isNil] + userDidEarnRewardHandler:[OCMArg any]]); + + // Verify full screen callbacks. + OCMVerify([mockManager adWillPresentFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adWillDismissFullScreenContent:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordImpression:[OCMArg isEqual:ad]]); + OCMVerify([mockManager adDidRecordClick:[OCMArg isEqual:ad]]); + OCMVerify([mockManager + didFailToPresentFullScreenContentWithError:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); + + // Verify reward callback. + OCMVerify([mockManager + onRewardedInterstitialAdUserEarnedReward:[OCMArg isEqual:ad] + reward:[OCMArg checkWithBlock:^BOOL( + id obj) { + FLTRewardItem *reward = + (FLTRewardItem *)obj; + XCTAssertEqual(reward.amount, @1.0); + XCTAssertEqual(reward.type, @"type"); + return true; + }]]); + // Call stopMocking. There's a bug where mocks are not stopping automatically + // after the test finishes. + [rewardedInterstitialClassMock stopMocking]; +} + +- (void)testFailedToLoadGADRequest { + FLTAdRequest *request = OCMClassMock([FLTAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GADRequest *gadRequest = OCMClassMock([GADRequest class]); + OCMStub([request asGADRequest:[OCMArg any]]).andReturn(gadRequest); + [self testFailedToLoad:request]; +} + +- (void)testFailedToLoadGAMRequest { + FLTGAMAdRequest *request = OCMClassMock([FLTGAMAdRequest class]); + OCMStub([request keywords]).andReturn(@[ @"apple" ]); + GAMRequest *gamRequest = OCMClassMock([GAMRequest class]); + OCMStub([request asGAMRequest:[OCMArg any]]).andReturn(gamRequest); + [self testFailedToLoad:request]; +} + +// Helper for testing failed to load. +- (void)testFailedToLoad:(FLTAdRequest *)request { + FLTRewardedInterstitialAd *ad = + [[FLTRewardedInterstitialAd alloc] initWithAdUnitId:@"testId" + request:request + adId:@1]; + ad.manager = mockManager; + + id rewardedInterstitialClassMock = + OCMClassMock([GADRewardedInterstitialAd class]); + NSError *error = OCMClassMock([NSError class]); + OCMStub(ClassMethod([rewardedInterstitialClassMock + loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(GADRewardedInterstitialAd *ad, + NSError *error); + [invocation getArgument:&completionHandler atIndex:4]; + completionHandler(nil, error); + }); + + [ad load]; + + OCMVerify(ClassMethod([rewardedInterstitialClassMock + loadWithAdUnitID:[OCMArg any] + request:[OCMArg any] + completionHandler:[OCMArg any]])); + OCMVerify([mockManager onAdFailedToLoad:[OCMArg isEqual:ad] + error:[OCMArg isEqual:error]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformManagerTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformManagerTest.m new file mode 100644 index 00000000..946460ba --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformManagerTest.m @@ -0,0 +1,454 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#include +#import + +#import "FLTUserMessagingPlatformManager.h" +#import "FLTUserMessagingPlatformReaderWriter.h" + +@interface FLTUserMessagingPlatformManagerTest : XCTestCase +@end + +@interface FLTUserMessagingPlatformManager () +@property UIViewController *rootController; +@end + +@implementation FLTUserMessagingPlatformManagerTest { + FLTUserMessagingPlatformManager *umpManager; + NSObject *binaryMessenger; + UMPConsentInformation *mockUmpConsentInformation; + FlutterResult flutterResult; + bool resultInvoked; + id _Nullable returnedResult; +} + +- (void)setUp { + binaryMessenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger)); + umpManager = [[FLTUserMessagingPlatformManager alloc] + initWithBinaryMessenger:binaryMessenger]; + id umpInfoClassMock = OCMClassMock([UMPConsentInformation class]); + OCMStub(ClassMethod([umpInfoClassMock sharedInstance])) + .andReturn(umpInfoClassMock); + mockUmpConsentInformation = umpInfoClassMock; + + resultInvoked = false; + returnedResult = nil; + flutterResult = ^(id _Nullable result) { + self->resultInvoked = true; + self->returnedResult = result; + }; +} + +- (void)testReset { + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"ConsentInformation#reset" + arguments:@{}]; + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, nil); + OCMVerify([mockUmpConsentInformation reset]); +} + +- (void)testGetConsentStatus { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#getConsentStatus" + arguments:@{}]; + + OCMStub([mockUmpConsentInformation consentStatus]) + .andReturn(UMPConsentStatusRequired); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + NSNumber *expected = + [[NSNumber alloc] initWithInteger:UMPConsentStatusRequired]; + XCTAssertEqual(returnedResult, expected); + OCMVerify([mockUmpConsentInformation consentStatus]); +} + +- (void)testCanRequestAds_yes { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#canRequestAds" + arguments:@{}]; + OCMStub([mockUmpConsentInformation canRequestAds]).andReturn(YES); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, [[NSNumber alloc] initWithBool:YES]); +} + +- (void)testCanRequestAds_no { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#canRequestAds" + arguments:@{}]; + OCMStub([mockUmpConsentInformation canRequestAds]).andReturn(NO); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, [[NSNumber alloc] initWithBool:NO]); +} + +- (void)testGetPrivacyOptionsRequirementStatus_notRequiredReturns0 { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName: + @"ConsentInformation#getPrivacyOptionsRequirementStatus" + arguments:@{}]; + OCMStub([mockUmpConsentInformation privacyOptionsRequirementStatus]) + .andReturn(UMPPrivacyOptionsRequirementStatusNotRequired); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + NSNumber *expected = [[NSNumber alloc] initWithInt:0]; + XCTAssertEqual(returnedResult, expected); +} + +- (void)testGetPrivacyOptionsRequirementStatus_requiredReturns1 { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName: + @"ConsentInformation#getPrivacyOptionsRequirementStatus" + arguments:@{}]; + OCMStub([mockUmpConsentInformation privacyOptionsRequirementStatus]) + .andReturn(UMPPrivacyOptionsRequirementStatusRequired); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + NSNumber *expected = [[NSNumber alloc] initWithInt:1]; + XCTAssertEqual(returnedResult, expected); +} + +- (void)testGetPrivacyOptionsRequirementStatus_unknownReturns2 { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName: + @"ConsentInformation#getPrivacyOptionsRequirementStatus" + arguments:@{}]; + OCMStub([mockUmpConsentInformation privacyOptionsRequirementStatus]) + .andReturn(UMPPrivacyOptionsRequirementStatusUnknown); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + NSNumber *expected = [[NSNumber alloc] initWithInt:2]; + XCTAssertEqual(returnedResult, expected); +} + +- (void)testRequestConsentInfoUpdate_success { + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#requestConsentInfoUpdate" + arguments:@{@"params" : params}]; + + OCMStub([mockUmpConsentInformation + requestConsentInfoUpdateWithParameters:[OCMArg isEqual:params] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(NSError *error); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(nil); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([mockUmpConsentInformation + requestConsentInfoUpdateWithParameters:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testRequestConsentInfoUpdate_error { + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#requestConsentInfoUpdate" + arguments:@{@"params" : params}]; + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + OCMStub([mockUmpConsentInformation + requestConsentInfoUpdateWithParameters:[OCMArg isEqual:params] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(NSError *error); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(error); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + + OCMVerify([mockUmpConsentInformation + requestConsentInfoUpdateWithParameters:[OCMArg any] + completionHandler:[OCMArg any]]); + FlutterError *resultError = (FlutterError *)returnedResult; + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.details, @"domain"); + XCTAssertEqualObjects(resultError.message, @"description"); +} + +- (void)testLoadAndShowConsentFormIfRequired_success { + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName: + @"UserMessagingPlatform#loadAndShowConsentFormIfRequired" + arguments:@{@"params" : params}]; + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm + loadAndPresentIfRequiredFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained void (^completionHandler)(NSError *loadError); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(nil); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([mockUmpConsentForm + loadAndPresentIfRequiredFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testLoadAndShowConsentFormIfRequired_error { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName: + @"UserMessagingPlatform#loadAndShowConsentFormIfRequired" + arguments:@{@"params" : params}]; + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm + loadAndPresentIfRequiredFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained void (^completionHandler)(NSError *loadError); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(error); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + FlutterError *resultError = (FlutterError *)returnedResult; + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.details, @"domain"); + XCTAssertEqualObjects(resultError.message, @"description"); + OCMVerify([mockUmpConsentForm + loadAndPresentIfRequiredFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testLoadConsentForm_successAndDispose { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"UserMessagingPlatform#loadConsentForm" + arguments:@{}]; + + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm loadWithCompletionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(UMPConsentForm *form, NSError *loadError); + [invocation getArgument:&completionHandler atIndex:2]; + completionHandler(mockUmpConsentForm, nil); + }); + + FLTUserMessagingPlatformManager *partialMock = OCMPartialMock(umpManager); + FLTUserMessagingPlatformReaderWriter *mockReaderWriter = + OCMClassMock([FLTUserMessagingPlatformReaderWriter class]); + OCMStub([partialMock readerWriter]).andReturn(mockReaderWriter); + + [partialMock handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, mockUmpConsentForm); + OCMVerify([mockUmpConsentForm loadWithCompletionHandler:[OCMArg any]]); + OCMVerify([mockReaderWriter trackConsentForm:mockUmpConsentForm]); +} + +- (void)testLoadConsentForm_error { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"UserMessagingPlatform#loadConsentForm" + arguments:@{}]; + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm loadWithCompletionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(UMPConsentForm *form, NSError *loadError); + [invocation getArgument:&completionHandler atIndex:2]; + completionHandler(mockUmpConsentForm, error); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + OCMVerify([mockUmpConsentForm loadWithCompletionHandler:[OCMArg any]]); + FlutterError *resultError = (FlutterError *)returnedResult; + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.details, @"domain"); + XCTAssertEqualObjects(resultError.message, @"description"); +} + +- (void)testShowPrivacyOptionsForm_success { + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"UserMessagingPlatform#showPrivacyOptionsForm" + arguments:@{@"params" : params}]; + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm + presentPrivacyOptionsFormFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained void (^completionHandler)(NSError *loadError); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(nil); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([mockUmpConsentForm + presentPrivacyOptionsFormFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testShowPrivacyOptionsForm_error { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + UMPRequestParameters *params = OCMClassMock([UMPRequestParameters class]); + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"UserMessagingPlatform#showPrivacyOptionsForm" + arguments:@{@"params" : params}]; + id mockUmpConsentForm = OCMClassMock([UMPConsentForm class]); + OCMStub([mockUmpConsentForm + presentPrivacyOptionsFormFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + __unsafe_unretained void (^completionHandler)(NSError *loadError); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(error); + }); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + FlutterError *resultError = (FlutterError *)returnedResult; + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.details, @"domain"); + XCTAssertEqualObjects(resultError.message, @"description"); + OCMVerify([mockUmpConsentForm + presentPrivacyOptionsFormFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testIsConsentFormAvailable_available { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#isConsentFormAvailable" + arguments:@{}]; + + OCMStub([mockUmpConsentInformation formStatus]) + .andReturn(UMPFormStatusAvailable); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, [[NSNumber alloc] initWithBool:YES]); +} + +- (void)testIsConsentFormAvailable_notAvailable { + FlutterMethodCall *methodCall = [FlutterMethodCall + methodCallWithMethodName:@"ConsentInformation#isConsentFormAvailable" + arguments:@{}]; + + OCMStub([mockUmpConsentInformation formStatus]) + .andReturn(UMPFormStatusUnavailable); + + [umpManager handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertEqual(returnedResult, [[NSNumber alloc] initWithBool:NO]); +} + +- (void)testShowConsentForm_success { + UIViewController *mockUIViewController = OCMClassMock(UIViewController.class); + FLTUserMessagingPlatformManager *partialMock = OCMPartialMock(umpManager); + OCMStub([partialMock rootController]).andReturn(mockUIViewController); + + UMPConsentForm *mockForm = OCMClassMock([UMPConsentForm class]); + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"ConsentForm#show" + arguments:@{@"consentForm" : mockForm}]; + + OCMStub([mockForm presentFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(NSError *error); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(nil); + }); + ; + + [partialMock handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + XCTAssertNil(returnedResult); + OCMVerify([mockForm presentFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); +} + +- (void)testShowConsentForm_error { + UIViewController *mockUIViewController = OCMClassMock(UIViewController.class); + FLTUserMessagingPlatformManager *partialMock = OCMPartialMock(umpManager); + OCMStub([partialMock rootController]).andReturn(mockUIViewController); + + UMPConsentForm *mockForm = OCMClassMock([UMPConsentForm class]); + FlutterMethodCall *methodCall = + [FlutterMethodCall methodCallWithMethodName:@"ConsentForm#show" + arguments:@{@"consentForm" : mockForm}]; + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"description"}; + NSError *error = [NSError errorWithDomain:@"domain" code:1 userInfo:userInfo]; + OCMStub([mockForm presentFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]) + .andDo(^(NSInvocation *invocation) { + void (^completionHandler)(NSError *error); + [invocation getArgument:&completionHandler atIndex:3]; + completionHandler(error); + }); + ; + + [partialMock handleMethodCall:methodCall result:flutterResult]; + + XCTAssertTrue(resultInvoked); + OCMVerify([mockForm presentFromViewController:[OCMArg any] + completionHandler:[OCMArg any]]); + FlutterError *resultError = (FlutterError *)returnedResult; + XCTAssertEqualObjects(resultError.code, @"1"); + XCTAssertEqualObjects(resultError.details, @"domain"); + XCTAssertEqualObjects(resultError.message, @"description"); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformReaderWriterTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformReaderWriterTest.m new file mode 100644 index 00000000..351133c7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/FLTUserMessagingPlatformReaderWriterTest.m @@ -0,0 +1,115 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#include +#import + +#import "FLTUserMessagingPlatformReaderWriter.h" + +@interface FLTUserMessagingPlatformReaderWriterTest : XCTestCase +@end + +@implementation FLTUserMessagingPlatformReaderWriterTest { + FlutterStandardMessageCodec *messageCodec; + FLTUserMessagingPlatformReaderWriter *readerWriter; +} + +- (void)setUp { + readerWriter = [[FLTUserMessagingPlatformReaderWriter alloc] init]; + messageCodec = + [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; +} + +- (void)testRequestParams_default { + UMPRequestParameters *requestParameters = [[UMPRequestParameters alloc] init]; + NSData *encodedMessage = [messageCodec encode:requestParameters]; + + UMPRequestParameters *decoded = [messageCodec decode:encodedMessage]; + XCTAssertEqual(decoded.tagForUnderAgeOfConsent, + requestParameters.tagForUnderAgeOfConsent); + XCTAssertEqual(decoded.debugSettings, requestParameters.debugSettings); +} + +- (void)testRequestParams_withDebugSettingsTfuac { + UMPRequestParameters *requestParameters = [[UMPRequestParameters alloc] init]; + requestParameters.tagForUnderAgeOfConsent = YES; + requestParameters.debugSettings = [[UMPDebugSettings alloc] init]; + NSData *encodedMessage = [messageCodec encode:requestParameters]; + + UMPRequestParameters *decoded = [messageCodec decode:encodedMessage]; + XCTAssertEqual(decoded.tagForUnderAgeOfConsent, + requestParameters.tagForUnderAgeOfConsent); + XCTAssertEqual(decoded.debugSettings.geography, + requestParameters.debugSettings.geography); + XCTAssertEqual(decoded.debugSettings.testDeviceIdentifiers, + requestParameters.debugSettings.testDeviceIdentifiers); +} + +- (void)testConsentDebugSettings_default { + UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init]; + NSData *encodedMessage = [messageCodec encode:debugSettings]; + + UMPDebugSettings *decoded = [messageCodec decode:encodedMessage]; + XCTAssertEqual(decoded.geography, debugSettings.geography); + XCTAssertEqual(decoded.testDeviceIdentifiers, + debugSettings.testDeviceIdentifiers); +} + +- (void)testConsentDebugSettings_geographyTestDeviceIdentifiers { + UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init]; + debugSettings.geography = UMPDebugGeographyOther; + debugSettings.testDeviceIdentifiers = @[ @"id-1", @"id-2" ]; + NSData *encodedMessage = [messageCodec encode:debugSettings]; + + UMPDebugSettings *decoded = [messageCodec decode:encodedMessage]; + XCTAssertEqual(decoded.geography, debugSettings.geography); + XCTAssertEqualObjects(decoded.testDeviceIdentifiers, + debugSettings.testDeviceIdentifiers); +} + +- (void)testConsentFormTrackAndDispose { + UMPConsentForm *form1 = OCMClassMock([UMPConsentForm class]); + UMPConsentForm *form2 = OCMClassMock([UMPConsentForm class]); + UMPConsentForm *form3 = OCMClassMock([UMPConsentForm class]); + + [readerWriter trackConsentForm:form1]; + [readerWriter trackConsentForm:form2]; + [readerWriter trackConsentForm:form3]; + + NSData *encodedMessage1 = [messageCodec encode:form1]; + NSData *encodedMessage2 = [messageCodec encode:form2]; + NSData *encodedMessage3 = [messageCodec encode:form3]; + + UMPConsentForm *decoded1 = [messageCodec decode:encodedMessage1]; + UMPConsentForm *decoded2 = [messageCodec decode:encodedMessage2]; + UMPConsentForm *decoded3 = [messageCodec decode:encodedMessage3]; + + XCTAssertEqual(form1, decoded1); + XCTAssertEqual(form2, decoded2); + XCTAssertEqual(form3, decoded3); + + [readerWriter disposeConsentForm:form1]; + [readerWriter disposeConsentForm:form2]; + [readerWriter disposeConsentForm:form3]; + + decoded1 = [messageCodec decode:encodedMessage1]; + decoded2 = [messageCodec decode:encodedMessage2]; + decoded3 = [messageCodec decode:encodedMessage3]; + XCTAssertNil(decoded1); + XCTAssertNil(decoded2); + XCTAssertNil(decoded3); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateColorTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateColorTest.m new file mode 100644 index 00000000..24ad94e7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateColorTest.m @@ -0,0 +1,41 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateColor.h" +#import +#import + +@interface FLTNativeTemplateColorTest : XCTestCase +@end + +@implementation FLTNativeTemplateColorTest + +- (void)testConvertToUiColor { + FLTNativeTemplateColor *color = [[FLTNativeTemplateColor alloc] + initWithAlpha:[[NSNumber alloc] initWithFloat:5.0f] + red:@10.0f + green:[[NSNumber alloc] initWithFloat:15.0f] + blue:[[NSNumber alloc] initWithFloat:20.0f]]; + CGFloat alpha; + CGFloat red; + CGFloat green; + CGFloat blue; + [color.uiColor getRed:&red green:&green blue:&blue alpha:&alpha]; + XCTAssertEqualWithAccuracy(alpha, 5.0f / 255.0f, FLT_EPSILON); + XCTAssertEqualWithAccuracy(red, 10.0f / 255.0f, FLT_EPSILON); + XCTAssertEqualWithAccuracy(green, 15.0f / 255.0f, FLT_EPSILON); + XCTAssertEqualWithAccuracy(blue, 20.0f / 255.0f, FLT_EPSILON); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateFontStyleTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateFontStyleTest.m new file mode 100644 index 00000000..8657b4de --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateFontStyleTest.m @@ -0,0 +1,38 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateFontStyle.h" +#import + +@interface FLTNativeTemplateFontStyleTest : XCTestCase +@end + +@implementation FLTNativeTemplateFontStyleTest + +- (void)testConvertFromInt { + FLTNativeTemplateFontStyleWrapper *wrapper = + [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:0]; + XCTAssertEqual(wrapper.fontStyle, FLTNativeTemplateFontNormal); + + wrapper = [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:1]; + XCTAssertEqual(wrapper.fontStyle, FLTNativeTemplateFontBold); + + wrapper = [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:2]; + XCTAssertEqual(wrapper.fontStyle, FLTNativeTemplateFontItalic); + + wrapper = [[FLTNativeTemplateFontStyleWrapper alloc] initWithInt:3]; + XCTAssertEqual(wrapper.fontStyle, FLTNativeTemplateFontMonospace); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateStyleTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateStyleTest.m new file mode 100644 index 00000000..208a21f3 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateStyleTest.m @@ -0,0 +1,222 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTNativeTemplateColor.h" +#import "FLTNativeTemplateStyle.h" +#import "FLTNativeTemplateTextStyle.h" +#import "FLTNativeTemplateType.h" + +@interface FLTNativeTemplateStyleTest : XCTestCase +@end + +@implementation FLTNativeTemplateStyleTest + +- (void)testInitNilParameters { + FLTNativeTemplateType *templateType = + [[FLTNativeTemplateType alloc] initWithInt:0]; + + FLTNativeTemplateStyle *style = + [[FLTNativeTemplateStyle alloc] initWithTemplateType:templateType + mainBackgroundColor:nil + callToActionStyle:nil + primaryTextStyle:nil + secondaryTextStyle:nil + tertiaryTextStyle:nil + cornerRadius:nil]; + XCTAssertEqual(style.templateType, templateType); + XCTAssertNil(style.mainBackgroundColor); + XCTAssertNil(style.callToActionStyle); + XCTAssertNil(style.primaryTextStyle); + XCTAssertNil(style.secondaryTextStyle); + XCTAssertNil(style.tertiaryTextStyle); + XCTAssertNil(style.cornerRadius); +} + +- (void)testInit { + FLTNativeTemplateType *templateType = + [[FLTNativeTemplateType alloc] initWithInt:0]; + FLTNativeTemplateColor *bgColor = + OCMClassMock([FLTNativeTemplateColor class]); + UIColor *bgUIColor = OCMClassMock([UIColor class]); + OCMStub([bgColor uiColor]).andReturn(bgUIColor); + FLTNativeTemplateTextStyle *ctaStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + FLTNativeTemplateTextStyle *primaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + FLTNativeTemplateTextStyle *secondaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + FLTNativeTemplateTextStyle *tertiaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + + FLTNativeTemplateStyle *style = + [[FLTNativeTemplateStyle alloc] initWithTemplateType:templateType + mainBackgroundColor:bgColor + callToActionStyle:ctaStyle + primaryTextStyle:primaryStyle + secondaryTextStyle:secondaryStyle + tertiaryTextStyle:tertiaryStyle + cornerRadius:@14.0f]; + + XCTAssertEqual(style.templateType, templateType); + XCTAssertEqual(style.mainBackgroundColor, bgColor); + XCTAssertEqual(style.callToActionStyle, ctaStyle); + XCTAssertEqual(style.primaryTextStyle, primaryStyle); + XCTAssertEqual(style.secondaryTextStyle, secondaryStyle); + XCTAssertEqual(style.tertiaryTextStyle, tertiaryStyle); + XCTAssertEqual(style.cornerRadius, @14.0f); +} + +- (void)testGetDisplayedView { + FLTNativeTemplateType *templateType = + OCMClassMock([FLTNativeTemplateType class]); + GADTTemplateView *templateView = OCMClassMock([GADTTemplateView class]); + OCMStub([templateType templateView]).andReturn(templateView); + + FLTNativeTemplateColor *bgColor = + OCMClassMock([FLTNativeTemplateColor class]); + UIColor *bgUIColor = OCMClassMock([UIColor class]); + OCMStub([bgColor uiColor]).andReturn(bgUIColor); + + // Setup mocks for cta + FLTNativeTemplateTextStyle *ctaStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + UIColor *ctaBackgroundUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *ctaBackgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([ctaBackgroundColor uiColor]).andReturn(ctaBackgroundUIColor); + OCMStub([ctaStyle backgroundColor]).andReturn(ctaBackgroundColor); + + UIColor *ctaTextUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *ctaTextcolor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([ctaTextcolor uiColor]).andReturn(ctaTextUIColor); + OCMStub([ctaStyle textColor]).andReturn(ctaTextcolor); + + UIFont *ctaFont = OCMClassMock([UIFont class]); + OCMStub([ctaStyle uiFont]).andReturn(ctaFont); + + // Setup mocks for primary + FLTNativeTemplateTextStyle *primaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + UIColor *primaryBackgroundUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *primaryBackgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([primaryBackgroundColor uiColor]).andReturn(primaryBackgroundUIColor); + OCMStub([primaryStyle backgroundColor]).andReturn(primaryBackgroundColor); + + UIColor *primaryTextUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *primaryTextcolor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([primaryTextcolor uiColor]).andReturn(primaryTextUIColor); + OCMStub([primaryStyle textColor]).andReturn(primaryTextcolor); + + UIFont *primaryFont = OCMClassMock([UIFont class]); + OCMStub([primaryStyle uiFont]).andReturn(primaryFont); + + // Setup mocks for secondary + FLTNativeTemplateTextStyle *secondaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + UIColor *secondaryBackgroundUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *secondaryBackgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([secondaryBackgroundColor uiColor]) + .andReturn(secondaryBackgroundUIColor); + OCMStub([secondaryStyle backgroundColor]).andReturn(secondaryBackgroundColor); + + UIColor *secondaryTextUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *secondaryTextcolor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([secondaryTextcolor uiColor]).andReturn(secondaryTextUIColor); + OCMStub([secondaryStyle textColor]).andReturn(secondaryTextcolor); + + UIFont *secondaryFont = OCMClassMock([UIFont class]); + OCMStub([secondaryStyle uiFont]).andReturn(secondaryFont); + + // Setup mocks for tertiary + FLTNativeTemplateTextStyle *tertiaryStyle = + OCMClassMock([FLTNativeTemplateTextStyle class]); + UIColor *tertiaryBackgroundUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *tertiaryBackgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([tertiaryBackgroundColor uiColor]) + .andReturn(tertiaryBackgroundUIColor); + OCMStub([tertiaryStyle backgroundColor]).andReturn(tertiaryBackgroundColor); + + UIColor *tertiaryTextUIColor = OCMClassMock([UIColor class]); + FLTNativeTemplateColor *tertiaryTextcolor = + OCMClassMock([FLTNativeTemplateColor class]); + OCMStub([tertiaryTextcolor uiColor]).andReturn(tertiaryTextUIColor); + OCMStub([tertiaryStyle textColor]).andReturn(tertiaryTextcolor); + + UIFont *tertiaryFont = OCMClassMock([UIFont class]); + OCMStub([tertiaryStyle uiFont]).andReturn(tertiaryFont); + + FLTNativeTemplateStyle *style = + [[FLTNativeTemplateStyle alloc] initWithTemplateType:templateType + mainBackgroundColor:bgColor + callToActionStyle:ctaStyle + primaryTextStyle:primaryStyle + secondaryTextStyle:secondaryStyle + tertiaryTextStyle:tertiaryStyle + cornerRadius:@14.0f]; + + GADNativeAd *gadNativeAd = OCMClassMock([GADNativeAd class]); + + FLTNativeTemplateViewWrapper *templateViewWrapper = + [style getDisplayedView:gadNativeAd]; + XCTAssertEqual(templateViewWrapper.templateView, templateView); + OCMVerify([templateView setNativeAd:[OCMArg isEqual:gadNativeAd]]); + OCMVerify([templateView + setStyles:[OCMArg checkWithBlock:^BOOL(id obj) { + NSDictionary *styles = obj; + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyCornerRadius], @14.0f); + + XCTAssertEqual( + styles[GADTNativeTemplateStyleKeyCallToActionBackgroundColor], + ctaBackgroundUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyCallToActionFontColor], + ctaTextUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyCallToActionFont], + ctaFont); + + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyPrimaryBackgroundColor], + primaryBackgroundUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyPrimaryFontColor], + primaryTextUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyPrimaryFont], + primaryFont); + + XCTAssertEqual( + styles[GADTNativeTemplateStyleKeySecondaryBackgroundColor], + secondaryBackgroundUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeySecondaryFontColor], + secondaryTextUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeySecondaryFont], + secondaryFont); + + XCTAssertEqual( + styles[GADTNativeTemplateStyleKeyTertiaryBackgroundColor], + tertiaryBackgroundUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyTertiaryFontColor], + tertiaryTextUIColor); + XCTAssertEqual(styles[GADTNativeTemplateStyleKeyTertiaryFont], + tertiaryFont); + return YES; + }]]); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTextStyleTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTextStyleTest.m new file mode 100644 index 00000000..1aff4db1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTextStyleTest.m @@ -0,0 +1,148 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +#import "FLTNativeTemplateTextStyle.h" + +@interface FLTNativeTemplateTextStyleTest : XCTestCase +@end + +@implementation FLTNativeTemplateTextStyleTest + +- (void)testInitWithNilParameters { + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:nil + backgroundColor:nil + fontStyle:nil + size:nil]; + XCTAssertNil(textStyle.uiFont); + XCTAssertNil(textStyle.backgroundColor); + XCTAssertNil(textStyle.textColor); + XCTAssertNil(textStyle.fontStyle); + XCTAssertNil(textStyle.size); +} + +- (void)testInitWithDefinedParams { + FLTNativeTemplateColor *textColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateColor *backgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateFontStyleWrapper *fontStyleWrapper = + OCMClassMock([FLTNativeTemplateFontStyleWrapper class]); + OCMStub([fontStyleWrapper fontStyle]).andReturn(FLTNativeTemplateFontBold); + NSNumber *size = [[NSNumber alloc] initWithFloat:14.0f]; + + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:fontStyleWrapper + size:size]; + + XCTAssertEqual(textStyle.backgroundColor, backgroundColor); + XCTAssertEqual(textStyle.textColor, textColor); + XCTAssertEqual(textStyle.fontStyle, fontStyleWrapper); + XCTAssertEqual(textStyle.size, size); + + UIFont *font = textStyle.uiFont; + UIFont *expectedFont = [UIFont boldSystemFontOfSize:14.0f]; + XCTAssertEqual(font.pointSize, expectedFont.pointSize); + XCTAssertEqual(font.fontName, expectedFont.fontName); + XCTAssertEqual(font.familyName, expectedFont.familyName); +} + +- (void)testUiFontWithMissingSize { + FLTNativeTemplateColor *textColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateColor *backgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateFontStyleWrapper *fontStyleWrapper = + OCMClassMock([FLTNativeTemplateFontStyleWrapper class]); + OCMStub([fontStyleWrapper fontStyle]).andReturn(FLTNativeTemplateFontItalic); + + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:fontStyleWrapper + size:nil]; + + XCTAssertEqual(textStyle.backgroundColor, backgroundColor); + XCTAssertEqual(textStyle.textColor, textColor); + XCTAssertEqual(textStyle.fontStyle, fontStyleWrapper); + XCTAssertNil(textStyle.size); + + UIFont *font = textStyle.uiFont; + // System font size is used when size is not defined + UIFont *expectedFont = [UIFont italicSystemFontOfSize:UIFont.systemFontSize]; + XCTAssertEqual(font.pointSize, expectedFont.pointSize); + XCTAssertEqual(font.fontName, expectedFont.fontName); + XCTAssertEqual(font.familyName, expectedFont.familyName); +} + +- (void)testUiFontWithMissingFontStyle { + FLTNativeTemplateColor *textColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateColor *backgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + NSNumber *size = [[NSNumber alloc] initWithFloat:14.0f]; + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:nil + size:size]; + + XCTAssertEqual(textStyle.backgroundColor, backgroundColor); + XCTAssertEqual(textStyle.textColor, textColor); + XCTAssertNil(textStyle.fontStyle); + XCTAssertEqual(textStyle.size, size); + + UIFont *font = textStyle.uiFont; + // Default system font type is used when fontStyle is not defined + UIFont *expectedFont = [UIFont systemFontOfSize:14.0f]; + XCTAssertEqual(font.pointSize, expectedFont.pointSize); + XCTAssertEqual(font.fontName, expectedFont.fontName); + XCTAssertEqual(font.familyName, expectedFont.familyName); +} + +- (void)testUiFontWithUnknownFontStyle { + FLTNativeTemplateColor *textColor = + OCMClassMock([FLTNativeTemplateColor class]); + FLTNativeTemplateColor *backgroundColor = + OCMClassMock([FLTNativeTemplateColor class]); + NSNumber *size = [[NSNumber alloc] initWithFloat:14.0f]; + FLTNativeTemplateFontStyleWrapper *fontStyleWrapper = + OCMClassMock([FLTNativeTemplateFontStyleWrapper class]); + OCMStub([fontStyleWrapper fontStyle]).andReturn(-1); + + FLTNativeTemplateTextStyle *textStyle = + [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:fontStyleWrapper + size:size]; + + XCTAssertEqual(textStyle.backgroundColor, backgroundColor); + XCTAssertEqual(textStyle.textColor, textColor); + XCTAssertEqual(textStyle.fontStyle, fontStyleWrapper); + XCTAssertEqual(textStyle.size, size); + + UIFont *font = textStyle.uiFont; + // Default system font type is used when fontStyle is unknown + UIFont *expectedFont = [UIFont systemFontOfSize:14.0f]; + XCTAssertEqual(font.pointSize, expectedFont.pointSize); + XCTAssertEqual(font.fontName, expectedFont.fontName); + XCTAssertEqual(font.familyName, expectedFont.familyName); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTypeTest.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTypeTest.m new file mode 100644 index 00000000..94b32771 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/RunnerTests/NativeTemplates/FLTNativeTemplateTypeTest.m @@ -0,0 +1,42 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateType.h" +#import + +@interface FLTNativeTemplateTypeTest : XCTestCase +@end + +@implementation FLTNativeTemplateTypeTest + +- (void)testXibName { + FLTNativeTemplateType *templateTypeSmall = + [[FLTNativeTemplateType alloc] initWithInt:0]; + XCTAssertEqualObjects(templateTypeSmall.xibName, @"GADTSmallTemplateView"); + + FLTNativeTemplateType *templateTypeMedium = + [[FLTNativeTemplateType alloc] initWithInt:1]; + XCTAssertEqualObjects(templateTypeMedium.xibName, @"GADTMediumTemplateView"); + + // Unknown templates default to medium + FLTNativeTemplateType *templateTypeUnknown = + [[FLTNativeTemplateType alloc] initWithInt:-1]; + XCTAssertEqualObjects(templateTypeUnknown.xibName, @"GADTMediumTemplateView"); + + FLTNativeTemplateType *templateType = + [[FLTNativeTemplateType alloc] initWithInt:2]; + XCTAssertEqualObjects(templateType.xibName, @"GADTMediumTemplateView"); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/google_mobile_ads_exampleTests/Info.plist b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/google_mobile_ads_exampleTests/Info.plist new file mode 100644 index 00000000..64d65ca4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/ios/google_mobile_ads_exampleTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/anchored_adaptive_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/anchored_adaptive_example.dart new file mode 100644 index 00000000..02719666 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/anchored_adaptive_example.dart @@ -0,0 +1,146 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'constants.dart'; + +/// This example demonstrates anchored adaptive banner ads. +/// +/// Loads an anchored adaptive banner ad and displays it at the bottom of the +/// screen. This also handles loading a new ad on orientation change. +class AnchoredAdaptiveExample extends StatefulWidget { + @override + _AnchoredAdaptiveExampleState createState() => + _AnchoredAdaptiveExampleState(); +} + +class _AnchoredAdaptiveExampleState extends State { + BannerAd? _anchoredAdaptiveAd; + bool _isLoaded = false; + late Orientation _currentOrientation; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _currentOrientation = MediaQuery.of(context).orientation; + _loadAd(); + } + + /// Load another ad, disposing of the current ad if there is one. + Future _loadAd() async { + await _anchoredAdaptiveAd?.dispose(); + setState(() { + _anchoredAdaptiveAd = null; + _isLoaded = false; + }); + + final AnchoredAdaptiveBannerAdSize? size = + await AdSize.getLargeAnchoredAdaptiveBannerAdSize( + MediaQuery.of(context).size.width.truncate(), + ); + + if (size == null) { + print('Unable to get height of anchored banner.'); + return; + } + + _anchoredAdaptiveAd = BannerAd( + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/9214589741' + : 'ca-app-pub-3940256099942544/2435281174', + size: size, + request: AdRequest(), + listener: BannerAdListener( + onAdLoaded: (Ad ad) { + print('$ad loaded: ${ad.responseInfo}'); + setState(() { + // When the ad is loaded, get the ad size and use it to set + // the height of the ad container. + _anchoredAdaptiveAd = ad as BannerAd; + _isLoaded = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('Anchored adaptive banner failedToLoad: $error'); + ad.dispose(); + }, + ), + ); + return _anchoredAdaptiveAd!.load(); + } + + /// Gets a widget containing the ad, if one is loaded. + /// + /// Returns an empty container if no ad is loaded, or the orientation + /// has changed. Also loads a new ad if the orientation changes. + Widget _getAdWidget() { + return OrientationBuilder( + builder: (context, orientation) { + if (_currentOrientation == orientation && + _anchoredAdaptiveAd != null && + _isLoaded) { + return Container( + color: Colors.green, + width: _anchoredAdaptiveAd!.size.width.toDouble(), + height: _anchoredAdaptiveAd!.size.height.toDouble(), + child: AdWidget(ad: _anchoredAdaptiveAd!), + ); + } + // Reload the ad if the orientation changes. + if (_currentOrientation != orientation) { + _currentOrientation = orientation; + _loadAd(); + } + return Container(); + }, + ); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: Text('Anchored adaptive banner example')), + body: Center( + child: Stack( + alignment: AlignmentDirectional.bottomCenter, + children: [ + ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + itemBuilder: (context, index) { + return Text( + Constants.placeholderText, + style: TextStyle(fontSize: 24), + ); + }, + separatorBuilder: (context, index) { + return Container(height: 40); + }, + itemCount: 5, + ), + _getAdWidget(), + ], + ), + ), + ); + + @override + void dispose() { + super.dispose(); + _anchoredAdaptiveAd?.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/constants.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/constants.dart new file mode 100644 index 00000000..b71613c4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/constants.dart @@ -0,0 +1,30 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +/// Constants used in the example app. +class Constants { + /// Placeholder text. + static const String placeholderText = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod' + ' tempor incididunt ut labore et dolore magna aliqua. Faucibus purus in' + ' massa tempor. Quis enim lobortis scelerisque fermentum dui faucibus' + ' in. Nibh praesent tristique magna sit amet purus gravida quis.' + ' Magna sit amet purus gravida quis blandit turpis cursus in. Sed' + ' adipiscing diam donec adipiscing tristique. Urna porttitor rhoncus' + ' dolor purus non enim praesent. Pellentesque habitant morbi tristique' + ' senectus et netus. Risus ultricies tristique nulla aliquet enim tortor' + ' at.'; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/fluid_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/fluid_example.dart new file mode 100644 index 00000000..361ffee9 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/fluid_example.dart @@ -0,0 +1,102 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'constants.dart'; + +/// This example demonstrates fluid ads. +class FluidExample extends StatefulWidget { + @override + _FluidExampleExampleState createState() => _FluidExampleExampleState(); +} + +class _FluidExampleExampleState extends State { + FluidAdManagerBannerAd? _fluidAd; + double _width = 200.0; + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: Text('Fluid example')), + body: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView.separated( + itemCount: 3, + separatorBuilder: (BuildContext context, int index) { + return Container(height: 40); + }, + itemBuilder: (BuildContext context, int index) { + if (index == 1) { + return Align( + alignment: Alignment.center, + child: FluidAdWidget(width: _width, ad: _fluidAd!), + ); + } else if (index == 2) { + return ElevatedButton( + onPressed: () { + double newWidth; + if (_width == 200.0) { + newWidth = 100.0; + } else if (_width == 100.0) { + newWidth = 150.0; + } else { + newWidth = 200.0; + } + setState(() { + _width = newWidth; + }); + }, + child: Text('Change size'), + ); + } + return Text( + Constants.placeholderText, + style: TextStyle(fontSize: 24), + ); + }, + ), + ), + ), + ); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Create the ad objects and load ads. + _fluidAd = FluidAdManagerBannerAd( + adUnitId: '/6499/example/APIDemo/Fluid', + request: AdManagerAdRequest(nonPersonalizedAds: true), + listener: AdManagerBannerAdListener( + onAdLoaded: (Ad ad) { + print('$_fluidAd loaded.'); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('$_fluidAd failedToLoad: $error'); + ad.dispose(); + }, + onAdOpened: (Ad ad) => print('$_fluidAd onAdOpened.'), + onAdClosed: (Ad ad) => print('$_fluidAd onAdClosed.'), + ), + )..load(); + } + + @override + void dispose() { + super.dispose(); + _fluidAd?.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/inline_adaptive_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/inline_adaptive_example.dart new file mode 100644 index 00000000..0052508f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/inline_adaptive_example.dart @@ -0,0 +1,154 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'constants.dart'; + +/// This example demonstrates inline adaptive banner ads. +/// +/// Loads and shows an inline adaptive banner ad in a scrolling view, +/// and reloads the ad when the orientation changes. +class InlineAdaptiveExample extends StatefulWidget { + @override + _InlineAdaptiveExampleState createState() => _InlineAdaptiveExampleState(); +} + +class _InlineAdaptiveExampleState extends State { + static const _insets = 16.0; + AdManagerBannerAd? _inlineAdaptiveAd; + bool _isLoaded = false; + AdSize? _adSize; + late Orientation _currentOrientation; + + double get _adWidth => MediaQuery.of(context).size.width - (2 * _insets); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _currentOrientation = MediaQuery.of(context).orientation; + _loadAd(); + } + + void _loadAd() async { + await _inlineAdaptiveAd?.dispose(); + setState(() { + _inlineAdaptiveAd = null; + _isLoaded = false; + }); + + // Get an inline adaptive size for the current orientation. + AdSize size = AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize( + _adWidth.truncate(), + ); + + _inlineAdaptiveAd = AdManagerBannerAd( + adUnitId: Platform.isAndroid + ? '/21775744923/example/banner' + : '/21775744923/example/adaptive-banner', + sizes: [size], + request: AdManagerAdRequest(), + listener: AdManagerBannerAdListener( + onAdLoaded: (Ad ad) async { + print('Inline adaptive banner loaded: ${ad.responseInfo}'); + + // After the ad is loaded, get the platform ad size and use it to + // update the height of the container. This is necessary because the + // height can change after the ad is loaded. + AdManagerBannerAd bannerAd = (ad as AdManagerBannerAd); + final AdSize? size = await bannerAd.getPlatformAdSize(); + if (size == null) { + print('Error: getPlatformAdSize() returned null for $bannerAd'); + return; + } + + setState(() { + _inlineAdaptiveAd = bannerAd; + _isLoaded = true; + _adSize = size; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('Inline adaptive banner failedToLoad: $error'); + ad.dispose(); + }, + ), + ); + await _inlineAdaptiveAd!.load(); + } + + /// Gets a widget containing the ad, if one is loaded. + /// + /// Returns an empty container if no ad is loaded, or the orientation + /// has changed. Also loads a new ad if the orientation changes. + Widget _getAdWidget() { + return OrientationBuilder( + builder: (context, orientation) { + if (_currentOrientation == orientation && + _inlineAdaptiveAd != null && + _isLoaded && + _adSize != null) { + return Align( + child: Container( + width: _adWidth, + height: _adSize!.height.toDouble(), + child: AdWidget(ad: _inlineAdaptiveAd!), + ), + ); + } + // Reload the ad if the orientation changes. + if (_currentOrientation != orientation) { + _currentOrientation = orientation; + _loadAd(); + } + return Container(); + }, + ); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: Text('Inline adaptive banner example')), + body: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: _insets), + child: ListView.separated( + itemCount: 3, + separatorBuilder: (BuildContext context, int index) { + return Container(height: 40); + }, + itemBuilder: (BuildContext context, int index) { + if (index == 1) { + return _getAdWidget(); + } + return Text( + Constants.placeholderText, + style: TextStyle(fontSize: 24), + ); + }, + ), + ), + ), + ); + + @override + void dispose() { + super.dispose(); + _inlineAdaptiveAd?.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/main.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/main.dart new file mode 100644 index 00000000..8ee75cb5 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/main.dart @@ -0,0 +1,388 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io' show Platform; + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'dart:developer'; + +import 'anchored_adaptive_example.dart'; +import 'fluid_example.dart'; +import 'inline_adaptive_example.dart'; +import 'multi_adaptive_inline_with_recycle_example.dart'; +import 'native_template_example.dart'; +import 'reusable_inline_example.dart'; +import 'webview_example.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + MobileAds.instance.initialize(); + runApp(MyApp()); +} + +// You can also test with your own ad unit IDs by registering your device as a +// test device. Check the logs for your device's ID value. +const String testDevice = 'YOUR_DEVICE_ID'; +const int maxFailedLoadAttempts = 3; + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + static final AdRequest request = AdRequest( + keywords: ['foo', 'bar'], + contentUrl: 'http://foo.com/bar.html', + nonPersonalizedAds: true, + ); + + static const interstitialButtonText = 'InterstitialAd'; + static const rewardedButtonText = 'RewardedAd'; + static const rewardedInterstitialButtonText = 'RewardedInterstitialAd'; + static const fluidButtonText = 'Fluid'; + static const inlineAdaptiveButtonText = 'Inline adaptive'; + static const mulipleInlineAdaptiveWithRecycleButtonText = + 'Multiple inline adaptive with recycle'; + static const anchoredAdaptiveButtonText = 'Anchored adaptive'; + static const nativeTemplateButtonText = 'Native template'; + static const webviewExampleButtonText = 'Register WebView'; + static const adInspectorButtonText = 'Ad Inspector'; + + InterstitialAd? _interstitialAd; + int _numInterstitialLoadAttempts = 0; + + RewardedAd? _rewardedAd; + int _numRewardedLoadAttempts = 0; + + RewardedInterstitialAd? _rewardedInterstitialAd; + int _numRewardedInterstitialLoadAttempts = 0; + + @override + void initState() { + super.initState(); + MobileAds.instance.updateRequestConfiguration( + RequestConfiguration(testDeviceIds: [testDevice]), + ); + _createInterstitialAd(); + _createRewardedAd(); + _createRewardedInterstitialAd(); + } + + void _createInterstitialAd() { + InterstitialAd.load( + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/1033173712' + : 'ca-app-pub-3940256099942544/4411468910', + request: request, + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (InterstitialAd ad) { + print('$ad loaded'); + _interstitialAd = ad; + _numInterstitialLoadAttempts = 0; + _interstitialAd!.setImmersiveMode(true); + }, + onAdFailedToLoad: (LoadAdError error) { + print('InterstitialAd failed to load: $error.'); + _numInterstitialLoadAttempts += 1; + _interstitialAd = null; + if (_numInterstitialLoadAttempts < maxFailedLoadAttempts) { + _createInterstitialAd(); + } + }, + ), + ); + } + + void _showInterstitialAd() { + if (_interstitialAd == null) { + print('Warning: attempt to show interstitial before loaded.'); + return; + } + _interstitialAd!.fullScreenContentCallback = FullScreenContentCallback( + onAdShowedFullScreenContent: (InterstitialAd ad) => + print('ad onAdShowedFullScreenContent.'), + onAdDismissedFullScreenContent: (InterstitialAd ad) { + print('$ad onAdDismissedFullScreenContent.'); + ad.dispose(); + _createInterstitialAd(); + }, + onAdFailedToShowFullScreenContent: (InterstitialAd ad, AdError error) { + print('$ad onAdFailedToShowFullScreenContent: $error'); + ad.dispose(); + _createInterstitialAd(); + }, + ); + _interstitialAd!.show(); + _interstitialAd = null; + } + + void _createRewardedAd() { + RewardedAd.load( + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/5224354917' + : 'ca-app-pub-3940256099942544/1712485313', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (RewardedAd ad) { + print('$ad loaded.'); + _rewardedAd = ad; + _numRewardedLoadAttempts = 0; + }, + onAdFailedToLoad: (LoadAdError error) { + print('RewardedAd failed to load: $error'); + _rewardedAd = null; + _numRewardedLoadAttempts += 1; + if (_numRewardedLoadAttempts < maxFailedLoadAttempts) { + _createRewardedAd(); + } + }, + ), + ); + } + + void _showRewardedAd() { + if (_rewardedAd == null) { + print('Warning: attempt to show rewarded before loaded.'); + return; + } + _rewardedAd!.fullScreenContentCallback = FullScreenContentCallback( + onAdShowedFullScreenContent: (RewardedAd ad) => + print('ad onAdShowedFullScreenContent.'), + onAdDismissedFullScreenContent: (RewardedAd ad) { + print('$ad onAdDismissedFullScreenContent.'); + ad.dispose(); + _createRewardedAd(); + }, + onAdFailedToShowFullScreenContent: (RewardedAd ad, AdError error) { + print('$ad onAdFailedToShowFullScreenContent: $error'); + ad.dispose(); + _createRewardedAd(); + }, + ); + + _rewardedAd!.setImmersiveMode(true); + _rewardedAd!.show( + onUserEarnedReward: (AdWithoutView ad, RewardItem reward) { + print('$ad with reward $RewardItem(${reward.amount}, ${reward.type})'); + }, + ); + _rewardedAd = null; + } + + void _createRewardedInterstitialAd() { + RewardedInterstitialAd.load( + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/5354046379' + : 'ca-app-pub-3940256099942544/6978759866', + request: request, + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (RewardedInterstitialAd ad) { + print('$ad loaded.'); + _rewardedInterstitialAd = ad; + _numRewardedInterstitialLoadAttempts = 0; + }, + onAdFailedToLoad: (LoadAdError error) { + print('RewardedInterstitialAd failed to load: $error'); + _rewardedInterstitialAd = null; + _numRewardedInterstitialLoadAttempts += 1; + if (_numRewardedInterstitialLoadAttempts < maxFailedLoadAttempts) { + _createRewardedInterstitialAd(); + } + }, + ), + ); + } + + void _showRewardedInterstitialAd() { + if (_rewardedInterstitialAd == null) { + print('Warning: attempt to show rewarded interstitial before loaded.'); + return; + } + _rewardedInterstitialAd!.fullScreenContentCallback = + FullScreenContentCallback( + onAdShowedFullScreenContent: (RewardedInterstitialAd ad) => + print('$ad onAdShowedFullScreenContent.'), + onAdDismissedFullScreenContent: (RewardedInterstitialAd ad) { + print('$ad onAdDismissedFullScreenContent.'); + ad.dispose(); + _createRewardedInterstitialAd(); + }, + onAdFailedToShowFullScreenContent: + (RewardedInterstitialAd ad, AdError error) { + print('$ad onAdFailedToShowFullScreenContent: $error'); + ad.dispose(); + _createRewardedInterstitialAd(); + }, + ); + + _rewardedInterstitialAd!.setImmersiveMode(true); + _rewardedInterstitialAd!.show( + onUserEarnedReward: (AdWithoutView ad, RewardItem reward) { + print('$ad with reward $RewardItem(${reward.amount}, ${reward.type})'); + }, + ); + _rewardedInterstitialAd = null; + } + + @override + void dispose() { + super.dispose(); + _interstitialAd?.dispose(); + _rewardedAd?.dispose(); + _rewardedInterstitialAd?.dispose(); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Builder( + builder: (BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('AdMob Plugin example app'), + actions: [ + PopupMenuButton( + onSelected: (String result) { + switch (result) { + case interstitialButtonText: + _showInterstitialAd(); + break; + case rewardedButtonText: + _showRewardedAd(); + break; + case rewardedInterstitialButtonText: + _showRewardedInterstitialAd(); + break; + case fluidButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FluidExample(), + ), + ); + break; + case inlineAdaptiveButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => InlineAdaptiveExample(), + ), + ); + break; + case mulipleInlineAdaptiveWithRecycleButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + MultiInlineAdaptiveWithRecycleExample(), + ), + ); + break; + case anchoredAdaptiveButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AnchoredAdaptiveExample(), + ), + ); + break; + case nativeTemplateButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => NativeTemplateExample(), + ), + ); + break; + case webviewExampleButtonText: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => WebViewExample(), + ), + ); + break; + case adInspectorButtonText: + MobileAds.instance.openAdInspector( + (error) => log( + 'Ad Inspector ' + + (error == null + ? 'opened.' + : 'error: ' + (error.message ?? '')), + ), + ); + break; + default: + throw AssertionError('unexpected button: $result'); + } + }, + itemBuilder: (BuildContext context) => + >[ + PopupMenuItem( + value: interstitialButtonText, + child: Text(interstitialButtonText), + ), + PopupMenuItem( + value: rewardedButtonText, + child: Text(rewardedButtonText), + ), + PopupMenuItem( + value: rewardedInterstitialButtonText, + child: Text(rewardedInterstitialButtonText), + ), + PopupMenuItem( + value: fluidButtonText, + child: Text(fluidButtonText), + ), + PopupMenuItem( + value: inlineAdaptiveButtonText, + child: Text(inlineAdaptiveButtonText), + ), + PopupMenuItem( + value: mulipleInlineAdaptiveWithRecycleButtonText, + child: Text( + mulipleInlineAdaptiveWithRecycleButtonText, + ), + ), + PopupMenuItem( + value: anchoredAdaptiveButtonText, + child: Text(anchoredAdaptiveButtonText), + ), + PopupMenuItem( + value: nativeTemplateButtonText, + child: Text(nativeTemplateButtonText), + ), + PopupMenuItem( + value: webviewExampleButtonText, + child: Text(webviewExampleButtonText), + ), + PopupMenuItem( + value: adInspectorButtonText, + child: Text(adInspectorButtonText), + ), + ], + ), + ], + ), + body: SafeArea(child: ReusableInlineExample()), + ); + }, + ), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/multi_adaptive_inline_with_recycle_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/multi_adaptive_inline_with_recycle_example.dart new file mode 100644 index 00000000..f1c310c2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/multi_adaptive_inline_with_recycle_example.dart @@ -0,0 +1,148 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:collection/collection.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +/// This example demonstrates inline adaptive ads in a list view, where banners +/// are recycle to improve performance. +class MultiInlineAdaptiveWithRecycleExample extends StatefulWidget { + @override + _MultiInlineAdaptiveWithRecycleExampleState createState() => + _MultiInlineAdaptiveWithRecycleExampleState(); +} + +class _MultiInlineAdaptiveWithRecycleExampleState + extends State { + // A list of all the banners created. + final List _banners = []; + // Keep track of sizes of the banners (since they can be different sizes). + final Map _bannerSizes = {}; + // A set of all failed banners to retry. + final Set _failedBanners = {}; + + // The maximum number of banners to create. + static const int _cacheSize = 10; + // Show a banner every 3 rows (i.e. row index 0, 3, 6, 9 etc will be banner rows. + static const int _adInterval = 3; + // Keep track of the positions of banners. + final Map _bannerPositions = {}; + + BannerAd _createBannerAd() { + final String bannerId = Platform.isAndroid + ? 'ca-app-pub-3940256099942544/6300978111' + : 'ca-app-pub-3940256099942544/2934735716'; + AdSize adSize = AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(360); + final BannerAd bannerAd = BannerAd( + adUnitId: bannerId, + request: const AdRequest(), + size: adSize, + listener: BannerAdListener( + onAdLoaded: (Ad ad) async { + BannerAd bannerAd = (ad as BannerAd); + if (_failedBanners.contains(bannerAd)) { + _failedBanners.remove(bannerAd); + } + final AdSize? adSize = await bannerAd.getPlatformAdSize(); + // When the banner size is updated, rebuild by calling setState. + if (adSize != null && adSize != _bannerSizes[bannerAd]) { + setState(() { + _bannerSizes[bannerAd] = adSize; + }); + } + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + _failedBanners.add(ad as BannerAd); + }, + onAdImpression: (Ad ad) { + print('Banner ad impression occurred.'); + }, + ), + ); + bannerAd.load(); + return bannerAd; + } + + BannerAd _getRecycledBannerAd(int bannerPosition) { + // If already created a banner for current position, just reuse it. + BannerAd? currentBannerAd = _bannerPositions.entries + .firstWhereOrNull((entry) => entry.value == bannerPosition) + ?.key; + if (currentBannerAd != null) { + return currentBannerAd; + } + + if (_banners.length < _cacheSize) { + // If the cache is not full, create a new banner + BannerAd bannerAd = _createBannerAd(); + _banners.add(bannerAd); + _bannerPositions[bannerAd] = bannerPosition; + return bannerAd; + } + // If cache is full, recycle the banner (if possible). + BannerAd bannerAd = _banners[bannerPosition % _cacheSize]; + if (_failedBanners.contains(bannerAd)) { + // if it's failed previously, reload it. + bannerAd.load(); + _failedBanners.remove(bannerAd); + } + if (bannerAd.isMounted) { + // Create a new banner if it's not possible to recycle the banner + // e.g. show 15 banners on screen, but _cacheSize is only 10. + // This should be a corner case indicating _cacheSize should be increased. + bannerAd = _createBannerAd(); + } + _bannerPositions[bannerAd] = bannerPosition; + return bannerAd; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Adaptive Size, Recycle')), + body: ListView.builder( + // Arbitrary example of 100 items in the list. + itemCount: 100, + itemBuilder: (BuildContext context, int index) { + if (index % _adInterval == 0) { + int bannerPosition = index ~/ _adInterval; + BannerAd bannerAd = _getRecycledBannerAd(bannerPosition); + final AdSize? adSize = _bannerSizes[bannerAd]; + if (adSize == null) { + // Null adSize means the banner's content is not fetched yet. + return SizedBox.shrink(); + } + // Now this banner is loaded with ad content and corresponding ad size. + return SizedBox( + width: adSize.width.toDouble(), + height: adSize.height.toDouble(), + child: AdWidget(ad: bannerAd), + ); + } + + // Show your regular non-ad content. + return Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.blue, + width: 1.0, + style: BorderStyle.solid, + ), + ), + child: SizedBox( + height: 100, + child: ColoredBox(color: Colors.yellow), + ), + ); + }, + ), + ); + } + + @override + void dispose() { + for (final banner in _banners) { + banner.dispose(); + } + super.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/native_template_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/native_template_example.dart new file mode 100644 index 00000000..415db8ed --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/native_template_example.dart @@ -0,0 +1,106 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'constants.dart'; + +/// This example demonstrates native templates. +class NativeTemplateExample extends StatefulWidget { + @override + _NativeTemplateExampleExampleState createState() => + _NativeTemplateExampleExampleState(); +} + +class _NativeTemplateExampleExampleState extends State { + NativeAd? _nativeAd; + bool _nativeAdIsLoaded = false; + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: Text('Native templates example')), + body: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView.separated( + itemCount: 10, + separatorBuilder: (BuildContext context, int index) { + return Container(height: 40); + }, + itemBuilder: (BuildContext context, int index) { + if (index == 5 && _nativeAd != null && _nativeAdIsLoaded) { + return Align( + alignment: Alignment.center, + child: ConstrainedBox( + constraints: const BoxConstraints( + minWidth: 300, + minHeight: 350, + maxHeight: 400, + maxWidth: 450, + ), + child: AdWidget(ad: _nativeAd!), + ), + ); + } + return Text( + Constants.placeholderText, + style: TextStyle(fontSize: 24), + ); + }, + ), + ), + ), + ); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Create the ad objects and load ads. + _nativeAd = NativeAd( + adUnitId: '/6499/example/native', + request: AdRequest(), + listener: NativeAdListener( + onAdLoaded: (Ad ad) { + print('$NativeAd loaded.'); + setState(() { + _nativeAdIsLoaded = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('$NativeAd failedToLoad: $error'); + ad.dispose(); + }, + onAdOpened: (Ad ad) => print('$NativeAd onAdOpened.'), + onAdClosed: (Ad ad) => print('$NativeAd onAdClosed.'), + ), + nativeTemplateStyle: NativeTemplateStyle( + templateType: TemplateType.medium, + mainBackgroundColor: Colors.white12, + callToActionTextStyle: NativeTemplateTextStyle(size: 16.0), + primaryTextStyle: NativeTemplateTextStyle( + textColor: Colors.black38, + backgroundColor: Colors.white70, + ), + ), + )..load(); + } + + @override + void dispose() { + super.dispose(); + _nativeAd?.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/reusable_inline_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/reusable_inline_example.dart new file mode 100644 index 00000000..18711161 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/reusable_inline_example.dart @@ -0,0 +1,163 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'constants.dart'; +import 'dart:io' show Platform; + +/// This example demonstrates inline ads in a list view, where the ad objects +/// live for the lifetime of this widget. +class ReusableInlineExample extends StatefulWidget { + @override + _ReusableInlineExampleState createState() => _ReusableInlineExampleState(); +} + +class _ReusableInlineExampleState extends State { + BannerAd? _bannerAd; + bool _bannerAdIsLoaded = false; + + AdManagerBannerAd? _adManagerBannerAd; + bool _adManagerBannerAdIsLoaded = false; + + NativeAd? _nativeAd; + bool _nativeAdIsLoaded = false; + + @override + Widget build(BuildContext context) => Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView.separated( + itemCount: 20, + separatorBuilder: (BuildContext context, int index) { + return Container(height: 40); + }, + itemBuilder: (BuildContext context, int index) { + final BannerAd? bannerAd = _bannerAd; + if (index == 5 && _bannerAdIsLoaded && bannerAd != null) { + return Container( + height: bannerAd.size.height.toDouble(), + width: bannerAd.size.width.toDouble(), + child: AdWidget(ad: bannerAd), + ); + } + + final AdManagerBannerAd? adManagerBannerAd = _adManagerBannerAd; + if (index == 10 && + _adManagerBannerAdIsLoaded && + adManagerBannerAd != null) { + return Container( + height: adManagerBannerAd.sizes[0].height.toDouble(), + width: adManagerBannerAd.sizes[0].width.toDouble(), + child: AdWidget(ad: _adManagerBannerAd!), + ); + } + + final NativeAd? nativeAd = _nativeAd; + if (index == 15 && _nativeAdIsLoaded && nativeAd != null) { + return Container( + width: 250, + height: 350, + child: AdWidget(ad: nativeAd), + ); + } + + return Text( + Constants.placeholderText, + style: TextStyle(fontSize: 24), + ); + }, + ), + ), + ); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + // Create the ad objects and load ads. + _bannerAd = BannerAd( + size: AdSize.banner, + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/6300978111' + : 'ca-app-pub-3940256099942544/2934735716', + listener: BannerAdListener( + onAdLoaded: (Ad ad) { + print('$BannerAd loaded.'); + setState(() { + _bannerAdIsLoaded = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('$BannerAd failedToLoad: $error'); + ad.dispose(); + }, + onAdOpened: (Ad ad) => print('$BannerAd onAdOpened.'), + onAdClosed: (Ad ad) => print('$BannerAd onAdClosed.'), + ), + request: AdRequest(), + )..load(); + + _nativeAd = NativeAd( + adUnitId: Platform.isAndroid + ? 'ca-app-pub-3940256099942544/2247696110' + : 'ca-app-pub-3940256099942544/3986624511', + request: AdRequest(), + factoryId: 'adFactoryExample', + listener: NativeAdListener( + onAdLoaded: (Ad ad) { + print('$NativeAd loaded.'); + setState(() { + _nativeAdIsLoaded = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('$NativeAd failedToLoad: $error'); + ad.dispose(); + }, + onAdOpened: (Ad ad) => print('$NativeAd onAdOpened.'), + onAdClosed: (Ad ad) => print('$NativeAd onAdClosed.'), + ), + )..load(); + + _adManagerBannerAd = AdManagerBannerAd( + adUnitId: '/6499/example/banner', + request: AdManagerAdRequest(nonPersonalizedAds: true), + sizes: [AdSize.largeBanner], + listener: AdManagerBannerAdListener( + onAdLoaded: (Ad ad) { + print('$AdManagerBannerAd loaded.'); + setState(() { + _adManagerBannerAdIsLoaded = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + print('$AdManagerBannerAd failedToLoad: $error'); + ad.dispose(); + }, + onAdOpened: (Ad ad) => print('$AdManagerBannerAd onAdOpened.'), + onAdClosed: (Ad ad) => print('$AdManagerBannerAd onAdClosed.'), + ), + )..load(); + } + + @override + void dispose() { + super.dispose(); + _bannerAd?.dispose(); + _adManagerBannerAd?.dispose(); + _nativeAd?.dispose(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/banner_ad_snippets.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/banner_ad_snippets.dart new file mode 100644 index 00000000..8685cbf8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/banner_ad_snippets.dart @@ -0,0 +1,79 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +/// Dart snippets for the developer guide. +class _BannerAdWidget extends StatefulWidget { + const _BannerAdWidget(); + + @override + State<_BannerAdWidget> createState() => _BannerAdSnippets(); +} + +class _BannerAdSnippets extends State<_BannerAdWidget> { + BannerAd? _bannerAd; + final _adUnitId = Platform.isAndroid + ? 'ca-app-pub-3940256099942544/9214589741' + : 'ca-app-pub-3940256099942544/2435281174'; + final String _adManagerAdUnitId = '/21775744923/example/adaptive-banner'; + + // [START load_ad_ad_manager] + void _loadAd() async { + // Get an AnchoredAdaptiveBannerAdSize before loading the ad. + final size = await AdSize.getLargeAnchoredAdaptiveBannerAdSize( + MediaQuery.sizeOf(context).width.truncate(), + ); + + if (size == null) { + // Unable to get width of anchored banner. + return; + } + + unawaited( + BannerAd( + adUnitId: _adUnitId, + request: const AdManagerAdRequest(), + size: size, + listener: BannerAdListener( + onAdLoaded: (ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + setState(() { + _bannerAd = ad as BannerAd; + }); + }, + onAdFailedToLoad: (ad, err) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $err'); + ad.dispose(); + }, + ), + ).load(), + ); + } + // [END load_ad_ad_manager] + + @override + Widget build(BuildContext context) { + // TODO: implement build + throw UnimplementedError(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/interstitial_ad_snippets.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/interstitial_ad_snippets.dart new file mode 100644 index 00000000..10d49c89 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/interstitial_ad_snippets.dart @@ -0,0 +1,112 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +/// Dart snippets for the developer guide. +class _InterstitialAdSnippets { + InterstitialAd? _interstitialAd; + final String _adUnitId = Platform.isAndroid + ? 'ca-app-pub-3940256099942544/1033173712' + : 'ca-app-pub-3940256099942544/4411468910'; + final String _adManagerAdUnitId = '/21775744923/example/interstitial'; + + void _loadInterstitialAd() { + // [START load_ad] + InterstitialAd.load( + adUnitId: _adUnitId, + request: const AdRequest(), + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (InterstitialAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _interstitialAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad] + } + + void _setFullScreenContentCallback(InterstitialAd ad) { + // [START ad_events] + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdShowedFullScreenContent: (ad) { + // Called when the ad showed the full screen content. + debugPrint('Ad showed full screen content.'); + }, + onAdFailedToShowFullScreenContent: (ad, err) { + // Called when the ad failed to show full screen content. + debugPrint('Ad failed to show full screen content with error: $err'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdDismissedFullScreenContent: (ad) { + // Called when the ad dismissed full screen content. + debugPrint('Ad was dismissed.'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdImpression: (ad) { + // Called when an impression occurs on the ad. + debugPrint('Ad recorded an impression.'); + }, + onAdClicked: (ad) { + // Called when a click is recorded for an ad. + debugPrint('Ad was clicked.'); + }, + ); + // [END ad_events] + } + + // =================================================================== + // Ad Manager snippets + // =================================================================== + + void _loadAdManagerInterstitialAd() { + // [START load_ad_ad_manager] + InterstitialAd.load( + adUnitId: _adUnitId, + request: const AdManagerAdRequest(), + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (InterstitialAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _interstitialAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad_ad_manager] + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_ad_snippets.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_ad_snippets.dart new file mode 100644 index 00000000..82b152ed --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_ad_snippets.dart @@ -0,0 +1,152 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +/// Dart snippets for the developer guide. +class _RewardedAdSnippets { + RewardedAd? _rewardedAd; + final String _adUnitId = Platform.isAndroid + ? 'ca-app-pub-3940256099942544/5224354917' + : 'ca-app-pub-3940256099942544/1712485313'; + final String _adManagerAdUnitId = '/21775744923/example/rewarded'; + + void _loadRewardedAd() { + // [START load_ad] + RewardedAd.load( + adUnitId: _adUnitId, + request: const AdRequest(), + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (RewardedAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _rewardedAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad] + } + + void _setFullScreenContentCallback(RewardedAd ad) { + // [START ad_events] + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdShowedFullScreenContent: (ad) { + // Called when the ad showed the full screen content. + debugPrint('Ad showed full screen content.'); + }, + onAdFailedToShowFullScreenContent: (ad, err) { + // Called when the ad failed to show full screen content. + debugPrint('Ad failed to show full screen content with error: $err'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdDismissedFullScreenContent: (ad) { + // Called when the ad dismissed full screen content. + debugPrint('Ad was dismissed.'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdImpression: (ad) { + // Called when an impression occurs on the ad. + debugPrint('Ad recorded an impression.'); + }, + onAdClicked: (ad) { + // Called when a click is recorded for an ad. + debugPrint('Ad was clicked.'); + }, + ); + // [END ad_events] + } + + void _validateServerSideVerification() { + // [START validate_server_side_verification] + RewardedAd.load( + adUnitId: _adUnitId, + request: AdRequest(), + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + ServerSideVerificationOptions _options = + ServerSideVerificationOptions( + customData: 'SAMPLE_CUSTOM_DATA_STRING', + ); + ad.setServerSideOptions(_options); + _rewardedAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + // [END validate_server_side_verification] + } + + // =================================================================== + // Ad Manager snippets + // =================================================================== + + void _loadAdManagerRewardedAd() { + // [START load_ad_ad_manager] + RewardedAd.load( + adUnitId: _adUnitId, + request: const AdManagerAdRequest(), + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (RewardedAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _rewardedAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad_ad_manager] + } + + void _validateAdManagerServerSideVerification() { + // [START validate_server_side_verification_ad_manager] + RewardedAd.load( + adUnitId: _adUnitId, + request: AdManagerAdRequest(), + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + ServerSideVerificationOptions _options = + ServerSideVerificationOptions( + customData: 'SAMPLE_CUSTOM_DATA_STRING', + ); + ad.setServerSideOptions(_options); + _rewardedAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + // [END validate_server_side_verification_ad_manager] + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_interstitial_ad_snippets.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_interstitial_ad_snippets.dart new file mode 100644 index 00000000..ff932b61 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/snippets/rewarded_interstitial_ad_snippets.dart @@ -0,0 +1,153 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +/// Dart snippets for the developer guide. +class _RewardedInterstitialAdSnippets { + RewardedInterstitialAd? _rewardedInterstitialAd; + final String _adUnitId = Platform.isAndroid + ? 'ca-app-pub-3940256099942544/5354046379' + : 'ca-app-pub-3940256099942544/6978759866'; + final String _adManagerAdUnitId = + '/21775744923/example/rewarded-interstitial'; + + void _loadRewardedInterstitialAd() { + // [START load_ad] + RewardedInterstitialAd.load( + adUnitId: _adUnitId, + request: const AdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (RewardedInterstitialAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _rewardedInterstitialAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad] + } + + void _setFullScreenContentCallback(RewardedInterstitialAd ad) { + // [START ad_events] + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdShowedFullScreenContent: (ad) { + // Called when the ad showed the full screen content. + debugPrint('Ad showed full screen content.'); + }, + onAdFailedToShowFullScreenContent: (ad, err) { + // Called when the ad failed to show full screen content. + debugPrint('Ad failed to show full screen content with error: $err'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdDismissedFullScreenContent: (ad) { + // Called when the ad dismissed full screen content. + debugPrint('Ad was dismissed.'); + // Dispose the ad here to free resources. + ad.dispose(); + }, + onAdImpression: (ad) { + // Called when an impression occurs on the ad. + debugPrint('Ad recorded an impression.'); + }, + onAdClicked: (ad) { + // Called when a click is recorded for an ad. + debugPrint('Ad was clicked.'); + }, + ); + // [END ad_events] + } + + void _validateServerSideVerification() { + // [START validate_server_side_verification] + RewardedInterstitialAd.load( + adUnitId: _adUnitId, + request: AdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + ServerSideVerificationOptions _options = + ServerSideVerificationOptions( + customData: 'SAMPLE_CUSTOM_DATA_STRING', + ); + ad.setServerSideOptions(_options); + _rewardedInterstitialAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + // [END validate_server_side_verification] + } + + // =================================================================== + // Ad Manager snippets + // =================================================================== + + void _loadAdManagerRewardedInterstitialAd() { + // [START load_ad_ad_manager] + RewardedInterstitialAd.load( + adUnitId: _adUnitId, + request: const AdManagerAdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (RewardedInterstitialAd ad) { + // Called when an ad is successfully received. + debugPrint('Ad was loaded.'); + // Keep a reference to the ad so you can show it later. + _rewardedInterstitialAd = ad; + // [START_EXCLUDE silent] + _setFullScreenContentCallback(ad); + // [END_EXCLUDE] + }, + onAdFailedToLoad: (LoadAdError error) { + // Called when an ad request failed. + debugPrint('Ad failed to load with error: $error'); + }, + ), + ); + // [END load_ad_ad_manager] + } + + void _validateAdManagerServerSideVerification() { + // [START validate_server_side_verification_ad_manager] + RewardedInterstitialAd.load( + adUnitId: _adUnitId, + request: AdManagerAdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + ServerSideVerificationOptions _options = + ServerSideVerificationOptions( + customData: 'SAMPLE_CUSTOM_DATA_STRING', + ); + ad.setServerSideOptions(_options); + _rewardedInterstitialAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + // [END validate_server_side_verification_ad_manager] + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/webview_example.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/webview_example.dart new file mode 100644 index 00000000..b194a964 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/lib/webview_example.dart @@ -0,0 +1,77 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:webview_flutter_android/webview_flutter_android.dart'; + +/// Opens a WebView and tries to register it via `MobileAds.registerWebView()`. +class WebViewExample extends StatefulWidget { + @override + _WebViewExampleState createState() => _WebViewExampleState(); +} + +class _WebViewExampleState extends State { + late final WebViewController controller; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('WebView Example')), + body: WebViewWidget(controller: controller), + ); + } + + @override + void initState() { + super.initState(); + createWebView(); + } + + void createWebView() async { + controller = WebViewController(); + await controller.setJavaScriptMode(JavaScriptMode.unrestricted); + await controller.setBackgroundColor(const Color(0x00000000)); + await controller.setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) {}, + onPageStarted: (String url) {}, + onPageFinished: (String url) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + if (request.url.startsWith('https://www.youtube.com/')) { + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ); + if (controller.platform is AndroidWebViewController) { + AndroidWebViewCookieManager cookieManager = AndroidWebViewCookieManager( + PlatformWebViewCookieManagerCreationParams(), + ); + await cookieManager.setAcceptThirdPartyCookies( + controller.platform as AndroidWebViewController, + true, + ); + } + await MobileAds.instance.registerWebView(controller); + await controller.loadRequest( + Uri.parse('https://google.github.io/webview-ads/test/#api-for-ads-tests'), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/pubspec.yaml new file mode 100644 index 00000000..aa0ac859 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/example/pubspec.yaml @@ -0,0 +1,37 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: google_mobile_ads_example +version: 1.0.0 +description: Demonstrates how to use the google mobile ads plugin. +publish_to: none + +dependencies: + flutter: + sdk: flutter + google_mobile_ads: + path: ../ + webview_flutter_android: ^4.10.9 + webview_flutter: ^4.10.0 + +dev_dependencies: + pedantic: ^1.11.0 + flutter_driver: + sdk: flutter + +flutter: + uses-material-design: true + +environment: + sdk: ">=3.9.0 <4.0.0" diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads.podspec b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads.podspec new file mode 100644 index 00000000..161c4794 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads.podspec @@ -0,0 +1,31 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'google_mobile_ads' + s.version = '8.0.0' + s.summary = 'Google Mobile Ads plugin for Flutter.' + s.description = <<-DESC +Google Mobile Ads plugin for Flutter. + DESC + s.homepage = 'https://github.com/googleads/googleads-mobile-flutter' + s.license = { :file => '../LICENSE' } + s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } + s.source = { :path => '.' } + s.source_files = 'google_mobile_ads/Sources/google_mobile_ads/**/*.{h,m}' + s.public_header_files = 'google_mobile_ads/Sources/google_mobile_ads/**/*.h' + s.dependency 'Flutter' + s.dependency 'Google-Mobile-Ads-SDK','~> 13.2.0' + s.dependency 'webview_flutter_wkwebview' + s.ios.deployment_target = '13.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'armv7 arm64 x86_64' } + s.static_framework = true + s.resource_bundles = { + 'google_mobile_ads' => ['google_mobile_ads/Sources/google_mobile_ads/**/*.xib'] + } + + s.test_spec 'Tests' do |test_spec| + test_spec.source_files = 'Tests/**/*.{h,m}' + test_spec.dependency 'OCMock','3.6' + end +end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Package.swift b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Package.swift new file mode 100644 index 00000000..057a4e82 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Package.swift @@ -0,0 +1,34 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "google_mobile_ads", + platforms: [ + .iOS("13.0") + ], + products: [ + .library(name: "google-mobile-ads", targets: ["google_mobile_ads"]) + ], + dependencies: [ + .package( + url: "https://github.com/googleads/swift-package-manager-google-mobile-ads", from: "13.2.0"), + .package(name: "webview_flutter_wkwebview", path: "../webview_flutter_wkwebview-3.26.0"), + ], + targets: [ + .target( + name: "google_mobile_ads", + dependencies: [ + .product(name: "GoogleMobileAds", package: "swift-package-manager-google-mobile-ads"), + .product(name: "webview-flutter-wkwebview", package: "webview_flutter_wkwebview"), + ], + resources: [ + .process("Resources"), + ], + cSettings: [ + .headerSearchPath("include/google_mobile_ads") + ] + ) + ] +) diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdInstanceManager_Internal.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdInstanceManager_Internal.m new file mode 100644 index 00000000..6f8e856c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdInstanceManager_Internal.m @@ -0,0 +1,259 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAdInstanceManager_Internal.h" + +@implementation FLTAdInstanceManager { + FLTGoogleMobileAdsCollection> *_ads; + FlutterMethodChannel *_channel; +} + +- (instancetype _Nonnull)initWithBinaryMessenger: + (id _Nonnull)binaryMessenger { + self = [super init]; + if (self) { + _ads = [[FLTGoogleMobileAdsCollection alloc] init]; + NSObject *methodCodec = [FlutterStandardMethodCodec + codecWithReaderWriter:[[FLTGoogleMobileAdsReaderWriter alloc] init]]; + _channel = [[FlutterMethodChannel alloc] + initWithName:@"plugins.flutter.io/google_mobile_ads" + binaryMessenger:binaryMessenger + codec:methodCodec]; + } + return self; +} + +- (id _Nullable)adFor:(NSNumber *_Nonnull)adId { + return [_ads objectForKey:adId]; +} + +- (NSNumber *_Nullable)adIdFor:(id _Nonnull)ad { + NSArray *keys = [_ads allKeysForObject:ad]; + + if (keys.count > 1) { + NSLog(@"%@Error: Multiple keys for a single ad.", + NSStringFromClass([FLTAdInstanceManager class])); + } + + if (keys.count > 0) { + return keys[0]; + } + + return nil; +} + +- (void)loadAd:(id _Nonnull)ad { + [_ads setObject:ad forKey:ad.adId]; + ad.manager = self; + [ad load]; +} + +- (void)dispose:(NSNumber *_Nonnull)adId { + [_ads removeObjectForKey:adId]; +} + +- (void)disposeAllAds { + [_ads removeAllObjects]; +} + +- (void)showAdWithID:(NSNumber *_Nonnull)adId { + id ad = (id)[self adFor:adId]; + + if (!ad) { + NSLog(@"Can't find ad with id: %@", adId); + return; + } + + [ad show]; +} + +- (void)onAdLoaded:(id _Nonnull)ad + responseInfo:(GADResponseInfo *_Nonnull)responseInfo { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onAdLoaded", + @"responseInfo" : [[FLTGADResponseInfo alloc] + initWithResponseInfo:responseInfo] + }]; +} + +- (void)onAdFailedToLoad:(id _Nonnull)ad error:(NSError *_Nonnull)error { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onAdFailedToLoad", + @"loadAdError" : [[FLTLoadAdError alloc] initWithError:error] + }]; +} + +- (void)onAppEvent:(id _Nonnull)ad + name:(NSString *)name + data:(NSString *)data { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onAppEvent", + @"name" : name, + @"data" : data + }]; +} + +- (void)onNativeAdImpression:(FLTNativeAd *_Nonnull)ad { + [self sendAdEvent:@"onNativeAdImpression" ad:ad]; +} + +- (void)onNativeAdWillPresentScreen:(FLTNativeAd *_Nonnull)ad { + [self sendAdEvent:@"onNativeAdWillPresentScreen" ad:ad]; +} + +- (void)onNativeAdDidDismissScreen:(FLTNativeAd *_Nonnull)ad { + [self sendAdEvent:@"onNativeAdDidDismissScreen" ad:ad]; +} + +- (void)onNativeAdWillDismissScreen:(FLTNativeAd *_Nonnull)ad { + [self sendAdEvent:@"onNativeAdWillDismissScreen" ad:ad]; +} + +- (void)onRewardedAdUserEarnedReward:(FLTRewardedAd *_Nonnull)ad + reward:(FLTRewardItem *_Nonnull)reward { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onRewardedAdUserEarnedReward", + @"rewardItem" : reward, + }]; +} + +- (void)onRewardedInterstitialAdUserEarnedReward: + (FLTRewardedInterstitialAd *_Nonnull)ad + reward: + (FLTRewardItem *_Nonnull)reward { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onRewardedInterstitialAdUserEarnedReward", + @"rewardItem" : reward, + }]; +} + +- (void)onPaidEvent:(id _Nonnull)ad value:(FLTAdValue *_Nonnull)adValue { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onPaidEvent", + @"valueMicros" : adValue.valueMicros, + @"precision" : [NSNumber numberWithInteger:adValue.precision], + @"currencyCode" : adValue.currencyCode + }]; +} + +- (void)onBannerImpression:(FLTBannerAd *_Nonnull)ad { + [self sendAdEvent:@"onBannerImpression" ad:ad]; +} + +- (void)onBannerWillDismissScreen:(FLTBannerAd *)ad { + [self sendAdEvent:@"onBannerWillDismissScreen" ad:ad]; +} + +- (void)onBannerDidDismissScreen:(FLTBannerAd *)ad { + [self sendAdEvent:@"onBannerDidDismissScreen" ad:ad]; +} + +- (void)onBannerWillPresentScreen:(FLTBannerAd *_Nonnull)ad { + [self sendAdEvent:@"onBannerWillPresentScreen" ad:ad]; +} + +- (void)adWillPresentFullScreenContent:(id _Nonnull)ad { + [self sendAdEvent:@"adWillPresentFullScreenContent" ad:ad]; +} + +- (void)adDidDismissFullScreenContent:(id _Nonnull)ad { + [self sendAdEvent:@"adDidDismissFullScreenContent" ad:ad]; +} + +- (void)adWillDismissFullScreenContent:(id _Nonnull)ad { + [self sendAdEvent:@"adWillDismissFullScreenContent" ad:ad]; +} + +- (void)adDidRecordImpression:(id _Nonnull)ad { + [self sendAdEvent:@"adDidRecordImpression" ad:ad]; +} + +- (void)adDidRecordClick:(id _Nonnull)ad { + [self sendAdEvent:@"adDidRecordClick" ad:ad]; +} + +- (void)didFailToPresentFullScreenContentWithError:(id _Nonnull)ad + error:(NSError *_Nonnull)error { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"didFailToPresentFullScreenContentWithError", + @"error" : error + }]; +} + +- (void)onFluidAdHeightChanged:(id _Nonnull)ad height:(CGFloat)height { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : @"onFluidAdHeightChanged", + @"height" : [[NSNumber alloc] initWithFloat:height] + }]; +} + +/// Sends an ad event with the provided name. +- (void)sendAdEvent:(NSString *_Nonnull)eventName ad:(id)ad { + [_channel invokeMethod:@"onAdEvent" + arguments:@{ + @"adId" : ad.adId, + @"eventName" : eventName, + }]; +} + +@end + +@implementation FLTNewGoogleMobileAdsViewFactory +- (instancetype)initWithManager:(FLTAdInstanceManager *_Nonnull)manager { + self = [super init]; + if (self) { + _manager = manager; + } + return self; +} + +- (nonnull NSObject *)createWithFrame:(CGRect)frame + viewIdentifier:(int64_t)viewId + arguments:(id _Nullable)args { + NSNumber *adId = args; + NSObject *view = + (NSObject *)[_manager adFor:adId]; + + if (!view) { + NSString *reason = [NSString + stringWithFormat: + @"Could not find an ad with id: %@. Was this ad already disposed?", + adId]; + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:reason + userInfo:nil]; + } + return view; +} + +- (NSObject *)createArgsCodec { + return [FlutterStandardMessageCodec sharedInstance]; +} +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdUtil.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdUtil.m new file mode 100644 index 00000000..8627b341 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAdUtil.m @@ -0,0 +1,58 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAdUtil.h" +#import "FLTConstants.h" +@import webview_flutter_wkwebview; + +@implementation FLTAdUtil + +static NSString *_requestAgent; + ++ (BOOL)isNull:(id)object { + return object == nil || [[NSNull null] isEqual:object]; +} + ++ (BOOL)isNotNull:(id)object { + return ![FLTAdUtil isNull:object]; +} + ++ (NSString *)requestAgent { + NSString *newsTemplateString = @""; + id newsTemplateVersion = [NSBundle.mainBundle + objectForInfoDictionaryKey:@"FLTNewsTemplateVersion"]; + if ([newsTemplateVersion isKindOfClass:[NSString class]]) { + newsTemplateString = + [NSString stringWithFormat:@"_News-%@", newsTemplateVersion]; + } + + NSString *gameTemplateString = @""; + id gameTemplateVersion = [NSBundle.mainBundle + objectForInfoDictionaryKey:@"FLTGameTemplateVersion"]; + if ([gameTemplateVersion isKindOfClass:[NSString class]]) { + gameTemplateString = + [NSString stringWithFormat:@"_Game-%@", gameTemplateVersion]; + } + return [NSString stringWithFormat:@"%@%@%@", FLT_REQUEST_AGENT_VERSIONED, + newsTemplateString, gameTemplateString]; +} + ++ (WKWebView *)getWebView:(NSNumber *)webViewId + flutterPluginRegistry:(id)flutterPluginRegistry { + return (WKWebView *)[FWFWebViewFlutterWKWebViewExternalAPI + webViewForIdentifier:webViewId.longValue + withPluginRegistry:flutterPluginRegistry]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAd_Internal.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAd_Internal.m new file mode 100644 index 00000000..d66f9b91 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAd_Internal.m @@ -0,0 +1,1407 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAd_Internal.h" +#import "FLTAdUtil.h" +#import "FLTNativeTemplateStyle.h" + +@implementation FLTAdSize +- (instancetype _Nonnull)initWithWidth:(NSNumber *_Nonnull)width + height:(NSNumber *_Nonnull)height { + return [self initWithAdSize:GADAdSizeFromCGSize(CGSizeMake( + width.doubleValue, height.doubleValue))]; +} + +- (instancetype _Nonnull)initWithAdSize:(GADAdSize)size { + self = [super init]; + if (self) { + _size = size; + _width = @(size.size.width); + _height = @(size.size.height); + } + return self; +} +@end + +@implementation FLTAdSizeFactory +- (GADAdSize)portraitAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth(width.doubleValue); +} + +- (GADAdSize)landscapeAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width.doubleValue); +} + +- (GADAdSize)currentOrientationAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth( + width.doubleValue); +} + +- (GADAdSize)largePortraitAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADLargePortraitAnchoredAdaptiveBannerAdSizeWithWidth(width.doubleValue); +} + +- (GADAdSize)largeLandscapeAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADLargeLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width.doubleValue); +} + +- (GADAdSize)largeAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADLargeAnchoredAdaptiveBannerAdSizeWithWidth( + width.doubleValue); +} + +- (GADAdSize)currentOrientationInlineAdaptiveBannerSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADCurrentOrientationInlineAdaptiveBannerAdSizeWithWidth( + width.floatValue); +} + +- (GADAdSize)portraitOrientationInlineAdaptiveBannerSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADPortraitInlineAdaptiveBannerAdSizeWithWidth(width.floatValue); +} +- (GADAdSize)landscapeInlineAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width { + return GADLandscapeInlineAdaptiveBannerAdSizeWithWidth(width.floatValue); +} +- (GADAdSize) + inlineAdaptiveBannerAdSizeWithWidthAndMaxHeight:(NSNumber *_Nonnull)width + maxHeight: + (NSNumber *_Nonnull)maxHeight { + return GADInlineAdaptiveBannerAdSizeWithWidthAndMaxHeight( + width.floatValue, maxHeight.floatValue); +} + +@end + +@implementation FLTAnchoredAdaptiveBannerSize +- (instancetype _Nonnull)initWithFactory:(FLTAdSizeFactory *_Nonnull)factory + orientation:(NSString *_Nullable)orientation + width:(NSNumber *_Nonnull)width + isLarge:(Boolean)isLarge { + GADAdSize size; + if ([FLTAdUtil isNull:orientation]) { + if (isLarge) { + size = [factory largeAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } else { + size = + [factory currentOrientationAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } + } else if ([orientation isEqualToString:@"portrait"]) { + if (isLarge) { + size = [factory largePortraitAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } else { + size = [factory portraitAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } + } else if ([orientation isEqualToString:@"landscape"]) { + if (isLarge) { + size = [factory largeLandscapeAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } else { + size = [factory landscapeAnchoredAdaptiveBannerAdSizeWithWidth:width]; + } + } else { + NSLog(@"Unexpected value for orientation: %@", orientation); + return nil; + } + + self = [self initWithAdSize:size]; + if (self) { + _orientation = orientation; + } + return self; +} +@end + +@implementation FLTInlineAdaptiveBannerSize +- (instancetype _Nonnull)initWithFactory:(FLTAdSizeFactory *_Nonnull)factory + width:(NSNumber *_Nonnull)width + maxHeight:(NSNumber *_Nullable)maxHeight + orientation:(NSNumber *_Nullable)orientation { + GADAdSize gadAdSize; + if ([FLTAdUtil isNotNull:orientation]) { + gadAdSize = + orientation.intValue == 0 + ? [factory + portraitOrientationInlineAdaptiveBannerSizeWithWidth:width] + : [factory landscapeInlineAdaptiveBannerAdSizeWithWidth:width]; + } else if ([FLTAdUtil isNotNull:maxHeight]) { + gadAdSize = + [factory inlineAdaptiveBannerAdSizeWithWidthAndMaxHeight:width + maxHeight:maxHeight]; + } else { + gadAdSize = + [factory currentOrientationInlineAdaptiveBannerSizeWithWidth:width]; + } + self = [self initWithAdSize:gadAdSize]; + if (self) { + _orientation = orientation; + _maxHeight = maxHeight; + } + return self; +} +@end + +@implementation FLTSmartBannerSize +- (instancetype _Nonnull)initWithOrientation:(NSString *_Nonnull)orientation { + GADAdSize size; + if ([orientation isEqualToString:@"portrait"]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + size = kGADAdSizeSmartBannerPortrait; + } else if ([orientation isEqualToString:@"landscape"]) { + size = kGADAdSizeSmartBannerLandscape; +#pragma clang diagnostic pop + } else { + NSLog(@"SmartBanner orientation should be 'portrait' or 'landscape': %@", + orientation); + return nil; + } + + self = [self initWithAdSize:size]; + if (self) { + _orientation = orientation; + } + return self; +} +@end + +@implementation FLTFluidSize +- (instancetype _Nonnull)init { + self = [self initWithAdSize:GADAdSizeFluid]; + return self; +} +@end + +@interface FLTAdRequest () +/// A helper method for adding network extras to the GADRequest. +- (void)addNetworkExtrasToGADRequest:(GADRequest *_Nonnull)request + adUnitId:(NSString *_Nonnull)adUnitId; + +@end + +@implementation FLTAdRequest + +- (void)addNetworkExtrasToGADRequest:(GADRequest *)request + adUnitId:(NSString *_Nonnull)adUnitId { + NSArray> *extras; + + if (_mediationExtras != NULL) { + NSMutableArray> *flutterExtras = + [NSMutableArray array]; + for (id extra in _mediationExtras) { + [flutterExtras addObject:[extra getMediationExtras]]; + } + extras = [NSArray arrayWithArray:flutterExtras]; + } else { + extras = [_mediationNetworkExtrasProvider + getMediationExtras:adUnitId + mediationExtrasIdentifier:_mediationExtrasIdentifier]; + } + BOOL addedNpaToGADExtras = false; + + if ([FLTAdUtil isNotNull:extras]) { + for (id extra in extras) { + // If GADExtras are present and npa is true, add npa = 1 to the GADExtras + if ([extra isKindOfClass:[GADExtras class]] && _nonPersonalizedAds) { + GADExtras *gadExtras = (GADExtras *)extra; + NSMutableDictionary *newParams = [[NSMutableDictionary alloc] + initWithDictionary:gadExtras.additionalParameters]; + newParams[@"npa"] = @"1"; + gadExtras.additionalParameters = newParams; + [request registerAdNetworkExtras:gadExtras]; + addedNpaToGADExtras = true; + } else { + [request registerAdNetworkExtras:extra]; + } + } + } + + if (!addedNpaToGADExtras) { + [self addAdMobExtras:request]; + } +} + +- (void)addAdMobExtras:(GADRequest *_Nonnull)request { + NSMutableDictionary *additionalParams = + [[NSMutableDictionary alloc] init]; + + if (_nonPersonalizedAds) { + additionalParams[@"npa"] = @"1"; + } + if (_adMobExtras) { + [additionalParams addEntriesFromDictionary:_adMobExtras]; + } + if (additionalParams.count > 0) { + GADExtras *extras = [[GADExtras alloc] init]; + extras.additionalParameters = additionalParams; + [request registerAdNetworkExtras:extras]; + } +} + +- (GADRequest *_Nonnull)asGADRequest:(NSString *_Nonnull)adUnitId { + GADRequest *request = [GADRequest request]; + request.keywords = _keywords; + request.contentURL = _contentURL; + request.neighboringContentURLStrings = _neighboringContentURLs; + request.requestAgent = _requestAgent; + [self addNetworkExtrasToGADRequest:request adUnitId:adUnitId]; + return request; +} + +@end + +@implementation FLTGADResponseInfo + +- (instancetype _Nonnull)initWithResponseInfo: + (GADResponseInfo *_Nonnull)responseInfo { + self = [super init]; + if (self) { + _responseIdentifier = responseInfo.responseIdentifier; + _adNetworkClassName = + responseInfo.loadedAdNetworkResponseInfo.adNetworkClassName; + NSMutableArray *infoArray = + [[NSMutableArray alloc] init]; + for (GADAdNetworkResponseInfo *adNetworkInfo in responseInfo + .adNetworkInfoArray) { + [infoArray addObject:[[FLTGADAdNetworkResponseInfo alloc] + initWithResponseInfo:adNetworkInfo]]; + } + _adNetworkInfoArray = infoArray; + _loadedAdNetworkResponseInfo = [[FLTGADAdNetworkResponseInfo alloc] + initWithResponseInfo:responseInfo.loadedAdNetworkResponseInfo]; + _extrasDictionary = + responseInfo.extrasDictionary ? responseInfo.extrasDictionary : @{}; + } + return self; +} +@end + +@implementation FLTGADAdNetworkResponseInfo + +- (instancetype _Nonnull)initWithResponseInfo: + (GADAdNetworkResponseInfo *_Nonnull)responseInfo { + self = [super init]; + if (self) { + _adNetworkClassName = responseInfo.adNetworkClassName; + NSNumber *timeInMillis = + [[NSNumber alloc] initWithDouble:responseInfo.latency * 1000]; + _latency = @(timeInMillis.longValue); + _dictionaryDescription = responseInfo.dictionaryRepresentation.description; + _adUnitMapping = [[NSMutableDictionary alloc] init]; + for (NSString *key in responseInfo.adUnitMapping) { + if ([responseInfo.adUnitMapping[key] isKindOfClass:NSObject.class]) { + NSObject *value = ((NSObject *)responseInfo.adUnitMapping[key]); + [_adUnitMapping setValue:value.description forKey:key]; + } else { + [_adUnitMapping setValue:@"Unrecognized credential" forKey:key]; + } + } + _error = responseInfo.error; + + _adSourceName = responseInfo.adSourceName; + _adSourceInstanceName = responseInfo.adSourceInstanceName; + _adSourceInstanceID = responseInfo.adSourceInstanceID; + _adSourceID = responseInfo.adSourceID; + } + return self; +} +@end + +@implementation FLTLoadAdError + +- (instancetype _Nonnull)initWithError:(NSError *_Nonnull)error { + self = [super init]; + if (self) { + _code = error.code; + _domain = error.domain; + _message = error.localizedDescription; + GADResponseInfo *responseInfo = + error.userInfo[GADErrorUserInfoKeyResponseInfo]; + if (responseInfo) { + _responseInfo = + [[FLTGADResponseInfo alloc] initWithResponseInfo:responseInfo]; + } + } + return self; +} +@end + +#pragma mark - FLTGAMAdRequest + +@implementation FLTGAMAdRequest +- (GADRequest *_Nonnull)asGAMRequest:(NSString *_Nonnull)adUnitId { + GAMRequest *request = [GAMRequest request]; + request.keywords = self.keywords; + request.contentURL = self.contentURL; + request.neighboringContentURLStrings = self.neighboringContentURLs; + request.publisherProvidedID = self.pubProvidedID; + request.requestAgent = self.requestAgent; + + NSMutableDictionary *targetingDictionary = + [NSMutableDictionary dictionaryWithDictionary:self.customTargeting]; + for (NSString *key in self.customTargetingLists) { + targetingDictionary[key] = + [self.customTargetingLists[key] componentsJoinedByString:@","]; + } + request.customTargeting = targetingDictionary; + [self addNetworkExtrasToGADRequest:request adUnitId:adUnitId]; + return request; +} +@end + +#pragma mark - FLTBaseAd + +@interface FLTBaseAd () +@property(readwrite) NSNumber *_Nonnull adId; +@end + +@implementation FLTBaseAd +@synthesize adId; +@end + +#pragma mark - FLTBannerAd + +@implementation FLTBannerAd { + GADBannerView *_bannerView; + FLTAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + size:(FLTAdSize *_Nonnull)size + request:(FLTAdRequest *_Nonnull)request + rootViewController:(UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + _adRequest = request; + _adUnitId = adUnitId; + _bannerView = [[GADBannerView alloc] initWithAdSize:size.size]; + _bannerView.adUnitID = adUnitId; + self.adId = adId; + self.bannerView.rootViewController = rootViewController; + __weak FLTBannerAd *weakSelf = self; + self.bannerView.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + } + return self; +} + +- (GADBannerView *_Nonnull)bannerView { + return _bannerView; +} + +- (void)load { + self.bannerView.delegate = self; + [self.bannerView loadRequest:[_adRequest asGADRequest:_adUnitId]]; +} + +- (FLTAdSize *)getAdSize { + if (self.bannerView) { + return [[FLTAdSize alloc] initWithAdSize:self.bannerView.adSize]; + } + return nil; +} + +-(BOOL)isCollapsible { + if (self.bannerView) { + return self.bannerView.isCollapsible; + } + return false; +} + +#pragma mark - GADBannerViewDelegate + +- (void)bannerViewDidReceiveAd:(GADBannerView *)bannerView { + [manager onAdLoaded:self responseInfo:bannerView.responseInfo]; +} + +- (void)bannerView:(GADBannerView *)bannerView + didFailToReceiveAdWithError:(NSError *)error { + [manager onAdFailedToLoad:self error:error]; +} + +- (void)bannerViewDidRecordImpression:(GADBannerView *)bannerView { + [manager onBannerImpression:self]; +} + +- (void)bannerViewWillPresentScreen:(GADBannerView *)bannerView { + [manager onBannerWillPresentScreen:self]; +} + +- (void)bannerViewWillDismissScreen:(GADBannerView *)bannerView { + [manager onBannerWillDismissScreen:self]; +} + +- (void)bannerViewDidDismissScreen:(GADBannerView *)bannerView { + [manager onBannerDidDismissScreen:self]; +} + +- (void)bannerViewDidRecordClick:(GADBannerView *)bannerView { + [manager adDidRecordClick:self]; +} + +#pragma mark - FlutterPlatformView +- (nonnull UIView *)view { + return self.bannerView; +} + +@synthesize manager; + +@end + +#pragma mark - FLTGAMBannerAd +@implementation FLTGAMBannerAd { + GAMBannerView *_bannerView; + FLTGAMAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + sizes:(NSArray *_Nonnull)sizes + request:(FLTGAMAdRequest *_Nonnull)request + rootViewController:(UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = adUnitId; + _bannerView = [[GAMBannerView alloc] initWithAdSize:sizes[0].size]; + _bannerView.adUnitID = adUnitId; + _bannerView.rootViewController = rootViewController; + _bannerView.appEventDelegate = self; + _bannerView.delegate = self; + + NSMutableArray *validAdSizes = + [NSMutableArray arrayWithCapacity:sizes.count]; + for (FLTAdSize *size in sizes) { + [validAdSizes addObject:NSValueFromGADAdSize(size.size)]; + } + _bannerView.validAdSizes = validAdSizes; + + __weak FLTGAMBannerAd *weakSelf = self; + self.bannerView.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + } + return self; +} + +- (GADBannerView *_Nonnull)bannerView { + return _bannerView; +} + +- (void)load { + [self.bannerView loadRequest:[_adRequest asGAMRequest:_adUnitId]]; +} + +#pragma mark - FlutterPlatformView + +- (nonnull UIView *)view { + return self.bannerView; +} + +#pragma mark - GADAppEventDelegate +- (void)adView:(nonnull GADBannerView *)banner + didReceiveAppEvent:(nonnull NSString *)name + withInfo:(nullable NSString *)info { + [self.manager onAppEvent:self name:name data:info]; +} + +@end + +#pragma mark - FLTFluidGAMBannerAd + +@implementation FLTFluidGAMBannerAd { + GAMBannerView *_bannerView; + FLTGAMAdRequest *_adRequest; + UIScrollView *_containerView; + CGFloat _height; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTGAMAdRequest *_Nonnull)request + rootViewController:(UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _height = -1; + _adRequest = request; + _adUnitId = adUnitId; + _bannerView = [[GAMBannerView alloc] initWithAdSize:GADAdSizeFluid]; + _bannerView.adUnitID = adUnitId; + _bannerView.rootViewController = rootViewController; + _bannerView.appEventDelegate = self; + _bannerView.delegate = self; + _bannerView.adSizeDelegate = self; + + __weak FLTFluidGAMBannerAd *weakSelf = self; + self.bannerView.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + } + return self; +} + +- (GADBannerView *_Nonnull)bannerView { + return _bannerView; +} + +- (void)load { + [self.bannerView loadRequest:[_adRequest asGAMRequest:_adUnitId]]; +} + +#pragma mark - FlutterPlatformView + +- (nonnull UIView *)view { + if (_containerView) { + return _containerView; + } + + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; + [scrollView setShowsHorizontalScrollIndicator:NO]; + [scrollView setShowsVerticalScrollIndicator:NO]; + [scrollView addSubview:_bannerView]; + + _bannerView.translatesAutoresizingMaskIntoConstraints = false; + NSLayoutConstraint *width = + [NSLayoutConstraint constraintWithItem:_bannerView + attribute:NSLayoutAttributeWidth + relatedBy:0 + toItem:scrollView + attribute:NSLayoutAttributeWidth + multiplier:1.0 + constant:0]; + [scrollView addConstraint:width]; + _containerView = scrollView; + [_bannerView.widthAnchor constraintEqualToAnchor:scrollView.widthAnchor] + .active = YES; + [_bannerView.topAnchor constraintEqualToAnchor:scrollView.topAnchor].active = + YES; + return scrollView; +} + +#pragma mark - GADAdSizeDelegate + +- (void)adView:(GADBannerView *)bannerView + willChangeAdSizeTo:(GADAdSize)adSize { + CGFloat height = adSize.size.height; + [self.manager onFluidAdHeightChanged:self height:height]; +} + +#pragma mark - GADAppEventDelegate +- (void)adView:(nonnull GADBannerView *)banner + didReceiveAppEvent:(nonnull NSString *)name + withInfo:(nullable NSString *)info { + [self.manager onAppEvent:self name:name data:info]; +} + +@end + +#pragma mark - FLTFullScreenAd + +@implementation FLTFullScreenAd { + BOOL _statusBarVisibilityBeforeAdShow; +} + +@synthesize manager; + +- (void)load { + // Must be overridden by subclasses + [NSException + raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} + +- (void)show { + // Must be overridden by subclasses + [NSException + raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} + +- (void)ad:(nonnull id)ad + didFailToPresentFullScreenContentWithError:(nonnull NSError *)error { + [manager didFailToPresentFullScreenContentWithError:self error:error]; +} + +- (void)adWillPresentFullScreenContent: + (nonnull id)ad { + // Manually hide the status bar. This is a fix for + // https://github.com/googleads/googleads-mobile-flutter/issues/191 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + _statusBarVisibilityBeforeAdShow = + UIApplication.sharedApplication.statusBarHidden; + [UIApplication.sharedApplication setStatusBarHidden:YES]; +#pragma clang diagnostic pop + [manager adWillPresentFullScreenContent:self]; +} + +- (void)adDidDismissFullScreenContent: + (nonnull id)ad { + [manager adDidDismissFullScreenContent:self]; +} + +- (void)adWillDismissFullScreenContent: + (nonnull id)ad { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [UIApplication.sharedApplication + setStatusBarHidden:_statusBarVisibilityBeforeAdShow]; +#pragma clang diagnostic pop + [manager adWillDismissFullScreenContent:self]; +} + +- (void)adDidRecordImpression:(nonnull id)ad { + [manager adDidRecordImpression:self]; +} + +- (void)adDidRecordClick:(nonnull id)ad { + [manager adDidRecordClick:self]; +} + +@end + +#pragma mark - FLTInterstitialAd + +@implementation FLTInterstitialAd { + GADInterstitialAd *_interstitialView; + FLTAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = [adUnitId copy]; + } + return self; +} + +- (GADInterstitialAd *_Nullable)interstitial { + return _interstitialView; +} + +- (NSString *_Nonnull)adUnitId { + return _adUnitId; +} + +- (void)load { + [GADInterstitialAd + loadWithAdUnitID:_adUnitId + request:[_adRequest asGADRequest:_adUnitId] + completionHandler:^(GADInterstitialAd *ad, NSError *error) { + if (error) { + [self.manager onAdFailedToLoad:self error:error]; + return; + } + + ad.fullScreenContentDelegate = self; + self->_interstitialView = ad; + __weak FLTInterstitialAd *weakSelf = self; + ad.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + + [self.manager onAdLoaded:self responseInfo:ad.responseInfo]; + }]; +} + +- (void)show { + if (self.interstitial) { + [self.interstitial presentFromRootViewController:nil]; + } else { + NSLog(@"InterstitialAd failed to show because the ad was not ready."); + } +} + +@end + +#pragma mark - FLTGAMInterstitialAd + +@implementation FLTGAMInterstitialAd { + GAMInterstitialAd *_insterstitial; + FLTGAMAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTGAMAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = [adUnitId copy]; + } + return self; +} + +- (GADInterstitialAd *_Nullable)interstitial { + return _insterstitial; +} + +- (void)load { + [GAMInterstitialAd + loadWithAdManagerAdUnitID:_adUnitId + request:[_adRequest asGAMRequest:_adUnitId] + completionHandler:^(GAMInterstitialAd *ad, NSError *error) { + if (error) { + [self.manager onAdFailedToLoad:self error:error]; + return; + } + [self.manager onAdLoaded:self responseInfo:ad.responseInfo]; + ad.fullScreenContentDelegate = self; + ad.appEventDelegate = self; + __weak FLTGAMInterstitialAd *weakSelf = self; + ad.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + + self->_insterstitial = ad; + }]; +} + +- (void)show { + if (self.interstitial) { + [self.interstitial presentFromRootViewController:nil]; + } else { + NSLog(@"InterstitialAd failed to show because the ad was not ready."); + } +} + +#pragma mark - GADAppEventDelegate + +- (void)interstitialAd:(nonnull GADInterstitialAd *)interstitialAd + didReceiveAppEvent:(nonnull NSString *)name + withInfo:(nullable NSString *)info { + [self.manager onAppEvent:self name:name data:info]; +} + +@end + +#pragma mark - FLTRewardedAd +@implementation FLTRewardedAd { + GADRewardedAd *_rewardedView; + FLTAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = [adUnitId copy]; + } + return self; +} + +- (GADRewardedAd *_Nullable)rewardedAd { + return _rewardedView; +} + +- (void)load { + GADRequest *request; + if ([_adRequest isKindOfClass:[FLTGAMAdRequest class]]) { + FLTGAMAdRequest *gamRequest = (FLTGAMAdRequest *)_adRequest; + request = [gamRequest asGAMRequest:_adUnitId]; + } else if ([_adRequest isKindOfClass:[FLTAdRequest class]]) { + request = [_adRequest asGADRequest:_adUnitId]; + } else { + NSLog(@"A null or invalid ad request was provided."); + return; + } + + [GADRewardedAd loadWithAdUnitID:_adUnitId + request:request + completionHandler:^(GADRewardedAd *_Nullable rewardedAd, + NSError *_Nullable error) { + if (error) { + [self.manager onAdFailedToLoad:self error:error]; + return; + } + __weak FLTRewardedAd *weakSelf = self; + rewardedAd.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + rewardedAd.fullScreenContentDelegate = self; + self->_rewardedView = rewardedAd; + [self.manager onAdLoaded:self + responseInfo:rewardedAd.responseInfo]; + }]; +} + +- (void)show { + if (self.rewardedAd) { + [self.rewardedAd + presentFromRootViewController:nil + userDidEarnRewardHandler:^{ + GADAdReward *reward = self.rewardedAd.adReward; + FLTRewardItem *fltReward = + [[FLTRewardItem alloc] initWithAmount:reward.amount + type:reward.type]; + [self.manager onRewardedAdUserEarnedReward:self + reward:fltReward]; + }]; + } else { + NSLog(@"RewardedAd failed to show because the ad was not ready."); + } +} + +- (void)setServerSideVerificationOptions: + (FLTServerSideVerificationOptions *_Nullable)serverSideVerificationOptions { + if (_rewardedView) { + _rewardedView.serverSideVerificationOptions = + [serverSideVerificationOptions asGADServerSideVerificationOptions]; + } else { + NSLog(@"Error - rewardedView is nil in " + @"FLTRewardedAd.setServerSideVerificationOptions"); + } +} + +@end + +#pragma mark - FLTRewardedInterstitialAd +@implementation FLTRewardedInterstitialAd { + GADRewardedInterstitialAd *_rewardedInterstitialView; + FLTAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = [adUnitId copy]; + } + return self; +} + +- (GADRewardedInterstitialAd *_Nullable)rewardedInterstitialAd { + return _rewardedInterstitialView; +} + +- (void)load { + GADRequest *request; + if ([_adRequest isKindOfClass:[FLTGAMAdRequest class]]) { + FLTGAMAdRequest *gamRequest = (FLTGAMAdRequest *)_adRequest; + request = [gamRequest asGAMRequest:_adUnitId]; + } else if ([_adRequest isKindOfClass:[FLTAdRequest class]]) { + request = [_adRequest asGADRequest:_adUnitId]; + } else { + NSLog(@"A null or invalid ad request was provided."); + return; + } + + [GADRewardedInterstitialAd + loadWithAdUnitID:_adUnitId + request:request + completionHandler:^( + GADRewardedInterstitialAd *_Nullable rewardedInterstitialAd, + NSError *_Nullable error) { + if (error) { + [self.manager onAdFailedToLoad:self error:error]; + return; + } + __weak FLTRewardedInterstitialAd *weakSelf = self; + rewardedInterstitialAd.paidEventHandler = + ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + rewardedInterstitialAd.fullScreenContentDelegate = self; + self->_rewardedInterstitialView = rewardedInterstitialAd; + [self.manager onAdLoaded:self + responseInfo:rewardedInterstitialAd.responseInfo]; + }]; +} + +- (void)show { + if (self.rewardedInterstitialAd) { + [self.rewardedInterstitialAd + presentFromRootViewController:nil + userDidEarnRewardHandler:^{ + GADAdReward *reward = self.rewardedInterstitialAd.adReward; + FLTRewardItem *fltReward = + [[FLTRewardItem alloc] initWithAmount:reward.amount + type:reward.type]; + [self.manager + onRewardedInterstitialAdUserEarnedReward:self + reward:fltReward]; + }]; + } else { + NSLog( + @"RewardedInterstitialAd failed to show because the ad was not ready."); + } +} + +- (void)setServerSideVerificationOptions: + (FLTServerSideVerificationOptions *_Nullable)serverSideVerificationOptions { + if (_rewardedInterstitialView) { + _rewardedInterstitialView.serverSideVerificationOptions = + [serverSideVerificationOptions asGADServerSideVerificationOptions]; + } else { + NSLog(@"Error - rewardedView is nil in " + @"FLTRewardedInterstitialAd.setServerSideVerificationOptions"); + } +} + +@end + +#pragma mark - FLTAppOpenAd +@implementation FLTAppOpenAd { + GADAppOpenAd *_appOpenAd; + FLTAdRequest *_adRequest; + NSString *_adUnitId; +} + +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId { + self = [super init]; + if (self) { + self.adId = adId; + _adRequest = request; + _adUnitId = [adUnitId copy]; + } + return self; +} + +- (GADAppOpenAd *_Nullable)appOpenAd { + return _appOpenAd; +} + +- (void)load { + GADRequest *request; + if ([_adRequest isKindOfClass:[FLTGAMAdRequest class]]) { + FLTGAMAdRequest *gamRequest = (FLTGAMAdRequest *)_adRequest; + request = [gamRequest asGAMRequest:_adUnitId]; + } else if ([_adRequest isKindOfClass:[FLTAdRequest class]]) { + request = [_adRequest asGADRequest:_adUnitId]; + } else { + NSLog(@"A null or invalid ad request was provided."); + return; + } + + [GADAppOpenAd loadWithAdUnitID:_adUnitId + request:request + completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, + NSError *_Nullable error) { + if (error) { + [self.manager onAdFailedToLoad:self error:error]; + return; + } + __weak FLTAppOpenAd *weakSelf = self; + appOpenAd.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] + initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + appOpenAd.fullScreenContentDelegate = self; + + self->_appOpenAd = appOpenAd; + [self.manager onAdLoaded:self + responseInfo:appOpenAd.responseInfo]; + }]; +} + +- (void)show { + if (self.appOpenAd) { + [self.appOpenAd presentFromRootViewController:nil]; + } else { + NSLog(@"AppOpenAd failed to show because the ad was not ready."); + } +} + +@end + +#pragma mark - FLTNativeAd + +@implementation FLTNativeAd { + NSString *_adUnitId; + FLTAdRequest *_adRequest; + NSObject *_nativeAdFactory; + NSDictionary *_customOptions; + UIView *_view; + GADAdLoader *_adLoader; + FLTNativeAdOptions *_nativeAdOptions; + FLTNativeTemplateStyle *_nativeTemplateStyle; +} + +- (instancetype _Nonnull) + initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + nativeAdFactory:(NSObject *_Nonnull)nativeAdFactory + customOptions:(NSDictionary *_Nullable)customOptions + rootViewController:(UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId + nativeAdOptions:(FLTNativeAdOptions *_Nullable)nativeAdOptions + nativeTemplateStyle:(FLTNativeTemplateStyle *_Nullable)nativeTemplateStyle { + self = [super init]; + if (self) { + self.adId = adId; + _adUnitId = adUnitId; + _adRequest = request; + _nativeAdFactory = nativeAdFactory; + _customOptions = customOptions; + NSArray *adLoaderOptions = + (nativeAdOptions == nil || [[NSNull null] isEqual:nativeAdOptions]) + ? @[] + : nativeAdOptions.asGADAdLoaderOptions; + + _adLoader = + [[GADAdLoader alloc] initWithAdUnitID:_adUnitId + rootViewController:rootViewController + adTypes:@[ GADAdLoaderAdTypeNative ] + options:adLoaderOptions]; + _nativeAdOptions = nativeAdOptions; + _nativeTemplateStyle = nativeTemplateStyle; + self.adLoader.delegate = self; + } + return self; +} + +- (GADAdLoader *_Nonnull)adLoader { + return _adLoader; +} + +- (void)load { + GADRequest *request; + if ([_adRequest isKindOfClass:[FLTGAMAdRequest class]]) { + FLTGAMAdRequest *gamRequest = (FLTGAMAdRequest *)_adRequest; + request = [gamRequest asGAMRequest:_adUnitId]; + } else { + request = [_adRequest asGADRequest:_adUnitId]; + } + + [self.adLoader loadRequest:request]; +} + +#pragma mark - GADNativeAdLoaderDelegate + +- (void)adLoader:(GADAdLoader *)adLoader + didReceiveNativeAd:(GADNativeAd *)nativeAd { + // Use Nil instead of Null to fix crash with Swift integrations. + NSDictionary *customOptions = + [[NSNull null] isEqual:_customOptions] ? nil : _customOptions; + if ([FLTAdUtil isNotNull:_nativeTemplateStyle]) { + _view = [_nativeTemplateStyle getDisplayedView:nativeAd]; + } else if ([FLTAdUtil isNotNull:_nativeAdFactory]) { + _view = [_nativeAdFactory createNativeAd:nativeAd + customOptions:customOptions]; + } + + nativeAd.delegate = self; + + __weak FLTNativeAd *weakSelf = self; + nativeAd.paidEventHandler = ^(GADAdValue *_Nonnull value) { + if (weakSelf.manager == nil) { + return; + } + [weakSelf.manager + onPaidEvent:weakSelf + value:[[FLTAdValue alloc] initWithValue:value.value + precision:(NSInteger)value.precision + currencyCode:value.currencyCode]]; + }; + [manager onAdLoaded:self responseInfo:nativeAd.responseInfo]; +} + +- (void)adLoader:(GADAdLoader *)adLoader + didFailToReceiveAdWithError:(NSError *)error { + [manager onAdFailedToLoad:self error:error]; +} + +#pragma mark - GADNativeAdDelegate + +- (void)nativeAdDidRecordClick:(GADNativeAd *)nativeAd { + [manager adDidRecordClick:self]; +} + +- (void)nativeAdDidRecordImpression:(GADNativeAd *)nativeAd { + [manager onNativeAdImpression:self]; +} + +- (void)nativeAdWillPresentScreen:(GADNativeAd *)nativeAd { + [manager onNativeAdWillPresentScreen:self]; +} + +- (void)nativeAdWillDismissScreen:(nonnull GADNativeAd *)nativeAd { + [manager onNativeAdWillDismissScreen:self]; +} + +- (void)nativeAdDidDismissScreen:(GADNativeAd *)nativeAd { + [manager onNativeAdDidDismissScreen:self]; +} + +#pragma mark - FlutterPlatformView +- (UIView *)view { + return _view; +} + +@synthesize manager; + +@end + +@implementation FLTRewardItem +- (instancetype _Nonnull)initWithAmount:(NSNumber *_Nonnull)amount + type:(NSString *_Nonnull)type { + self = [super init]; + if (self) { + _amount = amount; + _type = type; + } + return self; +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } else if (![super isEqual:other]) { + return NO; + } else { + FLTRewardItem *item = other; + return [_amount isEqual:item.amount] && [_type isEqual:item.type]; + } +} + +- (NSUInteger)hash { + return _amount.hash | _type.hash; +} +@end + +@implementation FLTAdValue +- (instancetype _Nonnull)initWithValue:(NSDecimalNumber *_Nonnull)value + precision:(NSInteger)precision + currencyCode:(NSString *_Nonnull)currencyCode { + self = [super init]; + if (self) { + _valueMicros = + [value decimalNumberByMultiplyingBy:[[NSDecimalNumber alloc] + initWithInteger:1000000]]; + _precision = precision; + _currencyCode = currencyCode; + } + return self; +} +@end + +@implementation FLTVideoOptions +- (instancetype _Nonnull) + initWithClickToExpandRequested:(NSNumber *_Nullable)clickToExpandRequested + customControlsRequested:(NSNumber *_Nullable)customControlsRequested + startMuted:(NSNumber *_Nullable)startMuted { + self = [super init]; + if (self) { + _clickToExpandRequested = clickToExpandRequested; + _customControlsRequested = customControlsRequested; + _startMuted = startMuted; + } + return self; +} + +- (GADVideoOptions *_Nonnull)asGADVideoOptions { + GADVideoOptions *options = [[GADVideoOptions alloc] init]; + if ([FLTAdUtil isNotNull:_clickToExpandRequested]) { + options.clickToExpandRequested = _clickToExpandRequested.boolValue; + } + if ([FLTAdUtil isNotNull:_customControlsRequested]) { + options.customControlsRequested = _customControlsRequested.boolValue; + } + if ([FLTAdUtil isNotNull:_startMuted]) { + options.startMuted = _startMuted.boolValue; + } + return options; +} + +@end + +@implementation FLTNativeAdOptions +- (instancetype _Nonnull) + initWithAdChoicesPlacement:(NSNumber *_Nullable)adChoicesPlacement + mediaAspectRatio:(NSNumber *_Nullable)mediaAspectRatio + videoOptions:(FLTVideoOptions *_Nullable)videoOptions + requestCustomMuteThisAd:(NSNumber *_Nullable)requestCustomMuteThisAd + shouldRequestMultipleImages: + (NSNumber *_Nullable)shouldRequestMultipleImages + shouldReturnUrlsForImageAssets: + (NSNumber *_Nullable)shouldReturnUrlsForImageAssets { + self = [super init]; + if (self) { + _adChoicesPlacement = adChoicesPlacement; + _mediaAspectRatio = mediaAspectRatio; + _videoOptions = videoOptions; + _requestCustomMuteThisAd = requestCustomMuteThisAd; + _shouldRequestMultipleImages = shouldRequestMultipleImages; + _shouldReturnUrlsForImageAssets = shouldReturnUrlsForImageAssets; + } + return self; +} + +- (NSArray *_Nonnull)asGADAdLoaderOptions { + NSMutableArray *options = [NSMutableArray array]; + + GADNativeAdImageAdLoaderOptions *imageOptions = + [[GADNativeAdImageAdLoaderOptions alloc] init]; + if ([FLTAdUtil isNotNull:_shouldReturnUrlsForImageAssets]) { + imageOptions.disableImageLoading = + _shouldReturnUrlsForImageAssets.boolValue; + } + if ([FLTAdUtil isNotNull:_shouldRequestMultipleImages]) { + imageOptions.shouldRequestMultipleImages = + _shouldRequestMultipleImages.boolValue; + } + [options addObject:imageOptions]; + + if ([FLTAdUtil isNotNull:_adChoicesPlacement]) { + GADNativeAdViewAdOptions *adViewOptions = + [[GADNativeAdViewAdOptions alloc] init]; + switch (_adChoicesPlacement.intValue) { + case 0: + adViewOptions.preferredAdChoicesPosition = + GADAdChoicesPositionTopRightCorner; + break; + case 1: + adViewOptions.preferredAdChoicesPosition = + GADAdChoicesPositionTopLeftCorner; + break; + case 2: + adViewOptions.preferredAdChoicesPosition = + GADAdChoicesPositionBottomRightCorner; + break; + case 3: + adViewOptions.preferredAdChoicesPosition = + GADAdChoicesPositionBottomLeftCorner; + break; + default: + NSLog(@"AdChoicesPlacement should be an int in the range [0, 3]: %d", + _adChoicesPlacement.intValue); + break; + } + [options addObject:adViewOptions]; + } + + if ([FLTAdUtil isNotNull:_mediaAspectRatio]) { + GADNativeAdMediaAdLoaderOptions *mediaOptions = + [[GADNativeAdMediaAdLoaderOptions alloc] init]; + switch (_mediaAspectRatio.intValue) { + case 0: + mediaOptions.mediaAspectRatio = GADMediaAspectRatioUnknown; + break; + case 1: + mediaOptions.mediaAspectRatio = GADMediaAspectRatioAny; + break; + case 2: + mediaOptions.mediaAspectRatio = GADMediaAspectRatioLandscape; + break; + case 3: + mediaOptions.mediaAspectRatio = GADMediaAspectRatioPortrait; + break; + case 4: + mediaOptions.mediaAspectRatio = GADMediaAspectRatioSquare; + break; + default: + NSLog(@"MediaAspectRatio should be an int in the range [0, 4]: %d", + _mediaAspectRatio.intValue); + break; + } + [options addObject:mediaOptions]; + } + + if ([FLTAdUtil isNotNull:_videoOptions]) { + [options addObject:_videoOptions.asGADVideoOptions]; + } + return options; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAppStateNotifier.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAppStateNotifier.m new file mode 100644 index 00000000..d4ef51ad --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTAppStateNotifier.m @@ -0,0 +1,142 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAppStateNotifier.h" + +@implementation FLTAppStateNotifier { + FlutterEventChannel *_eventChannel; + FlutterMethodChannel *_methodChannel; + FlutterEventSink _events; + NSMutableArray> *_observers; + BOOL _applicationInBackground; +} + +- (instancetype _Nonnull)initWithBinaryMessenger: + (NSObject *_Nonnull)messenger { + self = [self init]; + if (self) { + FLTAppStateNotifier *__weak weakSelf = self; + _observers = [[NSMutableArray alloc] init]; + _eventChannel = [FlutterEventChannel + eventChannelWithName: + @"plugins.flutter.io/google_mobile_ads/app_state_event" + binaryMessenger:messenger]; + _methodChannel = [FlutterMethodChannel + methodChannelWithName: + @"plugins.flutter.io/google_mobile_ads/app_state_method" + binaryMessenger:messenger]; + [_eventChannel setStreamHandler:self]; + [_methodChannel setMethodCallHandler:^(FlutterMethodCall *_Nonnull call, + FlutterResult _Nonnull result) { + [weakSelf handleMethodCall:call result:result]; + }]; + } + return self; +} + +- (void)handleMethodCall:(FlutterMethodCall *_Nonnull)call + result:(FlutterResult _Nonnull)result { + if ([call.method isEqualToString:@"start"]) { + [self addAppStateObservers]; + result(nil); + } else if ([call.method isEqualToString:@"stop"]) { + [self removeAppStateObservers]; + result(nil); + } else { + result(FlutterMethodNotImplemented); + } +} + +- (void)addAppStateObservers { + if (_observers.count > 0) { + NSLog(@"FLTAppStateNotifier: Already listening for foreground/background " + @"changes."); + return; + } + + id foregroundObserver = [NSNotificationCenter.defaultCenter + addObserverForName:UIApplicationWillEnterForegroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification *_Nonnull note) { + [self handleWillEnterForeground]; + }]; + [_observers addObject:foregroundObserver]; + + id backgroundObserver = [NSNotificationCenter.defaultCenter + addObserverForName:UIApplicationDidEnterBackgroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification *_Nonnull note) { + [self handleDidEnterBackground]; + }]; + [_observers addObject:backgroundObserver]; + + if (@available(iOS 13.0, *)) { + id foregroundSceneObserver = [NSNotificationCenter.defaultCenter + addObserverForName:UISceneWillEnterForegroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification *_Nonnull note) { + [self handleWillEnterForeground]; + }]; + [_observers addObject:foregroundSceneObserver]; + + id backgroundSceneObserver = [NSNotificationCenter.defaultCenter + addObserverForName:UISceneDidEnterBackgroundNotification + object:nil + queue:nil + usingBlock:^(NSNotification *_Nonnull note) { + [self handleDidEnterBackground]; + }]; + [_observers addObject:backgroundSceneObserver]; + } +} + +- (void)removeAppStateObservers { + while (_observers.count > 0) { + [NSNotificationCenter.defaultCenter removeObserver:_observers.lastObject]; + [_observers removeLastObject]; + } +} + +- (void)handleWillEnterForeground { + if (!_applicationInBackground) { + return; + } + _applicationInBackground = NO; + _events(@"foreground"); +} + +- (void)handleDidEnterBackground { + if (_applicationInBackground) { + return; + } + _applicationInBackground = YES; + _events(@"background"); +} + +- (FlutterError *_Nullable)onCancelWithArguments:(id _Nullable)arguments { + _events = nil; + return nil; +} + +- (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments + eventSink: + (nonnull FlutterEventSink)events { + _events = events; + return nil; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.m new file mode 100644 index 00000000..6efb188e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.m @@ -0,0 +1,70 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTGoogleMobileAdsCollection_Internal.h" + +@implementation FLTGoogleMobileAdsCollection { + NSMutableDictionary> *_dictionary; + dispatch_queue_t _lockQueue; +} + +- (instancetype _Nonnull)init { + self = [super init]; + if (self) { + _dictionary = [[NSMutableDictionary alloc] init]; + _lockQueue = dispatch_queue_create("FLTGoogleMobileAdsCollection", + DISPATCH_QUEUE_SERIAL); + } + return self; +} + +- (void)setObject:(id _Nonnull)object forKey:(id _Nonnull)key { + if (key && object) { + dispatch_async(_lockQueue, ^{ + self->_dictionary[key] = object; + }); + } +} + +- (void)removeObjectForKey:(id _Nonnull)key { + if (key != nil) { + dispatch_async(_lockQueue, ^{ + [self->_dictionary removeObjectForKey:key]; + }); + } +} + +- (id _Nullable)objectForKey:(id _Nonnull)key { + id __block object = nil; + dispatch_sync(_lockQueue, ^{ + object = _dictionary[key]; + }); + return object; +} + +- (NSArray *_Nonnull)allKeysForObject:(id _Nonnull)object { + NSArray __block *keys = nil; + dispatch_sync(_lockQueue, ^{ + keys = [_dictionary allKeysForObject:object]; + }); + return keys; +} + +- (void)removeAllObjects { + dispatch_async(_lockQueue, ^{ + [self->_dictionary removeAllObjects]; + }); +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsPlugin.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsPlugin.m new file mode 100644 index 00000000..ae62c703 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsPlugin.m @@ -0,0 +1,592 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTGoogleMobileAdsPlugin.h" +#import "FLTAdUtil.h" +#import "FLTAppStateNotifier.h" +#import "FLTConstants.h" +#import "FLTNSString.h" +#import "FLTUserMessagingPlatformManager.h" +@import webview_flutter_wkwebview; + +@interface FLTGoogleMobileAdsPlugin () +@property(nonatomic, retain) FlutterMethodChannel *channel; +@property NSObject *registrar; +@property NSMutableDictionary> + *nativeAdFactories; +@end + +/// Initialization handler for GMASDK. Invokes result at most once. +@interface FLTInitializationHandler : NSObject +- (instancetype)initWithResult:(FlutterResult)result; +- (void)handleInitializationComplete:(GADInitializationStatus *_Nonnull)status; +@end + +@interface GADMobileAds (Plugin) +- (void)setPlugin:(nullable NSString *)plugin; +@end + +@implementation FLTInitializationHandler { + FlutterResult _result; + BOOL _isInitializationCompleted; +} + +- (instancetype)initWithResult:(FlutterResult)result { + self = [super init]; + if (self) { + _isInitializationCompleted = false; + _result = result; + } + return self; +} + +- (void)handleInitializationComplete:(GADInitializationStatus *_Nonnull)status { + if (_isInitializationCompleted) { + return; + } + _result([[FLTInitializationStatus alloc] initWithStatus:status]); + _isInitializationCompleted = true; + GADMobileAds *mobileAds = GADMobileAds.sharedInstance; + if ([mobileAds respondsToSelector:@selector(setPlugin:)]) { + [mobileAds setPlugin:FLT_REQUEST_AGENT_VERSIONED]; + } +} + +@end + +@implementation FLTGoogleMobileAdsPlugin { + NSMutableDictionary> *_nativeAdFactories; + FLTAdInstanceManager *_manager; + id _mediationNetworkExtrasProvider; + FLTGoogleMobileAdsReaderWriter *_readerWriter; + FLTAppStateNotifier *_appStateNotifier; + FLTUserMessagingPlatformManager *_userMessagingPlatformManager; + __weak FlutterAppDelegate *_appDelegate; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FLTGoogleMobileAdsPlugin *instance = [[FLTGoogleMobileAdsPlugin alloc] + initWithRegistrar:registrar binaryMessenger:registrar.messenger]; + [registrar publish:instance]; + + FLTGoogleMobileAdsReaderWriter *readerWriter = + [[FLTGoogleMobileAdsReaderWriter alloc] init]; + instance->_readerWriter = readerWriter; + + NSObject *codec = + [FlutterStandardMethodCodec codecWithReaderWriter:readerWriter]; + + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:@"plugins.flutter.io/google_mobile_ads" + binaryMessenger:[registrar messenger] + codec:codec]; + [registrar addMethodCallDelegate:instance channel:channel]; + + FLTNewGoogleMobileAdsViewFactory *viewFactory = + [[FLTNewGoogleMobileAdsViewFactory alloc] + initWithManager:instance->_manager]; + [registrar + registerViewFactory:viewFactory + withId:@"plugins.flutter.io/google_mobile_ads/ad_widget"]; + [registrar addApplicationDelegate:instance]; +} + +- (instancetype)init { + self = [super init]; + return self; +} + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + _appDelegate = (FlutterAppDelegate *)application.delegate; + return YES; +} + +- (instancetype)initWithRegistrar: (NSObject*)registrar + binaryMessenger: (id)binaryMessenger { + self = [self init]; + if (self) { + _registrar = registrar; + _nativeAdFactories = [NSMutableDictionary dictionary]; + _manager = + [[FLTAdInstanceManager alloc] initWithBinaryMessenger:binaryMessenger]; + _appStateNotifier = + [[FLTAppStateNotifier alloc] initWithBinaryMessenger:binaryMessenger]; + _userMessagingPlatformManager = [[FLTUserMessagingPlatformManager alloc] + initWithBinaryMessenger:binaryMessenger]; + } + + return self; +} + ++ (BOOL)registerMediationNetworkExtrasProvider: + (id _Nonnull) + mediationNetworkExtrasProvider + registry: + (id _Nonnull) + registry { + NSString *pluginClassName = + NSStringFromClass([FLTGoogleMobileAdsPlugin class]); + FLTGoogleMobileAdsPlugin *adMobPlugin = (FLTGoogleMobileAdsPlugin *)[registry + valuePublishedByPlugin:pluginClassName]; + if (!adMobPlugin) { + NSLog(@"Could not find a %@ instance registering mediation extras " + @"provider. The plugin may " + @"have not been registered.", + pluginClassName); + return NO; + } + + adMobPlugin->_mediationNetworkExtrasProvider = mediationNetworkExtrasProvider; + adMobPlugin->_readerWriter.mediationNetworkExtrasProvider = + mediationNetworkExtrasProvider; + + return YES; +} + ++ (void)unregisterMediationNetworkExtrasProvider: + (id _Nonnull)registry { + NSString *pluginClassName = + NSStringFromClass([FLTGoogleMobileAdsPlugin class]); + FLTGoogleMobileAdsPlugin *adMobPlugin = (FLTGoogleMobileAdsPlugin *)[registry + valuePublishedByPlugin:pluginClassName]; + if (!adMobPlugin) { + NSLog(@"Could not find a %@ instance deregistering mediation extras " + @"provider. The plugin may " + @"have not been registered.", + pluginClassName); + return; + } + + adMobPlugin->_mediationNetworkExtrasProvider = nil; + adMobPlugin->_readerWriter.mediationNetworkExtrasProvider = nil; +} + ++ (BOOL)registerNativeAdFactory:(id)registry + factoryId:(NSString *)factoryId + nativeAdFactory:(id)nativeAdFactory { + NSString *pluginClassName = + NSStringFromClass([FLTGoogleMobileAdsPlugin class]); + FLTGoogleMobileAdsPlugin *adMobPlugin = (FLTGoogleMobileAdsPlugin *)[registry + valuePublishedByPlugin:pluginClassName]; + if (!adMobPlugin) { + NSString *reason = + [NSString stringWithFormat:@"Could not find a %@ instance. The plugin " + @"may have not been registered.", + pluginClassName]; + [NSException exceptionWithName:NSInvalidArgumentException + reason:reason + userInfo:nil]; + } + + if (adMobPlugin.nativeAdFactories[factoryId]) { + NSLog(@"A NativeAdFactory with the following factoryId already exists: %@", + factoryId); + return NO; + } + + [adMobPlugin.nativeAdFactories setValue:nativeAdFactory forKey:factoryId]; + return YES; +} + ++ (id)unregisterNativeAdFactory: + (id)registry + factoryId:(NSString *)factoryId { + FLTGoogleMobileAdsPlugin *adMobPlugin = (FLTGoogleMobileAdsPlugin *)[registry + valuePublishedByPlugin:NSStringFromClass( + [FLTGoogleMobileAdsPlugin class])]; + + id factory = adMobPlugin.nativeAdFactories[factoryId]; + if (factory) + [adMobPlugin.nativeAdFactories removeObjectForKey:factoryId]; + return factory; +} + +- (UIViewController *)rootController { + UIViewController* root = _registrar.viewController; + if ([FLTAdUtil isNull:root]) { +// UIApplication.sharedApplication.delegate.window is not guaranteed to be +// set. Use the keyWindow in this case. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + root = UIApplication.sharedApplication.keyWindow.rootViewController; +#pragma clang diagnostic pop + } + + // Get the presented view controller. This fixes an issue in the add to app + // case: https://github.com/googleads/googleads-mobile-flutter/issues/700 + UIViewController *presentedViewController = root; + while (presentedViewController.presentedViewController && + ![presentedViewController.presentedViewController isBeingDismissed]) { + if ([presentedViewController isKindOfClass:[UITabBarController class]]) { + UITabBarController *tabBarController = + (UITabBarController *)presentedViewController; + presentedViewController = tabBarController.selectedViewController; + } else if ([presentedViewController + isKindOfClass:[UINavigationController class]]) { + UINavigationController *navigationController = + (UINavigationController *)presentedViewController; + presentedViewController = navigationController.visibleViewController; + } else { + presentedViewController = presentedViewController.presentedViewController; + } + } + return presentedViewController; +} + +- (void)handleMethodCall:(FlutterMethodCall *)call + result:(FlutterResult)result { + UIViewController *rootController = self.rootController; + + if ([call.method isEqualToString:@"MobileAds#initialize"]) { + FLTInitializationHandler *handler = + [[FLTInitializationHandler alloc] initWithResult:result]; + [[GADMobileAds sharedInstance] + startWithCompletionHandler:^(GADInitializationStatus *_Nonnull status) { + [handler handleInitializationComplete:status]; + }]; + } else if ([call.method isEqualToString:@"_init"]) { + [_manager disposeAllAds]; + result(nil); + } else if ([call.method isEqualToString:@"MobileAds#setSameAppKeyEnabled"]) { + GADRequestConfiguration *requestConfig = + GADMobileAds.sharedInstance.requestConfiguration; + NSNumber *isEnabled = call.arguments[@"isEnabled"]; + [requestConfig setPublisherFirstPartyIDEnabled:isEnabled.boolValue]; + result(nil); + } else if ([call.method isEqualToString:@"MobileAds#setAppMuted"]) { + GADMobileAds.sharedInstance.applicationMuted = + [call.arguments[@"muted"] boolValue]; + result(nil); + } else if ([call.method isEqualToString:@"MobileAds#setAppVolume"]) { + GADMobileAds.sharedInstance.applicationVolume = + [call.arguments[@"volume"] floatValue]; + result(nil); + } else if ([call.method + isEqualToString:@"MobileAds#disableSDKCrashReporting"]) { + [GADMobileAds.sharedInstance disableSDKCrashReporting]; + result(nil); + } else if ([call.method + isEqualToString:@"MobileAds#disableMediationInitialization"]) { + [GADMobileAds.sharedInstance disableMediationInitialization]; + result(nil); + } else if ([call.method isEqualToString:@"MobileAds#openDebugMenu"]) { + NSString *adUnitId = call.arguments[@"adUnitId"]; + GADDebugOptionsViewController *debugOptionsViewController = + [GADDebugOptionsViewController + debugOptionsViewControllerWithAdUnitID:adUnitId]; + [rootController presentViewController:debugOptionsViewController + animated:YES + completion:nil]; + result(nil); + } else if ([call.method isEqualToString:@"MobileAds#openAdInspector"]) { + [GADMobileAds.sharedInstance + presentAdInspectorFromViewController:rootController + completionHandler:^(NSError *error) { + if (error) { + result([FlutterError + errorWithCode:[[NSString alloc] + gma_initWithInt:error.code] + message:error.localizedDescription + details:error.domain]); + } else { + result(nil); + } + }]; + } else if ([call.method isEqualToString:@"MobileAds#getVersionString"]) { + result(GADGetStringFromVersionNumber( + GADMobileAds.sharedInstance.versionNumber)); + } else if ([call.method + isEqualToString:@"MobileAds#getRequestConfiguration"]) { + result(GADMobileAds.sharedInstance.requestConfiguration); + } else if ([call.method isEqualToString:@"MobileAds#registerWebView"]) { + UIViewController* viewController = _registrar.viewController; + NSNumber *webViewId = call.arguments[@"webViewId"]; + if ([viewController isKindOfClass:FlutterViewController.class]) { + FlutterEngine* engine = ((FlutterViewController*)viewController).engine; + WKWebView *webView = [FLTAdUtil getWebView:webViewId + flutterPluginRegistry:engine]; + [GADMobileAds.sharedInstance registerWebView:webView]; + } else if (!_appDelegate) { + NSLog(@"App delegate is null in MobileAds#registerWebView, skipping"); + } else { + WKWebView *webView = [FLTAdUtil getWebView:webViewId + flutterPluginRegistry:_appDelegate]; + [GADMobileAds.sharedInstance registerWebView:webView]; + } + result(nil); + } else if ([call.method + isEqualToString:@"MobileAds#updateRequestConfiguration"]) { + NSString *maxAdContentRating = call.arguments[@"maxAdContentRating"]; + NSNumber *tagForChildDirectedTreatment = + call.arguments[@"tagForChildDirectedTreatment"]; + NSNumber *tagForUnderAgeOfConsent = + call.arguments[@"tagForUnderAgeOfConsent"]; + NSArray *testDeviceIds = call.arguments[@"testDeviceIds"]; + + if (maxAdContentRating != NULL && maxAdContentRating != (id)[NSNull null]) { + if ([maxAdContentRating isEqualToString:@"G"]) { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + GADMaxAdContentRatingGeneral; + } else if ([maxAdContentRating isEqualToString:@"PG"]) { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + GADMaxAdContentRatingParentalGuidance; + } else if ([maxAdContentRating isEqualToString:@"T"]) { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + GADMaxAdContentRatingTeen; + } else if ([maxAdContentRating isEqualToString:@"MA"]) { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + GADMaxAdContentRatingMatureAudience; + } + } + if (tagForChildDirectedTreatment != NULL && + tagForChildDirectedTreatment != (id)[NSNull null]) { + switch ([tagForChildDirectedTreatment intValue]) { + case 0: + GADMobileAds.sharedInstance.requestConfiguration + .tagForChildDirectedTreatment = @NO; + break; + case 1: + GADMobileAds.sharedInstance.requestConfiguration + .tagForChildDirectedTreatment = @YES; + break; + } + } + if (tagForUnderAgeOfConsent != NULL && + tagForUnderAgeOfConsent != (id)[NSNull null]) { + switch ([tagForUnderAgeOfConsent intValue]) { + case 0: + GADMobileAds.sharedInstance.requestConfiguration + .tagForUnderAgeOfConsent = @NO; + break; + case 1: + GADMobileAds.sharedInstance.requestConfiguration + .tagForUnderAgeOfConsent = @YES; + break; + } + } + if (testDeviceIds != NULL && testDeviceIds != (id)[NSNull null]) { + GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = + testDeviceIds; + } + result(nil); + } else if ([call.method isEqualToString:@"loadBannerAd"]) { + FLTBannerAd *ad = + [[FLTBannerAd alloc] initWithAdUnitId:call.arguments[@"adUnitId"] + size:call.arguments[@"size"] + request:call.arguments[@"request"] + rootViewController:rootController + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadAdManagerBannerAd"]) { + FLTGAMBannerAd *ad = + [[FLTGAMBannerAd alloc] initWithAdUnitId:call.arguments[@"adUnitId"] + sizes:call.arguments[@"sizes"] + request:call.arguments[@"request"] + rootViewController:rootController + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadFluidAd"]) { + FLTFluidGAMBannerAd *ad = [[FLTFluidGAMBannerAd alloc] + initWithAdUnitId:call.arguments[@"adUnitId"] + request:call.arguments[@"request"] + rootViewController:rootController + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadNativeAd"]) { + NSString *factoryId = call.arguments[@"factoryId"]; + id factory = _nativeAdFactories[factoryId]; + FLTNativeTemplateStyle *templateStyle = + call.arguments[@"nativeTemplateStyle"]; + if ([FLTAdUtil isNull:factory] && [FLTAdUtil isNull:templateStyle]) { + NSString *message = + [NSString stringWithFormat:@"Can't find NativeAdFactory with id: %@ " + @"and nativeTemplateStyle is null", + factoryId]; + result([FlutterError errorWithCode:@"NativeAdError" + message:message + details:nil]); + return; + } + + FLTAdRequest *request; + if ([FLTAdUtil isNotNull:call.arguments[@"request"]]) { + request = call.arguments[@"request"]; + } else if ([FLTAdUtil isNotNull:call.arguments[@"adManagerRequest"]]) { + request = call.arguments[@"adManagerRequest"]; + } + + FLTNativeAd *ad = [[FLTNativeAd alloc] + initWithAdUnitId:call.arguments[@"adUnitId"] + request:request + nativeAdFactory:(id)factory + customOptions:call.arguments[@"customOptions"] + rootViewController:rootController + adId:call.arguments[@"adId"] + nativeAdOptions:call.arguments[@"nativeAdOptions"] + nativeTemplateStyle:call.arguments[@"nativeTemplateStyle"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadInterstitialAd"]) { + FLTInterstitialAd *ad = + [[FLTInterstitialAd alloc] initWithAdUnitId:call.arguments[@"adUnitId"] + request:call.arguments[@"request"] + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadAdManagerInterstitialAd"]) { + FLTGAMInterstitialAd *ad = [[FLTGAMInterstitialAd alloc] + initWithAdUnitId:call.arguments[@"adUnitId"] + request:call.arguments[@"request"] + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadRewardedAd"]) { + FLTAdRequest *request; + if ([FLTAdUtil isNotNull:call.arguments[@"request"]]) { + request = call.arguments[@"request"]; + } else if ([FLTAdUtil isNotNull:call.arguments[@"adManagerRequest"]]) { + request = call.arguments[@"adManagerRequest"]; + } else { + result([FlutterError + errorWithCode:@"InvalidRequest" + message:@"A null or invalid ad request was provided." + details:nil]); + return; + } + + FLTRewardedAd *ad = + [[FLTRewardedAd alloc] initWithAdUnitId:call.arguments[@"adUnitId"] + request:request + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadRewardedInterstitialAd"]) { + FLTAdRequest *request; + if ([FLTAdUtil isNotNull:call.arguments[@"request"]]) { + request = call.arguments[@"request"]; + } else if ([FLTAdUtil isNotNull:call.arguments[@"adManagerRequest"]]) { + request = call.arguments[@"adManagerRequest"]; + } else { + result([FlutterError + errorWithCode:@"InvalidRequest" + message:@"A null or invalid ad request was provided." + details:nil]); + return; + } + + FLTRewardedInterstitialAd *ad = [[FLTRewardedInterstitialAd alloc] + initWithAdUnitId:call.arguments[@"adUnitId"] + request:request + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"loadAppOpenAd"]) { + FLTAdRequest *request; + if ([FLTAdUtil isNotNull:call.arguments[@"request"]]) { + request = call.arguments[@"request"]; + } else if ([FLTAdUtil isNotNull:call.arguments[@"adManagerRequest"]]) { + request = call.arguments[@"adManagerRequest"]; + } else { + result([FlutterError + errorWithCode:@"InvalidRequest" + message:@"A null or invalid ad request was provided." + details:nil]); + return; + } + FLTAppOpenAd *ad = + [[FLTAppOpenAd alloc] initWithAdUnitId:call.arguments[@"adUnitId"] + request:request + adId:call.arguments[@"adId"]]; + [_manager loadAd:ad]; + result(nil); + } else if ([call.method isEqualToString:@"disposeAd"]) { + [_manager dispose:call.arguments[@"adId"]]; + result(nil); + } else if ([call.method isEqualToString:@"showAdWithoutView"]) { + [_manager showAdWithID:call.arguments[@"adId"]]; + result(nil); + } else if ([call.method + isEqualToString:@"AdSize#getAnchoredAdaptiveBannerAdSize"]) { + FLTAnchoredAdaptiveBannerSize *size = [[FLTAnchoredAdaptiveBannerSize alloc] + initWithFactory:[[FLTAdSizeFactory alloc] init] + orientation:call.arguments[@"orientation"] + width:call.arguments[@"width"] + isLarge:false]; + if (IsGADAdSizeValid(size.size)) { + result(size.height); + } else { + result(nil); + } + } else if ([call.method isEqualToString:@"AdSize#getLargeAnchoredAdaptiveBannerAdSize"]) { + FLTAnchoredAdaptiveBannerSize *size = [[FLTAnchoredAdaptiveBannerSize alloc] + initWithFactory:[[FLTAdSizeFactory alloc] init] + orientation:call.arguments[@"orientation"] + width:call.arguments[@"width"] + isLarge:true]; + if (IsGADAdSizeValid(size.size)) { + result(size.height); + } else { + result(nil); + } + } else if ([call.method isEqualToString:@"getAdSize"]) { + id ad = [_manager adFor:call.arguments[@"adId"]]; + if ([FLTAdUtil isNull:ad]) { + // Called on an ad that hasn't been loaded yet. + result(nil); + } + if ([ad isKindOfClass:[FLTBannerAd class]]) { + FLTBannerAd *bannerAd = (FLTBannerAd *)ad; + result([bannerAd getAdSize]); + } else { + result(FlutterMethodNotImplemented); + } + } else if ([call.method isEqualToString:@"isCollapsible"]) { + id ad = [_manager adFor:call.arguments[@"adId"]]; + if ([FLTAdUtil isNull:ad]) { + // Called on an ad that hasn't been loaded yet. + result(@NO); + } + if ([ad isKindOfClass:[FLTBannerAd class]]) { + FLTBannerAd *bannerAd = (FLTBannerAd *)ad; + result(@([bannerAd isCollapsible])); + } else { + result(FlutterMethodNotImplemented); + } + } else if ([call.method + isEqualToString:@"setServerSideVerificationOptions"]) { + id ad = [_manager adFor:call.arguments[@"adId"]]; + FLTServerSideVerificationOptions *options = + call.arguments[@"serverSideVerificationOptions"]; + if ([ad isKindOfClass:[FLTRewardedAd class]]) { + FLTRewardedAd *rewardedAd = (FLTRewardedAd *)ad; + [rewardedAd setServerSideVerificationOptions:options]; + } else if ([ad isKindOfClass:[FLTRewardedInterstitialAd class]]) { + FLTRewardedInterstitialAd *rewardedInterstitialAd = + (FLTRewardedInterstitialAd *)ad; + [rewardedInterstitialAd setServerSideVerificationOptions:options]; + } else { + NSLog(@"Error - setServerSideVerificationOptions called on missing or " + @"invalid ad id: %@", + call.arguments[@"adId"]); + } + result(nil); + } else { + result(FlutterMethodNotImplemented); + } +} +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.m new file mode 100644 index 00000000..fa8bcb5b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.m @@ -0,0 +1,532 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTGoogleMobileAdsReaderWriter_Internal.h" +#import "FLTAdUtil.h" +#import "FLTMediationExtras.h" +#import "FLTNativeTemplateColor.h" +#import "FLTNativeTemplateFontStyle.h" +#import "FLTNativeTemplateStyle.h" +#import "FLTNativeTemplateTextStyle.h" +#import "FLTNativeTemplateType.h" + +// The type values below must be consistent for each platform. +typedef NS_ENUM(NSInteger, FLTAdMobField) { + FLTAdMobFieldAdSize = 128, + FLTAdMobFieldAdRequest = 129, + FLTAdMobFieldFluidAdSize = 130, + FLTAdMobFieldRewardItem = 132, + FLTAdMobFieldLoadError = 133, + FLTAdMobFieldAdManagerAdRequest = 134, + FLTAdMobFieldAdapterInitializationState = 135, + FLTAdMobFieldAdapterStatus = 136, + FLTAdMobFieldInitializationStatus = 137, + FLTAdmobFieldServerSideVerificationOptions = 138, + FLTAdmobFieldAdError = 139, + FLTAdmobFieldGadResponseInfo = 140, + FLTAdmobFieldGADAdNetworkResponseInfo = 141, + FLTAdmobFieldAnchoredAdaptiveBannerAdSize = 142, + FLTAdmobFieldSmartBannerAdSize = 143, + FLTAdmobFieldNativeAdOptions = 144, + FLTAdmobFieldVideoOptions = 145, + FLTAdmobFieldInlineAdaptiveAdSize = 146, + FLTAdmobRequestConfigurationParams = 148, + FLTAdmobFieldNativeTemplateStyle = 149, + FLTAdmobFieldNativeTemplateTextStyle = 150, + FLTAdmobFieldNativeTemplateFontStyle = 151, + FLTAdmobFieldNativeTemplateType = 152, + FLTAdmobFieldNativeTemplateColor = 153, + FLTAdmobFieldMediationExtras = 154 + +}; + +@interface FLTGoogleMobileAdsWriter : FlutterStandardWriter +@end + +@implementation FLTGoogleMobileAdsReaderWriter +- (instancetype)init { + return [self initWithFactory:[[FLTAdSizeFactory alloc] init]]; +} + +- (instancetype _Nonnull)initWithFactory: + (FLTAdSizeFactory *_Nonnull)adSizeFactory { + self = [super init]; + if (self) { + _adSizeFactory = adSizeFactory; + } + return self; +} + +- (FlutterStandardReader *_Nonnull)readerWithData:(NSData *_Nonnull)data { + FLTGoogleMobileAdsReader *reader = + [[FLTGoogleMobileAdsReader alloc] initWithFactory:_adSizeFactory + data:data]; + reader.mediationNetworkExtrasProvider = _mediationNetworkExtrasProvider; + return reader; +} + +- (FlutterStandardWriter *_Nonnull)writerWithData: + (NSMutableData *_Nonnull)data { + return [[FLTGoogleMobileAdsWriter alloc] initWithData:data]; +} +@end + +@implementation FLTGoogleMobileAdsReader { + NSString *_requestAgent; +} +- (instancetype _Nonnull)initWithFactory: + (FLTAdSizeFactory *_Nonnull)adSizeFactory + data:(NSData *_Nonnull)data { + self = [super initWithData:data]; + if (self) { + _adSizeFactory = adSizeFactory; + _requestAgent = [FLTAdUtil requestAgent]; + } + return self; +} + +- (id _Nullable)readValueOfType:(UInt8)type { + FLTAdMobField field = (FLTAdMobField)type; + switch (field) { + case FLTAdMobFieldAdSize: + return [[FLTAdSize alloc] + initWithWidth:[self readValueOfType:[self readByte]] + height:[self readValueOfType:[self readByte]]]; + case FLTAdMobFieldFluidAdSize: + return [[FLTFluidSize alloc] init]; + case FLTAdMobFieldAdRequest: { + FLTAdRequest *request = [[FLTAdRequest alloc] init]; + + request.keywords = [self readValueOfType:[self readByte]]; + request.contentURL = [self readValueOfType:[self readByte]]; + + NSNumber *nonPersonalizedAds = [self readValueOfType:[self readByte]]; + request.nonPersonalizedAds = nonPersonalizedAds.boolValue; + request.neighboringContentURLs = [self readValueOfType:[self readByte]]; + request.mediationExtrasIdentifier = [self readValueOfType:[self readByte]]; + request.mediationNetworkExtrasProvider = _mediationNetworkExtrasProvider; + request.adMobExtras = [self readValueOfType:[self readByte]]; + request.requestAgent = _requestAgent; + request.mediationExtras = [self readValueOfType:[self readByte]]; + return request; + } + case FLTAdmobFieldMediationExtras: { + id flutterMediationExtras = + [[NSClassFromString([self readValueOfType:[self readByte]]) alloc] + init]; + NSMutableDictionary *flutterExtras = [self readValueOfType:[self readByte]]; + flutterMediationExtras.extras = flutterExtras; + return flutterMediationExtras; + } + case FLTAdMobFieldRewardItem: { + return [[FLTRewardItem alloc] + initWithAmount:[self readValueOfType:[self readByte]] + type:[self readValueOfType:[self readByte]]]; + } + case FLTAdmobFieldGadResponseInfo: { + NSString *responseIdentifier = [self readValueOfType:[self readByte]]; + NSString *adNetworkClassName = [self readValueOfType:[self readByte]]; + NSArray *adNetworkInfoArray = + [self readValueOfType:[self readByte]]; + FLTGADAdNetworkResponseInfo *loadedResponseInfo = + [self readValueOfType:[self readByte]]; + NSDictionary *extrasDictionary = + [self readValueOfType:[self readByte]]; + FLTGADResponseInfo *gadResponseInfo = [[FLTGADResponseInfo alloc] init]; + gadResponseInfo.adNetworkClassName = adNetworkClassName; + gadResponseInfo.responseIdentifier = responseIdentifier; + gadResponseInfo.adNetworkInfoArray = adNetworkInfoArray; + gadResponseInfo.loadedAdNetworkResponseInfo = loadedResponseInfo; + gadResponseInfo.extrasDictionary = extrasDictionary; + return gadResponseInfo; + } + case FLTAdmobFieldGADAdNetworkResponseInfo: { + NSString *adNetworkClassName = [self readValueOfType:[self readByte]]; + NSNumber *latency = [self readValueOfType:[self readByte]]; + NSString *dictionaryDescription = [self readValueOfType:[self readByte]]; + NSDictionary *adUnitMapping = + [self readValueOfType:[self readByte]]; + NSError *error = [self readValueOfType:[self readByte]]; + NSString *adSourceName = [self readValueOfType:[self readByte]]; + NSString *adSourceID = [self readValueOfType:[self readByte]]; + NSString *adSourceInstanceName = [self readValueOfType:[self readByte]]; + NSString *adSourceInstanceID = [self readValueOfType:[self readByte]]; + FLTGADAdNetworkResponseInfo *adNetworkResponseInfo = + [[FLTGADAdNetworkResponseInfo alloc] init]; + adNetworkResponseInfo.adNetworkClassName = adNetworkClassName; + adNetworkResponseInfo.latency = latency; + adNetworkResponseInfo.dictionaryDescription = dictionaryDescription; + adNetworkResponseInfo.adUnitMapping = adUnitMapping; + adNetworkResponseInfo.error = error; + adNetworkResponseInfo.adSourceName = adSourceName; + adNetworkResponseInfo.adSourceID = adSourceID; + adNetworkResponseInfo.adSourceInstanceName = adSourceInstanceName; + adNetworkResponseInfo.adSourceInstanceID = adSourceInstanceID; + + return adNetworkResponseInfo; + } + case FLTAdMobFieldLoadError: { + NSNumber *code = [self readValueOfType:[self readByte]]; + NSString *domain = [self readValueOfType:[self readByte]]; + NSString *message = [self readValueOfType:[self readByte]]; + FLTGADResponseInfo *responseInfo = [self readValueOfType:[self readByte]]; + FLTLoadAdError *loadAdError = [[FLTLoadAdError alloc] init]; + loadAdError.code = code.longValue; + loadAdError.domain = domain; + loadAdError.message = message; + loadAdError.responseInfo = responseInfo; + return loadAdError; + } + case FLTAdmobFieldAdError: { + NSNumber *code = [self readValueOfType:[self readByte]]; + NSString *domain = [self readValueOfType:[self readByte]]; + NSString *message = [self readValueOfType:[self readByte]]; + return [NSError errorWithDomain:domain + code:code.longValue + userInfo:@{NSLocalizedDescriptionKey : message}]; + } + case FLTAdMobFieldAdManagerAdRequest: { + FLTGAMAdRequest *request = [[FLTGAMAdRequest alloc] init]; + request.keywords = [self readValueOfType:[self readByte]]; + request.contentURL = [self readValueOfType:[self readByte]]; + request.customTargeting = [self readValueOfType:[self readByte]]; + request.customTargetingLists = [self readValueOfType:[self readByte]]; + NSNumber *nonPersonalizedAds = [self readValueOfType:[self readByte]]; + request.nonPersonalizedAds = nonPersonalizedAds.boolValue; + request.neighboringContentURLs = [self readValueOfType:[self readByte]]; + request.pubProvidedID = [self readValueOfType:[self readByte]]; + request.mediationExtrasIdentifier = [self readValueOfType:[self readByte]]; + request.mediationNetworkExtrasProvider = _mediationNetworkExtrasProvider; + request.adMobExtras = [self readValueOfType:[self readByte]]; + request.requestAgent = _requestAgent; + request.mediationExtras = [self readValueOfType:[self readByte]]; + return request; + } + case FLTAdMobFieldAdapterInitializationState: { + NSString *state = [self readValueOfType:[self readByte]]; + if (!state) { + return nil; + } else if ([@"notReady" isEqualToString:state]) { + return @(FLTAdapterInitializationStateNotReady); + } else if ([@"ready" isEqualToString:state]) { + return @(FLTAdapterInitializationStateReady); + } + NSLog(@"Failed to interpret AdapterInitializationState of: %@", state); + return nil; + } + case FLTAdMobFieldAdapterStatus: { + FLTAdapterStatus *status = [[FLTAdapterStatus alloc] init]; + status.state = [self readValueOfType:[self readByte]]; + status.statusDescription = [self readValueOfType:[self readByte]]; + status.latency = [self readValueOfType:[self readByte]]; + return status; + } + case FLTAdMobFieldInitializationStatus: { + FLTInitializationStatus *status = [[FLTInitializationStatus alloc] init]; + status.adapterStatuses = [self readValueOfType:[self readByte]]; + return status; + } + case FLTAdmobFieldServerSideVerificationOptions: { + FLTServerSideVerificationOptions *options = + [[FLTServerSideVerificationOptions alloc] init]; + options.userIdentifier = [self readValueOfType:[self readByte]]; + options.customRewardString = [self readValueOfType:[self readByte]]; + return options; + } + case FLTAdmobFieldAnchoredAdaptiveBannerAdSize: { + NSString *orientation = [self readValueOfType:[self readByte]]; + NSNumber *width = [self readValueOfType:[self readByte]]; + return [[FLTAnchoredAdaptiveBannerSize alloc] initWithFactory:_adSizeFactory + orientation:orientation + width:width + isLarge:false]; + } + case FLTAdmobFieldSmartBannerAdSize: + return [[FLTSmartBannerSize alloc] + initWithOrientation:[self readValueOfType:[self readByte]]]; + case FLTAdmobFieldNativeAdOptions: { + return [[FLTNativeAdOptions alloc] + initWithAdChoicesPlacement:[self readValueOfType:[self readByte]] + mediaAspectRatio:[self readValueOfType:[self readByte]] + videoOptions:[self readValueOfType:[self readByte]] + requestCustomMuteThisAd:[self readValueOfType:[self readByte]] + shouldRequestMultipleImages:[self readValueOfType:[self readByte]] + shouldReturnUrlsForImageAssets:[self readValueOfType:[self readByte]]]; + } + case FLTAdmobFieldVideoOptions: { + return [[FLTVideoOptions alloc] + initWithClickToExpandRequested:[self readValueOfType:[self readByte]] + customControlsRequested:[self readValueOfType:[self readByte]] + startMuted:[self readValueOfType:[self readByte]]]; + } + case FLTAdmobRequestConfigurationParams: { + GADMobileAds.sharedInstance.requestConfiguration.maxAdContentRating = + [self readValueOfType:[self readByte]]; + GADMobileAds.sharedInstance.requestConfiguration + .tagForChildDirectedTreatment = [self readValueOfType:[self readByte]]; + GADMobileAds.sharedInstance.requestConfiguration.tagForUnderAgeOfConsent = + [self readValueOfType:[self readByte]]; + GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = + [self readValueOfType:[self readByte]]; + return GADMobileAds.sharedInstance.requestConfiguration; + } + case FLTAdmobFieldInlineAdaptiveAdSize: { + return [[FLTInlineAdaptiveBannerSize alloc] + initWithFactory:_adSizeFactory + width:[self readValueOfType:[self readByte]] + maxHeight:[self readValueOfType:[self readByte]] + orientation:[self readValueOfType:[self readByte]]]; + } + case FLTAdmobFieldNativeTemplateStyle: { + FLTNativeTemplateType *templateType = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateColor *mainBackgroundColor = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateTextStyle *callToActionStyle = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateTextStyle *primaryTextStyle = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateTextStyle *secondaryTextStyle = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateTextStyle *tertiaryTextStyle = + [self readValueOfType:[self readByte]]; + NSNumber *cornerRadius = [self readValueOfType:[self readByte]]; + return + [[FLTNativeTemplateStyle alloc] initWithTemplateType:templateType + mainBackgroundColor:mainBackgroundColor + callToActionStyle:callToActionStyle + primaryTextStyle:primaryTextStyle + secondaryTextStyle:secondaryTextStyle + tertiaryTextStyle:tertiaryTextStyle + cornerRadius:cornerRadius]; + } + case FLTAdmobFieldNativeTemplateTextStyle: { + FLTNativeTemplateColor *textColor = [self readValueOfType:[self readByte]]; + FLTNativeTemplateColor *backgroundColor = + [self readValueOfType:[self readByte]]; + FLTNativeTemplateFontStyleWrapper *fontStyle = + [self readValueOfType:[self readByte]]; + NSNumber *size = [self readValueOfType:[self readByte]]; + return [[FLTNativeTemplateTextStyle alloc] initWithTextColor:textColor + backgroundColor:backgroundColor + fontStyle:fontStyle + size:size]; + } + case FLTAdmobFieldNativeTemplateFontStyle: { + NSNumber *fontStyleIndex = [self readValueOfType:[self readByte]]; + return [[FLTNativeTemplateFontStyleWrapper alloc] + initWithInt:fontStyleIndex.intValue]; + } + case FLTAdmobFieldNativeTemplateType: { + NSNumber *templateIndex = [self readValueOfType:[self readByte]]; + return [[FLTNativeTemplateType alloc] initWithInt:templateIndex.intValue]; + } + case FLTAdmobFieldNativeTemplateColor: { + NSNumber *alpha = [self readValueOfType:[self readByte]]; + NSNumber *red = [self readValueOfType:[self readByte]]; + NSNumber *green = [self readValueOfType:[self readByte]]; + NSNumber *blue = [self readValueOfType:[self readByte]]; + return [[FLTNativeTemplateColor alloc] initWithAlpha:alpha + red:red + green:green + blue:blue]; + } + } + return [super readValueOfType:type]; +} +@end + +@implementation FLTGoogleMobileAdsWriter +- (void)writeAdSize:(FLTAdSize *_Nonnull)value { + if ([value isKindOfClass:[FLTInlineAdaptiveBannerSize class]]) { + [self writeByte:FLTAdmobFieldInlineAdaptiveAdSize]; + FLTInlineAdaptiveBannerSize *size = (FLTInlineAdaptiveBannerSize *)value; + [self writeValue:size.width]; + [self writeValue:size.maxHeight]; + [self writeValue:size.orientation]; + } else if ([value isKindOfClass:[FLTAnchoredAdaptiveBannerSize class]]) { + [self writeByte:FLTAdmobFieldAnchoredAdaptiveBannerAdSize]; + FLTAnchoredAdaptiveBannerSize *size = + (FLTAnchoredAdaptiveBannerSize *)value; + [self writeValue:size.orientation]; + [self writeValue:size.width]; + } else if ([value isKindOfClass:[FLTSmartBannerSize class]]) { + [self writeByte:FLTAdmobFieldSmartBannerAdSize]; + FLTSmartBannerSize *size = (FLTSmartBannerSize *)value; + [self writeValue:size.orientation]; + } else if ([value isKindOfClass:[FLTFluidSize class]]) { + [self writeByte:FLTAdMobFieldFluidAdSize]; + } else if ([value isKindOfClass:[FLTAdSize class]]) { + [self writeByte:FLTAdMobFieldAdSize]; + [self writeValue:value.width]; + [self writeValue:value.height]; + } +} + +- (void)writeValue:(id)value { + if ([value isKindOfClass:[FLTAdSize class]]) { + [self writeAdSize:value]; + } else if ([value isKindOfClass:[FLTGAMAdRequest class]]) { + [self writeByte:FLTAdMobFieldAdManagerAdRequest]; + FLTGAMAdRequest *request = value; + [self writeValue:request.keywords]; + [self writeValue:request.contentURL]; + [self writeValue:request.customTargeting]; + [self writeValue:request.customTargetingLists]; + [self writeValue:@(request.nonPersonalizedAds)]; + [self writeValue:request.neighboringContentURLs]; + [self writeValue:request.pubProvidedID]; + [self writeValue:request.mediationExtrasIdentifier]; + [self writeValue:request.adMobExtras]; + [self writeValue:request.mediationExtras]; + } else if ([value isKindOfClass:[FLTAdRequest class]]) { + [self writeByte:FLTAdMobFieldAdRequest]; + FLTAdRequest *request = value; + [self writeValue:request.keywords]; + [self writeValue:request.contentURL]; + [self writeValue:@(request.nonPersonalizedAds)]; + [self writeValue:request.neighboringContentURLs]; + [self writeValue:request.mediationExtrasIdentifier]; + [self writeValue:request.adMobExtras]; + [self writeValue:request.mediationExtras]; + } else if ([value conformsToProtocol:@protocol(FlutterMediationExtras)]) { + [self writeByte:FLTAdmobFieldMediationExtras]; + NSObject *fltExtras = value; + [self writeValue:NSStringFromClass([fltExtras class])]; + [self writeValue:fltExtras.extras]; + } else if ([value isKindOfClass:[FLTRewardItem class]]) { + [self writeByte:FLTAdMobFieldRewardItem]; + FLTRewardItem *item = value; + [self writeValue:item.amount]; + [self writeValue:item.type]; + } else if ([value isKindOfClass:[FLTGADResponseInfo class]]) { + [self writeByte:FLTAdmobFieldGadResponseInfo]; + FLTGADResponseInfo *responseInfo = value; + [self writeValue:responseInfo.responseIdentifier]; + [self writeValue:responseInfo.adNetworkClassName]; + [self writeValue:responseInfo.adNetworkInfoArray]; + [self writeValue:responseInfo.loadedAdNetworkResponseInfo]; + [self writeValue:responseInfo.extrasDictionary]; + } else if ([value isKindOfClass:[FLTGADAdNetworkResponseInfo class]]) { + [self writeByte:FLTAdmobFieldGADAdNetworkResponseInfo]; + FLTGADAdNetworkResponseInfo *networkResponseInfo = value; + [self writeValue:networkResponseInfo.adNetworkClassName]; + [self writeValue:networkResponseInfo.latency]; + [self writeValue:networkResponseInfo.dictionaryDescription]; + [self writeValue:networkResponseInfo.adUnitMapping]; + [self writeValue:networkResponseInfo.error]; + [self writeValue:networkResponseInfo.adSourceName]; + [self writeValue:networkResponseInfo.adSourceID]; + [self writeValue:networkResponseInfo.adSourceInstanceName]; + [self writeValue:networkResponseInfo.adSourceInstanceID]; + } else if ([value isKindOfClass:[FLTLoadAdError class]]) { + [self writeByte:FLTAdMobFieldLoadError]; + FLTLoadAdError *error = value; + [self writeValue:@(error.code)]; + [self writeValue:error.domain]; + [self writeValue:error.message]; + [self writeValue:error.responseInfo]; + } else if ([value isKindOfClass:[NSError class]]) { + [self writeByte:FLTAdmobFieldAdError]; + NSError *error = value; + [self writeValue:@(error.code)]; + [self writeValue:error.domain]; + [self writeValue:error.localizedDescription]; + } else if ([value isKindOfClass:[FLTAdapterStatus class]]) { + [self writeByte:FLTAdMobFieldAdapterStatus]; + FLTAdapterStatus *status = value; + [self writeByte:FLTAdMobFieldAdapterInitializationState]; + if (!status.state) { + [self writeValue:[NSNull null]]; + } else if (status.state.unsignedLongValue == + FLTAdapterInitializationStateNotReady) { + [self writeValue:@"notReady"]; + } else if (status.state.unsignedLongValue == + FLTAdapterInitializationStateReady) { + [self writeValue:@"ready"]; + } else { + NSLog(@"Failed to interpret AdapterInitializationState of: %@", + status.state); + [self writeValue:[NSNull null]]; + } + [self writeValue:status.statusDescription]; + [self writeValue:status.latency]; + } else if ([value isKindOfClass:[FLTInitializationStatus class]]) { + [self writeByte:FLTAdMobFieldInitializationStatus]; + FLTInitializationStatus *status = value; + [self writeValue:status.adapterStatuses]; + } else if ([value isKindOfClass:[FLTServerSideVerificationOptions class]]) { + [self writeByte:FLTAdmobFieldServerSideVerificationOptions]; + FLTServerSideVerificationOptions *options = value; + [self writeValue:options.userIdentifier]; + [self writeValue:options.customRewardString]; + } else if ([value isKindOfClass:[FLTNativeAdOptions class]]) { + [self writeByte:FLTAdmobFieldNativeAdOptions]; + FLTNativeAdOptions *options = value; + [self writeValue:options.adChoicesPlacement]; + [self writeValue:options.mediaAspectRatio]; + [self writeValue:options.videoOptions]; + [self writeValue:options.requestCustomMuteThisAd]; + [self writeValue:options.shouldRequestMultipleImages]; + [self writeValue:options.shouldReturnUrlsForImageAssets]; + } else if ([value isKindOfClass:[FLTVideoOptions class]]) { + [self writeByte:FLTAdmobFieldVideoOptions]; + FLTVideoOptions *options = value; + [self writeValue:options.clickToExpandRequested]; + [self writeValue:options.customControlsRequested]; + [self writeValue:options.startMuted]; + } else if ([value isKindOfClass:[GADRequestConfiguration class]]) { + [self writeByte:FLTAdmobRequestConfigurationParams]; + GADRequestConfiguration *params = value; + [self writeValue:params.maxAdContentRating]; + [self writeValue:params.tagForChildDirectedTreatment]; + [self writeValue:params.tagForUnderAgeOfConsent]; + [self writeValue:params.testDeviceIdentifiers]; + } else if ([value isKindOfClass:[FLTNativeTemplateType class]]) { + [self writeByte:FLTAdmobFieldNativeTemplateType]; + FLTNativeTemplateType *templateType = value; + [self writeValue:@(templateType.intValue)]; + } else if ([value isKindOfClass:[FLTNativeTemplateFontStyleWrapper class]]) { + [self writeByte:FLTAdmobFieldNativeTemplateFontStyle]; + FLTNativeTemplateFontStyleWrapper *fontStyle = value; + [self writeValue:@(fontStyle.intValue)]; + } else if ([value isKindOfClass:[FLTNativeTemplateColor class]]) { + [self writeByte:FLTAdmobFieldNativeTemplateColor]; + FLTNativeTemplateColor *templateColor = value; + [self writeValue:templateColor.alpha]; + [self writeValue:templateColor.red]; + [self writeValue:templateColor.green]; + [self writeValue:templateColor.blue]; + } else if ([value isKindOfClass:[FLTNativeTemplateTextStyle class]]) { + [self writeByte:FLTAdmobFieldNativeTemplateTextStyle]; + FLTNativeTemplateTextStyle *textStyle = value; + [self writeValue:textStyle.textColor]; + [self writeValue:textStyle.backgroundColor]; + [self writeValue:textStyle.fontStyle]; + [self writeValue:textStyle.size]; + } else if ([value isKindOfClass:[FLTNativeTemplateStyle class]]) { + [self writeByte:FLTAdmobFieldNativeTemplateStyle]; + FLTNativeTemplateStyle *templateStyle = value; + [self writeValue:templateStyle.templateType]; + [self writeValue:templateStyle.mainBackgroundColor]; + [self writeValue:templateStyle.callToActionStyle]; + [self writeValue:templateStyle.primaryTextStyle]; + [self writeValue:templateStyle.secondaryTextStyle]; + [self writeValue:templateStyle.tertiaryTextStyle]; + [self writeValue:templateStyle.cornerRadius]; + } else { + [super writeValue:value]; + } +} +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTMobileAds_Internal.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTMobileAds_Internal.m new file mode 100644 index 00000000..cb3a3fba --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTMobileAds_Internal.m @@ -0,0 +1,61 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTMobileAds_Internal.h" + +@implementation FLTAdapterStatus +- (instancetype)initWithStatus:(GADAdapterStatus *)status { + self = [self init]; + if (self) { + switch (status.state) { + case GADAdapterInitializationStateNotReady: + _state = @(FLTAdapterInitializationStateNotReady); + break; + case GADAdapterInitializationStateReady: + _state = @(FLTAdapterInitializationStateReady); + break; + } + _statusDescription = status.description; + _latency = @(status.latency); + } + return self; +} +@end + +@implementation FLTInitializationStatus +- (instancetype)initWithStatus:(GADInitializationStatus *)status { + self = [self init]; + if (self) { + NSMutableDictionary *newDictionary = [NSMutableDictionary dictionary]; + for (NSString *name in status.adapterStatusesByClassName.allKeys) { + FLTAdapterStatus *adapterStatus = [[FLTAdapterStatus alloc] + initWithStatus:status.adapterStatusesByClassName[name]]; + [newDictionary setValue:adapterStatus forKey:name]; + } + _adapterStatuses = newDictionary; + } + return self; +} +@end + +@implementation FLTServerSideVerificationOptions +- (GADServerSideVerificationOptions *_Nonnull) + asGADServerSideVerificationOptions { + GADServerSideVerificationOptions *options = + [[GADServerSideVerificationOptions alloc] init]; + options.userIdentifier = _userIdentifier; + options.customRewardString = _customRewardString; + return options; +} +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTNSString.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTNSString.m new file mode 100644 index 00000000..3cf996f6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/FLTNSString.m @@ -0,0 +1,24 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNSString.h" + +@implementation NSString (FLTNSStringExtension) + +- (instancetype _Nonnull)gma_initWithInt:(NSInteger)integer { + self = [self initWithFormat:@"%ld", (long)integer]; + return self; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.m new file mode 100644 index 00000000..237cc11a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.m @@ -0,0 +1,30 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GADTFullScreenTemplateView.h" + +@implementation GADTFullScreenTemplateView + +- (nonnull instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.translatesAutoresizingMaskIntoConstraints = NO; + } + return self; +} + +- (nonnull NSString *)getTemplateTypeName { + return @"full_screen_template"; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.m new file mode 100644 index 00000000..715010eb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.m @@ -0,0 +1,29 @@ +// Copyright 2018-2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#import "GADTMediumTemplateView.h" + +@implementation GADTMediumTemplateView + +- (nonnull instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.translatesAutoresizingMaskIntoConstraints = NO; + } + return self; +} + +- (nonnull NSString *)getTemplateTypeName { + return @"medium_template"; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.m new file mode 100644 index 00000000..a4482d7b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.m @@ -0,0 +1,30 @@ +// Copyright 2018-2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GADTSmallTemplateView.h" + +@implementation GADTSmallTemplateView + +- (nonnull instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.translatesAutoresizingMaskIntoConstraints = NO; + } + return self; +} + +- (nonnull NSString *)getTemplateTypeName { + return @"small_template"; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.m new file mode 100644 index 00000000..2c8f3413 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.m @@ -0,0 +1,326 @@ +// Copyright 2018-2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GADTTemplateView.h" +#import + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyCallToActionFont = + @"call_to_action_font"; + +GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyCallToActionFontColor = + @"call_to_action_font_color"; + +GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyCallToActionBackgroundColor = + @"call_to_action_background_color"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeySecondaryFont = + @"secondary_font"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeySecondaryFontColor = + @"secondary_font_color"; + +GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeySecondaryBackgroundColor = + @"secondary_background_color"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyPrimaryFont = + @"primary_font"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyPrimaryFontColor = + @"primary_font_color"; + +GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyPrimaryBackgroundColor = + @"primary_background_color"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyTertiaryFont = + @"tertiary_font"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyTertiaryFontColor = + @"tertiary_font_color"; + +GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyTertiaryBackgroundColor = + @"tertiary_background_color"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyMainBackgroundColor = + @"main_background_color"; + +GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyCornerRadius = + @"corner_radius"; + +static NSString *const GADTBlue = @"#5C84F0"; + +@implementation GADTTemplateView { + NSDictionary *_defaultStyles; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _rootView = + [NSBundle.mainBundle loadNibNamed:NSStringFromClass([self class]) + owner:self + options:nil] + .firstObject; + + [self addSubview:_rootView]; + + [self addConstraints: + [NSLayoutConstraint + constraintsWithVisualFormat:@"H:|[_rootView]|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings( + _rootView)]]; + [self addConstraints: + [NSLayoutConstraint + constraintsWithVisualFormat:@"V:|[_rootView]|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings( + _rootView)]]; + [self applyStyles]; + [self styleAdBadge]; + } + return self; +} + +- (NSString *)getTemplateTypeName { + return @"root"; +} + +/// Returns the style value for the provided key or the default style if no +/// styles dictionary was set. +- (id)styleForKey:(GADTNativeTemplateStyleKey)key { + return _styles[key] ?: nil; +} + +// Goes through all recognized style keys and updates the views accordingly, +// overwriting the defaults. +- (void)applyStyles { + self.layer.borderColor = + [GADTTemplateView colorFromHexString:@"E0E0E0"].CGColor; + self.layer.borderWidth = 1.0f; + [self.mediaView sizeToFit]; + if ([self styleForKey:GADTNativeTemplateStyleKeyCornerRadius]) { + float roundedCornerRadius = + ((NSNumber *)[self styleForKey:GADTNativeTemplateStyleKeyCornerRadius]) + .floatValue; + + // Rounded corners + self.iconView.layer.cornerRadius = roundedCornerRadius; + self.iconView.clipsToBounds = YES; + ((UIButton *)self.callToActionView).layer.cornerRadius = + roundedCornerRadius; + ((UIButton *)self.callToActionView).clipsToBounds = YES; + } + + // Fonts + if ([self styleForKey:GADTNativeTemplateStyleKeyPrimaryFont]) { + ((UILabel *)self.headlineView).font = + (UIFont *)[self styleForKey:GADTNativeTemplateStyleKeyPrimaryFont]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeySecondaryFont]) { + ((UILabel *)self.bodyView).font = + (UIFont *)[self styleForKey:GADTNativeTemplateStyleKeySecondaryFont]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyTertiaryFont]) { + ((UILabel *)self.advertiserView).font = + (UIFont *)[self styleForKey:GADTNativeTemplateStyleKeyTertiaryFont]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyCallToActionFont]) { + ((UIButton *)self.callToActionView).titleLabel.font = + (UIFont *)[self styleForKey:GADTNativeTemplateStyleKeyCallToActionFont]; + } + + // Font colors + if ([self styleForKey:GADTNativeTemplateStyleKeyPrimaryFontColor]) + ((UILabel *)self.headlineView).textColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyPrimaryFontColor]; + + if ([self styleForKey:GADTNativeTemplateStyleKeySecondaryFontColor]) { + ((UILabel *)self.bodyView).textColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeySecondaryFontColor]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyTertiaryFontColor]) { + ((UILabel *)self.advertiserView).textColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyTertiaryFontColor]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyCallToActionFontColor]) { + [((UIButton *)self.callToActionView) + setTitleColor: + (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyCallToActionFontColor] + forState:UIControlStateNormal]; + } + + // Background colors + if ([self styleForKey:GADTNativeTemplateStyleKeyPrimaryBackgroundColor]) { + ((UILabel *)self.headlineView).backgroundColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyPrimaryBackgroundColor]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeySecondaryBackgroundColor]) { + ((UILabel *)self.bodyView).backgroundColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeySecondaryBackgroundColor]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyTertiaryBackgroundColor]) { + ((UILabel *)self.advertiserView).backgroundColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyTertiaryBackgroundColor]; + } + + if ([self + styleForKey:GADTNativeTemplateStyleKeyCallToActionBackgroundColor]) { + ((UIButton *)self.callToActionView).backgroundColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyCallToActionBackgroundColor]; + } + + if ([self styleForKey:GADTNativeTemplateStyleKeyMainBackgroundColor]) { + self.backgroundColor = (UIColor *)[self + styleForKey:GADTNativeTemplateStyleKeyMainBackgroundColor]; + } + [self styleAdBadge]; +} + +- (void)styleAdBadge { + UILabel *adBadge = self.adBadge; + adBadge.layer.borderColor = adBadge.textColor.CGColor; + adBadge.layer.borderWidth = 1.0; + adBadge.layer.cornerRadius = 3.0; + adBadge.layer.masksToBounds = YES; +} + +- (void)setStyles: + (NSDictionary *)styles { + _styles = [styles copy]; + [self applyStyles]; +} + +- (void)setNativeAd:(GADNativeAd *)nativeAd { + ((UILabel *)self.headlineView).text = nativeAd.headline; + + // Some of the assets are not guaranteed to be present. This is to check + // that they are before showing or hiding them. + ((UIImageView *)self.iconView).image = nativeAd.icon.image; + self.iconView.hidden = nativeAd.icon ? NO : YES; + + [((UIButton *)self.callToActionView) setTitle:nativeAd.callToAction + forState:UIControlStateNormal]; + + // Either show the advertiser an app has, or show the store of the ad. + if (nativeAd.advertiser && !nativeAd.store) { + // Ad has advertiser but not store + self.storeView.hidden = YES; + ((UILabel *)self.advertiserView).text = nativeAd.advertiser; + self.advertiserView.hidden = NO; + } else if (nativeAd.store && !nativeAd.advertiser) { + // Ad has store but not advertiser + self.advertiserView.hidden = YES; + ((UILabel *)self.storeView).text = nativeAd.store; + self.storeView.hidden = NO; + } else if (nativeAd.advertiser && nativeAd.store) { + // Ad has both store and advertiser, default to showing advertiser. + self.storeView.hidden = YES; + ((UILabel *)self.advertiserView).text = nativeAd.advertiser; + self.advertiserView.hidden = NO; + } + + // Either show the number of stars an app has, or show the body of the ad. + // If there is a starRating then starRatingView is shown and bodyView is + // hidden otherwise, starRatingView is hidden and bodyView is filled. Use the + // unicode characters for filled in or empty stars. + if (nativeAd.starRating.floatValue > 0) { + NSMutableString *stars = [[NSMutableString alloc] initWithString:@""]; + int count = 0; + for (; count < nativeAd.starRating.intValue; count++) { + NSString *filledStar = [NSString stringWithUTF8String:"\u2605"]; + [stars appendString:filledStar]; + } + for (; count < 5; count++) { + NSString *emptyStar = [NSString stringWithUTF8String:"\u2606"]; + [stars appendString:emptyStar]; + } + ((UILabel *)self.starRatingView).text = stars; + self.bodyView.hidden = YES; + self.starRatingView.hidden = NO; + } else { + self.starRatingView.hidden = YES; + ((UILabel *)self.bodyView).text = nativeAd.body; + self.bodyView.hidden = NO; + } + + [self.mediaView setMediaContent:nativeAd.mediaContent]; + [super setNativeAd:nativeAd]; +} + +- (void)addHorizontalConstraintsToSuperviewWidth { + // Add an autolayout constraint to make sure our template view stretches to + // fill the width of its parent. + if (self.superview) { + UIView *child = self; + [self.superview + addConstraints: + [NSLayoutConstraint + constraintsWithVisualFormat:@"H:|[child]|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings( + child)]]; + } +} + +- (void)addVerticalCenterConstraintToSuperview { + if (self.superview) { + UIView *child = self; + [self.superview + addConstraint:[NSLayoutConstraint + constraintWithItem:self.superview + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:child + attribute:NSLayoutAttributeCenterY + multiplier:1 + constant:0]]; + } +} + +/// Creates an opaque UIColor object from a byte-value color definition. ++ (UIColor *)colorFromHexString:(NSString *)hexString { + if (hexString == nil) { + return nil; + } + NSRange range = [hexString rangeOfString:@"^#[0-9a-fA-F]{6}$" + options:NSRegularExpressionSearch]; + if (range.location == NSNotFound) { + return nil; + } + unsigned rgbValue = 0; + NSScanner *scanner = [NSScanner scannerWithString:hexString]; + [scanner setScanLocation:1]; // Bypass '#' character. + [scanner scanHexInt:&rgbValue]; + + return [UIColor colorWithRed:((rgbValue & 0xff0000) >> 16) / 255.0f + green:((rgbValue & 0xff00) >> 8) / 255.0f + blue:(rgbValue & 0xff) / 255.0f + alpha:1]; +} +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateColor.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateColor.m new file mode 100644 index 00000000..1651ffd1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateColor.m @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateColor.h" + +@implementation FLTNativeTemplateColor { + NSNumber *_alpha; + NSNumber *_red; + NSNumber *_green; + NSNumber *_blue; +} + +- (instancetype _Nonnull)initWithAlpha:(NSNumber *_Nonnull)alpha + red:(NSNumber *_Nonnull)red + green:(NSNumber *_Nonnull)green + blue:(NSNumber *_Nonnull)blue { + self = [super init]; + if (self) { + _alpha = alpha; + _red = red; + _green = green; + _blue = blue; + } + return self; +} + +- (UIColor *)uiColor { + return [UIColor colorWithRed:_red.floatValue / 255.f + green:_green.floatValue / 255.f + blue:_blue.floatValue / 255.f + alpha:_alpha.floatValue / 255.f]; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateFontStyle.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateFontStyle.m new file mode 100644 index 00000000..1d1fdbed --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateFontStyle.m @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateFontStyle.h" + +@implementation FLTNativeTemplateFontStyleWrapper { + int _intValue; +} + +- (instancetype _Nonnull)initWithInt:(int)intValue { + self = [super init]; + if (self) { + _intValue = intValue; + } + return self; +} + +- (FLTNativeTemplateFontStyle)fontStyle { + switch (_intValue) { + case 0: + return FLTNativeTemplateFontNormal; + case 1: + return FLTNativeTemplateFontBold; + case 2: + return FLTNativeTemplateFontItalic; + case 3: + return FLTNativeTemplateFontMonospace; + default: + NSLog(@"Unknown FLTNativeTemplateFontStyle value: %d", _intValue); + return FLTNativeTemplateFontNormal; + } +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateStyle.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateStyle.m new file mode 100644 index 00000000..1de7bb50 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateStyle.m @@ -0,0 +1,157 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateStyle.h" +#import "FLTAdUtil.h" +#import "GADTSmallTemplateView.h" +#import "GADTTemplateView.h" + +@implementation FLTNativeTemplateStyle + +- (instancetype _Nonnull) + initWithTemplateType:(FLTNativeTemplateType *_Nonnull)templateType + mainBackgroundColor:(FLTNativeTemplateColor *_Nullable)mainBackgroundColor + callToActionStyle: + (FLTNativeTemplateTextStyle *_Nullable)callToActionStyle + primaryTextStyle:(FLTNativeTemplateTextStyle *_Nullable)primaryTextStyle + secondaryTextStyle: + (FLTNativeTemplateTextStyle *_Nullable)secondaryTextStyle + tertiaryTextStyle: + (FLTNativeTemplateTextStyle *_Nullable)tertiaryTextStyle + cornerRadius:(NSNumber *_Nullable)cornerRadius { + self = [super init]; + if (self) { + _templateType = templateType; + _mainBackgroundColor = mainBackgroundColor; + _callToActionStyle = callToActionStyle; + _primaryTextStyle = primaryTextStyle; + _secondaryTextStyle = secondaryTextStyle; + _tertiaryTextStyle = tertiaryTextStyle; + _cornerRadius = cornerRadius; + } + return self; +} + +- (FLTNativeTemplateViewWrapper *_Nonnull)getDisplayedView: + (GADNativeAd *_Nonnull)gadNativeAd { + GADTTemplateView *templateView = _templateType.templateView; + templateView.nativeAd = gadNativeAd; + + NSMutableDictionary *styles = [[NSMutableDictionary alloc] init]; + if ([FLTAdUtil isNotNull:_mainBackgroundColor]) { + styles[GADTNativeTemplateStyleKeyMainBackgroundColor] = + _mainBackgroundColor.uiColor; + } + if ([FLTAdUtil isNotNull:_cornerRadius]) { + styles[GADTNativeTemplateStyleKeyCornerRadius] = _cornerRadius; + } + if ([FLTAdUtil isNotNull:_callToActionStyle]) { + if ([FLTAdUtil isNotNull:_callToActionStyle.backgroundColor]) { + styles[GADTNativeTemplateStyleKeyCallToActionBackgroundColor] = + _callToActionStyle.backgroundColor.uiColor; + } + if ([FLTAdUtil isNotNull:_callToActionStyle.uiFont]) { + styles[GADTNativeTemplateStyleKeyCallToActionFont] = + _callToActionStyle.uiFont; + } + if ([FLTAdUtil isNotNull:_callToActionStyle.textColor]) { + styles[GADTNativeTemplateStyleKeyCallToActionFontColor] = + _callToActionStyle.textColor.uiColor; + } + } + if ([FLTAdUtil isNotNull:_primaryTextStyle]) { + if ([FLTAdUtil isNotNull:_primaryTextStyle.backgroundColor]) { + styles[GADTNativeTemplateStyleKeyPrimaryBackgroundColor] = + _primaryTextStyle.backgroundColor.uiColor; + } + if ([FLTAdUtil isNotNull:_primaryTextStyle.uiFont]) { + styles[GADTNativeTemplateStyleKeyPrimaryFont] = _primaryTextStyle.uiFont; + } + if ([FLTAdUtil isNotNull:_primaryTextStyle.textColor]) { + styles[GADTNativeTemplateStyleKeyPrimaryFontColor] = + _primaryTextStyle.textColor.uiColor; + } + } + if ([FLTAdUtil isNotNull:_secondaryTextStyle]) { + if ([FLTAdUtil isNotNull:_secondaryTextStyle.backgroundColor]) { + styles[GADTNativeTemplateStyleKeySecondaryBackgroundColor] = + _secondaryTextStyle.backgroundColor.uiColor; + } + if ([FLTAdUtil isNotNull:_secondaryTextStyle.uiFont]) { + styles[GADTNativeTemplateStyleKeySecondaryFont] = + _secondaryTextStyle.uiFont; + } + if ([FLTAdUtil isNotNull:_secondaryTextStyle.textColor]) { + styles[GADTNativeTemplateStyleKeySecondaryFontColor] = + _secondaryTextStyle.textColor.uiColor; + } + } + if ([FLTAdUtil isNotNull:_tertiaryTextStyle]) { + if ([FLTAdUtil isNotNull:_tertiaryTextStyle.backgroundColor]) { + styles[GADTNativeTemplateStyleKeyTertiaryBackgroundColor] = + _tertiaryTextStyle.backgroundColor.uiColor; + } + if ([FLTAdUtil isNotNull:_tertiaryTextStyle.uiFont]) { + styles[GADTNativeTemplateStyleKeyTertiaryFont] = + _tertiaryTextStyle.uiFont; + } + if ([FLTAdUtil isNotNull:_tertiaryTextStyle.textColor]) { + styles[GADTNativeTemplateStyleKeyTertiaryFontColor] = + _tertiaryTextStyle.textColor.uiColor; + } + } + templateView.styles = styles; + + FLTNativeTemplateViewWrapper *wrapper = + [[FLTNativeTemplateViewWrapper alloc] initWithFrame:CGRectZero]; + wrapper.templateView = templateView; + return wrapper; +} + +@end + +@implementation FLTNativeTemplateViewWrapper + +- (void)layoutSubviews { + [super layoutSubviews]; + if (_templateView) { + [self addSubview:_templateView]; + // Constrain the top of the templateView to the top of this view. This top + // aligns the template view + if (_templateView.superview) { + [_templateView.superview + addConstraint:[NSLayoutConstraint + constraintWithItem:_templateView.superview + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:_templateView + attribute:NSLayoutAttributeTop + multiplier:1 + constant:0]]; + [_templateView.superview + addConstraint: + [NSLayoutConstraint + constraintWithItem:_templateView.superview + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationGreaterThanOrEqual + toItem:_templateView + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:0]]; + } + [_templateView addHorizontalConstraintsToSuperviewWidth]; + } +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateTextStyle.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateTextStyle.m new file mode 100644 index 00000000..82716ba1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateTextStyle.m @@ -0,0 +1,67 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateTextStyle.h" +#import "FLTAdUtil.h" + +@implementation FLTNativeTemplateTextStyle + +- (instancetype _Nonnull) + initWithTextColor:(FLTNativeTemplateColor *_Nullable)textColor + backgroundColor:(FLTNativeTemplateColor *_Nullable)backgroundColor + fontStyle:(FLTNativeTemplateFontStyleWrapper *_Nullable)fontStyle + size:(NSNumber *_Nullable)size { + self = [super init]; + if (self) { + _textColor = textColor; + _backgroundColor = backgroundColor; + _fontStyle = fontStyle; + _size = size; + } + return self; +} + +- (UIFont *_Nullable)uiFont { + if ([FLTAdUtil isNull:_fontStyle] && [FLTAdUtil isNull:_size]) { + return nil; + } + + CGFloat size = + [FLTAdUtil isNull:_size] ? UIFont.systemFontSize : _size.floatValue; + if ([FLTAdUtil isNull:_fontStyle]) { + return [UIFont systemFontOfSize:size]; + } else { + switch (_fontStyle.fontStyle) { + case FLTNativeTemplateFontNormal: + return [UIFont systemFontOfSize:size]; + case FLTNativeTemplateFontBold: + return [UIFont boldSystemFontOfSize:size]; + case FLTNativeTemplateFontItalic: + return [UIFont italicSystemFontOfSize:size]; + case FLTNativeTemplateFontMonospace: + if (@available(iOS 13.0, *)) { + return [UIFont monospacedSystemFontOfSize:size + weight:UIFontWeightRegular]; + } else { + return [UIFont monospacedDigitSystemFontOfSize:size + weight:UIFontWeightRegular]; + } + default: + NSLog(@"Unknown fontStyle case: %ld", _fontStyle.fontStyle); + return [UIFont systemFontOfSize:size]; + } + } +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateType.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateType.m new file mode 100644 index 00000000..6f7ab2e0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/NativeTemplates/FLTNativeTemplateType.m @@ -0,0 +1,69 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateType.h" + +#ifndef SWIFTPM_MODULE_BUNDLE + #define SWIFTPM_MODULE_BUNDLE [NSBundle bundleForClass:[self class]] +#endif + +@implementation FLTNativeTemplateType { + int _intValue; +} + +- (instancetype _Nonnull)initWithInt:(int)intValue { + self = [super init]; + if (self) { + _intValue = intValue; + } + return self; +} + +- (NSString *_Nonnull)xibName { + switch (_intValue) { + case 0: + return @"GADTSmallTemplateView"; + case 1: + return @"GADTMediumTemplateView"; + default: + NSLog(@"Unknown template type value: %d", _intValue); + return @"GADTMediumTemplateView"; + } +} + +- (GADTTemplateView *_Nonnull)templateView { + // Bundle file name is declared in Package.swift or podspec + NSBundle *adsBundle = nil; + + NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"google_mobile_ads" + withExtension:@"bundle"]; + if (bundleURL) { + adsBundle = [NSBundle bundleWithURL:bundleURL]; + } else { + #ifdef SWIFTPM_MODULE_BUNDLE + adsBundle = SWIFTPM_MODULE_BUNDLE; + #else + adsBundle = [NSBundle bundleForClass:[self class]]; + #endif + } + if (!adsBundle) { + adsBundle = [NSBundle mainBundle]; + } + + GADTTemplateView *templateView = + [adsBundle loadNibNamed:self.xibName owner:nil options:nil].firstObject; + return templateView; +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTFullScreenTemplateView.xib b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTFullScreenTemplateView.xib new file mode 100644 index 00000000..8e370677 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTFullScreenTemplateView.xib @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTMediumTemplateView.xib b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTMediumTemplateView.xib new file mode 100644 index 00000000..f6bf27cc --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTMediumTemplateView.xib @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTSmallTemplateView.xib b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTSmallTemplateView.xib new file mode 100644 index 00000000..ccc9feab --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/Resources/GADTSmallTemplateView.xib @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformManager.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformManager.m new file mode 100644 index 00000000..5cca5767 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformManager.m @@ -0,0 +1,180 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTUserMessagingPlatformManager.h" +#import "FLTAdUtil.h" +#import "FLTNSString.h" +#import "FLTUserMessagingPlatformReaderWriter.h" +#include + +@implementation FLTUserMessagingPlatformManager { + FlutterMethodChannel *_methodChannel; +} + +- (instancetype _Nonnull)initWithBinaryMessenger: + (NSObject *_Nonnull)binaryMessenger { + self = [self init]; + if (self) { + self.readerWriter = [[FLTUserMessagingPlatformReaderWriter alloc] init]; + NSObject *methodCodec = + [FlutterStandardMethodCodec codecWithReaderWriter:_readerWriter]; + _methodChannel = [[FlutterMethodChannel alloc] + initWithName:@"plugins.flutter.io/google_mobile_ads/ump" + binaryMessenger:binaryMessenger + codec:methodCodec]; + + FLTUserMessagingPlatformManager *__weak weakSelf = self; + [_methodChannel setMethodCallHandler:^(FlutterMethodCall *_Nonnull call, + FlutterResult _Nonnull result) { + [weakSelf handleMethodCall:call result:result]; + }]; + } + return self; +} + +- (UIViewController *)rootController { + return UIApplication.sharedApplication.delegate.window.rootViewController; +} + +- (void)handleMethodCall:(FlutterMethodCall *_Nonnull)call + result:(FlutterResult _Nonnull)result { + if ([call.method isEqualToString:@"ConsentInformation#reset"]) { + [UMPConsentInformation.sharedInstance reset]; + result(nil); + } else if ([call.method + isEqualToString:@"ConsentInformation#getConsentStatus"]) { + UMPConsentStatus status = + UMPConsentInformation.sharedInstance.consentStatus; + result([[NSNumber alloc] initWithInteger:status]); + } else if ([call.method + isEqualToString:@"ConsentInformation#canRequestAds"]) { + result(@([UMPConsentInformation.sharedInstance canRequestAds])); + } else if ([call.method + isEqualToString:@"ConsentInformation#" + @"getPrivacyOptionsRequirementStatus"]) { + UMPPrivacyOptionsRequirementStatus status = + UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus; + switch (status) { + case UMPPrivacyOptionsRequirementStatusNotRequired: + result([[NSNumber alloc] initWithInt:0]); + break; + case UMPPrivacyOptionsRequirementStatusRequired: + result([[NSNumber alloc] initWithInt:1]); + break; + default: + result([[NSNumber alloc] initWithInt:2]); + break; + } + } else if ([call.method isEqualToString: + @"ConsentInformation#requestConsentInfoUpdate"]) { + UMPRequestParameters *parameters = call.arguments[@"params"]; + [UMPConsentInformation.sharedInstance + requestConsentInfoUpdateWithParameters:parameters + completionHandler:^(NSError *_Nullable error) { + if ([FLTAdUtil isNull:error]) { + result(nil); + } else { + result([FlutterError + errorWithCode:[[NSString alloc] + gma_initWithInt:error.code] + message:error.localizedDescription + details:error.domain]); + } + }]; + } else if ([call.method + isEqualToString:@"UserMessagingPlatform#" + @"loadAndShowConsentFormIfRequired"]) { + [UMPConsentForm + loadAndPresentIfRequiredFromViewController:self.rootController + completionHandler:^(NSError *_Nullable error) { + if ([FLTAdUtil isNull:error]) { + result(nil); + } else { + result([FlutterError + errorWithCode: + [[NSString alloc] + gma_initWithInt:error.code] + message:error + .localizedDescription + details:error.domain]); + } + }]; + } else if ([call.method + isEqualToString:@"UserMessagingPlatform#loadConsentForm"]) { + [UMPConsentForm + loadWithCompletionHandler:^(UMPConsentForm *form, NSError *loadError) { + if ([FLTAdUtil isNull:loadError]) { + [self.readerWriter trackConsentForm:form]; + result(form); + } else { + result([FlutterError + errorWithCode:[[NSString alloc] gma_initWithInt:loadError.code] + message:loadError.localizedDescription + details:loadError.domain]); + } + }]; + } else if ([call.method + isEqualToString: + @"UserMessagingPlatform#showPrivacyOptionsForm"]) { + [UMPConsentForm + presentPrivacyOptionsFormFromViewController:self.rootController + completionHandler:^( + NSError *_Nullable formError) { + if ([FLTAdUtil isNull:formError]) { + result(nil); + } else { + result([FlutterError + errorWithCode: + [[NSString alloc] + gma_initWithInt:formError.code] + message: + formError + .localizedDescription + details:formError.domain]); + } + }]; + } else if ([call.method isEqualToString: + @"ConsentInformation#isConsentFormAvailable"]) { + BOOL isAvailable = UMPConsentInformation.sharedInstance.formStatus == + UMPFormStatusAvailable; + result([[NSNumber alloc] initWithBool:isAvailable]); + } else if ([call.method isEqualToString:@"ConsentForm#show"]) { + UMPConsentForm *consentForm = call.arguments[@"consentForm"]; + [consentForm + presentFromViewController:self.rootController + completionHandler:^(NSError *_Nullable error) { + if ([FLTAdUtil isNull:error]) { + result(nil); + } else { + result([FlutterError + errorWithCode:[[NSString alloc] gma_initWithInt:error.code] + message:error.localizedDescription + details:error.domain]); + } + }]; + } else if ([call.method isEqualToString:@"ConsentForm#dispose"]) { + UMPConsentForm *consentForm = call.arguments[@"consentForm"]; + if ([FLTAdUtil isNotNull:consentForm]) { + [_readerWriter disposeConsentForm:consentForm]; + } else { + NSLog(@"FLTUserMessagingPlatformManager - consentForm resources already " + @"freed"); + } + result(nil); + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.m b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.m new file mode 100644 index 00000000..d3ab46d7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.m @@ -0,0 +1,138 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTUserMessagingPlatformReaderWriter.h" +#import "FLTAdUtil.h" +#include + +// The type values below must be consistent for each platform. +typedef NS_ENUM(NSInteger, FLTUserMessagingPlatformField) { + FLTValueConsentRequestParameters = 129, + FLTValueConsentDebugSettings = 130, + FLTValueConsentForm = 131, +}; + +@interface FLTUserMessagingPlatformReader : FlutterStandardReader +@property NSMutableDictionary *consentFormDict; +@end + +@interface FLTUserMessagingPlatformWriter : FlutterStandardWriter +@property NSMutableDictionary *consentFormDict; +@end + +@interface FLTUserMessagingPlatformReaderWriter () +@property NSMutableDictionary *consentFormDict; +@end + +@implementation FLTUserMessagingPlatformReaderWriter + +- (instancetype _Nonnull)init { + self = [super init]; + if (self) { + self.consentFormDict = [[NSMutableDictionary alloc] init]; + } + return self; +} + +- (void)trackConsentForm:(UMPConsentForm *)consentForm { + NSNumber *hash = [[NSNumber alloc] initWithInteger:consentForm.hash]; + _consentFormDict[hash] = consentForm; +} + +- (void)disposeConsentForm:(UMPConsentForm *)consentForm { + NSNumber *hash = [[NSNumber alloc] initWithInteger:consentForm.hash]; + [_consentFormDict removeObjectForKey:hash]; +} + +- (FlutterStandardReader *_Nonnull)readerWithData:(NSData *_Nonnull)data { + FLTUserMessagingPlatformReader *reader = + [[FLTUserMessagingPlatformReader alloc] initWithData:data]; + reader.consentFormDict = self.consentFormDict; + return reader; +} + +- (FlutterStandardWriter *_Nonnull)writerWithData: + (NSMutableData *_Nonnull)data { + FLTUserMessagingPlatformWriter *writer = + [[FLTUserMessagingPlatformWriter alloc] initWithData:data]; + writer.consentFormDict = self.consentFormDict; + return writer; +} +@end + +@implementation FLTUserMessagingPlatformWriter + +- (void)writeValue:(id)value { + if ([value isKindOfClass:[UMPConsentForm class]]) { + UMPConsentForm *form = (UMPConsentForm *)value; + NSNumber *hash = [[NSNumber alloc] initWithInteger:form.hash]; + [self writeByte:FLTValueConsentForm]; + [self writeValue:hash]; + } else if ([value isKindOfClass:[UMPRequestParameters class]]) { + UMPRequestParameters *params = (UMPRequestParameters *)value; + + [self writeByte:FLTValueConsentRequestParameters]; + [self writeValue:[[NSNumber alloc] + initWithBool:params.tagForUnderAgeOfConsent]]; + [self writeValue:params.debugSettings]; + } else if ([value isKindOfClass:[UMPDebugSettings class]]) { + UMPDebugSettings *debugSettings = (UMPDebugSettings *)value; + [self writeByte:FLTValueConsentDebugSettings]; + [self + writeValue:[[NSNumber alloc] initWithInteger:debugSettings.geography]]; + [self writeValue:debugSettings.testDeviceIdentifiers]; + } else { + [super writeValue:value]; + } +} + +@end + +@implementation FLTUserMessagingPlatformReader + +- (id _Nullable)readValueOfType:(UInt8)type { + FLTUserMessagingPlatformField field = (FLTUserMessagingPlatformField)type; + switch (field) { + case FLTValueConsentRequestParameters: { + UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init]; + NSNumber *tfuac = [self readValueOfType:[self readByte]]; + + parameters.tagForUnderAgeOfConsent = tfuac.boolValue; + UMPDebugSettings *debugSettings = [self readValueOfType:[self readByte]]; + parameters.debugSettings = debugSettings; + return parameters; + } + case FLTValueConsentDebugSettings: { + UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init]; + NSNumber *geography = [self readValueOfType:[self readByte]]; + NSArray *testIdentifiers = + [self readValueOfType:[self readByte]]; + if ([FLTAdUtil isNotNull:geography]) { + debugSettings.geography = geography.intValue; + } + if ([FLTAdUtil isNotNull:testIdentifiers]) { + debugSettings.testDeviceIdentifiers = testIdentifiers; + } + return debugSettings; + } + case FLTValueConsentForm: { + NSNumber *hash = [self readValueOfType:[self readByte]]; + return _consentFormDict[hash]; + } + default: + return [super readValueOfType:type]; + } +} + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdInstanceManager_Internal.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdInstanceManager_Internal.h new file mode 100644 index 00000000..1e8dd554 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdInstanceManager_Internal.h @@ -0,0 +1,74 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAd_Internal.h" +#import "FLTGoogleMobileAdsCollection_Internal.h" +#import "FLTGoogleMobileAdsReaderWriter_Internal.h" +#import + +@protocol FLTAd; +@class FLTBannerAd; +@class FLTNativeAd; +@class FLTRewardedAd; +@class FLTRewardedInterstitialAd; +@class FLTRewardItem; +@class FLTAdValue; + +@interface FLTAdInstanceManager : NSObject +- (instancetype _Nonnull)initWithBinaryMessenger: + (id _Nonnull)binaryMessenger; +- (id _Nullable)adFor:(NSNumber *_Nonnull)adId; +- (NSNumber *_Nullable)adIdFor:(id _Nonnull)ad; +- (void)loadAd:(id _Nonnull)ad; +- (void)dispose:(NSNumber *_Nonnull)adId; +- (void)showAdWithID:(NSNumber *_Nonnull)adId; +- (void)onAdLoaded:(id _Nonnull)ad + responseInfo:(GADResponseInfo *_Nonnull)responseInfo; +- (void)onAdFailedToLoad:(id _Nonnull)ad error:(NSError *_Nonnull)error; +- (void)onAppEvent:(id _Nonnull)ad + name:(NSString *_Nullable)name + data:(NSString *_Nullable)data; +- (void)onNativeAdImpression:(FLTNativeAd *_Nonnull)ad; +- (void)onNativeAdWillPresentScreen:(FLTNativeAd *_Nonnull)ad; +- (void)onNativeAdDidDismissScreen:(FLTNativeAd *_Nonnull)ad; +- (void)onNativeAdWillDismissScreen:(FLTNativeAd *_Nonnull)ad; +- (void)onRewardedAdUserEarnedReward:(FLTRewardedAd *_Nonnull)ad + reward:(FLTRewardItem *_Nonnull)reward; +- (void)onRewardedInterstitialAdUserEarnedReward: + (FLTRewardedInterstitialAd *_Nonnull)ad + reward: + (FLTRewardItem *_Nonnull)reward; +- (void)onPaidEvent:(id _Nonnull)ad value:(FLTAdValue *_Nonnull)value; +- (void)onBannerImpression:(FLTBannerAd *_Nonnull)ad; +- (void)onBannerWillDismissScreen:(FLTBannerAd *_Nonnull)ad; +- (void)onBannerDidDismissScreen:(FLTBannerAd *_Nonnull)ad; +- (void)onBannerWillPresentScreen:(FLTBannerAd *_Nonnull)ad; + +- (void)adWillPresentFullScreenContent:(id _Nonnull)ad; +- (void)adDidDismissFullScreenContent:(id _Nonnull)ad; +- (void)adWillDismissFullScreenContent:(id _Nonnull)ad; +- (void)adDidRecordImpression:(id _Nonnull)ad; +- (void)adDidRecordClick:(id _Nonnull)ad; +- (void)didFailToPresentFullScreenContentWithError:(id _Nonnull)ad + error:(NSError *_Nonnull)error; +- (void)onFluidAdHeightChanged:(id _Nonnull)ad height:(CGFloat)height; +- (void)disposeAllAds; +@end + +@interface FLTNewGoogleMobileAdsViewFactory + : NSObject +@property(readonly) FLTAdInstanceManager *_Nonnull manager; +- (instancetype _Nonnull)initWithManager: + (FLTAdInstanceManager *_Nonnull)manager; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdUtil.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdUtil.h new file mode 100644 index 00000000..1a0c2f9f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAdUtil.h @@ -0,0 +1,31 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import +#import + +@interface FLTAdUtil : NSObject + ++ (BOOL)isNull:(_Nullable id)object; + ++ (BOOL)isNotNull:(_Nullable id)object; + ++ (WKWebView *_Nullable)getWebView:(NSNumber *_Nonnull)webViewId + flutterPluginRegistry: + (id _Nonnull)flutterPluginRegistry; + +@property(readonly, class) NSString *_Nonnull requestAgent; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAd_Internal.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAd_Internal.h new file mode 100644 index 00000000..1d48655c --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAd_Internal.h @@ -0,0 +1,319 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTGoogleMobileAdsPlugin.h" +#import "FLTMediationExtras.h" +#import "FLTMediationNetworkExtrasProvider.h" +#import "FLTMobileAds_Internal.h" +#import "FLTNativeTemplateStyle.h" +#import "GADTTemplateView.h" +#import +#import + +@class FLTAdInstanceManager; +@protocol FLTNativeAdFactory; + +@interface FLTAdSize : NSObject +@property(readonly) GADAdSize size; +@property(readonly) NSNumber *_Nonnull width; +@property(readonly) NSNumber *_Nonnull height; +- (instancetype _Nonnull)initWithWidth:(NSNumber *_Nonnull)width + height:(NSNumber *_Nonnull)height; +- (instancetype _Nonnull)initWithAdSize:(GADAdSize)size; +@end + +/** + * Wrapper around top level methods for `GADAdSize` for the Google Mobile Ads + * Plugin. + */ +@interface FLTAdSizeFactory : NSObject +- (GADAdSize)portraitAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize)landscapeAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize)currentOrientationAnchoredAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize)currentOrientationInlineAdaptiveBannerSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize)portraitOrientationInlineAdaptiveBannerSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize)landscapeInlineAdaptiveBannerAdSizeWithWidth: + (NSNumber *_Nonnull)width; +- (GADAdSize) + inlineAdaptiveBannerAdSizeWithWidthAndMaxHeight:(NSNumber *_Nonnull)width + maxHeight: + (NSNumber *_Nonnull)maxHeight; + +@end + +@interface FLTAnchoredAdaptiveBannerSize : FLTAdSize +@property(readonly) NSString *_Nonnull orientation; +- (instancetype _Nonnull)initWithFactory:(FLTAdSizeFactory *_Nonnull)factory + orientation:(NSString *_Nullable)orientation + width:(NSNumber *_Nonnull)width + isLarge:(BOOL)isLarge; +@end + +@interface FLTInlineAdaptiveBannerSize : FLTAdSize +@property(readonly) NSNumber *_Nullable orientation; +@property(readonly) NSNumber *_Nullable maxHeight; +- (instancetype _Nonnull)initWithFactory:(FLTAdSizeFactory *_Nonnull)factory + width:(NSNumber *_Nonnull)width + maxHeight:(NSNumber *_Nullable)maxHeight + orientation:(NSNumber *_Nullable)orientation; +@end + +@interface FLTSmartBannerSize : FLTAdSize +@property(readonly) NSString *_Nonnull orientation; +- (instancetype _Nonnull)initWithOrientation:(NSString *_Nonnull)orientation; +@end + +@interface FLTFluidSize : FLTAdSize +@end + +@interface FLTAdRequest : NSObject +@property NSArray *_Nullable keywords; +@property NSString *_Nullable contentURL; +@property BOOL nonPersonalizedAds; +@property NSArray *_Nullable neighboringContentURLs; +@property NSString *_Nullable mediationExtrasIdentifier + DEPRECATED_MSG_ATTRIBUTE("Use mediationExtras instead."); +@property id< + FLTMediationNetworkExtrasProvider> _Nullable mediationNetworkExtrasProvider + DEPRECATED_MSG_ATTRIBUTE("Use mediationExtras instead."); +@property NSDictionary *_Nullable adMobExtras; +@property NSString *_Nonnull requestAgent; +@property NSArray> *_Nullable mediationExtras; + +- (GADRequest *_Nonnull)asGADRequest:(NSString *_Nonnull)adUnitId; +@end + +/** + * Wrapper around `GADAdNetworkResponseInfo`. + */ +@interface FLTGADAdNetworkResponseInfo : NSObject + +@property NSString *_Nullable adNetworkClassName; +@property NSNumber *_Nullable latency; +@property NSString *_Nullable dictionaryDescription; +@property NSDictionary *_Nullable adUnitMapping; +@property NSError *_Nullable error; +@property NSString *_Nullable adSourceInstanceID; +@property NSString *_Nullable adSourceID; +@property NSString *_Nullable adSourceName; +@property NSString *_Nullable adSourceInstanceName; + +- (instancetype _Nonnull)initWithResponseInfo: + (GADAdNetworkResponseInfo *_Nonnull)responseInfo; +@end + +/** + * Wrapper around `GADResponseInfo`. + */ +@interface FLTGADResponseInfo : NSObject +@property NSString *_Nullable responseIdentifier; +@property NSString *_Nullable adNetworkClassName; +@property NSArray *_Nullable adNetworkInfoArray; +@property FLTGADAdNetworkResponseInfo *_Nullable loadedAdNetworkResponseInfo; +@property NSDictionary *_Nullable extrasDictionary; + +- (instancetype _Nonnull)initWithResponseInfo: + (GADResponseInfo *_Nonnull)responseInfo; +@end + +/** + * Wrapper around `GAMRequest` for the Google Mobile Ads Plugin. + * Extracts response info from the userInfo dict. + */ +@interface FLTLoadAdError : NSObject +@property NSInteger code; +@property NSString *_Nullable domain; +@property NSString *_Nullable message; +@property FLTGADResponseInfo *_Nullable responseInfo; + +- (instancetype _Nonnull)initWithError:(NSError *_Nonnull)error; +@end + +/** + * Wrapper around `GAMRequest` for the Google Mobile Ads Plugin. + */ +@interface FLTGAMAdRequest : FLTAdRequest +@property NSDictionary *_Nullable customTargeting; +@property NSDictionary *> + *_Nullable customTargetingLists; +@property NSString *_Nullable pubProvidedID; + +- (GAMRequest *_Nonnull)asGAMRequest:(NSString *_Nonnull)adUnitId; +@end + +@protocol FLTAd +@property(weak) FLTAdInstanceManager *_Nullable manager; +@property(readonly) NSNumber *_Nonnull adId; +- (void)load; +@end + +@protocol FLTAdWithoutView +- (void)show; +@end + +@interface FLTBaseAd : NSObject +@property(readonly) NSNumber *_Nonnull adId; +@end + +@interface FLTBannerAd + : FLTBaseAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + size:(FLTAdSize *_Nonnull)size + request:(FLTAdRequest *_Nonnull)request + rootViewController: + (UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId; +- (FLTAdSize *_Nullable)getAdSize; +- (GADBannerView *_Nonnull)bannerView; +- (BOOL)isCollapsible; +@end + +/** + * Wrapper around `GAMBannerAd` for the Google Mobile Ads Plugin. + */ +@interface FLTGAMBannerAd : FLTBannerAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + sizes:(NSArray *_Nonnull)sizes + request:(FLTGAMAdRequest *_Nonnull)request + rootViewController: + (UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId; + +@end + +/** + * An extension of`GAMBannerAd` for fluid ad size. + */ +@interface FLTFluidGAMBannerAd : FLTGAMBannerAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTGAMAdRequest *_Nonnull)request + rootViewController: + (UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId; +@end + +@interface FLTFullScreenAd + : FLTBaseAd +@end + +@interface FLTInterstitialAd : FLTFullScreenAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId; +- (GADInterstitialAd *_Nullable)interstitial; +- (NSString *_Nonnull)adUnitId; +- (void)load; + +@end + +@interface FLTGAMInterstitialAd : FLTInterstitialAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTGAMAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId; +@end + +@interface FLTRewardedAd : FLTFullScreenAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId; +- (GADRewardedAd *_Nullable)rewardedAd; +- (void)setServerSideVerificationOptions: + (FLTServerSideVerificationOptions *_Nullable)serverSideVerificationOptions; +@end + +@interface FLTRewardedInterstitialAd : FLTFullScreenAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId; +- (GADRewardedInterstitialAd *_Nullable)rewardedInterstitialAd; +- (void)setServerSideVerificationOptions: + (FLTServerSideVerificationOptions *_Nullable)serverSideVerificationOptions; +@end + +@interface FLTAppOpenAd : FLTFullScreenAd +- (instancetype _Nonnull)initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + adId:(NSNumber *_Nonnull)adId; +- (GADAppOpenAd *_Nullable)appOpenAd; +@end + +@interface FLTVideoOptions : NSObject +@property(readonly) NSNumber *_Nullable clickToExpandRequested; +@property(readonly) NSNumber *_Nullable customControlsRequested; +@property(readonly) NSNumber *_Nullable startMuted; +- (instancetype _Nonnull) + initWithClickToExpandRequested:(NSNumber *_Nullable)clickToExpandRequested + customControlsRequested:(NSNumber *_Nullable)customControlsRequested + startMuted:(NSNumber *_Nullable)startMuted; +- (GADVideoOptions *_Nonnull)asGADVideoOptions; + +@end + +@interface FLTNativeAdOptions : NSObject +@property(readonly) NSNumber *_Nullable adChoicesPlacement; +@property(readonly) NSNumber *_Nullable mediaAspectRatio; +@property(readonly) FLTVideoOptions *_Nullable videoOptions; +@property(readonly) NSNumber *_Nullable requestCustomMuteThisAd; +@property(readonly) NSNumber *_Nullable shouldRequestMultipleImages; +@property(readonly) NSNumber *_Nullable shouldReturnUrlsForImageAssets; + +- (instancetype _Nonnull) + initWithAdChoicesPlacement:(NSNumber *_Nullable)adChoicesPlacement + mediaAspectRatio:(NSNumber *_Nullable)mediaAspectRatio + videoOptions:(FLTVideoOptions *_Nullable)videoOptions + requestCustomMuteThisAd:(NSNumber *_Nullable)requestCustomMuteThisAd + shouldRequestMultipleImages: + (NSNumber *_Nullable)shouldRequestMultipleImages + shouldReturnUrlsForImageAssets: + (NSNumber *_Nullable)shouldReturnUrlsForImageAssets; + +- (NSArray *_Nonnull)asGADAdLoaderOptions; +@end + +@interface FLTNativeAd + : FLTBaseAd +- (instancetype _Nonnull) + initWithAdUnitId:(NSString *_Nonnull)adUnitId + request:(FLTAdRequest *_Nonnull)request + nativeAdFactory:(NSObject *_Nonnull)nativeAdFactory + customOptions:(NSDictionary *_Nullable)customOptions + rootViewController:(UIViewController *_Nonnull)rootViewController + adId:(NSNumber *_Nonnull)adId + nativeAdOptions:(FLTNativeAdOptions *_Nullable)nativeAdOptions + nativeTemplateStyle:(FLTNativeTemplateStyle *_Nullable)nativeTemplateStyle; +- (GADAdLoader *_Nonnull)adLoader; +@end + +@interface FLTRewardItem : NSObject +@property(readonly) NSNumber *_Nonnull amount; +@property(readonly) NSString *_Nonnull type; +- (instancetype _Nonnull)initWithAmount:(NSNumber *_Nonnull)amount + type:(NSString *_Nonnull)type; +@end + +@interface FLTAdValue : NSObject +@property(readonly) NSDecimalNumber *_Nonnull valueMicros; +@property(readonly) NSInteger precision; +@property(readonly) NSString *_Nonnull currencyCode; +- (instancetype _Nonnull)initWithValue:(NSDecimalNumber *_Nonnull)value + precision:(NSInteger)precision + currencyCode:(NSString *_Nonnull)currencyCode; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAppStateNotifier.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAppStateNotifier.h new file mode 100644 index 00000000..027d4689 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTAppStateNotifier.h @@ -0,0 +1,22 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +@interface FLTAppStateNotifier : NSObject + +- (instancetype _Nonnull)initWithBinaryMessenger: + (NSObject *_Nonnull)messenger; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTConstants.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTConstants.h new file mode 100644 index 00000000..46a063b8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTConstants.h @@ -0,0 +1,16 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** Versioned request agent string. */ +#define FLT_REQUEST_AGENT_VERSIONED @"Flutter-GMA-8.0.0" diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.h new file mode 100644 index 00000000..5034d467 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsCollection_Internal.h @@ -0,0 +1,29 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAd_Internal.h" +#import "FLTGoogleMobileAdsPlugin.h" +#import + +@protocol FLTAd; + +// Thread-safe wrapper of NSMutableDictionary. +@interface FLTGoogleMobileAdsCollection : NSObject +- (void)setObject:(ObjectType _Nonnull)object + forKey:(KeyType _Nonnull)key; +- (void)removeObjectForKey:(KeyType _Nonnull)key; +- (id _Nullable)objectForKey:(KeyType _Nonnull)key; +- (NSArray *_Nonnull)allKeysForObject:(ObjectType _Nonnull)object; +- (void)removeAllObjects; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsPlugin.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsPlugin.h new file mode 100644 index 00000000..9da745da --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsPlugin.h @@ -0,0 +1,111 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +#import + +#import "FLTAdInstanceManager_Internal.h" +#import "FLTAd_Internal.h" +#import "FLTMediationNetworkExtrasProvider.h" +#import "FLTMobileAds_Internal.h" + +#define FLTLogWarning(format, ...) \ + NSLog((@"GoogleMobileAdsPlugin " format), ##__VA_ARGS__) + +/** + * Creates a `GADNativeAdView` to be shown in a Flutter app. + * + * When a Native Ad is created in Dart, this protocol is responsible for + * building the `GADNativeAdView`. Register a class that implements this with a + * `FLTGoogleMobileAdsPlugin` to use in conjunction with Flutter. + */ +@protocol FLTNativeAdFactory +@required +/** + * Creates a `GADNativeAdView` with a `GADNativeAd`. + * + * @param nativeAd Ad information used to create a `GADNativeAdView` + * @param customOptions Used to pass additional custom options to create the + * `GADNativeAdView`. Nullable. + * @return a `GADNativeAdView` that is overlaid on top of the FlutterView. + */ +- (GADNativeAdView *_Nullable)createNativeAd:(GADNativeAd *_Nonnull)nativeAd + customOptions: + (NSDictionary *_Nullable)customOptions; +@end + +/** + * Flutter plugin providing access to the Google Mobile Ads API. + */ +@interface FLTGoogleMobileAdsPlugin : NSObject + +/** + * Registers a FLTMediationNetworkExtrasProvider used to provide mediation + * extras when the plugin creates ad requests. + * + * @param mediationNetworkExtrasProvider the FLTMediationNetworkExtrasProvider + * which will be used to get extras when ad requests are created. + * @param registry the associated FlutterPluginRegistry the plugin will be + * attached to + * @return whether mediationNetworkExtrasProvider was successfully registered to + * a FLTGoogleMobileAdsPlugin in the registry. + */ ++ (BOOL)registerMediationNetworkExtrasProvider: + (id _Nonnull) + mediationNetworkExtrasProvider + registry: + (id _Nonnull) + registry + __deprecated_msg("Use MediationExtras instead"); + +/* + * Unregisters any FLTMediationNetworkExtrasProvider that was associated with + * the FLTGoogleMobileAdsPlugin in registry. + */ ++ (void)unregisterMediationNetworkExtrasProvider: + (id _Nonnull)registry + __deprecated_msg("Use MediationExtras instead"); + +/** + * Adds a `FLTNativeAdFactory` used to create a `GADNativeAdView`s from a Native + * Ad created in Dart. + * + * @param registry maintains access to a `FLTGoogleMobileAdsPlugin`` instance. + * @param factoryId a unique identifier for the ad factory. The Native Ad + * created in Dart includes a parameter that refers to this. + * @param nativeAdFactory creates `GADNativeAdView`s when a Native Ad is created + * in Dart. + * @return whether the factoryId is unique and the nativeAdFactory was + * successfully added. + */ ++ (BOOL)registerNativeAdFactory:(id _Nonnull)registry + factoryId:(NSString *_Nonnull)factoryId + nativeAdFactory: + (id _Nonnull)nativeAdFactory; + +/** + * Unregisters a `FLTNativeAdFactory` used to create `GADNativeAdView`s from a + * Native Ad created in Dart. + * + * @param registry maintains access to a `FLTGoogleMobileAdsPlugin `instance. + * @param factoryId a unique identifier for the ad factory. The Native Ad + * created in Dart includes a parameter that refers to this. + * @return the previous `FLTNativeAdFactory` associated with this factoryId, or + * null if there was none for this factoryId. + */ ++ (id _Nullable) + unregisterNativeAdFactory:(id _Nonnull)registry + factoryId:(NSString *_Nonnull)factoryId; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h new file mode 100644 index 00000000..5d8092af --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTGoogleMobileAdsReaderWriter_Internal.h @@ -0,0 +1,38 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTAd_Internal.h" +#import "FLTMediationNetworkExtrasProvider.h" +#import + +@class FLTAdSizeFactory; + +@interface FLTGoogleMobileAdsReaderWriter : FlutterStandardReaderWriter +@property(readonly) FLTAdSizeFactory *_Nonnull adSizeFactory; +@property id< + FLTMediationNetworkExtrasProvider> _Nullable mediationNetworkExtrasProvider; + +- (instancetype _Nonnull)initWithFactory: + (FLTAdSizeFactory *_Nonnull)adSizeFactory; +@end + +@interface FLTGoogleMobileAdsReader : FlutterStandardReader +@property(readonly) FLTAdSizeFactory *_Nonnull adSizeFactory; +@property id< + FLTMediationNetworkExtrasProvider> _Nullable mediationNetworkExtrasProvider; + +- (instancetype _Nonnull)initWithFactory: + (FLTAdSizeFactory *_Nonnull)adSizeFactory + data:(NSData *_Nonnull)data; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationExtras.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationExtras.h new file mode 100644 index 00000000..398d612a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationExtras.h @@ -0,0 +1,35 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +/** + * Mediation adapters will provide a class that conforms to this protocol to be + * added to the `FLTAdRequest`. + */ +@protocol FlutterMediationExtras + +// Pair of key-values to be stored received from the dart layer. +@property NSDictionary *_Nullable extras; + +/** + * Parses the values in @c extras to the required protocol to append Mediation + * extras to the `FLTAdRequest`. + * + * @return the parsed extra values to an object that conforms to protocol. + */ +- (id _Nonnull)getMediationExtras; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationNetworkExtrasProvider.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationNetworkExtrasProvider.h new file mode 100644 index 00000000..3f2c9281 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMediationNetworkExtrasProvider.h @@ -0,0 +1,42 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Provides network specific parameters to include in ad requests. + * An implementation of this protocol can be passed to FLTGoogleMobileAdsPlugin + * using registerMediationNetworkExtrasProvider + * + * @deprecated Use FLTMediationExtras instead. + */ +__attribute__((deprecated)) +@protocol FLTMediationNetworkExtrasProvider +@required + +/** + * Gets an array of GADAdNetworkExtras to include in the GADRequest for the + * given adUnitId and mediationExtrasIdentifier. + * + * @param adUnitId the ad unit id associated with the ad request + * @param mediationExtrasIdentifier n optional string that comes from the + * associated dart ad request object. This allows for additional control of + * which extras to include for an ad request, beyond just the ad unit. + * @return an array of GADAdNetworkExtras to include in the ad request. + */ +- (NSArray> *_Nullable) + getMediationExtras:(NSString *_Nonnull)adUnitId + mediationExtrasIdentifier:(NSString *_Nullable)mediationExtrasIdentifier; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMobileAds_Internal.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMobileAds_Internal.h new file mode 100644 index 00000000..06414f4d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTMobileAds_Internal.h @@ -0,0 +1,57 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represent `GADAdapterInitializationState` for the Google Mobile Ads Plugin. + * + * Used to help serialize and pass `GADAdapterInitializationState` to Dart. + */ +typedef NS_ENUM(NSUInteger, FLTAdapterInitializationState) { + FLTAdapterInitializationStateNotReady, + FLTAdapterInitializationStateReady, +}; + +/** + * Wrapper around `GADAdapterStatus` for the Google Mobile Ads Plugin. + * + * Used to help serialize and pass `GADAdapterStatus` to Dart. + */ +@interface FLTAdapterStatus : NSObject +@property NSNumber *state; +@property NSString *statusDescription; +@property NSNumber *latency; +- (instancetype)initWithStatus:(GADAdapterStatus *)status; +@end + +/** + * Wrapper around `GADInitializationStatus` for the Google Mobile Ads Plugin. + * + * Used to help serialize and pass `GADInitializationStatus` to Dart. + */ +@interface FLTInitializationStatus : NSObject +@property NSDictionary *adapterStatuses; +- (instancetype)initWithStatus:(GADInitializationStatus *)status; +@end + +@interface FLTServerSideVerificationOptions : NSObject +@property(nonatomic, copy, nullable) NSString *userIdentifier; +@property(nonatomic, copy, nullable) NSString *customRewardString; +- (GADServerSideVerificationOptions *_Nonnull) + asGADServerSideVerificationOptions; +@end +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNSString.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNSString.h new file mode 100644 index 00000000..5ec63900 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNSString.h @@ -0,0 +1,22 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/// Category extensions for NSString +@interface NSString (FLTNSStringExtension) + +- (instancetype _Nonnull)gma_initWithInt:(NSInteger)integer __attribute__((objc_method_family(init))); + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateColor.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateColor.h new file mode 100644 index 00000000..67f1c107 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateColor.h @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import + +/** + * Handles mapping argb to UIColor. + */ +@interface FLTNativeTemplateColor : NSObject + +- (instancetype _Nonnull)initWithAlpha:(NSNumber *_Nonnull)alpha + red:(NSNumber *_Nonnull)red + green:(NSNumber *_Nonnull)green + blue:(NSNumber *_Nonnull)blue; +- (UIColor *_Nonnull)uiColor; + +@property(readonly) NSNumber *_Nonnull alpha; +@property(readonly) NSNumber *_Nonnull red; +@property(readonly) NSNumber *_Nonnull green; +@property(readonly) NSNumber *_Nonnull blue; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateFontStyle.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateFontStyle.h new file mode 100644 index 00000000..d8b3e6c8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateFontStyle.h @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/** + * Predefined font types for native templates. + */ +typedef NS_ENUM(NSInteger, FLTNativeTemplateFontStyle) { + FLTNativeTemplateFontNormal, + FLTNativeTemplateFontBold, + FLTNativeTemplateFontItalic, + FLTNativeTemplateFontMonospace +}; + +/** + * Handles mapping int values to FLTNativeTemplateFontStyle. + */ +@interface FLTNativeTemplateFontStyleWrapper : NSObject + +- (instancetype _Nonnull)initWithInt:(int)intValue; +- (FLTNativeTemplateFontStyle)fontStyle; + +@property(readonly) int intValue; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateStyle.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateStyle.h new file mode 100644 index 00000000..58ecc30d --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateStyle.h @@ -0,0 +1,58 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateColor.h" +#import "FLTNativeTemplateTextStyle.h" +#import "FLTNativeTemplateType.h" +#import "GADTTemplateView.h" +#import +#import +#import + +/** + * Wraps a GADTTemplateView for being displayed as a platform view. + * Exists to override layoutSubviews, so we can attach layout constraints. + */ +@interface FLTNativeTemplateViewWrapper : UIView + +/** The GADTTemplateView that is being wrapped. */ +@property GADTTemplateView *_Nullable templateView; +@end + +@interface FLTNativeTemplateStyle : NSObject + +- (instancetype _Nonnull) + initWithTemplateType:(FLTNativeTemplateType *_Nonnull)templateType + mainBackgroundColor:(FLTNativeTemplateColor *_Nullable)mainBackgroundColor + callToActionStyle: + (FLTNativeTemplateTextStyle *_Nullable)callToActionStyle + primaryTextStyle:(FLTNativeTemplateTextStyle *_Nullable)primaryTextStyle + secondaryTextStyle: + (FLTNativeTemplateTextStyle *_Nullable)secondaryTextStyle + tertiaryTextStyle: + (FLTNativeTemplateTextStyle *_Nullable)tertiaryTextStyle + cornerRadius:(NSNumber *_Nullable)cornerRadius; +@property(readonly) FLTNativeTemplateType *_Nonnull templateType; +@property(readonly) FLTNativeTemplateColor *_Nullable mainBackgroundColor; +@property(readonly) FLTNativeTemplateTextStyle *_Nullable callToActionStyle; +@property(readonly) FLTNativeTemplateTextStyle *_Nullable primaryTextStyle; +@property(readonly) FLTNativeTemplateTextStyle *_Nullable secondaryTextStyle; +@property(readonly) FLTNativeTemplateTextStyle *_Nullable tertiaryTextStyle; +@property(readonly) NSNumber *_Nullable cornerRadius; + +/** The actual view to be displayed. */ +- (FLTNativeTemplateViewWrapper *_Nonnull)getDisplayedView: + (GADNativeAd *_Nonnull)gadNativeAd; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateTextStyle.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateTextStyle.h new file mode 100644 index 00000000..d4068a78 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateTextStyle.h @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "FLTNativeTemplateColor.h" +#import "FLTNativeTemplateFontStyle.h" + +/** + * Contains style options that can be applied to text in a native template. + */ +@interface FLTNativeTemplateTextStyle : NSObject + +- (instancetype _Nonnull) + initWithTextColor:(FLTNativeTemplateColor *_Nullable)textColor + backgroundColor:(FLTNativeTemplateColor *_Nullable)backgroundColor + fontStyle:(FLTNativeTemplateFontStyleWrapper *_Nullable)fontStyle + size:(NSNumber *_Nullable)size; + +@property(readonly) FLTNativeTemplateColor *_Nullable textColor; +@property(readonly) FLTNativeTemplateColor *_Nullable backgroundColor; +@property(readonly) FLTNativeTemplateFontStyleWrapper *_Nullable fontStyle; +@property(readonly) NSNumber *_Nullable size; +/** UIFont that has the corresponding fontStyle and size. */ +@property(readonly) UIFont *_Nullable uiFont; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateType.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateType.h new file mode 100644 index 00000000..65bda99b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTNativeTemplateType.h @@ -0,0 +1,27 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import "GADTTemplateView.h" +#import + +/** Maps int values to template layout types. */ +@interface FLTNativeTemplateType : NSObject + +- (instancetype _Nonnull)initWithInt:(int)intValue; +- (NSString *_Nonnull)xibName; +- (GADTTemplateView *_Nonnull)templateView; + +@property(readonly) int intValue; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformManager.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformManager.h new file mode 100644 index 00000000..9bfd93cf --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformManager.h @@ -0,0 +1,29 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "FLTUserMessagingPlatformReaderWriter.h" +#import +#import + +@interface FLTUserMessagingPlatformManager : NSObject + +@property FLTUserMessagingPlatformReaderWriter *_Nonnull readerWriter; + +- (instancetype _Nonnull)initWithBinaryMessenger: + (NSObject *_Nonnull)binaryMessenger; + +- (void)handleMethodCall:(FlutterMethodCall *_Nonnull)call + result:(FlutterResult _Nonnull)result; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformReaderWriter.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformReaderWriter.h new file mode 100644 index 00000000..1c069166 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/FLTUserMessagingPlatformReaderWriter.h @@ -0,0 +1,24 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#include + +@interface FLTUserMessagingPlatformReaderWriter : FlutterStandardReaderWriter + +- (void)trackConsentForm:(UMPConsentForm *)consentForm; + +- (void)disposeConsentForm:(UMPConsentForm *)consentForm; + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTFullScreenTemplateView.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTFullScreenTemplateView.h new file mode 100644 index 00000000..b9d28475 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTFullScreenTemplateView.h @@ -0,0 +1,21 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GADTTemplateView.h" + +@interface GADTFullScreenTemplateView : GADTTemplateView + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTMediumTemplateView.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTMediumTemplateView.h new file mode 100644 index 00000000..915d18e0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTMediumTemplateView.h @@ -0,0 +1,23 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GADTTemplateView.h" + +/// A template for medium sized views. Renders a roughly square view with a call +/// to action on the bottom and a horizontal image in the middle. +@interface GADTMediumTemplateView : GADTTemplateView + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTSmallTemplateView.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTSmallTemplateView.h new file mode 100644 index 00000000..12d4d3d8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTSmallTemplateView.h @@ -0,0 +1,22 @@ +/* + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GADTTemplateView.h" + +/// A small template, perfect for UITableViewCells or other row views. +@interface GADTSmallTemplateView : GADTTemplateView + +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTTemplateView.h b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTTemplateView.h new file mode 100644 index 00000000..82a27630 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/ios/google_mobile_ads/Sources/google_mobile_ads/include/google_mobile_ads/GADTTemplateView.h @@ -0,0 +1,114 @@ +// Copyright 2018-2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import + +/// Constants used to style your template. +typedef NSString *GADTNativeTemplateStyleKey NS_STRING_ENUM; + +/// The font, font color and background color for your call to action view. +/// All templates have a call to action view. +#pragma mark - Call To Action + +/// Call to action font. Expects a UIFont. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyCallToActionFont; + +/// Call to action font color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyCallToActionFontColor; + +/// Call to action background color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyCallToActionBackgroundColor; + +/// The font, font color and background color for the first row of text in the +/// template. All templates have a primary text area which is populated by the +/// native ad's headline. +#pragma mark - Primary Text + +/// Primary text font. Expects a UIFont. +extern GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyPrimaryFont; + +/// Primary text font color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyPrimaryFontColor; + +/// Primary text background color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyPrimaryBackgroundColor; + +/// The font, font color and background color for the second row of text in the +/// template. All templates have a secondary text area which is populated either +/// by the body of the ad, or by the rating of the app. +#pragma mark - Secondary Text + +/// Secondary text font. Expects a UIFont. +extern GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeySecondaryFont; + +/// Secondary text font color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeySecondaryFontColor; + +/// Secondary text background color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeySecondaryBackgroundColor; + +/// The font, font color and background color for the third row of text in the +/// template. The third row is used to display store name or the default +/// tertiary text. +#pragma mark - Tertiary Text + +/// Tertiary text font. Expects a UIFont. +extern GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyTertiaryFont; + +/// Tertiary text font color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyTertiaryFontColor; + +/// Tertiary text background color. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyTertiaryBackgroundColor; + +#pragma mark - Additional Style Options + +/// The background color for the bulk of the ad. Expects a UIColor. +extern GADTNativeTemplateStyleKey const + GADTNativeTemplateStyleKeyMainBackgroundColor; + +/// The corner rounding radius for the icon view and call to action. Expects an +/// NSNumber. +extern GADTNativeTemplateStyleKey const GADTNativeTemplateStyleKeyCornerRadius; + +/// The super class for every template object. +/// This class has the majority of all layout and styling logic. +@interface GADTTemplateView : GADNativeAdView +@property(nonatomic, copy) + NSDictionary *styles; +@property(weak) IBOutlet UILabel *adBadge; +@property(weak) UIView *rootView; + +/// Adds a constraint to the superview so that the template spans the width of +/// its parent. Does nothing if there is no superview. +- (void)addHorizontalConstraintsToSuperviewWidth; + +/// Adds a constraint to the superview so that the template is centered +/// vertically in its parent. Does nothing if there is no superview. +- (void)addVerticalCenterConstraintToSuperview; + +/// Utility method to get a color from a hex string. ++ (UIColor *)colorFromHexString:(NSString *)hexString; + +- (NSString *)getTemplateTypeName; +@end diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/google_mobile_ads.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/google_mobile_ads.dart new file mode 100644 index 00000000..d33b6e17 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/google_mobile_ads.dart @@ -0,0 +1,28 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export 'src/ad_containers.dart'; +export 'src/ad_listeners.dart'; +export 'src/app_background_event_notifier.dart'; +export 'src/mediation_extras.dart'; +export 'src/mobile_ads.dart'; +export 'src/request_configuration.dart'; +export 'src/ump/consent_request_parameters.dart'; +export 'src/ump/consent_information.dart'; +export 'src/ump/consent_form.dart'; +export 'src/ump/form_error.dart'; +export 'src/nativetemplates/native_template_font_style.dart'; +export 'src/nativetemplates/native_template_style.dart'; +export 'src/nativetemplates/native_template_text_style.dart'; +export 'src/nativetemplates/template_type.dart'; diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_containers.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_containers.dart new file mode 100644 index 00000000..5c6fb716 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_containers.dart @@ -0,0 +1,1663 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +import 'ad_instance_manager.dart'; +import 'ad_listeners.dart'; +import 'mediation_extras.dart'; +import 'nativetemplates/native_template_style.dart'; + +/// Error information about why an ad operation failed. +class AdError { + /// Creates an [AdError] with the given [code], [domain] and [message]. + @protected + AdError(this.code, this.domain, this.message); + + /// Unique code to identify the error. + /// + /// See links below for possible error codes: + /// Android: + /// https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest#constant-summary + /// Ios: + /// https://developers.google.com/admob/ios/api/reference/Enums/GADErrorCode + final int code; + + /// The domain from which the error came. + final String domain; + + /// A message detailing the error. + /// + /// For example "Account not approved yet". See + /// https://support.google.com/admob/answer/9905175 for explanations of + /// common errors. + final String message; + + @override + String toString() { + return '$runtimeType(code: $code, domain: $domain, message: $message)'; + } +} + +/// Contains information about the loaded ad or ad request. +/// +/// For debugging and logging purposes. See +/// https://developers.google.com/admob/android/response-info for more +/// information on how this can be used. +class ResponseInfo { + /// Constructs a [ResponseInfo] with the [responseId] and [mediationAdapterClassName]. + @protected + const ResponseInfo({ + this.responseId, + this.mediationAdapterClassName, + this.adapterResponses, + this.loadedAdapterResponseInfo, + required this.responseExtras, + }); + + /// An identifier for the loaded ad. + final String? responseId; + + /// The mediation adapter class name of the ad network that loaded the ad. + final String? mediationAdapterClassName; + + /// The [AdapterResponseInfo]s containing metadata for each adapter included + /// in the ad response. + /// + /// Can be used to debug the mediation waterfall execution. + final List? adapterResponses; + + /// The [AdapterResponseInfo] of the adapter that was used to load the ad. + /// + /// This is null if the ad failed to load. + final AdapterResponseInfo? loadedAdapterResponseInfo; + + /// Map of extra information about the ad response. + final Map responseExtras; + + @override + String toString() { + return '$runtimeType(responseId: $responseId, ' + 'mediationAdapterClassName: $mediationAdapterClassName, ' + 'adapterResponses: $adapterResponses, ' + 'loadedAdapterResponseInfo: $loadedAdapterResponseInfo), ' + 'responseExtras: $responseExtras'; + } +} + +/// Response information for an individual ad network in an ad response. +class AdapterResponseInfo { + /// Constructs an [AdapterResponseInfo]. + @protected + AdapterResponseInfo({ + required this.adapterClassName, + required this.latencyMillis, + required this.description, + required this.adUnitMapping, + required this.adSourceName, + required this.adSourceId, + required this.adSourceInstanceName, + required this.adSourceInstanceId, + this.adError, + }); + + /// A class name that identifies the ad network adapter. + final String adapterClassName; + + /// The amount of time the ad network adapter spent loading an ad. + /// + /// 0 if the adapter was not attempted. + final int latencyMillis; + + /// A log friendly string version of this object. + final String description; + + /// Network configuration set on the AdMob UI. + final Map adUnitMapping; + + /// The error that occurred while rendering the ad. + final AdError? adError; + + /// The ad source name associated with this adapter response. + /// + /// This is an empty string "" if the ad server did not populate this field. + final String adSourceName; + + /// The ad source ID associated with this adapter response. + /// + /// This is an empty string "" if the ad server did not populate this field. + final String adSourceId; + + /// The ad source instance name associated with this adapter response. + /// + /// This is an empty string "" if the ad server did not populate this field. + final String adSourceInstanceName; + + /// The ad source instance id associated with this adapter response. + /// + /// This is an empty string "" if the ad server did not populate this field. + final String adSourceInstanceId; + + @override + String toString() { + return '$runtimeType(adapterClassName: $adapterClassName, ' + 'latencyMillis: $latencyMillis, ' + 'description: $description, ' + 'adUnitMapping: $adUnitMapping, ' + 'adError: $adError, ' + 'adSourceName: $adSourceName, ' + 'adSourceId: $adSourceId, ' + 'adSourceInstanceName: $adSourceInstanceName, ' + 'adSourceInstanceId: $adSourceInstanceId)'; + } +} + +/// Represents errors that occur when loading an ad. +class LoadAdError extends AdError { + /// Default constructor for [LoadAdError]. + @protected + LoadAdError(int code, String domain, String message, this.responseInfo) + : super(code, domain, message); + + /// The [ResponseInfo] for the error. + final ResponseInfo? responseInfo; + + @override + String toString() { + return '$runtimeType(code: $code, domain: $domain, message: $message' + ', responseInfo: $responseInfo)'; + } +} + +/// Targeting info per the AdMob API. +/// +/// This class's properties mirror the native AdRequest API. See for example: +/// [AdRequest.Builder for Android](https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest.Builder). +class AdRequest { + /// Default constructor for [AdRequest]. + const AdRequest({ + this.keywords, + this.contentUrl, + this.neighboringContentUrls, + this.nonPersonalizedAds, + this.httpTimeoutMillis, + @Deprecated('Use mediationExtras instead.') this.mediationExtrasIdentifier, + this.extras, + this.mediationExtras, + }); + + /// Words or phrases describing the current user activity. + final List? keywords; + + /// URL string for a webpage whose content matches the app’s primary content. + /// + /// This webpage content is used for targeting and brand safety purposes. + final String? contentUrl; + + /// URLs representing web content near an ad. + final List? neighboringContentUrls; + + /// Non-personalized ads are ads that are not based on a user’s past behavior. + /// + /// For more information: + /// https://support.google.com/admob/answer/7676680?hl=en + final bool? nonPersonalizedAds; + + /// A custom timeout for HTTPS calls during an ad request. + /// + /// This is only supported in Android. This value is ignored on iOS. + final int? httpTimeoutMillis; + + /// String identifier used in providing mediation extras. + /// + /// Only relevant if you use mediation and need to provide network extras + /// to the ad request. This identifier will get passed to your platform-side + /// mediation extras factory class, allowing for additional customization + /// of network extras. + @Deprecated('Use mediationExtras instead.') + final String? mediationExtrasIdentifier; + + /// Extras to pass to the AdMob adapter. + final Map? extras; + + /// Extra parameters to pass to specific ad adapters. + final List? mediationExtras; + + @override + bool operator ==(Object other) { + return other is AdRequest && + listEquals(keywords, other.keywords) && + contentUrl == other.contentUrl && + nonPersonalizedAds == other.nonPersonalizedAds && + listEquals(neighboringContentUrls, other.neighboringContentUrls) && + httpTimeoutMillis == other.httpTimeoutMillis && + //ignore: deprecated_member_use_from_same_package + mediationExtrasIdentifier == other.mediationExtrasIdentifier && + mapEquals(extras, other.extras) && + mediationExtras == other.mediationExtras; + } + + @override + int get hashCode => Object.hash( + keywords, + contentUrl, + nonPersonalizedAds, + neighboringContentUrls, + httpTimeoutMillis, + //ignore: deprecated_member_use_from_same_package + mediationExtrasIdentifier, + extras, + mediationExtras, + ); +} + +/// Targeting info per the Ad Manager API. +class AdManagerAdRequest extends AdRequest { + /// Constructs an [AdManagerAdRequest] from optional targeting information. + const AdManagerAdRequest({ + List? keywords, + String? contentUrl, + List? neighboringContentUrls, + this.customTargeting, + this.customTargetingLists, + bool? nonPersonalizedAds, + int? httpTimeoutMillis, + this.publisherProvidedId, + String? mediationExtrasIdentifier, + Map? extras, + List? mediationExtras, + }) : super( + keywords: keywords, + contentUrl: contentUrl, + neighboringContentUrls: neighboringContentUrls, + nonPersonalizedAds: nonPersonalizedAds, + httpTimeoutMillis: httpTimeoutMillis, + //ignore: deprecated_member_use_from_same_package + mediationExtrasIdentifier: mediationExtrasIdentifier, + extras: extras, + mediationExtras: mediationExtras, + ); + + /// Key-value pairs used for custom targeting. + final Map? customTargeting; + + /// Key-value pairs used for custom targeting. + /// + /// Any duplicate keys from [customTargeting] will be overwritten. + final Map>? customTargetingLists; + + /// The identifier used for frequency capping, audience segmentation + /// and targeting, sequential ad rotation, and other audience-based ad + /// delivery controls across devices. + final String? publisherProvidedId; + + @override + bool operator ==(Object other) { + return super == other && + other is AdManagerAdRequest && + mapEquals(customTargeting, other.customTargeting) && + customTargetingLists.toString() == + other.customTargetingLists.toString() && + publisherProvidedId == other.publisherProvidedId; + } + + @override + int get hashCode => + Object.hash(customTargeting, customTargetingLists, publisherProvidedId); +} + +/// An [AdSize] with the given width and a Google-optimized height to create a banner ad. +/// +/// See: +/// [AdSize.getAnchoredAdaptiveBannerAdSize]. +class AnchoredAdaptiveBannerAdSize extends AdSize { + /// Default constructor for [AnchoredAdaptiveBannerAdSize]. + /// + /// This constructor should only be used internally. + /// + /// See: + /// [AdSize.getAnchoredAdaptiveBannerAdSize]. + AnchoredAdaptiveBannerAdSize( + this.orientation, { + required int width, + required int height, + }) : super(width: width, height: height); + + /// Orientation of the device used by the SDK to automatically find the correct height. + final Orientation? orientation; +} + +/// Ad units that render screen-width banner ads on any screen size across different devices in either [Orientation]. +@Deprecated('Use adaptive banner instead') +class SmartBannerAdSize extends AdSize { + /// Default constructor for [SmartBannerAdSize]. + SmartBannerAdSize(this.orientation) : super(width: -1, height: -1); + + /// Orientation of the device used by the SDK to automatically find the correct height. + final Orientation orientation; +} + +/// A dynamically sized banner that matches its parent's width and content height. +class FluidAdSize extends AdSize { + /// Default constructor for [FluidAdSize]. + const FluidAdSize() : super(width: -3, height: -3); +} + +/// A size for inline adaptive banner ads. +/// +/// This ad size takes a width and optionally a maximum height and orientation. +/// They will be rendered at the provided width and have variable height decided +/// by Google servers. +/// +/// You can obtain an instance of this using factory methods such as +/// [AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(width)]. +/// +/// After an inline adaptive banner ad is loaded, you should use +/// [BannerAd.getPlatformAdSize] or [AdManagerBannerAd.getPlatformAdSize] to get +/// the height to use for the ad container. +class InlineAdaptiveSize extends AdSize { + /// Private constructor for [InlineAdaptiveSize]. + /// + /// You should use one of the static constructors in [AdSize]. + const InlineAdaptiveSize._({ + required int width, + this.maxHeight, + this.orientation, + }) : super(width: width, height: 0); + + /// The maximum height allowed. + final int? maxHeight; + + /// The orientation. If none if specified the current orientation is used. + final Orientation? orientation; + + /// Representation of [orientation] to pass to platform code. + int? get orientationValue => orientation == null + ? null + : orientation == Orientation.portrait + ? 0 + : 1; +} + +/// [AdSize] represents the size of a banner ad. +/// +/// There are six sizes available, which are the same for both iOS and Android. +/// See the guides for banners on [Android](https://developers.google.com/admob/android/banner#banner_sizes) +/// and [iOS](https://developers.google.com/admob/ios/banner#banner_sizes) for +/// additional details. +class AdSize { + /// Constructs an [AdSize] with the given [width] and [height]. + const AdSize({required this.width, required this.height}); + + /// The vertical span of an ad. + final int height; + + /// The horizontal span of an ad. + final int width; + + /// The standard banner (320x50) size. + static const AdSize banner = AdSize(width: 320, height: 50); + + /// The large banner (320x100) size. + static const AdSize largeBanner = AdSize(width: 320, height: 100); + + /// The medium rectangle (300x250) size. + static const AdSize mediumRectangle = AdSize(width: 300, height: 250); + + /// The full banner (468x60) size. + static const AdSize fullBanner = AdSize(width: 468, height: 60); + + /// The leaderboard (728x90) size. + static const AdSize leaderboard = AdSize(width: 728, height: 90); + + /// A dynamically sized banner that matches its parent's width and expands/contracts its height to match the ad's content after loading completes. + static const AdSize fluid = FluidAdSize(); + + /// Ad units that render screen-width banner ads on any screen size across different devices in either [Orientation]. + /// + /// Width of the current device can be found using: + /// `MediaQuery.of(context).size.width.truncate()`. + /// + /// Returns `null` if a proper height could not be found for the device or + /// window. + @Deprecated('Use getLargeAnchoredAdaptiveBannerAdSizeWithOrientation instead') + static Future getAnchoredAdaptiveBannerAdSize( + Orientation orientation, + int width, + ) async { + final num? height = await instanceManager.channel.invokeMethod( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + {'orientation': orientation.name, 'width': width}, + ); + + if (height == null) return null; + return AnchoredAdaptiveBannerAdSize( + orientation, + width: width, + height: height.truncate(), + ); + } + + /// Ad units that render screen-width banner ads on any screen size across different devices in either [Orientation]. + /// + /// Width of the current device can be found using: + /// `MediaQuery.of(context).size.width.truncate()`. + /// + /// Returns `null` if a proper height could not be found for the device or + /// window. + static Future + getLargeAnchoredAdaptiveBannerAdSizeWithOrientation( + Orientation orientation, + int width, + ) async { + final num? height = await instanceManager.channel.invokeMethod( + 'AdSize#getLargeAnchoredAdaptiveBannerAdSize', + {'orientation': orientation.name, 'width': width}, + ); + + if (height == null) return null; + return AnchoredAdaptiveBannerAdSize( + orientation, + width: width, + height: height.truncate(), + ); + } + + /// Returns an AdSize with the given width and a Google-optimized height to create a banner ad. + /// + /// The size returned will have an aspect ratio similar to AdSize, suitable for anchoring near the top or bottom of your app. + /// The height will never be larger than 15% of the device's current orientation height and never smaller than 50px. + /// This function always returns the same height for any width / device combination. + /// For more details, visit: https://developers.google.com/android/reference/com/google/android/gms/ads/AdSize#getCurrentOrientationAnchoredAdaptiveBannerAdSize(android.content.Context,%20int) + @Deprecated('Use getLargeAnchoredAdaptiveBannerAdSize instead') + static Future + getCurrentOrientationAnchoredAdaptiveBannerAdSize(int width) async { + final num? height = await instanceManager.channel.invokeMethod( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + {'width': width}, + ); + + if (height == null) return null; + return AnchoredAdaptiveBannerAdSize( + null, + width: width, + height: height.truncate(), + ); + } + + /// Returns an AdSize with the given width and a Google-optimized height to create a banner ad. + /// + /// The size returned will have an aspect ratio similar to AdSize, suitable for anchoring near the top or bottom of your app. + /// The height will never be larger than 15% of the device's current orientation height and never smaller than 50px. + /// This function always returns the same height for any width / device combination. + /// For more details, visit: https://developers.google.com/android/reference/com/google/android/gms/ads/AdSize#getCurrentOrientationAnchoredAdaptiveBannerAdSize(android.content.Context,%20int) + static Future + getLargeAnchoredAdaptiveBannerAdSize(int width) async { + final num? height = await instanceManager.channel.invokeMethod( + 'AdSize#getLargeAnchoredAdaptiveBannerAdSize', + {'width': width}, + ); + + if (height == null) return null; + return AnchoredAdaptiveBannerAdSize( + null, + width: width, + height: height.truncate(), + ); + } + + /// Gets an AdSize with the given width and height that is always 0. + /// + /// This ad size allows Google servers to choose an optimal ad size with a + /// height less than or equal to the height of the screen in the current + /// orientation. + /// After the ad is loaded, you should update the height of the ad container + /// by calling [BannerAd.getPlatformAdSize] or + /// [AdManagerBannerAd.getPlatformAdSize] from the ad load callback. + /// This ad size is most suitable for ads intended to be displayed inside + /// scrollable content. + static InlineAdaptiveSize getCurrentOrientationInlineAdaptiveBannerAdSize( + int width, + ) { + return InlineAdaptiveSize._(width: width); + } + + /// Gets an AdSize in landscape orientation with the given width and 0 height. + /// + /// This ad size allows Google servers to choose an optimal ad size with a + /// height less than or equal to the height of the screen in landscape + /// orientation. + /// After the ad is loaded, you should update the height of the ad container + /// by calling [BannerAd.getPlatformAdSize] or + /// [AdManagerBannerAd.getPlatformAdSize] from the ad load callback. + /// This ad size is most suitable for ads intended to be displayed inside + /// scrollable content. + static InlineAdaptiveSize getLandscapeInlineAdaptiveBannerAdSize(int width) { + return InlineAdaptiveSize._( + width: width, + orientation: Orientation.landscape, + ); + } + + /// Gets an AdSize in portrait orientation with the given width and 0 height. + /// + /// This ad size allows Google servers to choose an optimal ad size with a + /// height less than or equal to the height of the screen in portrait + /// orientation. + /// After the ad is loaded, you should update the height of the ad container + /// by calling [BannerAd.getPlatformAdSize] or + /// [AdManagerBannerAd.getPlatformAdSize] from the ad load callback. + /// This ad size is most suitable for ads intended to be displayed inside + /// scrollable content. + static InlineAdaptiveSize getPortraitInlineAdaptiveBannerAdSize(int width) { + return InlineAdaptiveSize._( + width: width, + orientation: Orientation.portrait, + ); + } + + /// Gets an AdSize with the given width and height that is always 0. + /// + /// This ad size allows Google servers to choose an optimal ad size with a + /// height less than or equal to [maxHeight]. + /// After the ad is loaded, you should update the height of the ad container + /// by calling [BannerAd.getPlatformAdSize] or + /// [AdManagerBannerAd.getPlatformAdSize] from the ad load callback. + /// This ad size is most suitable for ads intended to be displayed inside + /// scrollable content. + static InlineAdaptiveSize getInlineAdaptiveBannerAdSize( + int width, + int maxHeight, + ) { + return InlineAdaptiveSize._(width: width, maxHeight: maxHeight); + } + + /// Ad units that render screen-width banner ads on any screen size across different devices in either orientation on Android. + @Deprecated('Use adaptive banner instead') + static AdSize get smartBanner { + assert(defaultTargetPlatform == TargetPlatform.android); + // Orientation is not used on Android. + return smartBannerPortrait; + } + + /// Ad units that render screen-width banner ads on any screen size across different devices in portrait on iOS. + @Deprecated('Use adaptive banner instead') + static AdSize get smartBannerPortrait { + return getSmartBanner(Orientation.portrait); + } + + /// Ad units that render screen-width banner ads on any screen size across different devices in landscape on iOS. + @Deprecated('Use adaptive banner instead') + static AdSize get smartBannerLandscape { + return getSmartBanner(Orientation.landscape); + } + + /// Ad units that render screen-width banner ads on any screen size across different devices in either [Orientation]. + @Deprecated('Use adaptive banner instead') + static SmartBannerAdSize getSmartBanner(Orientation orientation) { + return SmartBannerAdSize(orientation); + } + + @override + bool operator ==(Object other) { + return other is AdSize && width == other.width && height == other.height; + } + + @override + int get hashCode => Object.hash(width, height); +} + +/// The base class for all ads. +/// +/// A valid [adUnitId] is required. +abstract class Ad { + /// Default constructor, used by subclasses. + Ad({required this.adUnitId, this.responseInfo}); + + /// Identifies the source of [Ad]s for your application. + /// + /// For testing use a [sample ad unit](https://developers.google.com/admob/ios/test-ads#sample_ad_units). + final String adUnitId; + + /// Frees the plugin resources associated with this ad. + Future dispose() { + return instanceManager.disposeAd(this); + } + + /// Contains information about the loaded request. + /// + /// Only present if the ad has been successfully loaded. + ResponseInfo? responseInfo; +} + +/// Base class for mobile [Ad] that has an in-line view. +/// +/// A valid [adUnitId] and [size] are required. +abstract class AdWithView extends Ad { + /// Default constructor, used by subclasses. + AdWithView({required String adUnitId, required this.listener}) + : super(adUnitId: adUnitId); + + /// The [AdWithViewListener] for the ad. + final AdWithViewListener listener; + + /// Starts loading this ad. + /// + /// Loading callbacks are sent to this [Ad]'s [listener]. + Future load(); +} + +/// An [Ad] that is overlaid on top of the UI. +abstract class AdWithoutView extends Ad { + /// Default constructor used by subclasses. + AdWithoutView({required String adUnitId}) : super(adUnitId: adUnitId); + + /// Callback to be invoked when an ad is estimated to have earned money. + /// Available for allowlisted accounts only. + OnPaidEventCallback? onPaidEvent; + + /// Sets whether this ad will be displayed in immersive mode (Android only). + /// + /// This is a no-op on iOS. + /// See https://developer.android.com/training/system-ui/immersive#immersive + /// for more information on immersive mode. + Future setImmersiveMode(bool immersiveModeEnabled) async { + if (defaultTargetPlatform == TargetPlatform.iOS) { + return Future.value(); + } else { + return instanceManager.setImmersiveMode(this, immersiveModeEnabled); + } + } +} + +/// Displays an [Ad] as a Flutter widget. +/// +/// This widget takes ads inheriting from [AdWithView] +/// (e.g. [BannerAd] and [NativeAd]) and allows them to be added to the Flutter +/// widget tree. +/// +/// Must call `load()` first before showing the widget. Otherwise, a +/// [PlatformException] will be thrown. +class AdWidget extends StatefulWidget { + /// Default constructor for [AdWidget]. + /// + /// [ad] must be loaded before this is added to the widget tree. + const AdWidget({Key? key, required this.ad}) : super(key: key); + + /// Ad to be displayed as a widget. + final AdWithView ad; + + @override + _AdWidgetState createState() => _AdWidgetState(); +} + +class _AdWidgetState extends State { + bool _adIdAlreadyMounted = false; + bool _adLoadNotCalled = false; + + @override + void initState() { + super.initState(); + final int? adId = instanceManager.adIdFor(widget.ad); + if (adId != null) { + if (instanceManager.isWidgetAdIdMounted(adId)) { + _adIdAlreadyMounted = true; + } + instanceManager.mountWidgetAdId(adId); + } else { + _adLoadNotCalled = true; + } + } + + @override + void dispose() { + super.dispose(); + final int? adId = instanceManager.adIdFor(widget.ad); + if (adId != null) { + instanceManager.unmountWidgetAdId(adId); + } + } + + @override + Widget build(BuildContext context) { + if (_adIdAlreadyMounted) { + throw FlutterError.fromParts([ + ErrorSummary('This AdWidget is already in the Widget tree'), + ErrorHint( + 'If you placed this AdWidget in a list, make sure you create a new instance ' + 'in the builder function with a unique ad object.', + ), + ErrorHint( + 'Make sure you are not using the same ad object in more than one AdWidget.', + ), + ]); + } + if (_adLoadNotCalled) { + throw FlutterError.fromParts([ + ErrorSummary( + 'AdWidget requires Ad.load to be called before AdWidget is inserted into the tree', + ), + ErrorHint( + 'Parameter ad is not loaded. Call Ad.load before AdWidget is inserted into the tree.', + ), + ]); + } + if (defaultTargetPlatform == TargetPlatform.android) { + return PlatformViewLink( + viewType: '${instanceManager.channel.name}/ad_widget', + surfaceFactory: + (BuildContext context, PlatformViewController controller) { + return AndroidViewSurface( + controller: controller as AndroidViewController, + gestureRecognizers: + const >{}, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + ); + }, + onCreatePlatformView: (PlatformViewCreationParams params) { + return PlatformViewsService.initSurfaceAndroidView( + id: params.id, + viewType: '${instanceManager.channel.name}/ad_widget', + layoutDirection: TextDirection.ltr, + creationParams: instanceManager.adIdFor(widget.ad), + creationParamsCodec: StandardMessageCodec(), + ) + ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) + ..create(); + }, + ); + } + + return UiKitView( + viewType: '${instanceManager.channel.name}/ad_widget', + creationParams: instanceManager.adIdFor(widget.ad), + creationParamsCodec: StandardMessageCodec(), + ); + } +} + +/// A widget for displaying [FluidAdManagerBannerAd]. +/// +/// This widget adjusts its height based on the platform rendered ad. +class FluidAdWidget extends StatefulWidget { + /// Constructs a [FluidAdWidget]. + const FluidAdWidget({Key? key, required this.ad, this.width}) + : super(key: key); + + /// Ad to be displayed as a widget. + final FluidAdManagerBannerAd ad; + + /// The width to set for the ad widget. + final double? width; + + @override + _FluidAdWidgetState createState() => _FluidAdWidgetState(); +} + +class _FluidAdWidgetState extends State { + bool _adIdAlreadyMounted = false; + bool _adLoadNotCalled = false; + double _height = 0; + + @override + void initState() { + super.initState(); + final int? adId = instanceManager.adIdFor(widget.ad); + if (adId != null) { + if (instanceManager.isWidgetAdIdMounted(adId)) { + _adIdAlreadyMounted = true; + } + instanceManager.mountWidgetAdId(adId); + } else { + _adLoadNotCalled = true; + } + } + + @override + void dispose() { + super.dispose(); + final int? adId = instanceManager.adIdFor(widget.ad); + if (adId != null) { + instanceManager.unmountWidgetAdId(adId); + } + } + + @override + Widget build(BuildContext context) { + if (_adIdAlreadyMounted) { + throw FlutterError.fromParts([ + ErrorSummary('This AdWidget is already in the Widget tree'), + ErrorHint( + 'If you placed this AdWidget in a list, make sure you create a new instance ' + 'in the builder function with a unique ad object.', + ), + ErrorHint( + 'Make sure you are not using the same ad object in more than one AdWidget.', + ), + ]); + } + if (_adLoadNotCalled) { + throw FlutterError.fromParts([ + ErrorSummary( + 'AdWidget requires Ad.load to be called before AdWidget is inserted into the tree', + ), + ErrorHint( + 'Parameter ad is not loaded. Call Ad.load before AdWidget is inserted into the tree.', + ), + ]); + } + + widget.ad.onFluidAdHeightChangedListener = (ad, height) { + setState(() { + _height = height; + }); + }; + + Widget platformView; + double height; + if (defaultTargetPlatform == TargetPlatform.android) { + platformView = PlatformViewLink( + viewType: '${instanceManager.channel.name}/ad_widget', + surfaceFactory: + (BuildContext context, PlatformViewController controller) { + return AndroidViewSurface( + controller: controller as AndroidViewController, + gestureRecognizers: + const >{}, + hitTestBehavior: PlatformViewHitTestBehavior.opaque, + ); + }, + onCreatePlatformView: (PlatformViewCreationParams params) { + return PlatformViewsService.initSurfaceAndroidView( + id: params.id, + viewType: '${instanceManager.channel.name}/ad_widget', + layoutDirection: TextDirection.ltr, + creationParams: instanceManager.adIdFor(widget.ad), + creationParamsCodec: StandardMessageCodec(), + ) + ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated) + ..create(); + }, + ); + height = _height / MediaQuery.of(context).devicePixelRatio; + } else { + platformView = UiKitView( + viewType: '${instanceManager.channel.name}/ad_widget', + creationParams: instanceManager.adIdFor(widget.ad), + creationParamsCodec: StandardMessageCodec(), + ); + height = _height; + } + + return Container( + height: max(1, height), + width: widget.width == null ? 1 : max(1, widget.width!), + child: platformView, + ); + } +} + +/// A banner ad. +/// +/// This ad can either be overlaid on top of all flutter widgets as a static +/// view or displayed as a typical Flutter widget. To display as a widget, +/// instantiate an [AdWidget] with this as a parameter. +class BannerAd extends AdWithView { + /// Creates a [BannerAd]. + /// + /// A valid [adUnitId], nonnull [listener], and nonnull request is required. + BannerAd({ + required this.size, + required String adUnitId, + required this.listener, + required this.request, + }) : super(adUnitId: adUnitId, listener: listener); + + /// Targeting information used to fetch an [Ad]. + final AdRequest request; + + /// Represents the size of a banner ad. + /// + /// There are six sizes available, which are the same for both iOS and Android. + /// See the guides for banners on Android](https://developers.google.com/admob/android/banner#banner_sizes) + /// and [iOS](https://developers.google.com/admob/ios/banner#banner_sizes) for additional details. + final AdSize size; + + /// A listener for receiving events in the ad lifecycle. + @override + final BannerAdListener listener; + + @override + Future load() async { + await instanceManager.loadBannerAd(this); + } + + /// Returns the AdSize of the associated platform ad object. + /// + /// The dimensions of the [AdSize] returned here may differ from [size], + /// depending on what type of [AdSize] was used. + /// The future will resolve to null if [load] has not been called yet. + Future getPlatformAdSize() async { + return await instanceManager.getAdSize(this); + } + + /// Returns true if the ad Id is already mounted in a WidgetAd managed + /// by the instanceManager. + bool get isMounted { + final int? id = instanceManager.adIdFor(this); + if (id != null) { + return instanceManager.isWidgetAdIdMounted(id); + } + return false; + } + + /// Returns true if banner loaded is collapsible + Future get isCollapsible async { + return await instanceManager.isCollapsible(this); + } +} + +/// An 'AdManagerBannerAd' that has fluid ad size. +/// +/// These ads will dynamically adjust their height to match the width of the ad. +/// This should be used with [FluidAdWidget], which displays the ad in a widget +/// that adjusts its height to the height of the platform rendered ad. +class FluidAdManagerBannerAd extends AdManagerBannerAd { + /// Creates a [FluidAdManagerBannerAd]. + /// + /// These ads dynamically change their height based on the width. + /// Set [onFluidAdHeightChangedListener] to get notified of height updates. + FluidAdManagerBannerAd({ + required String adUnitId, + required AdManagerBannerAdListener listener, + required AdManagerAdRequest request, + this.onFluidAdHeightChangedListener, + }) : super( + sizes: [FluidAdSize()], + adUnitId: adUnitId, + listener: listener, + request: request, + ); + + /// Listener for when the height of the ad changes. + OnFluidAdHeightChangedListener? onFluidAdHeightChangedListener; + + @override + Future load() async { + return instanceManager.loadFluidAd(this); + } +} + +/// A banner ad displayed with Google Ad Manager. +/// +/// This ad can either be overlaid on top of all flutter widgets by passing this +/// to an [AdWidget] after calling [load]. +class AdManagerBannerAd extends AdWithView { + /// Default constructor for [AdManagerBannerAd]. + /// + /// [sizes], [adUnitId], [listener], and [request] are all required values. + AdManagerBannerAd({ + required this.sizes, + required String adUnitId, + required this.listener, + required this.request, + }) : assert(sizes.isNotEmpty), + super(adUnitId: adUnitId, listener: listener); + + /// Targeting information used to fetch an [Ad]. + final AdManagerAdRequest request; + + /// A listener for receiving events in the ad lifecycle. + @override + final AdManagerBannerAdListener listener; + + /// Ad sizes supported by this [AdManagerBannerAd]. + /// + /// In most cases, only one ad size will be specified. Multiple ad sizes can + /// be specified if your application can appropriately handle multiple ad + /// sizes. If multiple ad sizes are specified, the [AdManagerBannerAd] will + /// assume the size of the first ad size until an ad is loaded. + final List sizes; + + @override + Future load() async { + await instanceManager.loadAdManagerBannerAd(this); + } + + /// Returns the AdSize of the associated platform ad object. + /// + /// The future will resolve to null if [load] has not been called yet. + /// The dimensions of the [AdSize] returned here may differ from [sizes], + /// depending on what type of [AdSize] was used. + Future getPlatformAdSize() async { + return await instanceManager.getAdSize(this); + } +} + +/// A NativeAd. +/// +/// Native ads are ad assets that are presented to users via UI components that +/// are native to the platform. (e.g. A +/// [View](https://developer.android.com/reference/android/view/View) on Android +/// or a +/// [UIView](https://developer.apple.com/documentation/uikit/uiview?language=objc) +/// on iOS). Using Flutter widgets to create native ads is NOT supported by +/// this. +/// +/// Using platform specific UI components, these ads can be formatted to match +/// the visual design of the user experience in which they live. In coding +/// terms, this means that when a native ad loads, your app receives a NativeAd +/// object that contains its assets, and the app (rather than the Google Mobile +/// Ads SDK) is then responsible for displaying them. +/// +/// See the README for more details on using Native Ads. +/// +/// To display this ad, instantiate an [AdWidget] with this as a parameter after +/// calling [load]. +class NativeAd extends AdWithView { + /// Creates a [NativeAd]. + /// + /// A valid [adUnitId], nonnull [listener], nonnull [request], and either + /// [factoryId] or [nativeTemplateStyle] is required. + /// Use [nativeAdOptions] to customize the native ad request. + /// Use [customOptions] to pass data to your native ad factory. + NativeAd({ + required String adUnitId, + this.factoryId, + required this.listener, + required this.request, + this.nativeAdOptions, + this.customOptions, + this.nativeTemplateStyle, + }) : adManagerRequest = null, + assert(request != null), + assert(nativeTemplateStyle != null || factoryId != null), + super(adUnitId: adUnitId, listener: listener); + + /// Creates a [NativeAd] with Ad Manager. + /// + /// A valid [adUnitId], nonnull [listener], nonnull [adManagerRequest], and + /// either [factoryId] or [nativeTemplateStyle] is required. + /// Use [nativeAdOptions] to customize the native ad request. + /// Use [customOptions] to pass data to your native ad factory. + NativeAd.fromAdManagerRequest({ + required String adUnitId, + this.factoryId, + required this.listener, + required this.adManagerRequest, + this.nativeAdOptions, + this.customOptions, + this.nativeTemplateStyle, + }) : request = null, + assert(adManagerRequest != null), + assert(nativeTemplateStyle != null || factoryId != null), + super(adUnitId: adUnitId, listener: listener); + + /// An identifier for the factory that creates the Platform view. + final String? factoryId; + + /// A listener for receiving events in the ad lifecycle. + @override + final NativeAdListener listener; + + /// Optional options used to create the [NativeAd]. + /// + /// These options are passed to the platform's `NativeAdFactory`. + Map? customOptions; + + /// Targeting information used to fetch an [Ad]. + final AdRequest? request; + + /// Targeting information used to fetch an [Ad] with Ad Manager. + final AdManagerAdRequest? adManagerRequest; + + /// Options to configure the native ad request. + final NativeAdOptions? nativeAdOptions; + + /// Optional [NativeTemplateStyle] for this ad. + /// + /// If this is non-null, the plugin will render a native ad template + /// with corresponding style. Otherwise any registered NativeAdFactory will be + /// used to render the native ad. + final NativeTemplateStyle? nativeTemplateStyle; + + @override + Future load() async { + await instanceManager.loadNativeAd(this); + } +} + +/// A full-screen interstitial ad for the Google Mobile Ads Plugin. +class InterstitialAd extends AdWithoutView { + /// Creates an [InterstitialAd]. + /// + /// A valid [adUnitId] from the AdMob dashboard, a nonnull [listener], and a + /// nonnull [request] is required. + InterstitialAd._({ + required String adUnitId, + required this.request, + required this.adLoadCallback, + }) : super(adUnitId: adUnitId); + + /// Targeting information used to fetch an [Ad]. + final AdRequest request; + + /// Callback to be invoked when the ad finishes loading. + final InterstitialAdLoadCallback adLoadCallback; + + /// Callbacks to be invoked when ads show and dismiss full screen content. + FullScreenContentCallback? fullScreenContentCallback; + + /// Loads an [InterstitialAd] with the given [adUnitId] and [request]. + static Future load({ + required String adUnitId, + required AdRequest request, + required InterstitialAdLoadCallback adLoadCallback, + }) async { + InterstitialAd ad = InterstitialAd._( + adUnitId: adUnitId, + adLoadCallback: adLoadCallback, + request: request, + ); + + await instanceManager.loadInterstitialAd(ad); + } + + /// Displays this on top of the application. + /// + /// Set [fullScreenContentCallback] before calling this method to be + /// notified of events that occur when showing the ad. + Future show() { + return instanceManager.showAdWithoutView(this); + } +} + +/// A full-screen interstitial ad for use with Ad Manager. +class AdManagerInterstitialAd extends AdWithoutView { + /// Creates an [AdManagerInterstitialAd]. + /// + /// A valid [adUnitId] from the Ad Manager dashboard, a nonnull [listener], + /// and nonnull [request] is required. + AdManagerInterstitialAd._({ + required String adUnitId, + required this.request, + required this.adLoadCallback, + }) : super(adUnitId: adUnitId); + + /// Targeting information used to fetch an [Ad]. + final AdManagerAdRequest request; + + /// Callback to be invoked when the ad finishes loading. + final AdManagerInterstitialAdLoadCallback adLoadCallback; + + /// Callbacks to be invoked when ads show and dismiss full screen content. + FullScreenContentCallback? fullScreenContentCallback; + + /// An optional listener for app events. + AppEventListener? appEventListener; + + /// Loads an [AdManagerInterstitialAd] with the given [adUnitId] and [request]. + static Future load({ + required String adUnitId, + required AdManagerAdRequest request, + required AdManagerInterstitialAdLoadCallback adLoadCallback, + AppEventListener? appEventListener, + }) async { + AdManagerInterstitialAd ad = AdManagerInterstitialAd._( + adUnitId: adUnitId, + adLoadCallback: adLoadCallback, + request: request, + ); + + await instanceManager.loadAdManagerInterstitialAd(ad); + } + + /// Displays this on top of the application. + /// + /// Set [fullScreenContentCallback] before calling this method to be + /// notified of events that occur when showing the ad. + Future show() { + return instanceManager.showAdWithoutView(this); + } +} + +/// An [Ad] where a user has the option of interacting with in exchange for in-app rewards. +/// +/// Because the video assets are so large, it's a good idea to start loading an +/// ad well in advance of when it's likely to be needed. +class RewardedAd extends AdWithoutView { + /// Creates a [RewardedAd] with an [AdRequest]. + /// + /// A valid [adUnitId], nonnull [listener], and nonnull request is required. + RewardedAd._({ + required String adUnitId, + required this.rewardedAdLoadCallback, + required this.request, + }) : adManagerRequest = null, + super(adUnitId: adUnitId); + + /// Creates a [RewardedAd] with a [AdManagerAdRequest]. + /// + /// A valid [adUnitId], nonnull [listener], and nonnull request is required. + RewardedAd._fromAdManagerRequest({ + required String adUnitId, + required this.rewardedAdLoadCallback, + required this.adManagerRequest, + }) : request = null, + super(adUnitId: adUnitId); + + /// Targeting information used to fetch an [Ad]. + final AdRequest? request; + + /// Targeting information used to fetch an [Ad] using Ad Manager. + final AdManagerAdRequest? adManagerRequest; + + /// Callbacks for events that occur when attempting to load an ad. + final RewardedAdLoadCallback rewardedAdLoadCallback; + + /// Callbacks to be invoked when ads show and dismiss full screen content. + FullScreenContentCallback? fullScreenContentCallback; + + /// Callback for when the user earns a reward. + OnUserEarnedRewardCallback? onUserEarnedRewardCallback; + + /// Loads a [RewardedAd] using an [AdRequest]. + static Future load({ + required String adUnitId, + required AdRequest request, + required RewardedAdLoadCallback rewardedAdLoadCallback, + }) async { + RewardedAd rewardedAd = RewardedAd._( + adUnitId: adUnitId, + request: request, + rewardedAdLoadCallback: rewardedAdLoadCallback, + ); + + await instanceManager.loadRewardedAd(rewardedAd); + } + + /// Loads a [RewardedAd] using an [AdManagerAdRequest]. + static Future loadWithAdManagerAdRequest({ + required String adUnitId, + required AdManagerAdRequest adManagerRequest, + required RewardedAdLoadCallback rewardedAdLoadCallback, + }) async { + RewardedAd rewardedAd = RewardedAd._fromAdManagerRequest( + adUnitId: adUnitId, + adManagerRequest: adManagerRequest, + rewardedAdLoadCallback: rewardedAdLoadCallback, + ); + + await instanceManager.loadRewardedAd(rewardedAd); + } + + /// Display this on top of the application. + /// + /// Set [fullScreenContentCallback] before calling this method to be + /// notified of events that occur when showing the ad. + /// [onUserEarnedReward] will be invoked when the user earns a reward. + Future show({required OnUserEarnedRewardCallback onUserEarnedReward}) { + onUserEarnedRewardCallback = onUserEarnedReward; + return instanceManager.showAdWithoutView(this); + } + + /// Set [ServerSideVerificationOptions] for the ad. + Future setServerSideOptions(ServerSideVerificationOptions options) { + return instanceManager.setServerSideVerificationOptions(options, this); + } +} + +/// Rewarded interstitials are full screen ads that reward users and can be +/// shown without a user opt in. +/// +/// This ad format is different than [RewardedAd] because rewarded ads require +/// the user to opt-in to watching the video. This ad format is different than +/// [InterstitialAd] because interstitial ads do not reward the user. +/// +/// Because the video assets are so large, it's a good idea to start loading an +/// ad well in advance of when it's likely to be needed. +class RewardedInterstitialAd extends AdWithoutView { + /// Creates a [RewardedInterstitialAd] with an [AdRequest]. + /// + /// A valid [adUnitId], nonnull [listener], and nonnull request is required. + RewardedInterstitialAd._({ + required String adUnitId, + required this.rewardedInterstitialAdLoadCallback, + required this.request, + }) : adManagerRequest = null, + super(adUnitId: adUnitId); + + /// Creates a [RewardedInterstitialAd] with an [AdManagerAdRequest]. + /// + /// A valid [adUnitId], nonnull [listener], and nonnull request is required. + RewardedInterstitialAd._fromAdManagerRequest({ + required String adUnitId, + required this.rewardedInterstitialAdLoadCallback, + required this.adManagerRequest, + }) : request = null, + super(adUnitId: adUnitId); + + /// Targeting information used to fetch an [Ad]. + final AdRequest? request; + + /// Targeting information used to fetch an [Ad] using Ad Manager. + final AdManagerAdRequest? adManagerRequest; + + /// Callbacks for events that occur when attempting to load an ad. + final RewardedInterstitialAdLoadCallback rewardedInterstitialAdLoadCallback; + + /// Callbacks to be invoked when ads show and dismiss full screen content. + FullScreenContentCallback? fullScreenContentCallback; + + /// Callback for when the user earns a reward. + OnUserEarnedRewardCallback? onUserEarnedRewardCallback; + + /// Loads a [RewardedInterstitialAd] using an [AdRequest]. + static Future load({ + required String adUnitId, + required AdRequest request, + required RewardedInterstitialAdLoadCallback + rewardedInterstitialAdLoadCallback, + }) async { + RewardedInterstitialAd rewardedInterstitialAd = RewardedInterstitialAd._( + adUnitId: adUnitId, + request: request, + rewardedInterstitialAdLoadCallback: rewardedInterstitialAdLoadCallback, + ); + + await instanceManager.loadRewardedInterstitialAd(rewardedInterstitialAd); + } + + /// Loads a [RewardedInterstitialAd] using an [AdManagerAdRequest]. + static Future loadWithAdManagerAdRequest({ + required String adUnitId, + required AdManagerAdRequest adManagerRequest, + required RewardedInterstitialAdLoadCallback + rewardedInterstitialAdLoadCallback, + }) async { + RewardedInterstitialAd rewardedInterstitialAd = + RewardedInterstitialAd._fromAdManagerRequest( + adUnitId: adUnitId, + adManagerRequest: adManagerRequest, + rewardedInterstitialAdLoadCallback: + rewardedInterstitialAdLoadCallback, + ); + + await instanceManager.loadRewardedInterstitialAd(rewardedInterstitialAd); + } + + /// Display this on top of the application. + /// + /// Set [fullScreenContentCallback] before calling this method to be + /// notified of events that occur when showing the ad. + /// [onUserEarnedReward] will be invoked when the user earns a reward. + Future show({required OnUserEarnedRewardCallback onUserEarnedReward}) { + onUserEarnedRewardCallback = onUserEarnedReward; + return instanceManager.showAdWithoutView(this); + } + + /// Set [ServerSideVerificationOptions] for the ad. + Future setServerSideOptions(ServerSideVerificationOptions options) { + return instanceManager.setServerSideVerificationOptions(options, this); + } +} + +/// Credit information about a reward received from a [RewardedAd] or +/// [RewardedInterstitialAd]. +class RewardItem { + /// Default constructor for [RewardItem]. + /// + /// This is mostly used to return [RewardItem]s for a [RewardedAd] or + /// [RewardedInterstitialAd] and shouldn't be needed to be used directly. + RewardItem(this.amount, this.type); + + /// Credit amount rewarded from a [RewardedAd] or [RewardedInterstitialAd]. + final num amount; + + /// Type of credit rewarded. + final String type; +} + +/// Options for RewardedAd server-side verification callbacks. +/// +/// See https://developers.google.com/admob/ios/rewarded-video-ssv and +/// https://developers.google.com/admob/android/rewarded-video-ssv for more +/// information. +class ServerSideVerificationOptions { + /// The user id to be used in server-to-server reward callbacks. + final String? userId; + + /// The custom data to be used in server-to-server reward callbacks + final String? customData; + + /// Create [ServerSideVerificationOptions] with the userId or customData. + ServerSideVerificationOptions({this.userId, this.customData}); + + @override + bool operator ==(other) { + return other is ServerSideVerificationOptions && + userId == other.userId && + customData == other.customData; + } + + @override + int get hashCode => Object.hash(userId, customData); +} + +/// A full-screen app open ad for the Google Mobile Ads Plugin. +class AppOpenAd extends AdWithoutView { + AppOpenAd._({ + required String adUnitId, + required this.adLoadCallback, + required this.request, + }) : adManagerAdRequest = null, + super(adUnitId: adUnitId); + + AppOpenAd._fromAdManagerRequest({ + required String adUnitId, + required this.adLoadCallback, + required this.adManagerAdRequest, + }) : request = null, + super(adUnitId: adUnitId); + + /// The [AdRequest] used to load the ad. + final AdRequest? request; + + /// The [AdManagerAdRequest] used to load the ad. + final AdManagerAdRequest? adManagerAdRequest; + + /// Listener for ad load events. + final AppOpenAdLoadCallback adLoadCallback; + + /// Callbacks to be invoked when ads show and dismiss full screen content. + FullScreenContentCallback? fullScreenContentCallback; + + /// Loads a [AppOpenAd] using an [AdRequest]. + static Future load({ + required String adUnitId, + required AdRequest request, + required AppOpenAdLoadCallback adLoadCallback, + }) async { + AppOpenAd ad = AppOpenAd._( + adUnitId: adUnitId, + adLoadCallback: adLoadCallback, + request: request, + ); + await instanceManager.loadAppOpenAd(ad); + } + + /// Loads an [AppOpenAd] using an [AdManagerRequest]. + static Future loadWithAdManagerAdRequest({ + required String adUnitId, + required AdManagerAdRequest adManagerAdRequest, + required AppOpenAdLoadCallback adLoadCallback, + }) async { + AppOpenAd ad = AppOpenAd._fromAdManagerRequest( + adUnitId: adUnitId, + adLoadCallback: adLoadCallback, + adManagerAdRequest: adManagerAdRequest, + ); + await instanceManager.loadAppOpenAd(ad); + } + + /// Displays this on top of the application. + /// + /// Set [fullScreenContentCallback] before calling this method to be + /// notified of events that occur when showing the ad. + Future show() { + return instanceManager.showAdWithoutView(this); + } +} + +/// Media aspect ratio for native ads. +enum MediaAspectRatio { + /// Unknown media aspect ratio. + unknown, + + /// Any media aspect ratio. + any, + + /// Landscape media aspect ratio. + landscape, + + /// Portrait media aspect ratio. + portrait, + + /// Close to square media aspect ratio. This is not a strict 1:1 aspect ratio. + square, +} + +/// Indicates preferred location of AdChoices icon. +enum AdChoicesPlacement { + /// Top right corner. + topRightCorner, + + /// Top left corner. + topLeftCorner, + + /// Bottom right corner. + bottomRightCorner, + + /// Bottom left corner. + bottomLeftCorner, +} + +/// Used to configure native ad requests. +class NativeAdOptions { + /// Where to place the AdChoices icon. + /// + /// Default is top right. + final AdChoicesPlacement? adChoicesPlacement; + + /// The media aspect ratio. + /// + /// Default is unknown, which will apply no restrictions. + final MediaAspectRatio? mediaAspectRatio; + + /// Options for video. + final VideoOptions? videoOptions; + + /// Whether to request a custom implementation for the Mute This Ad feature. + /// + /// Default value is false. + final bool? requestCustomMuteThisAd; + + /// Sets whether multiple images should be requested or not. + /// + /// Default value is false. + final bool? shouldRequestMultipleImages; + + /// Indicates whether image asset content should be loaded by the SDK. + /// + /// If set to true, the SDK will not load image asset content and native ad + /// image URLs can be used to fetch content. Defaults to false. + final bool? shouldReturnUrlsForImageAssets; + + /// Construct a NativeAdOptions, an optional class used to further customize + /// native ad requests. + NativeAdOptions({ + this.adChoicesPlacement, + this.mediaAspectRatio, + this.videoOptions, + this.requestCustomMuteThisAd, + this.shouldRequestMultipleImages, + this.shouldReturnUrlsForImageAssets, + }); + + @override + bool operator ==(other) { + return other is NativeAdOptions && + adChoicesPlacement == other.adChoicesPlacement && + mediaAspectRatio == other.mediaAspectRatio && + videoOptions == other.videoOptions && + requestCustomMuteThisAd == other.requestCustomMuteThisAd && + shouldRequestMultipleImages == other.shouldRequestMultipleImages && + shouldReturnUrlsForImageAssets == other.shouldReturnUrlsForImageAssets; + } + + @override + int get hashCode => Object.hash( + adChoicesPlacement, + mediaAspectRatio, + videoOptions, + requestCustomMuteThisAd, + shouldRequestMultipleImages, + shouldReturnUrlsForImageAssets, + ); +} + +/// Options for controlling video playback in supported ad formats. +class VideoOptions { + /// Whether the requested video should have the click to expand behavior. + final bool? clickToExpandRequested; + + /// Whether the requested video should have custom controls enabled. + /// + /// Custom controls are for play/pause/mute/unmute. + final bool? customControlsRequested; + + /// Indicates whether videos should start muted. + /// + /// By default this property value is YES. + final bool? startMuted; + + /// Constructs a VideoOptions to further customize a native ad request. + /// + /// This is only necessary if you wish to further customize your native ad + /// integration. + VideoOptions({ + this.clickToExpandRequested, + this.customControlsRequested, + this.startMuted, + }); + + @override + bool operator ==(other) { + return other is VideoOptions && + clickToExpandRequested == other.clickToExpandRequested && + customControlsRequested == other.customControlsRequested && + startMuted == other.startMuted; + } + + @override + int get hashCode => + Object.hash(clickToExpandRequested, customControlsRequested, startMuted); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_inspector_containers.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_inspector_containers.dart new file mode 100644 index 00000000..cfc42daa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_inspector_containers.dart @@ -0,0 +1,31 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Callback for when the ad inspector closes. +typedef OnAdInspectorClosedListener = void Function(AdInspectorError?); + +/// Error information about why the ad inspector failed. +class AdInspectorError { + /// Create an AdInspectorError with the given code, domain and message. + AdInspectorError({this.code, this.domain, this.message}); + + /// Code to identifier the error. + final String? code; + + /// The domain from which the error came. + final String? domain; + + /// A message detailing the error. + final String? message; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_instance_manager.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_instance_manager.dart new file mode 100644 index 00000000..a0cccbb8 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_instance_manager.dart @@ -0,0 +1,1488 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ignore_for_file: public_member_api_docs + +// ignore_for_file: deprecated_member_use_from_same_package + +// ignore_for_file: deprecated_member_use + +import 'dart:async'; +import 'dart:collection'; +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_mobile_ads/src/ad_inspector_containers.dart'; +import 'package:google_mobile_ads/src/ad_listeners.dart'; +import 'package:google_mobile_ads/src/mediation_extras.dart'; +import 'package:google_mobile_ads/src/mobile_ads.dart'; +import 'package:google_mobile_ads/src/nativetemplates/template_type.dart'; +import 'package:google_mobile_ads/src/webview_controller_util.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:webview_flutter_android/webview_flutter_android.dart'; +import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; + +import 'ad_containers.dart'; +import 'nativetemplates/native_template_font_style.dart'; +import 'nativetemplates/native_template_style.dart'; +import 'nativetemplates/native_template_text_style.dart'; +import 'request_configuration.dart'; + +/// Loads and disposes [BannerAds] and [InterstitialAds]. +AdInstanceManager instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', +); + +/// Maintains access to loaded [Ad] instances and handles sending/receiving +/// messages to platform code. +class AdInstanceManager { + AdInstanceManager( + String channelName, { + this.webViewControllerUtil = const WebViewControllerUtil(), + }) : channel = MethodChannel( + channelName, + StandardMethodCodec(AdMessageCodec()), + ) { + channel.setMethodCallHandler((MethodCall call) async { + assert(call.method == 'onAdEvent'); + + final int adId = call.arguments['adId']; + final String eventName = call.arguments['eventName']; + + final Ad? ad = adFor(adId); + if (ad != null) { + _onAdEvent(ad, eventName, call.arguments); + } else { + debugPrint('$Ad with id `$adId` is not available for $eventName.'); + } + }); + } + + int _nextAdId = 0; + final _BiMap _loadedAds = _BiMap(); + + /// Invokes load and dispose calls. + final MethodChannel channel; + final WebViewControllerUtil webViewControllerUtil; + + void _onAdEvent(Ad ad, String eventName, Map arguments) { + if (defaultTargetPlatform == TargetPlatform.android) { + _onAdEventAndroid(ad, eventName, arguments); + } else { + _onAdEventIOS(ad, eventName, arguments); + } + } + + void _onAdEventIOS(Ad ad, String eventName, Map arguments) { + switch (eventName) { + case 'onAdLoaded': + _invokeOnAdLoaded(ad, eventName, arguments); + break; + case 'onAdFailedToLoad': + _invokeOnAdFailedToLoad(ad, eventName, arguments); + break; + case 'onAppEvent': + _invokeOnAppEvent(ad, eventName, arguments); + break; + case 'adDidRecordClick': + _invokeOnAdClicked(ad, eventName); + break; + case 'onNativeAdWillPresentScreen': // Fall through + case 'onBannerWillPresentScreen': + _invokeOnAdOpened(ad, eventName); + break; + case 'onNativeAdDidDismissScreen': // Fall through + case 'onBannerDidDismissScreen': + _invokeOnAdClosed(ad, eventName); + break; + case 'onBannerWillDismissScreen': // Fall through + case 'onNativeAdWillDismissScreen': + if (ad is AdWithView) { + ad.listener.onAdWillDismissScreen?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + break; + case 'onRewardedAdUserEarnedReward': + case 'onRewardedInterstitialAdUserEarnedReward': + _invokeOnUserEarnedReward(ad, eventName, arguments); + break; + case 'onBannerImpression': + case 'adDidRecordImpression': // Fall through + case 'onNativeAdImpression': // Fall through + _invokeOnAdImpression(ad, eventName); + break; + case 'adWillPresentFullScreenContent': + _invokeOnAdShowedFullScreenContent(ad, eventName); + break; + case 'adDidDismissFullScreenContent': + _invokeOnAdDismissedFullScreenContent(ad, eventName); + break; + case 'adWillDismissFullScreenContent': + if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdWillDismissFullScreenContent?.call( + ad, + ); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdWillDismissFullScreenContent?.call( + ad, + ); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdWillDismissFullScreenContent?.call( + ad, + ); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdWillDismissFullScreenContent?.call( + ad, + ); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdWillDismissFullScreenContent?.call( + ad, + ); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + break; + case 'didFailToPresentFullScreenContentWithError': + _invokeOnAdFailedToShowFullScreenContent(ad, eventName, arguments); + break; + case 'onPaidEvent': + _invokePaidEvent(ad, eventName, arguments); + break; + case 'onFluidAdHeightChanged': + _invokeFluidAdHeightChanged(ad, arguments); + break; + default: + debugPrint('invalid ad event name: $eventName'); + } + } + + void _onAdEventAndroid( + Ad ad, + String eventName, + Map arguments, + ) { + switch (eventName) { + case 'onAdLoaded': + _invokeOnAdLoaded(ad, eventName, arguments); + break; + case 'onAdFailedToLoad': + _invokeOnAdFailedToLoad(ad, eventName, arguments); + break; + case 'onAdOpened': + _invokeOnAdOpened(ad, eventName); + break; + case 'onAdClosed': + _invokeOnAdClosed(ad, eventName); + break; + case 'onAppEvent': + _invokeOnAppEvent(ad, eventName, arguments); + break; + case 'onRewardedAdUserEarnedReward': + case 'onRewardedInterstitialAdUserEarnedReward': + _invokeOnUserEarnedReward(ad, eventName, arguments); + break; + case 'onAdImpression': + _invokeOnAdImpression(ad, eventName); + break; + case 'onFailedToShowFullScreenContent': + _invokeOnAdFailedToShowFullScreenContent(ad, eventName, arguments); + break; + case 'onAdShowedFullScreenContent': + _invokeOnAdShowedFullScreenContent(ad, eventName); + break; + case 'onAdDismissedFullScreenContent': + _invokeOnAdDismissedFullScreenContent(ad, eventName); + break; + case 'onPaidEvent': + _invokePaidEvent(ad, eventName, arguments); + break; + case 'onFluidAdHeightChanged': + _invokeFluidAdHeightChanged(ad, arguments); + break; + case 'onAdClicked': + _invokeOnAdClicked(ad, eventName); + break; + default: + debugPrint('invalid ad event name: $eventName'); + } + } + + void _invokeFluidAdHeightChanged(Ad ad, Map arguments) { + assert(ad is FluidAdManagerBannerAd); + (ad as FluidAdManagerBannerAd).onFluidAdHeightChangedListener?.call( + ad, + arguments['height'].toDouble(), + ); + } + + void _invokeOnAdLoaded( + Ad ad, + String eventName, + Map arguments, + ) { + ad.responseInfo = arguments['responseInfo']; + if (ad is AdWithView) { + ad.listener.onAdLoaded?.call(ad); + } else if (ad is RewardedAd) { + ad.rewardedAdLoadCallback.onAdLoaded.call(ad); + } else if (ad is InterstitialAd) { + ad.adLoadCallback.onAdLoaded.call(ad); + } else if (ad is RewardedInterstitialAd) { + ad.rewardedInterstitialAdLoadCallback.onAdLoaded.call(ad); + } else if (ad is AdManagerInterstitialAd) { + ad.adLoadCallback.onAdLoaded.call(ad); + } else if (ad is AppOpenAd) { + ad.adLoadCallback.onAdLoaded.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdFailedToLoad( + Ad ad, + String eventName, + Map arguments, + ) { + if (ad is AdWithView) { + ad.listener.onAdFailedToLoad?.call(ad, arguments['loadAdError']); + } else if (ad is RewardedAd) { + ad.dispose(); + ad.rewardedAdLoadCallback.onAdFailedToLoad.call(arguments['loadAdError']); + } else if (ad is InterstitialAd) { + ad.dispose(); + ad.adLoadCallback.onAdFailedToLoad.call(arguments['loadAdError']); + } else if (ad is RewardedInterstitialAd) { + ad.dispose(); + ad.rewardedInterstitialAdLoadCallback.onAdFailedToLoad.call( + arguments['loadAdError'], + ); + } else if (ad is AdManagerInterstitialAd) { + ad.dispose(); + ad.adLoadCallback.onAdFailedToLoad.call(arguments['loadAdError']); + } else if (ad is AppOpenAd) { + ad.adLoadCallback.onAdFailedToLoad.call(arguments['loadAdError']); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAppEvent( + Ad ad, + String eventName, + Map arguments, + ) { + if (ad is AdManagerBannerAd) { + ad.listener.onAppEvent?.call(ad, arguments['name'], arguments['data']); + } else if (ad is AdManagerInterstitialAd) { + ad.appEventListener?.onAppEvent?.call( + ad, + arguments['name'], + arguments['data'], + ); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnUserEarnedReward( + Ad ad, + String eventName, + Map arguments, + ) { + assert(arguments['rewardItem'] != null); + if (ad is RewardedAd) { + ad.onUserEarnedRewardCallback?.call(ad, arguments['rewardItem']); + } else if (ad is RewardedInterstitialAd) { + ad.onUserEarnedRewardCallback?.call(ad, arguments['rewardItem']); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdOpened(Ad ad, String eventName) { + if (ad is AdWithView) { + ad.listener.onAdOpened?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdClosed(Ad ad, String eventName) { + if (ad is AdWithView) { + ad.listener.onAdClosed?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdShowedFullScreenContent(Ad ad, String eventName) { + if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdShowedFullScreenContent?.call(ad); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdShowedFullScreenContent?.call(ad); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdShowedFullScreenContent?.call(ad); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdShowedFullScreenContent?.call(ad); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdShowedFullScreenContent?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdDismissedFullScreenContent(Ad ad, String eventName) { + if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdDismissedFullScreenContent?.call(ad); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdDismissedFullScreenContent?.call(ad); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdDismissedFullScreenContent?.call(ad); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdDismissedFullScreenContent?.call(ad); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdDismissedFullScreenContent?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdFailedToShowFullScreenContent( + Ad ad, + String eventName, + Map arguments, + ) { + if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdFailedToShowFullScreenContent?.call( + ad, + arguments['error'], + ); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdFailedToShowFullScreenContent?.call( + ad, + arguments['error'], + ); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdFailedToShowFullScreenContent?.call( + ad, + arguments['error'], + ); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdFailedToShowFullScreenContent?.call( + ad, + arguments['error'], + ); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdFailedToShowFullScreenContent?.call( + ad, + arguments['error'], + ); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdImpression(Ad ad, String eventName) { + if (ad is AdWithView) { + ad.listener.onAdImpression?.call(ad); + } else if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdImpression?.call(ad); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdImpression?.call(ad); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdImpression?.call(ad); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdImpression?.call(ad); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdImpression?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokeOnAdClicked(Ad ad, String eventName) { + if (ad is NativeAd) { + ad.listener.onAdClicked?.call(ad); + } else if (ad is AdWithView) { + ad.listener.onAdClicked?.call(ad); + } else if (ad is RewardedAd) { + ad.fullScreenContentCallback?.onAdClicked?.call(ad); + } else if (ad is InterstitialAd) { + ad.fullScreenContentCallback?.onAdClicked?.call(ad); + } else if (ad is RewardedInterstitialAd) { + ad.fullScreenContentCallback?.onAdClicked?.call(ad); + } else if (ad is AdManagerInterstitialAd) { + ad.fullScreenContentCallback?.onAdClicked?.call(ad); + } else if (ad is AppOpenAd) { + ad.fullScreenContentCallback?.onAdClicked?.call(ad); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + void _invokePaidEvent( + Ad ad, + String eventName, + Map arguments, + ) { + assert(arguments['valueMicros'] != null && arguments['valueMicros'] is num); + + int precisionTypeInt = arguments['precision']; + PrecisionType precisionType; + switch (precisionTypeInt) { + case 0: + precisionType = PrecisionType.unknown; + break; + case 1: + precisionType = PrecisionType.estimated; + break; + case 2: + precisionType = PrecisionType.publisherProvided; + break; + case 3: + precisionType = PrecisionType.precise; + break; + default: + debugPrint('Unexpected precisionType: $precisionTypeInt'); + precisionType = PrecisionType.unknown; + break; + } + if (ad is AdWithView) { + ad.listener.onPaidEvent?.call( + ad, + arguments['valueMicros'].toDouble(), + precisionType, + arguments['currencyCode'], + ); + } else if (ad is AdWithoutView) { + ad.onPaidEvent?.call( + ad, + arguments['valueMicros'].toDouble(), + precisionType, + arguments['currencyCode'], + ); + } else { + debugPrint('invalid ad: $ad, for event name: $eventName'); + } + } + + Future initialize() async { + return (await instanceManager.channel.invokeMethod( + 'MobileAds#initialize', + ))!; + } + + Future getAdSize(Ad ad) => + instanceManager.channel.invokeMethod( + 'getAdSize', + {'adId': adIdFor(ad)}, + ); + + /// Returns null if an invalid [adId] was passed in. + Ad? adFor(int adId) => _loadedAds[adId]; + + /// Returns null if an invalid [Ad] was passed in. + int? adIdFor(Ad ad) => _loadedAds.inverse[ad]; + + final Set _mountedWidgetAdIds = {}; + + /// Returns true if the [adId] is already mounted in a [WidgetAd]. + bool isWidgetAdIdMounted(int adId) => _mountedWidgetAdIds.contains(adId); + + /// Returns true if banner loaded is collapsible + Future isCollapsible(Ad ad) async => + (await instanceManager.channel.invokeMethod( + 'isCollapsible', + {'adId': adIdFor(ad)}, + ))!; + + /// Indicates that [adId] is mounted in widget tree. + void mountWidgetAdId(int adId) => _mountedWidgetAdIds.add(adId); + + /// Indicates that [adId] is unmounted from the widget tree. + void unmountWidgetAdId(int adId) => _mountedWidgetAdIds.remove(adId); + + /// Starts loading the ad if not previously loaded. + /// + /// Does nothing if we have already tried to load the ad. + Future loadBannerAd(BannerAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadBannerAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + 'size': ad.size, + }); + } + + Future loadInterstitialAd(InterstitialAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadInterstitialAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + }); + } + + /// Starts loading the ad if not previously loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadNativeAd(NativeAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadNativeAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + 'adManagerRequest': ad.adManagerRequest, + 'factoryId': ad.factoryId, + 'nativeAdOptions': ad.nativeAdOptions, + 'customOptions': ad.customOptions, + 'nativeTemplateStyle': ad.nativeTemplateStyle, + }); + } + + /// Starts loading the ad if not previously loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadRewardedAd(RewardedAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadRewardedAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + 'adManagerRequest': ad.adManagerRequest, + }); + } + + /// Starts loading the ad if not previously loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadRewardedInterstitialAd(RewardedInterstitialAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel + .invokeMethod('loadRewardedInterstitialAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + 'adManagerRequest': ad.adManagerRequest, + }); + } + + /// Load an app open ad. + Future loadAppOpenAd(AppOpenAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadAppOpenAd', { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + 'adManagerRequest': ad.adManagerAdRequest, + }); + } + + /// Starts loading the ad if not previously loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadAdManagerBannerAd(AdManagerBannerAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod( + 'loadAdManagerBannerAd', + { + 'adId': adId, + 'sizes': ad.sizes, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + }, + ); + } + + /// Starts loading the ad if not previously loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadFluidAd(FluidAdManagerBannerAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod('loadFluidAd', { + 'adId': adId, + 'sizes': ad.sizes, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + }); + } + + /// Loads an ad if not currently loading or loaded. + /// + /// Loading also terminates if ad is already in the process of loading. + Future loadAdManagerInterstitialAd(AdManagerInterstitialAd ad) { + if (adIdFor(ad) != null) { + return Future.value(); + } + + final int adId = _nextAdId++; + _loadedAds[adId] = ad; + return channel.invokeMethod( + 'loadAdManagerInterstitialAd', + { + 'adId': adId, + 'adUnitId': ad.adUnitId, + 'request': ad.request, + }, + ); + } + + /// Free the plugin resources associated with this ad. + /// + /// Disposing a banner ad that's been shown removes it from the screen. + /// Interstitial ads can't be programmatically removed from view. + Future disposeAd(Ad ad) { + final int? adId = adIdFor(ad); + final Ad? disposedAd = _loadedAds.remove(adId); + if (disposedAd == null) { + return Future.value(); + } + return channel.invokeMethod('disposeAd', { + 'adId': adId, + }); + } + + /// Display an [AdWithoutView] that is overlaid on top of the application. + Future showAdWithoutView(AdWithoutView ad) { + assert( + adIdFor(ad) != null, + '$Ad has not been loaded or has already been disposed.', + ); + + return channel.invokeMethod('showAdWithoutView', { + 'adId': adIdFor(ad), + }); + } + + /// Gets the global [RequestConfiguration]. + Future getRequestConfiguration() async { + return (await instanceManager.channel.invokeMethod( + 'MobileAds#getRequestConfiguration', + ))!; + } + + /// Set the [RequestConfiguration] to apply for future ad requests. + Future updateRequestConfiguration( + RequestConfiguration requestConfiguration, + ) { + return channel.invokeMethod( + 'MobileAds#updateRequestConfiguration', + { + 'maxAdContentRating': requestConfiguration.maxAdContentRating, + 'tagForChildDirectedTreatment': + requestConfiguration.tagForChildDirectedTreatment, + 'testDeviceIds': requestConfiguration.testDeviceIds, + 'tagForUnderAgeOfConsent': requestConfiguration.tagForUnderAgeOfConsent, + }, + ); + } + + /// Set whether same app key is enabled. + Future setSameAppKeyEnabled(bool isEnabled) { + return channel.invokeMethod( + 'MobileAds#setSameAppKeyEnabled', + {'isEnabled': isEnabled}, + ); + } + + /// Mute / Unmute app. + Future setAppMuted(bool muted) { + return channel.invokeMethod( + 'MobileAds#setAppMuted', + {'muted': muted}, + ); + } + + /// Set app volume. + Future setAppVolume(double volume) { + return channel.invokeMethod( + 'MobileAds#setAppVolume', + {'volume': volume}, + ); + } + + /// Enable / Disable immersive mode for the Ad. + Future setImmersiveMode(AdWithoutView ad, bool immersiveModeEnabled) { + assert( + adIdFor(ad) != null, + '$ad has not been loaded or has already been disposed.', + ); + + return channel.invokeMethod('setImmersiveMode', { + 'adId': adIdFor(ad), + 'immersiveModeEnabled': immersiveModeEnabled, + }); + } + + /// Disables automated SDK crash reporting. + Future disableSDKCrashReporting() { + return channel.invokeMethod('MobileAds#disableSDKCrashReporting'); + } + + /// Disables mediation adapter initialization during initialization of the GMA SDK. + Future disableMediationInitialization() { + return channel.invokeMethod( + 'MobileAds#disableMediationInitialization', + ); + } + + /// Gets the version string of Google Mobile Ads SDK. + Future getVersionString() async { + return (await instanceManager.channel.invokeMethod( + 'MobileAds#getVersionString', + ))!; + } + + /// Set server side verification options on the ad. + Future setServerSideVerificationOptions( + ServerSideVerificationOptions options, + Ad ad, + ) { + return channel.invokeMethod( + 'setServerSideVerificationOptions', + { + 'adId': adIdFor(ad), + 'serverSideVerificationOptions': options, + }, + ); + } + + /// Opens the debug menu. + /// + /// Returns a Future that completes when the platform side api has been + /// invoked. + Future openDebugMenu(String adUnitId) async { + return channel.invokeMethod( + 'MobileAds#openDebugMenu', + {'adUnitId': adUnitId}, + ); + } + + /// Register the `WebViewController` with the GMASDK. + Future registerWebView(WebViewController controller) { + return channel.invokeMethod( + 'MobileAds#registerWebView', + { + 'webViewId': webViewControllerUtil.webViewIdentifier(controller), + }, + ); + } + + int getWebViewId(WebViewController controller) { + if (WebViewPlatform.instance is AndroidWebViewPlatform) { + return (controller.platform as AndroidWebViewController) + .webViewIdentifier; + } else if (WebViewPlatform.instance is WebKitWebViewPlatform) { + return (controller.platform as WebKitWebViewController).webViewIdentifier; + } else { + throw UnsupportedError('This method only supports Android and iOS.'); + } + } + + /// Send a platform message to open the ad inspector. + void openAdInspector(OnAdInspectorClosedListener listener) async { + try { + await channel.invokeMethod('MobileAds#openAdInspector'); + listener(null); + } on PlatformException catch (e) { + var error = AdInspectorError( + code: e.code, + domain: e.details, + message: e.message, + ); + listener(error); + } + } +} + +@visibleForTesting +class AdMessageCodec extends StandardMessageCodec { + // The type values below must be consistent for each platform. + static const int _valueAdSize = 128; + static const int _valueAdRequest = 129; + static const int _valueFluidAdSize = 130; + static const int _valueRewardItem = 132; + static const int _valueLoadAdError = 133; + static const int _valueAdManagerAdRequest = 134; + static const int _valueInitializationState = 135; + static const int _valueAdapterStatus = 136; + static const int _valueInitializationStatus = 137; + static const int _valueServerSideVerificationOptions = 138; + static const int _valueAdError = 139; + static const int _valueResponseInfo = 140; + static const int _valueAdapterResponseInfo = 141; + static const int _valueAnchoredAdaptiveBannerAdSize = 142; + static const int _valueSmartBannerAdSize = 143; + static const int _valueNativeAdOptions = 144; + static const int _valueVideoOptions = 145; + static const int _valueInlineAdaptiveBannerAdSize = 146; + static const int _valueRequestConfigurationParams = 148; + static const int _valueNativeTemplateStyle = 149; + static const int _valueNativeTemplateTextStyle = 150; + static const int _valueNativeTemplateFontStyle = 151; + static const int _valueNativeTemplateType = 152; + static const int _valueColor = 153; + static const int _valueMediationExtras = 154; + + @override + void writeValue(WriteBuffer buffer, dynamic value) { + if (value is AdSize) { + writeAdSize(buffer, value); + } else if (value is AdManagerAdRequest) { + buffer.putUint8(_valueAdManagerAdRequest); + writeValue(buffer, value.keywords); + writeValue(buffer, value.contentUrl); + writeValue(buffer, value.customTargeting); + writeValue(buffer, value.customTargetingLists); + writeValue(buffer, value.nonPersonalizedAds); + writeValue(buffer, value.neighboringContentUrls); + if (defaultTargetPlatform == TargetPlatform.android) { + writeValue(buffer, value.httpTimeoutMillis); + } + writeValue(buffer, value.publisherProvidedId); + writeValue(buffer, value.mediationExtrasIdentifier); + writeValue(buffer, value.extras); + writeValue(buffer, value.mediationExtras); + } else if (value is AdRequest) { + buffer.putUint8(_valueAdRequest); + writeValue(buffer, value.keywords); + writeValue(buffer, value.contentUrl); + writeValue(buffer, value.nonPersonalizedAds); + writeValue(buffer, value.neighboringContentUrls); + if (defaultTargetPlatform == TargetPlatform.android) { + writeValue(buffer, value.httpTimeoutMillis); + } + writeValue(buffer, value.mediationExtrasIdentifier); + writeValue(buffer, value.extras); + writeValue(buffer, value.mediationExtras); + } else if (value is MediationExtras) { + buffer.putUint8(_valueMediationExtras); + if (defaultTargetPlatform == TargetPlatform.android) { + writeValue(buffer, value.getAndroidClassName()); + } else { + writeValue(buffer, value.getIOSClassName()); + } + writeValue(buffer, value.getExtras()); + } else if (value is RewardItem) { + buffer.putUint8(_valueRewardItem); + writeValue(buffer, value.amount); + writeValue(buffer, value.type); + } else if (value is ResponseInfo) { + buffer.putUint8(_valueResponseInfo); + writeValue(buffer, value.responseId); + writeValue(buffer, value.mediationAdapterClassName); + writeValue(buffer, value.adapterResponses); + writeValue(buffer, value.loadedAdapterResponseInfo); + writeValue(buffer, value.responseExtras); + } else if (value is AdapterResponseInfo) { + buffer.putUint8(_valueAdapterResponseInfo); + writeValue(buffer, value.adapterClassName); + writeValue(buffer, value.latencyMillis); + writeValue(buffer, value.description); + writeValue(buffer, value.adUnitMapping); + writeValue(buffer, value.adError); + writeValue(buffer, value.adSourceName); + writeValue(buffer, value.adSourceId); + writeValue(buffer, value.adSourceInstanceName); + writeValue(buffer, value.adSourceInstanceId); + } else if (value is LoadAdError) { + buffer.putUint8(_valueLoadAdError); + writeValue(buffer, value.code); + writeValue(buffer, value.domain); + writeValue(buffer, value.message); + writeValue(buffer, value.responseInfo); + } else if (value is AdError) { + buffer.putUint8(_valueAdError); + writeValue(buffer, value.code); + writeValue(buffer, value.domain); + writeValue(buffer, value.message); + } else if (value is AdapterInitializationState) { + buffer.putUint8(_valueInitializationState); + writeValue(buffer, value.name); + } else if (value is AdapterStatus) { + buffer.putUint8(_valueAdapterStatus); + writeValue(buffer, value.state); + writeValue(buffer, value.description); + writeValue(buffer, value.latency); + } else if (value is InitializationStatus) { + buffer.putUint8(_valueInitializationStatus); + writeValue(buffer, value.adapterStatuses); + } else if (value is ServerSideVerificationOptions) { + buffer.putUint8(_valueServerSideVerificationOptions); + writeValue(buffer, value.userId); + writeValue(buffer, value.customData); + } else if (value is NativeAdOptions) { + buffer.putUint8(_valueNativeAdOptions); + writeValue(buffer, value.adChoicesPlacement?.intValue); + writeValue(buffer, value.mediaAspectRatio?.intValue); + writeValue(buffer, value.videoOptions); + writeValue(buffer, value.requestCustomMuteThisAd); + writeValue(buffer, value.shouldRequestMultipleImages); + writeValue(buffer, value.shouldReturnUrlsForImageAssets); + } else if (value is VideoOptions) { + buffer.putUint8(_valueVideoOptions); + writeValue(buffer, value.clickToExpandRequested); + writeValue(buffer, value.customControlsRequested); + writeValue(buffer, value.startMuted); + } else if (value is RequestConfiguration) { + buffer.putUint8(_valueRequestConfigurationParams); + writeValue(buffer, value.maxAdContentRating); + writeValue(buffer, value.tagForChildDirectedTreatment); + writeValue(buffer, value.tagForUnderAgeOfConsent); + writeValue(buffer, value.testDeviceIds); + } else if (value is NativeTemplateStyle) { + buffer.putUint8(_valueNativeTemplateStyle); + writeValue(buffer, value.templateType); + writeValue(buffer, value.mainBackgroundColor); + writeValue(buffer, value.callToActionTextStyle); + writeValue(buffer, value.primaryTextStyle); + writeValue(buffer, value.secondaryTextStyle); + writeValue(buffer, value.tertiaryTextStyle); + if (defaultTargetPlatform == TargetPlatform.iOS) { + writeValue(buffer, value.cornerRadius); + } + } else if (value is TemplateType) { + buffer.putUint8(_valueNativeTemplateType); + writeValue(buffer, value.index); + } else if (value is NativeTemplateTextStyle) { + buffer.putUint8(_valueNativeTemplateTextStyle); + writeValue(buffer, value.textColor); + writeValue(buffer, value.backgroundColor); + writeValue(buffer, value.style); + writeValue(buffer, value.size); + } else if (value is Color) { + buffer.putUint8(_valueColor); + writeValue(buffer, (value.a * 255).toInt()); + writeValue(buffer, (value.r * 255).toInt()); + writeValue(buffer, (value.g * 255).toInt()); + writeValue(buffer, (value.b * 255).toInt()); + } else if (value is NativeTemplateFontStyle) { + buffer.putUint8(_valueNativeTemplateFontStyle); + writeValue(buffer, value.index); + } else { + super.writeValue(buffer, value); + } + } + + @override + dynamic readValueOfType(dynamic type, ReadBuffer buffer) { + switch (type) { + case _valueInlineAdaptiveBannerAdSize: + final num width = readValueOfType(buffer.getUint8(), buffer); + final num? maxHeight = readValueOfType(buffer.getUint8(), buffer); + final num? orientation = readValueOfType(buffer.getUint8(), buffer); + if (orientation != null) { + return orientation.toInt() == 0 + ? AdSize.getPortraitInlineAdaptiveBannerAdSize(width.toInt()) + : AdSize.getLandscapeInlineAdaptiveBannerAdSize(width.toInt()); + } else if (maxHeight != null) { + return AdSize.getInlineAdaptiveBannerAdSize( + width.toInt(), + maxHeight.toInt(), + ); + } else { + return AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize( + width.toInt(), + ); + } + + case _valueAnchoredAdaptiveBannerAdSize: + final String? orientationStr = readValueOfType( + buffer.getUint8(), + buffer, + ); + final num width = readValueOfType(buffer.getUint8(), buffer); + Orientation? orientation; + if (orientationStr != null) { + orientation = Orientation.values.firstWhere( + (Orientation orientation) => orientation.name == orientationStr, + ); + } + return AnchoredAdaptiveBannerAdSize( + orientation, + width: width.truncate(), + height: -1, // Unused value + ); + case _valueSmartBannerAdSize: + final String orientationStr = readValueOfType( + buffer.getUint8(), + buffer, + ); + return SmartBannerAdSize( + Orientation.values.firstWhere( + (Orientation orientation) => orientation.name == orientationStr, + ), + ); + case _valueAdSize: + num width = readValueOfType(buffer.getUint8(), buffer); + num height = readValueOfType(buffer.getUint8(), buffer); + return AdSize(width: width.toInt(), height: height.toInt()); + case _valueFluidAdSize: + return FluidAdSize(); + case _valueAdRequest: + return AdRequest( + keywords: readValueOfType(buffer.getUint8(), buffer)?.cast(), + contentUrl: readValueOfType(buffer.getUint8(), buffer), + nonPersonalizedAds: readValueOfType(buffer.getUint8(), buffer), + neighboringContentUrls: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + httpTimeoutMillis: (defaultTargetPlatform == TargetPlatform.android) + ? readValueOfType(buffer.getUint8(), buffer) + : null, + mediationExtrasIdentifier: readValueOfType(buffer.getUint8(), buffer), + extras: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + mediationExtras: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast>(), + ); + case _valueMediationExtras: + return _MediationExtras( + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + ); + case _valueRewardItem: + return RewardItem( + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + ); + case _valueResponseInfo: + return ResponseInfo( + responseId: readValueOfType(buffer.getUint8(), buffer), + mediationAdapterClassName: readValueOfType(buffer.getUint8(), buffer), + adapterResponses: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + loadedAdapterResponseInfo: readValueOfType(buffer.getUint8(), buffer), + responseExtras: _deepCastStringKeyDynamicValueMap( + readValueOfType(buffer.getUint8(), buffer), + ), + ); + case _valueAdapterResponseInfo: + return AdapterResponseInfo( + adapterClassName: _safeReadString(buffer), + latencyMillis: readValueOfType(buffer.getUint8(), buffer), + description: _safeReadString(buffer), + adUnitMapping: _deepCastStringMap( + readValueOfType(buffer.getUint8(), buffer), + ), + adError: readValueOfType(buffer.getUint8(), buffer), + adSourceName: _safeReadString(buffer), + adSourceId: _safeReadString(buffer), + adSourceInstanceName: _safeReadString(buffer), + adSourceInstanceId: _safeReadString(buffer), + ); + case _valueLoadAdError: + return LoadAdError( + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + ); + case _valueAdError: + return AdError( + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + ); + case _valueAdManagerAdRequest: + return AdManagerAdRequest( + keywords: readValueOfType(buffer.getUint8(), buffer)?.cast(), + contentUrl: readValueOfType(buffer.getUint8(), buffer), + customTargeting: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + customTargetingLists: _tryDeepMapCast( + readValueOfType(buffer.getUint8(), buffer), + ), + nonPersonalizedAds: readValueOfType(buffer.getUint8(), buffer), + neighboringContentUrls: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + httpTimeoutMillis: (defaultTargetPlatform == TargetPlatform.android) + ? readValueOfType(buffer.getUint8(), buffer) + : null, + publisherProvidedId: readValueOfType(buffer.getUint8(), buffer), + mediationExtrasIdentifier: readValueOfType(buffer.getUint8(), buffer), + extras: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(), + mediationExtras: readValueOfType( + buffer.getUint8(), + buffer, + )?.cast>(), + ); + case _valueInitializationState: + switch (readValueOfType(buffer.getUint8(), buffer)) { + case 'notReady': + return AdapterInitializationState.notReady; + case 'ready': + return AdapterInitializationState.ready; + } + throw ArgumentError(); + case _valueAdapterStatus: + final AdapterInitializationState state = readValueOfType( + buffer.getUint8(), + buffer, + ); + final String description = readValueOfType(buffer.getUint8(), buffer); + + double latency = readValueOfType(buffer.getUint8(), buffer).toDouble(); + // Android provides this value as an int in milliseconds while iOS + // provides this value as a double in seconds. + if (defaultTargetPlatform == TargetPlatform.android) { + latency /= 1000; + } + + return AdapterStatus(state, description, latency); + case _valueInitializationStatus: + return InitializationStatus( + readValueOfType( + buffer.getUint8(), + buffer, + ).cast(), + ); + case _valueServerSideVerificationOptions: + return ServerSideVerificationOptions( + userId: readValueOfType(buffer.getUint8(), buffer), + customData: readValueOfType(buffer.getUint8(), buffer), + ); + case _valueNativeAdOptions: + int? adChoices = readValueOfType(buffer.getUint8(), buffer); + int? mediaAspectRatio = readValueOfType(buffer.getUint8(), buffer); + return NativeAdOptions( + adChoicesPlacement: AdChoicesPlacementExtension.fromInt(adChoices), + mediaAspectRatio: MediaAspectRatioExtension.fromInt(mediaAspectRatio), + videoOptions: readValueOfType(buffer.getUint8(), buffer), + requestCustomMuteThisAd: readValueOfType(buffer.getUint8(), buffer), + shouldRequestMultipleImages: readValueOfType( + buffer.getUint8(), + buffer, + ), + shouldReturnUrlsForImageAssets: readValueOfType( + buffer.getUint8(), + buffer, + ), + ); + case _valueVideoOptions: + return VideoOptions( + clickToExpandRequested: readValueOfType(buffer.getUint8(), buffer), + customControlsRequested: readValueOfType(buffer.getUint8(), buffer), + startMuted: readValueOfType(buffer.getUint8(), buffer), + ); + case _valueRequestConfigurationParams: + return RequestConfiguration( + maxAdContentRating: readValueOfType(buffer.getUint8(), buffer), + tagForChildDirectedTreatment: readValueOfType( + buffer.getUint8(), + buffer, + ), + tagForUnderAgeOfConsent: readValueOfType(buffer.getUint8(), buffer), + testDeviceIds: readValueOfType( + buffer.getUint8(), + buffer, + ).cast(), + ); + case _valueNativeTemplateStyle: + return NativeTemplateStyle( + templateType: readValueOfType(buffer.getUint8(), buffer), + mainBackgroundColor: readValueOfType(buffer.getUint8(), buffer), + callToActionTextStyle: readValueOfType(buffer.getUint8(), buffer), + primaryTextStyle: readValueOfType(buffer.getUint8(), buffer), + secondaryTextStyle: readValueOfType(buffer.getUint8(), buffer), + tertiaryTextStyle: readValueOfType(buffer.getUint8(), buffer), + cornerRadius: defaultTargetPlatform == TargetPlatform.iOS + ? readValueOfType(buffer.getUint8(), buffer) + : null, + ); + case _valueNativeTemplateType: + return TemplateType.values[readValueOfType(buffer.getUint8(), buffer)]; + case _valueNativeTemplateTextStyle: + return NativeTemplateTextStyle( + textColor: readValueOfType(buffer.getUint8(), buffer), + backgroundColor: readValueOfType(buffer.getUint8(), buffer), + style: readValueOfType(buffer.getUint8(), buffer), + size: readValueOfType(buffer.getUint8(), buffer), + ); + case _valueColor: + return Color.fromARGB( + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + readValueOfType(buffer.getUint8(), buffer), + ); + case _valueNativeTemplateFontStyle: + return NativeTemplateFontStyle.values[readValueOfType( + buffer.getUint8(), + buffer, + )]; + default: + return super.readValueOfType(type, buffer); + } + } + + Map>? _tryDeepMapCast(Map? map) { + if (map == null) return null; + return map.map>( + (dynamic key, dynamic value) => + MapEntry>(key, value?.cast()), + ); + } + + Map _deepCastStringMap(Map? map) { + if (map == null) return {}; + return map.map( + (dynamic key, dynamic value) => MapEntry(key, value), + ); + } + + Map _deepCastStringKeyDynamicValueMap( + Map? map, + ) { + if (map == null) return {}; + return map.map( + (dynamic key, dynamic value) => MapEntry(key, value), + ); + } + + /// Reads the next value as a non-nullable string. + /// + /// Returns '' if the next value is null. + String _safeReadString(ReadBuffer buffer) { + return readValueOfType(buffer.getUint8(), buffer) ?? ''; + } + + void writeAdSize(WriteBuffer buffer, AdSize value) { + if (value is InlineAdaptiveSize) { + buffer.putUint8(_valueInlineAdaptiveBannerAdSize); + writeValue(buffer, value.width); + writeValue(buffer, value.maxHeight); + writeValue(buffer, value.orientationValue); + } else if (value is AnchoredAdaptiveBannerAdSize) { + buffer.putUint8(_valueAnchoredAdaptiveBannerAdSize); + String? orientationValue; + if (value.orientation != null) { + orientationValue = (value.orientation as Orientation).name; + } + writeValue(buffer, orientationValue); + writeValue(buffer, value.width); + } else if (value is SmartBannerAdSize) { + buffer.putUint8(_valueSmartBannerAdSize); + if (defaultTargetPlatform == TargetPlatform.iOS) { + writeValue(buffer, value.orientation.name); + } + } else if (value is FluidAdSize) { + buffer.putUint8(_valueFluidAdSize); + } else { + buffer.putUint8(_valueAdSize); + writeValue(buffer, value.width); + writeValue(buffer, value.height); + } + } +} + +class _MediationExtras implements MediationExtras { + _MediationExtras(String className, Map extras) + : _androidClassName = className, + _iOSClassName = className, + _extras = extras; + + final String _androidClassName; + final String _iOSClassName; + final Map _extras; + + @override + String getAndroidClassName() { + return _androidClassName; + } + + @override + Map getExtras() { + return _extras; + } + + @override + String getIOSClassName() { + return _iOSClassName; + } +} + +/// An extension that maps each [MediaAspectRatio] to an int. +extension MediaAspectRatioExtension on MediaAspectRatio { + /// Gets the int mapping to pass to platform channel. + int get intValue { + switch (this) { + case MediaAspectRatio.unknown: + return 0; + case MediaAspectRatio.any: + return 1; + case MediaAspectRatio.landscape: + return 2; + case MediaAspectRatio.portrait: + return 3; + case MediaAspectRatio.square: + return 4; + } + } + + /// Maps an int back to [MediaAspectRatio]. + static MediaAspectRatio? fromInt(int? intValue) { + switch (intValue) { + case 0: + return MediaAspectRatio.unknown; + case 1: + return MediaAspectRatio.any; + case 2: + return MediaAspectRatio.landscape; + case 3: + return MediaAspectRatio.portrait; + case 4: + return MediaAspectRatio.square; + default: + return null; + } + } +} + +/// An extension that maps each [AdChoicesPlacement] to an int. +extension AdChoicesPlacementExtension on AdChoicesPlacement { + /// Gets the int mapping to pass to platform channel. + int get intValue { + switch (this) { + case AdChoicesPlacement.topRightCorner: + return Platform.isAndroid ? 1 : 0; + case AdChoicesPlacement.topLeftCorner: + return Platform.isAndroid ? 0 : 1; + case AdChoicesPlacement.bottomRightCorner: + return 2; + case AdChoicesPlacement.bottomLeftCorner: + return 3; + } + } + + /// Maps an int back to [AdChoicesPlacement]. + static AdChoicesPlacement? fromInt(int? intValue) { + switch (intValue) { + case 0: + return Platform.isAndroid + ? AdChoicesPlacement.topLeftCorner + : AdChoicesPlacement.topRightCorner; + case 1: + return Platform.isAndroid + ? AdChoicesPlacement.topRightCorner + : AdChoicesPlacement.topLeftCorner; + case 2: + return AdChoicesPlacement.bottomRightCorner; + case 3: + return AdChoicesPlacement.bottomLeftCorner; + default: + return null; + } + } +} + +class _BiMap extends MapBase { + _BiMap() { + _inverse = _BiMap._inverse(this); + } + + _BiMap._inverse(this._inverse); + + final Map _map = {}; + late _BiMap _inverse; + + _BiMap get inverse => _inverse; + + @override + V? operator [](Object? key) => _map[key]; + + @override + void operator []=(K key, V value) { + assert(!_map.containsKey(key)); + assert(!inverse.containsKey(value)); + _map[key] = value; + inverse._map[value] = key; + } + + @override + void clear() { + _map.clear(); + inverse._map.clear(); + } + + @override + Iterable get keys => _map.keys; + + @override + V? remove(Object? key) { + if (key == null) return null; + final V? value = _map[key]; + inverse._map.remove(value); + return _map.remove(key); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_listeners.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_listeners.dart new file mode 100644 index 00000000..2645bf98 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ad_listeners.dart @@ -0,0 +1,325 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +import 'ad_containers.dart'; + +/// The callback type to handle an event occurring for an [Ad]. +typedef AdEventCallback = void Function(Ad ad); + +/// Generic callback type for an event occurring on an Ad. +typedef GenericAdEventCallback = void Function(Ad ad); + +/// A callback type for when an error occurs loading a full screen ad. +typedef FullScreenAdLoadErrorCallback = void Function(LoadAdError error); + +/// The callback type for when a user earns a reward. +typedef OnUserEarnedRewardCallback = + void Function(AdWithoutView ad, RewardItem reward); + +/// The callback type to handle an error loading an [Ad]. +typedef AdLoadErrorCallback = void Function(Ad ad, LoadAdError error); + +/// The callback type for when an ad receives revenue value. +typedef OnPaidEventCallback = + void Function( + Ad ad, + double valueMicros, + PrecisionType precision, + String currencyCode, + ); + +/// The callback type for when a fluid ad's height changes. +typedef OnFluidAdHeightChangedListener = + void Function(FluidAdManagerBannerAd ad, double height); + +/// Allowed constants for precision type in [OnPaidEventCallback]. +enum PrecisionType { + /// An ad value with unknown precision. + unknown, + + /// An ad value estimated from aggregated data. + estimated, + + /// A publisher-provided ad value, such as manual CPMs in a mediation group. + publisherProvided, + + /// The precise value paid for this ad. + precise, +} + +/// Listener for app events. +class AppEventListener { + /// Called when an app event is received. + void Function(Ad ad, String name, String data)? onAppEvent; +} + +/// Shared event callbacks used in Native and Banner ads. +abstract class AdWithViewListener { + /// Default constructor for [AdWithViewListener], meant to be used by subclasses. + @protected + const AdWithViewListener({ + this.onAdLoaded, + this.onAdFailedToLoad, + this.onAdOpened, + this.onAdWillDismissScreen, + this.onAdImpression, + this.onAdClosed, + this.onPaidEvent, + this.onAdClicked, + }); + + /// Called when an ad is successfully received. + final AdEventCallback? onAdLoaded; + + /// Called when an ad request failed. + final AdLoadErrorCallback? onAdFailedToLoad; + + /// A full screen view/overlay is presented in response to the user clicking + /// on an ad. You may want to pause animations and time sensitive + /// interactions. + final AdEventCallback? onAdOpened; + + /// For iOS only. Called before dismissing a full screen view. + final AdEventCallback? onAdWillDismissScreen; + + /// Called when the full screen view has been closed. You should restart + /// anything paused while handling onAdOpened. + final AdEventCallback? onAdClosed; + + /// Called when an impression occurs on the ad. + final AdEventCallback? onAdImpression; + + /// Called when the ad is clicked. + final AdEventCallback? onAdClicked; + + /// Callback to be invoked when an ad is estimated to have earned money. + /// Available for allowlisted accounts only. + final OnPaidEventCallback? onPaidEvent; +} + +/// A listener for receiving notifications for the lifecycle of a [BannerAd]. +class BannerAdListener extends AdWithViewListener { + /// Constructs a [BannerAdListener] that notifies for the provided event callbacks. + /// + /// Typically you will override [onAdLoaded] and [onAdFailedToLoad]: + /// ```dart + /// BannerAdListener( + /// onAdLoaded: (ad) { + /// // Ad successfully loaded - display an AdWidget with the banner ad. + /// }, + /// onAdFailedToLoad: (ad, error) { + /// // Ad failed to load - log the error and dispose the ad. + /// }, + /// ... + /// ) + /// ``` + const BannerAdListener({ + AdEventCallback? onAdLoaded, + AdLoadErrorCallback? onAdFailedToLoad, + AdEventCallback? onAdOpened, + AdEventCallback? onAdClosed, + AdEventCallback? onAdWillDismissScreen, + AdEventCallback? onAdImpression, + OnPaidEventCallback? onPaidEvent, + AdEventCallback? onAdClicked, + }) : super( + onAdLoaded: onAdLoaded, + onAdFailedToLoad: onAdFailedToLoad, + onAdOpened: onAdOpened, + onAdClosed: onAdClosed, + onAdWillDismissScreen: onAdWillDismissScreen, + onAdImpression: onAdImpression, + onPaidEvent: onPaidEvent, + onAdClicked: onAdClicked, + ); +} + +/// A listener for receiving notifications for the lifecycle of an [AdManagerBannerAd]. +class AdManagerBannerAdListener extends BannerAdListener + implements AppEventListener { + /// Constructs an [AdManagerBannerAdListener] with the provided event callbacks. + /// + /// Typically you will override [onAdLoaded] and [onAdFailedToLoad]: + /// ```dart + /// AdManagerBannerAdListener( + /// onAdLoaded: (ad) { + /// // Ad successfully loaded - display an AdWidget with the banner ad. + /// }, + /// onAdFailedToLoad: (ad, error) { + /// // Ad failed to load - log the error and dispose the ad. + /// }, + /// ... + /// ) + /// ``` + AdManagerBannerAdListener({ + AdEventCallback? onAdLoaded, + Function(Ad ad, LoadAdError error)? onAdFailedToLoad, + AdEventCallback? onAdOpened, + AdEventCallback? onAdWillDismissScreen, + AdEventCallback? onAdClosed, + AdEventCallback? onAdImpression, + OnPaidEventCallback? onPaidEvent, + this.onAppEvent, + AdEventCallback? onAdClicked, + }) : super( + onAdLoaded: onAdLoaded, + onAdFailedToLoad: onAdFailedToLoad, + onAdOpened: onAdOpened, + onAdWillDismissScreen: onAdWillDismissScreen, + onAdClosed: onAdClosed, + onAdImpression: onAdImpression, + onPaidEvent: onPaidEvent, + onAdClicked: onAdClicked, + ); + + /// Called when an app event is received. + @override + void Function(Ad ad, String name, String data)? onAppEvent; +} + +/// A listener for receiving notifications for the lifecycle of a [NativeAd]. +class NativeAdListener extends AdWithViewListener { + /// Constructs a [NativeAdListener] with the provided event callbacks. + /// + /// Typically you will override [onAdLoaded] and [onAdFailedToLoad]: + /// ```dart + /// NativeAdListener( + /// onAdLoaded: (ad) { + /// // Ad successfully loaded - display an AdWidget with the native ad. + /// }, + /// onAdFailedToLoad: (ad, error) { + /// // Ad failed to load - log the error and dispose the ad. + /// }, + /// ... + /// ) + /// ``` + NativeAdListener({ + AdEventCallback? onAdLoaded, + Function(Ad ad, LoadAdError error)? onAdFailedToLoad, + AdEventCallback? onAdOpened, + AdEventCallback? onAdWillDismissScreen, + AdEventCallback? onAdClosed, + AdEventCallback? onAdImpression, + OnPaidEventCallback? onPaidEvent, + AdEventCallback? onAdClicked, + }) : super( + onAdLoaded: onAdLoaded, + onAdFailedToLoad: onAdFailedToLoad, + onAdOpened: onAdOpened, + onAdWillDismissScreen: onAdWillDismissScreen, + onAdClosed: onAdClosed, + onAdImpression: onAdImpression, + onPaidEvent: onPaidEvent, + onAdClicked: onAdClicked, + ); +} + +/// Callback events for for full screen ads, such as Rewarded and Interstitial. +class FullScreenContentCallback { + /// Construct a new [FullScreenContentCallback]. + /// + /// [Ad.dispose] should be called from [onAdFailedToShowFullScreenContent] + /// and [onAdDismissedFullScreenContent], in order to free up resources. + const FullScreenContentCallback({ + this.onAdShowedFullScreenContent, + this.onAdImpression, + this.onAdFailedToShowFullScreenContent, + this.onAdWillDismissFullScreenContent, + this.onAdDismissedFullScreenContent, + this.onAdClicked, + }); + + /// Called when an ad shows full screen content. + final GenericAdEventCallback? onAdShowedFullScreenContent; + + /// Called when an ad dismisses full screen content. + final GenericAdEventCallback? onAdDismissedFullScreenContent; + + /// For iOS only. Called before dismissing a full screen view. + final GenericAdEventCallback? onAdWillDismissFullScreenContent; + + /// Called when an ad impression occurs. + final GenericAdEventCallback? onAdImpression; + + /// Called when an ad is clicked. + final GenericAdEventCallback? onAdClicked; + + /// Called when ad fails to show full screen content. + final void Function(Ad ad, AdError error)? onAdFailedToShowFullScreenContent; +} + +/// Generic parent class for ad load callbacks. +abstract class FullScreenAdLoadCallback { + /// Default constructor for [FullScreenAdLoadCallback[, used by subclasses. + const FullScreenAdLoadCallback({ + required this.onAdLoaded, + required this.onAdFailedToLoad, + }); + + /// Called when the ad successfully loads. + final GenericAdEventCallback onAdLoaded; + + /// Called when an error occurs loading the ad. + final FullScreenAdLoadErrorCallback onAdFailedToLoad; +} + +/// This class holds callbacks for loading a [RewardedAd]. +class RewardedAdLoadCallback extends FullScreenAdLoadCallback { + /// Construct a [RewardedAdLoadCallback]. + const RewardedAdLoadCallback({ + required GenericAdEventCallback onAdLoaded, + required FullScreenAdLoadErrorCallback onAdFailedToLoad, + }) : super(onAdLoaded: onAdLoaded, onAdFailedToLoad: onAdFailedToLoad); +} + +/// This class holds callbacks for loading an [AppOpenAd]. +class AppOpenAdLoadCallback extends FullScreenAdLoadCallback { + /// Construct an [AppOpenAdLoadCallback]. + const AppOpenAdLoadCallback({ + required GenericAdEventCallback onAdLoaded, + required FullScreenAdLoadErrorCallback onAdFailedToLoad, + }) : super(onAdLoaded: onAdLoaded, onAdFailedToLoad: onAdFailedToLoad); +} + +/// This class holds callbacks for loading an [InterstitialAd]. +class InterstitialAdLoadCallback + extends FullScreenAdLoadCallback { + /// Construct a [InterstitialAdLoadCallback]. + const InterstitialAdLoadCallback({ + required GenericAdEventCallback onAdLoaded, + required FullScreenAdLoadErrorCallback onAdFailedToLoad, + }) : super(onAdLoaded: onAdLoaded, onAdFailedToLoad: onAdFailedToLoad); +} + +/// This class holds callbacks for loading an [AdManagerInterstitialAd]. +class AdManagerInterstitialAdLoadCallback + extends FullScreenAdLoadCallback { + /// Construct a [AdManagerInterstitialAdLoadCallback]. + const AdManagerInterstitialAdLoadCallback({ + required GenericAdEventCallback onAdLoaded, + required FullScreenAdLoadErrorCallback onAdFailedToLoad, + }) : super(onAdLoaded: onAdLoaded, onAdFailedToLoad: onAdFailedToLoad); +} + +/// This class holds callbacks for loading a [RewardedInterstitialAd]. +class RewardedInterstitialAdLoadCallback + extends FullScreenAdLoadCallback { + /// Construct a [RewardedInterstitialAdLoadCallback]. + const RewardedInterstitialAdLoadCallback({ + required GenericAdEventCallback onAdLoaded, + required FullScreenAdLoadErrorCallback onAdFailedToLoad, + }) : super(onAdLoaded: onAdLoaded, onAdFailedToLoad: onAdFailedToLoad); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/app_background_event_notifier.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/app_background_event_notifier.dart new file mode 100644 index 00000000..8c0d1e28 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/app_background_event_notifier.dart @@ -0,0 +1,63 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; + +/// The app foreground/background state. +enum AppState { + /// App is backgrounded. + background, + + /// App is foregrounded. + foreground, +} + +/// Notifies changes in app foreground/background. +/// +/// Subscribe to [appStateStream] to get notified of changes in [AppState]. +/// Use this when implementing app open ads instead of [WidgetsBindingObserver], +/// because the latter also notifies when the state of the Flutter +/// activity/view controller changes. This makes an interstitial taking control +/// of the screen indistinguishable from the app background/foreground. +class AppStateEventNotifier { + static const _eventChannelName = + 'plugins.flutter.io/google_mobile_ads/app_state_event'; + static const _methodChannelName = + 'plugins.flutter.io/google_mobile_ads/app_state_method'; + static const EventChannel _eventChannel = EventChannel(_eventChannelName); + static const MethodChannel _methodChannel = MethodChannel(_methodChannelName); + + /// Subscribe to this to get notified of changes in [AppState]. + /// + /// Call [startListening] before subscribing to this stream to + /// start listening to background/foreground events on the platform side. + static Stream get appStateStream => + _eventChannel.receiveBroadcastStream().map( + (event) => + event == 'foreground' ? AppState.foreground : AppState.background, + ); + + /// Start listening to background/foreground events. + static Future startListening() async { + return _methodChannel.invokeMethod('start'); + } + + /// Stop listening to background/foreground events. + static Future stopListening() async { + return _methodChannel.invokeMethod('stop'); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mediation_extras.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mediation_extras.dart new file mode 100644 index 00000000..c2ecc05f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mediation_extras.dart @@ -0,0 +1,39 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:google_mobile_ads/src/ad_containers.dart'; + +/// Contains information for a particular ad network set by developer. +abstract class MediationExtras { + /// Fully-qualified name of an Android FlutterMediationExtras class. + /// + /// The name of the class must implement the FlutterMediationExtras interface. + /// The flutter plugin will try to instantiate it via reflection when an + /// [AdRequest] is created and an instance of this class is assigned to its + /// mediationExtras. + String getAndroidClassName(); + + /// Name of an iOS class that conforms to the FLTMediationExtras protocol. + /// + /// The flutter plugin will try to instantiate it via reflection when an + /// [AdRequest] is created and an instance of this class is assigned to its + /// mediationExtras. + String getIOSClassName(); + + /// Key-Value pair to be sent to the host platform to parse. + /// + /// The Android or iOS parse classes are responsible to take these values and + /// parse them to Mediation Extras that the Ad Request can register. + Map getExtras(); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mobile_ads.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mobile_ads.dart new file mode 100644 index 00000000..ab6facb4 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/mobile_ads.dart @@ -0,0 +1,186 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:google_mobile_ads/google_mobile_ads.dart'; + +import 'ad_inspector_containers.dart'; +import 'ad_instance_manager.dart'; +import 'request_configuration.dart'; +import 'package:flutter/foundation.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +/// The initialization state of the mediation adapter. +enum AdapterInitializationState { + /// The mediation adapter is less likely to fill ad requests. + notReady, + + /// The mediation adapter is ready to service ad requests. + ready, +} + +/// Class contains logic that applies to the Google Mobile Ads SDK as a whole. +/// +/// Right now, the only methods in it are used for initialization. +/// +/// See [instance]. +class MobileAds { + MobileAds._(); + + static final MobileAds _instance = MobileAds._().._init(); + + /// Shared instance to initialize the AdMob SDK. + static MobileAds get instance => _instance; + + /// Initializes the Google Mobile Ads SDK. + /// + /// Call this method as early as possible after the app launches to reduce + /// latency on the session's first ad request. + /// + /// If this method is not called, the first ad request automatically + /// initializes the Google Mobile Ads SDK. + Future initialize() { + return instanceManager.initialize(); + } + + /// Get the current [RequestConfiguration]. + /// + /// On iOS, tagForUnderAgeOfConsent and tagForChildDirectedTreatment are null on + /// the returned [RequestConfiguration]. + Future getRequestConfiguration() { + return instanceManager.getRequestConfiguration(); + } + + /// Update the [RequestConfiguration] to apply for future ad requests. + Future updateRequestConfiguration( + RequestConfiguration requestConfiguration, + ) { + return instanceManager.updateRequestConfiguration(requestConfiguration); + } + + /// Set whether the Google Mobile Ads SDK Same App Key is enabled (iOS only). + /// + /// The value set persists across app sessions. The key is enabled by default. + /// This is a no-op on Android. + /// More documentation on same app key is available at + /// https://developers.google.com/admob/ios/global-settings#same_app_key. + Future setSameAppKeyEnabled(bool isEnabled) { + if (defaultTargetPlatform == TargetPlatform.iOS) { + return instanceManager.setSameAppKeyEnabled(isEnabled); + } else { + return Future.value(); + } + } + + /// Sets whether the app is muted. + /// + /// For more details about the volume control, visit + /// https://developers.google.com/admob/android/global-settings#video_ad_volume_control + Future setAppMuted(bool muted) { + return instanceManager.setAppMuted(muted); + } + + /// Sets the current app volume. + /// + /// [volume] should be from 0 (muted) to 1 (full media volume). + /// The default value is 1. + /// For more details about the volume control, visit + /// https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-void-setappvolume-float-volume + Future setAppVolume(double volume) { + return instanceManager.setAppVolume(volume); + } + + /// Disables automated SDK crash reporting (iOS only). + /// + /// For more details, visit admob (iOS) documentation: + /// https://developers.google.com/admob/ios/api/reference/Classes/GADMobileAds#-disablesdkcrashreporting + Future disableSDKCrashReporting() { + if (defaultTargetPlatform == TargetPlatform.iOS) { + return instanceManager.disableSDKCrashReporting(); + } else { + return Future.value(); + } + } + + /// Disables mediation adapter initialization during initialization of the GMA SDK. + /// + /// For more details, visit admob documentation: + /// https://developers.google.com/admob/ios/api/reference/Classes/GADMobileAds#-disablemediationinitialization + Future disableMediationInitialization() { + return instanceManager.disableMediationInitialization(); + } + + /// Gets the version string of Google Mobile Ads SDK. + Future getVersionString() { + return instanceManager.getVersionString(); + } + + /// Opens the debug menu for the [adUnitId]. + /// + /// Returns a Future that completes when the platform side api has been + /// invoked. + Future openDebugMenu(String adUnitId) { + return instanceManager.openDebugMenu(adUnitId); + } + + /// Registers a `WebViewController` with the Google Mobile Ads SDK. + /// + /// This improves in-app ad monetization of ads within this WebView. + Future registerWebView(WebViewController webViewController) { + return instanceManager.registerWebView(webViewController); + } + + /// Open the ad inspector. + void openAdInspector(OnAdInspectorClosedListener listener) async { + instanceManager.openAdInspector(listener); + } + + /// Internal init to cleanup state for hot restart. + /// This is a workaround for https://github.com/flutter/flutter/issues/7160. + void _init() { + instanceManager.channel.invokeMethod('_init'); + } +} + +/// The status of the SDK initialization. +class InitializationStatus { + /// Default constructor to create an [InitializationStatus]. + /// + /// Returned when calling [MobileAds.initialize]; + InitializationStatus(Map adapterStatuses) + : adapterStatuses = Map.unmodifiable( + adapterStatuses, + ); + + /// Initialization status of each known ad network, keyed by its adapter's class name. + final Map adapterStatuses; +} + +/// An immutable snapshot of a mediation adapter's initialization status. +class AdapterStatus { + /// Default constructor to create an [AdapterStatus]. + /// + /// Returned when calling [MobileAds.initialize]. + AdapterStatus(this.state, this.description, this.latency); + + /// The adapter's initialization state. + final AdapterInitializationState state; + + /// Detailed description of the status. + final String description; + + /// The adapter's initialization latency in seconds. + /// + /// 0 if initialization has not yet ended. + final double latency; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_font_style.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_font_style.dart new file mode 100644 index 00000000..451362ff --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_font_style.dart @@ -0,0 +1,28 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Font types for native templates. +enum NativeTemplateFontStyle { + /// Default text + normal, + + /// Bold + bold, + + /// Italic + italic, + + /// Monospace + monospace, +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_style.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_style.dart new file mode 100644 index 00000000..8d6873ee --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_style.dart @@ -0,0 +1,85 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ui'; + +import 'package:google_mobile_ads/src/nativetemplates/template_type.dart'; +import 'package:google_mobile_ads/src/nativetemplates/native_template_text_style.dart'; + +/// Style options for native templates. +/// +/// Can be used when loading a [NativeAd]. +class NativeTemplateStyle { + /// Create a [NativeTemplateStyle]. + /// + /// Only templateType is required. + NativeTemplateStyle({ + required this.templateType, + this.callToActionTextStyle, + this.primaryTextStyle, + this.secondaryTextStyle, + this.tertiaryTextStyle, + this.mainBackgroundColor, + this.cornerRadius, + }); + + /// The [TemplateType] to use. + TemplateType templateType; + + /// The [NativeTemplateTextStyle] for the call to action. + NativeTemplateTextStyle? callToActionTextStyle; + + /// The [NativeTemplateTextStyle] for the primary text. + NativeTemplateTextStyle? primaryTextStyle; + + /// The [NativeTemplateTextStyle] for the second row of text in the template. + /// + /// All templates have a secondary text area which is populated either by the + /// body of the ad or by the rating of the app. + NativeTemplateTextStyle? secondaryTextStyle; + + /// The [NativeTemplateTextStyle] for the third row of text in the template. + /// + /// The third row is used to display store name or the default tertiary text. + NativeTemplateTextStyle? tertiaryTextStyle; + + /// The background color. + Color? mainBackgroundColor; + + /// The corner radius for the icon view and call to action (iOS only). + double? cornerRadius; + + @override + bool operator ==(Object other) { + return other is NativeTemplateStyle && + templateType == other.templateType && + callToActionTextStyle == other.callToActionTextStyle && + primaryTextStyle == other.primaryTextStyle && + secondaryTextStyle == other.secondaryTextStyle && + tertiaryTextStyle == other.tertiaryTextStyle && + mainBackgroundColor == other.mainBackgroundColor && + cornerRadius == other.cornerRadius; + } + + @override + int get hashCode => Object.hashAll([ + templateType, + callToActionTextStyle, + primaryTextStyle, + secondaryTextStyle, + tertiaryTextStyle, + mainBackgroundColor, + cornerRadius, + ]); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_text_style.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_text_style.dart new file mode 100644 index 00000000..f2c7b6f2 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/native_template_text_style.dart @@ -0,0 +1,51 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ui'; +import 'package:google_mobile_ads/src/nativetemplates/native_template_font_style.dart'; + +/// Text style options for native templates. +class NativeTemplateTextStyle { + /// Create a [NativeTemplateTextStyle]. + NativeTemplateTextStyle({ + this.textColor, + this.backgroundColor, + this.style, + this.size, + }); + + /// Text color + Color? textColor; + + /// Background color + Color? backgroundColor; + + /// FontStyle] for the text + NativeTemplateFontStyle? style; + + /// Size of the text + double? size; + + @override + bool operator ==(Object other) { + return other is NativeTemplateTextStyle && + textColor == other.textColor && + backgroundColor == other.backgroundColor && + style == other.style && + size == other.size; + } + + @override + int get hashCode => Object.hashAll([textColor, backgroundColor, style, size]); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/template_type.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/template_type.dart new file mode 100644 index 00000000..86b63c5b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/nativetemplates/template_type.dart @@ -0,0 +1,22 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Template types for [NativeTemplateStyle]. +enum TemplateType { + /// Small layout + small, + + /// Medium layout + medium, +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/request_configuration.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/request_configuration.dart new file mode 100644 index 00000000..47491c7a --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/request_configuration.dart @@ -0,0 +1,105 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Contains targeting information that can be applied to all ad requests. +/// +/// See relevant documentation at +/// https://developers.google.com/ad-manager/mobile-ads-sdk/android/targeting#requestconfiguration. +class RequestConfiguration { + /// Maximum content rating that will be shown. + final String? maxAdContentRating; + + /// Whether to tag as child directed. + final int? tagForChildDirectedTreatment; + + /// Whether to tag as under age of consent. + final int? tagForUnderAgeOfConsent; + + /// List of test device ids to set. + final List? testDeviceIds; + + /// Creates a [RequestConfiguration]. + RequestConfiguration({ + this.maxAdContentRating, + this.tagForChildDirectedTreatment, + this.tagForUnderAgeOfConsent, + this.testDeviceIds, + }); +} + +/// Values for [RequestConfiguration.maxAdContentRating]. +class MaxAdContentRating { + /// No specified content rating. + static final String unspecified = ''; + + /// Content suitable for general audiences, including families. + static final String g = 'G'; + + /// Content suitable for most audiences with parental guidance. + static final String pg = 'PG'; + + /// Content suitable for most audiences with parental guidance. + static final String t = 'T'; + + /// Content suitable only for mature audiences. + static final String ma = 'MA'; +} + +/// Values for [RequestConfiguration.tagForUnderAgeOfConsent]. +class TagForUnderAgeOfConsent { + /// Tag as under age of consent. + /// + /// Indicates the publisher specified that the ad request should receive + /// treatment for users in the European Economic Area (EEA) under the age + /// of consent. + static final int yes = 1; + + /// Tag as NOT under age of consent. + /// + /// Indicates the publisher specified that the ad request should not receive + /// treatment for users in the European Economic Area (EEA) under the age of + /// consent. + static final int no = 0; + + /// Do not specify tag for under age of consent. + /// + /// Indicates that the publisher has not specified whether the ad request + /// should receive treatment for users in the European Economic Area (EEA) + /// under the age of consent. + static final int unspecified = -1; +} + +/// Values for [RequestConfiguration.tagForChildDirectedTreatment]. +class TagForChildDirectedTreatment { + /// Tag for child directed treatment. + /// + /// Indicates the publisher specified that the ad request should receive + /// treatment for users in the European Economic Area (EEA) under the age + /// of consent. + static final int yes = 1; + + /// Tag for NOT child directed treatment. + /// + /// Indicates the publisher specified that the ad request should not receive + /// treatment for users in the European Economic Area (EEA) under the age + /// of consent. + static final int no = 0; + + /// Do not specify tag for child directed treatment. + /// + /// Indicates that the publisher has not specified whether the ad request + /// should receive treatment for users in the European Economic Area (EEA) + /// under the age of consent. + static final int unspecified = -1; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form.dart new file mode 100644 index 00000000..0cd3dd01 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form.dart @@ -0,0 +1,71 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'form_error.dart'; +import 'user_messaging_channel.dart'; + +/// Callback to be invoked when a consent form is dismissed. +/// +/// An optional [FormError] is provided if an error occurred. +typedef OnConsentFormDismissedListener = void Function(FormError? formError); + +/// Callback to be invoked when a consent form loads successfully +typedef OnConsentFormLoadSuccessListener = + void Function(ConsentForm consentForm); + +/// Callback to be invoked when a consent form failed to load. +typedef OnConsentFormLoadFailureListener = void Function(FormError formError); + +/// A rendered form for collecting consent from a user. +abstract class ConsentForm { + /// Shows the consent form. + void show(OnConsentFormDismissedListener onConsentFormDismissedListener); + + /// Presents a privacy options form. + static Future showPrivacyOptionsForm( + OnConsentFormDismissedListener onConsentFormDismissedListener, + ) async { + onConsentFormDismissedListener( + await UserMessagingChannel.instance.showPrivacyOptionsForm(), + ); + } + + /// Free platform resources associated with this object. + /// + /// Returns a future that completes when the platform resources are freed. + Future dispose(); + + /// Loads a ConsentForm. + /// + /// Check that [ConsentInformation.isConsentFormAvailable()] returns true + /// prior to calling this method. + static void loadConsentForm( + OnConsentFormLoadSuccessListener successListener, + OnConsentFormLoadFailureListener failureListener, + ) { + UserMessagingChannel.instance.loadConsentForm( + successListener, + failureListener, + ); + } + + /// Loads a consent form and immediately shows it. + static Future loadAndShowConsentFormIfRequired( + OnConsentFormDismissedListener onConsentFormDismissedListener, + ) async { + onConsentFormDismissedListener( + await UserMessagingChannel.instance.loadAndShowConsentFormIfRequired(), + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form_impl.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form_impl.dart new file mode 100644 index 00000000..8ad486f7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_form_impl.dart @@ -0,0 +1,43 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'consent_form.dart'; +import 'user_messaging_channel.dart'; + +/// Implementation for [ConsentForm], +class ConsentFormImpl extends ConsentForm { + /// Construct a [ConsentFormImpl]. + ConsentFormImpl(this.platformHash); + + /// Identifier to the underlying platform object. + final int platformHash; + + @override + void show(OnConsentFormDismissedListener onConsentFormDismissedListener) { + UserMessagingChannel.instance.show(this, onConsentFormDismissedListener); + } + + @override + Future dispose() { + return UserMessagingChannel.instance.disposeConsentForm(this); + } + + @override + bool operator ==(Object other) { + return other is ConsentFormImpl && platformHash == other.platformHash; + } + + @override + int get hashCode => platformHash.hashCode; +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information.dart new file mode 100644 index 00000000..5d265941 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information.dart @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:google_mobile_ads/src/ump/consent_information_impl.dart'; + +import 'consent_request_parameters.dart'; +import 'form_error.dart'; + +/// Callback to be invoked when consent info is successfully updated. +typedef OnConsentInfoUpdateSuccessListener = void Function(); + +/// Callback to be invoked when consent info failed to update. +typedef OnConsentInfoUpdateFailureListener = void Function(FormError error); + +/// Consent status values. +enum ConsentStatus { + /// User consent not required. + notRequired, + + /// User consent obtained. + obtained, + + /// User consent required but not yet obtained. + required, + + /// Consent status is unknown. + unknown, +} + +/// Utility methods for collecting consent from users. +abstract class ConsentInformation { + /// Requests a consent information update. + void requestConsentInfoUpdate( + ConsentRequestParameters params, + OnConsentInfoUpdateSuccessListener successListener, + OnConsentInfoUpdateFailureListener failureListener, + ); + + /// Returns true if a ConsentForm is available, false otherwise. + Future isConsentFormAvailable(); + + /// Get the user’s consent status. + /// + /// This value is cached between app sessions and can be read before + /// requesting updated parameters. + Future getConsentStatus(); + + /// Resets the consent information to initialized status. + /// + /// Should only be used for testing. Returns a [Future] that completes when + /// the platform API has been called. + Future reset(); + + /// Indicates whether the app has completed the necessary steps for gathering updated user consent. + Future canRequestAds(); + + /// Indicates the privacy options requirement status as a [PrivacyOptionsRequirementStatus]. + Future getPrivacyOptionsRequirementStatus(); + + /// The static [ConsentInformation] instance. + static ConsentInformation instance = ConsentInformationImpl(); +} + +/// Values indicate whether a privacy options button is required. +enum PrivacyOptionsRequirementStatus { + /// Privacy options entry point is not required. + notRequired, + + /// Privacy options entry point is required. + required, + + /// Privacy options requirement status is unknown. + unknown, +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information_impl.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information_impl.dart new file mode 100644 index 00000000..c2a4fe81 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_information_impl.dart @@ -0,0 +1,61 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'consent_information.dart'; +import 'consent_request_parameters.dart'; +import 'user_messaging_channel.dart'; + +/// Implementation for ConsentInformation. +class ConsentInformationImpl extends ConsentInformation { + /// Constructor for [ConsentInformationImpl]. + ConsentInformationImpl(); + + @override + void requestConsentInfoUpdate( + ConsentRequestParameters params, + OnConsentInfoUpdateSuccessListener successListener, + OnConsentInfoUpdateFailureListener failureListener, + ) { + UserMessagingChannel.instance.requestConsentInfoUpdate( + params, + successListener, + failureListener, + ); + } + + @override + Future isConsentFormAvailable() { + return UserMessagingChannel.instance.isConsentFormAvailable(); + } + + @override + Future getConsentStatus() { + return UserMessagingChannel.instance.getConsentStatus(); + } + + @override + Future reset() { + return UserMessagingChannel.instance.reset(); + } + + @override + Future canRequestAds() { + return UserMessagingChannel.instance.canRequestAds(); + } + + @override + Future getPrivacyOptionsRequirementStatus() { + return UserMessagingChannel.instance.getPrivacyOptionsRequirementStatus(); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_request_parameters.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_request_parameters.dart new file mode 100644 index 00000000..f9f031a6 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/consent_request_parameters.dart @@ -0,0 +1,86 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/foundation.dart'; + +/// Parameters sent on updating user consent info. +class ConsentRequestParameters { + /// Construct a [ConsentRequestParameters]. + ConsentRequestParameters({ + this.tagForUnderAgeOfConsent, + this.consentDebugSettings, + }); + + /// Tag for underage of consent. + /// + /// False means users are not underage. + bool? tagForUnderAgeOfConsent; + + /// Debug settings to hardcode in test requests. + ConsentDebugSettings? consentDebugSettings; + + @override + bool operator ==(Object other) { + return other is ConsentRequestParameters && + tagForUnderAgeOfConsent == other.tagForUnderAgeOfConsent && + consentDebugSettings == other.consentDebugSettings; + } + + @override + int get hashCode => + Object.hash(tagForUnderAgeOfConsent, consentDebugSettings); +} + +/// Debug settings to hardcode in test requests. +class ConsentDebugSettings { + /// Construct a [ConsentDebugSettings]. + ConsentDebugSettings({this.debugGeography, this.testIdentifiers}); + + /// Debug geography for testing geography. + DebugGeography? debugGeography; + + /// List of device identifier strings. + /// + /// Debug features are enabled for devices with these identifiers. + List? testIdentifiers; + + @override + bool operator ==(Object other) { + return other is ConsentDebugSettings && + debugGeography == other.debugGeography && + listEquals(testIdentifiers, other.testIdentifiers); + } + + @override + int get hashCode => Object.hash(debugGeography, testIdentifiers); +} + +/// Debug values for testing geography. +enum DebugGeography { + /// Debug geography disabled. + debugGeographyDisabled, + + /// Geography appears as in EEA for debug devices. + debugGeographyEea, + + /// Geography appears as not in EEA for debug devices. + @Deprecated('Use DebugGeography.debugGeographyOther') + debugGeographyNotEea, + + /// Geography appears as in a regulated US State for debug devices. + debugGeographyRegulatedUsState, + + /// Geography appears as in a region with no regulation in force. + debugGeographyOther, +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/form_error.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/form_error.dart new file mode 100644 index 00000000..7ff1c006 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/form_error.dart @@ -0,0 +1,43 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Error information about why a form operation failed. +class FormError { + /// Init a [FormError] with the errorCode and message. + FormError({required this.errorCode, required this.message}); + + /// Code for the error. + /// + /// A value of 0 means that the error is internal to the Flutter plugin. + /// All other error codes come from the corresponding Android and iOS platform + /// objects. + /// See https://developers.google.com/admob/ump/android/api/reference/com/google/android/ump/FormError.ErrorCode, + /// https://developers.google.com/admob/ump/ios/api/reference/Enums/UMPFormErrorCode, + /// and https://developers.google.com/admob/ump/ios/api/reference/Enums/UMPRequestErrorCode + /// for platform specific error code descriptions. + final int errorCode; + + /// The message describing the error. + final String message; + + @override + bool operator ==(Object other) { + return other is FormError && + errorCode == other.errorCode && + message == other.message; + } + + @override + int get hashCode => Object.hash(errorCode, message); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_channel.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_channel.dart new file mode 100644 index 00000000..9a64e2f1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_channel.dart @@ -0,0 +1,200 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'consent_form.dart'; +import 'consent_information.dart'; +import 'consent_request_parameters.dart'; +import 'form_error.dart'; +import 'user_messaging_codec.dart'; + +/// Platform channel for UMP SDK. +class UserMessagingChannel { + static const _methodChannelName = 'plugins.flutter.io/google_mobile_ads/ump'; + + /// Create a [UserMessagingChannel] with the [channel]. + UserMessagingChannel(MethodChannel channel) : _methodChannel = channel; + + /// The shared [UserMessagingChannel] instance. + static UserMessagingChannel instance = UserMessagingChannel( + MethodChannel( + _methodChannelName, + StandardMethodCodec(UserMessagingCodec()), + ), + ); + + final MethodChannel _methodChannel; + + /// Request a consent information update with [params]. + /// + /// Invokes [successListener] or [failureListener] depending on if there was + /// an error. + void requestConsentInfoUpdate( + ConsentRequestParameters params, + OnConsentInfoUpdateSuccessListener successListener, + OnConsentInfoUpdateFailureListener failureListener, + ) async { + try { + await _methodChannel.invokeMethod( + 'ConsentInformation#requestConsentInfoUpdate', + {'params': params}, + ); + successListener(); + } on PlatformException catch (e) { + failureListener(_formErrorFromPlatformException(e)); + } + } + + /// Returns a future indicating whether a consent form is available. + Future isConsentFormAvailable() async { + return (await _methodChannel.invokeMethod( + 'ConsentInformation#isConsentFormAvailable', + ))!; + } + + /// Gets the consent status. + Future getConsentStatus() async { + int consentStatus = (await _methodChannel.invokeMethod( + 'ConsentInformation#getConsentStatus', + ))!; + + if (defaultTargetPlatform == TargetPlatform.iOS) { + switch (consentStatus) { + case 0: + return ConsentStatus.unknown; + case 1: + return ConsentStatus.required; + case 2: + return ConsentStatus.notRequired; + case 3: + return ConsentStatus.obtained; + default: + debugPrint('Error: unknown ConsentStatus value: $consentStatus'); + return ConsentStatus.unknown; + } + } else { + switch (consentStatus) { + case 0: + return ConsentStatus.unknown; + case 1: + return ConsentStatus.notRequired; + case 2: + return ConsentStatus.required; + case 3: + return ConsentStatus.obtained; + default: + debugPrint('Error: unknown ConsentStatus value: $consentStatus'); + return ConsentStatus.unknown; + } + } + } + + /// Invokes reset API, + Future reset() async { + return _methodChannel.invokeMethod('ConsentInformation#reset'); + } + + /// Returns indicating whether it is ok to request ads. + Future canRequestAds() async { + return (await _methodChannel.invokeMethod( + 'ConsentInformation#canRequestAds', + ))!; + } + + /// Indicates the privacy options requirement status as a [PrivacyOptionsRequirementStatus]. + Future + getPrivacyOptionsRequirementStatus() async { + int? privacyOptionsStatusInt = (await _methodChannel.invokeMethod( + 'ConsentInformation#getPrivacyOptionsRequirementStatus', + )); + switch (privacyOptionsStatusInt) { + case 0: + return PrivacyOptionsRequirementStatus.notRequired; + case 1: + return PrivacyOptionsRequirementStatus.required; + default: + return PrivacyOptionsRequirementStatus.unknown; + } + } + + /// Loads a consent form and calls the corresponding listener. + void loadConsentForm( + OnConsentFormLoadSuccessListener successListener, + OnConsentFormLoadFailureListener failureListener, + ) async { + try { + ConsentForm form = (await _methodChannel.invokeMethod( + 'UserMessagingPlatform#loadConsentForm', + ))!; + successListener(form); + } on PlatformException catch (e) { + failureListener(_formErrorFromPlatformException(e)); + } + } + + /// Loads a consent form and calls the listener afterwards. + Future loadAndShowConsentFormIfRequired() async { + try { + return await _methodChannel.invokeMethod( + 'UserMessagingPlatform#loadAndShowConsentFormIfRequired', + ); + } on PlatformException catch (e) { + return _formErrorFromPlatformException(e); + } + } + + /// Show the consent form. + void show( + ConsentForm consentForm, + OnConsentFormDismissedListener onConsentFormDismissedListener, + ) async { + try { + await _methodChannel.invokeMethod( + 'ConsentForm#show', + {'consentForm': consentForm}, + ); + onConsentFormDismissedListener(null); + } on PlatformException catch (e) { + onConsentFormDismissedListener(_formErrorFromPlatformException(e)); + } + } + + /// Presents a privacy options form. + Future showPrivacyOptionsForm() async { + try { + return await _methodChannel.invokeMethod( + 'UserMessagingPlatform#showPrivacyOptionsForm', + ); + } on PlatformException catch (e) { + return _formErrorFromPlatformException(e); + } + } + + FormError _formErrorFromPlatformException(PlatformException e) { + return FormError( + errorCode: int.tryParse(e.code) ?? -1, + message: e.message ?? '', + ); + } + + /// Free platform resources associated with the [ConsentForm]. + Future disposeConsentForm(ConsentForm consentForm) { + return _methodChannel.invokeMethod( + 'ConsentForm#dispose', + {'consentForm': consentForm}, + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_codec.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_codec.dart new file mode 100644 index 00000000..f81a5250 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/ump/user_messaging_codec.dart @@ -0,0 +1,88 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/services.dart'; +import 'package:google_mobile_ads/src/ump/form_error.dart'; + +import 'consent_form_impl.dart'; +import 'consent_request_parameters.dart'; + +/// Codec for coding and decoding types in the UMP SDK. +class UserMessagingCodec extends StandardMessageCodec { + static const int _valueConsentRequestParameters = 129; + static const int _valueConsentDebugSettings = 130; + static const int _valueConsentForm = 131; + static const int _valueFormError = 132; + + @override + void writeValue(WriteBuffer buffer, dynamic value) { + if (value is ConsentRequestParameters) { + buffer.putUint8(_valueConsentRequestParameters); + writeValue(buffer, value.tagForUnderAgeOfConsent); + writeValue(buffer, value.consentDebugSettings); + } else if (value is ConsentDebugSettings) { + buffer.putUint8(_valueConsentDebugSettings); + writeValue(buffer, value.debugGeography?.index); + writeValue(buffer, value.testIdentifiers); + } else if (value is ConsentFormImpl) { + buffer.putUint8(_valueConsentForm); + writeValue(buffer, value.platformHash); + } else if (value is FormError) { + buffer.putUint8(_valueFormError); + writeValue(buffer, value.errorCode); + writeValue(buffer, value.message); + } else { + super.writeValue(buffer, value); + } + } + + @override + dynamic readValueOfType(dynamic type, ReadBuffer buffer) { + switch (type) { + case _valueConsentRequestParameters: + bool? tfuac = readValueOfType(buffer.getUint8(), buffer); + ConsentDebugSettings? debugSettings = readValueOfType( + buffer.getUint8(), + buffer, + ); + return ConsentRequestParameters( + tagForUnderAgeOfConsent: tfuac, + consentDebugSettings: debugSettings, + ); + case _valueConsentDebugSettings: + int? debugGeographyInt = readValueOfType(buffer.getUint8(), buffer); + DebugGeography? debugGeography; + if (debugGeographyInt != null) { + debugGeography = DebugGeography.values[debugGeographyInt]; + } + List? testIds = readValueOfType( + buffer.getUint8(), + buffer, + )?.cast(); + return ConsentDebugSettings( + debugGeography: debugGeography, + testIdentifiers: testIds, + ); + case _valueConsentForm: + final int hashCode = readValueOfType(buffer.getUint8(), buffer); + return ConsentFormImpl(hashCode); + case _valueFormError: + final int errorCode = readValueOfType(buffer.getUint8(), buffer); + final String errorMessage = readValueOfType(buffer.getUint8(), buffer); + return FormError(errorCode: errorCode, message: errorMessage); + default: + return super.readValueOfType(type, buffer); + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/webview_controller_util.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/webview_controller_util.dart new file mode 100644 index 00000000..d843fc7f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/lib/src/webview_controller_util.dart @@ -0,0 +1,35 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:webview_flutter_android/webview_flutter_android.dart'; +import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; + +/// Util class for `WebViewController`. +class WebViewControllerUtil { + /// Default constructor. + const WebViewControllerUtil(); + + /// Returns the identifier for the underlying webview. + int webViewIdentifier(WebViewController controller) { + if (WebViewPlatform.instance is AndroidWebViewPlatform) { + return (controller.platform as AndroidWebViewController) + .webViewIdentifier; + } else if (WebViewPlatform.instance is WebKitWebViewPlatform) { + return (controller.platform as WebKitWebViewController).webViewIdentifier; + } else { + throw UnsupportedError('This method only supports Android and iOS.'); + } + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/pubspec.yaml b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/pubspec.yaml new file mode 100644 index 00000000..2dd66048 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/pubspec.yaml @@ -0,0 +1,52 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: google_mobile_ads +version: 8.0.0 +description: Flutter plugin for Google Mobile Ads, supporting + banner, interstitial (full-screen), rewarded and native ads +repository: https://github.com/googleads/googleads-mobile-flutter/tree/main/packages/google_mobile_ads + +flutter: + plugin: + platforms: + android: + package: io.flutter.plugins.googlemobileads + pluginClass: GoogleMobileAdsPlugin + ios: + pluginClass: FLTGoogleMobileAdsPlugin + +dependencies: + meta: ^1.16.0 + flutter: + sdk: flutter + webview_flutter_android: ^4.10.9 + webview_flutter_wkwebview: ^3.23.4 + webview_flutter: ^4.10.0 + +dev_dependencies: +# e2e: ^0.7.0 + flutter_driver: + sdk: flutter + mockito: ^5.4.5 + build_runner: ^2.4.15 + flutter_lints: ^6.0.0 + flutter_test: + sdk: flutter + webview_flutter_platform_interface: ^2.10.0 + + +environment: + sdk: ">=3.10.0 <4.0.0" + flutter: ">=3.38.1" diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ad_containers_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ad_containers_test.dart new file mode 100644 index 00000000..fa8dd0c0 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ad_containers_test.dart @@ -0,0 +1,1573 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/services.dart'; + +Future handlePlatformMessage(ByteData? data) async { + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); +} + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('GoogleMobileAds', () { + final List log = []; + final AdMessageCodec codec = AdMessageCodec(); + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'MobileAds#updateRequestConfiguration': + case 'MobileAds#setSameAppKeyEnabled': + case 'setImmersiveMode': + case 'loadBannerAd': + case 'loadNativeAd': + case 'showAdWithoutView': + case 'disposeAd': + case 'loadRewardedAd': + case 'loadInterstitialAd': + case 'loadAdManagerInterstitialAd': + case 'loadAdManagerBannerAd': + case 'setServerSideVerificationOptions': + return Future.value(); + case 'getAdSize': + return Future.value(AdSize.banner); + default: + assert(false); + return null; + } + }); + }); + + test('updateRequestConfiguration', () async { + final RequestConfiguration requestConfiguration = RequestConfiguration( + maxAdContentRating: MaxAdContentRating.ma, + tagForChildDirectedTreatment: TagForChildDirectedTreatment.yes, + tagForUnderAgeOfConsent: TagForUnderAgeOfConsent.yes, + testDeviceIds: ['test-device-id'], + ); + await instanceManager.updateRequestConfiguration(requestConfiguration); + expect(log, [ + isMethodCall( + 'MobileAds#updateRequestConfiguration', + arguments: { + 'maxAdContentRating': MaxAdContentRating.ma, + 'tagForChildDirectedTreatment': TagForChildDirectedTreatment.yes, + 'tagForUnderAgeOfConsent': TagForUnderAgeOfConsent.yes, + 'testDeviceIds': ['test-device-id'], + }, + ), + ]); + }); + + test('setSameAppKeyEnabled', () async { + await instanceManager.setSameAppKeyEnabled(true); + + expect(log, [ + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': true}, + ), + ]); + + await instanceManager.setSameAppKeyEnabled(false); + + expect(log, [ + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': true}, + ), + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': false}, + ), + ]); + }); + + test('load rewarded ad and set immersive mode and ssv', () async { + RewardedAd? rewarded; + AdRequest request = AdRequest(); + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + rewarded = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedAd createdAd = instanceManager.adFor(0) as RewardedAd; + (createdAd).rewardedAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + expect(rewarded, createdAd); + + // Set immersive mode + log.clear(); + await createdAd.setImmersiveMode(true); + expect(log, [ + isMethodCall( + 'setImmersiveMode', + arguments: {'adId': 0, 'immersiveModeEnabled': true}, + ), + ]); + + // Set ssv + log.clear(); + final ssv = ServerSideVerificationOptions(); + await createdAd.setServerSideOptions(ssv); + expect(log, [ + isMethodCall( + 'setServerSideVerificationOptions', + arguments: {'adId': 0, 'serverSideVerificationOptions': ssv}, + ), + ]); + }); + + test('load interstitial ad and set immersive mode', () async { + InterstitialAd? interstitial; + await InterstitialAd.load( + adUnitId: 'test-ad-unit', + request: AdRequest(), + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + InterstitialAd createdAd = (instanceManager.adFor(0) as InterstitialAd); + (createdAd).adLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': interstitial!.request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await createdAd.setImmersiveMode(false); + expect(log, [ + isMethodCall( + 'setImmersiveMode', + arguments: {'adId': 0, 'immersiveModeEnabled': false}, + ), + ]); + }); + + test('load ad manager interstitial and set immersive mode', () async { + AdManagerInterstitialAd? interstitial; + await AdManagerInterstitialAd.load( + adUnitId: 'test-id', + request: AdManagerAdRequest(), + adLoadCallback: AdManagerInterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + AdManagerInterstitialAd createdAd = + (instanceManager.adFor(0) as AdManagerInterstitialAd); + (createdAd).adLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadAdManagerInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-id', + 'request': interstitial!.request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await createdAd.setImmersiveMode(true); + expect(log, [ + isMethodCall( + 'setImmersiveMode', + arguments: {'adId': 0, 'immersiveModeEnabled': true}, + ), + ]); + }); + + test('load native', () async { + final Map options = {'a': 1, 'b': 2}; + final NativeAdOptions nativeAdOptions = NativeAdOptions( + adChoicesPlacement: AdChoicesPlacement.bottomLeftCorner, + mediaAspectRatio: MediaAspectRatio.any, + videoOptions: VideoOptions( + clickToExpandRequested: true, + customControlsRequested: true, + startMuted: true, + ), + requestCustomMuteThisAd: false, + shouldRequestMultipleImages: true, + shouldReturnUrlsForImageAssets: false, + ); + final NativeAd native = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: '0', + customOptions: options, + listener: NativeAdListener(), + request: AdRequest(), + nativeAdOptions: nativeAdOptions, + ); + + await native.load(); + expect(log, [ + isMethodCall( + 'loadNativeAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': native.request, + 'adManagerRequest': null, + 'factoryId': '0', + 'nativeAdOptions': nativeAdOptions, + 'customOptions': options, + 'nativeTemplateStyle': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + }); + + test('load native with $AdManagerAdRequest', () async { + final Map options = {'a': 1, 'b': 2}; + final NativeAd native = NativeAd.fromAdManagerRequest( + adUnitId: 'test-id', + factoryId: '0', + customOptions: options, + listener: NativeAdListener(), + adManagerRequest: AdManagerAdRequest(), + nativeTemplateStyle: NativeTemplateStyle( + templateType: TemplateType.medium, + ), + ); + + await native.load(); + expect(log, [ + isMethodCall( + 'loadNativeAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-id', + 'request': null, + 'adManagerRequest': native.adManagerRequest, + 'factoryId': '0', + 'nativeAdOptions': null, + 'customOptions': options, + 'nativeTemplateStyle': native.nativeTemplateStyle, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + }); + + testWidgets('build ad widget iOS', (WidgetTester tester) async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + final NativeAd native = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: '0', + listener: NativeAdListener(), + request: AdRequest(), + ); + + await native.load(); + + await tester.pumpWidget( + MaterialApp( + home: Material( + child: SingleChildScrollView( + child: Column( + key: UniqueKey(), + children: [ + SizedBox.fromSize(size: Size(200, 1000)), + Container( + height: 200, + width: 200, + child: AdWidget(ad: native), + ), + ], + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + + final uiKitView = tester.widget(find.byType(UiKitView)); + expect(uiKitView, isNotNull); + + await native.dispose(); + debugDefaultTargetPlatformOverride = null; + }); + + testWidgets('warns when the widget is reused', (WidgetTester tester) async { + final NativeAd ad = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: '0', + listener: NativeAdListener(), + request: AdRequest(), + ); + + await ad.load(); + + final AdWidget widget = AdWidget(ad: ad); + try { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: SizedBox( + width: 100, + height: 100, + child: Stack(children: [widget, widget]), + ), + ), + ); + } finally { + dynamic exception = tester.takeException(); + expect(exception, isA()); + expect( + (exception as FlutterError).toStringDeep(), + 'FlutterError\n' + ' This AdWidget is already in the Widget tree\n' + ' If you placed this AdWidget in a list, make sure you create a new\n' + ' instance in the builder function with a unique ad object.\n' + ' Make sure you are not using the same ad object in more than one\n' + ' AdWidget.\n' + '', + ); + } + }); + + testWidgets( + 'ad objects can be reused if the widget holding the object is disposed', + (WidgetTester tester) async { + final NativeAd ad = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: '0', + listener: NativeAdListener(), + request: AdRequest(), + ); + await ad.load(); + final AdWidget widget = AdWidget(ad: ad); + try { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: SizedBox(width: 100, height: 100, child: widget), + ), + ); + + await tester.pumpWidget(Container()); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: SizedBox(width: 100, height: 100, child: widget), + ), + ); + } finally { + expect(tester.takeException(), isNull); + } + }, + ); + + test('load show rewarded', () async { + RewardedAd? rewarded; + AdRequest request = AdRequest(); + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + rewarded = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedAd createdAd = instanceManager.adFor(0) as RewardedAd; + (createdAd).rewardedAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + expect(rewarded, createdAd); + + log.clear(); + await rewarded!.show(onUserEarnedReward: (ad, reward) => null); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + }); + + test('load show rewarded with $AdManagerAdRequest', () async { + RewardedAd? rewarded; + AdManagerAdRequest request = AdManagerAdRequest(); + await RewardedAd.loadWithAdManagerAdRequest( + adUnitId: 'test-ad-unit', + adManagerRequest: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + rewarded = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedAd createdAd = instanceManager.adFor(0) as RewardedAd; + (createdAd).rewardedAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': null, + 'adManagerRequest': request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await rewarded!.show(onUserEarnedReward: (ad, reward) => null); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + }); + + test('load show interstitial', () async { + InterstitialAd? interstitial; + await InterstitialAd.load( + adUnitId: 'test-ad-unit', + request: AdRequest(), + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + InterstitialAd createdAd = (instanceManager.adFor(0) as InterstitialAd); + (createdAd).adLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': interstitial!.request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await interstitial!.show(); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + }); + + test('load show ad manager interstitial', () async { + AdManagerInterstitialAd? interstitial; + await AdManagerInterstitialAd.load( + adUnitId: 'test-id', + request: AdManagerAdRequest(), + adLoadCallback: AdManagerInterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + AdManagerInterstitialAd createdAd = + (instanceManager.adFor(0) as AdManagerInterstitialAd); + (createdAd).adLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadAdManagerInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-id', + 'request': interstitial!.request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await interstitial!.show(); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + }); + + test('onAdFailedToLoad interstitial', () async { + final Completer resultsCompleter = Completer(); + final AdRequest request = AdRequest(); + await InterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (ad) => null, + onAdFailedToLoad: (error) => resultsCompleter.complete(error), + ), + ); + + expect(log, [ + isMethodCall( + 'loadInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + // Simulate onAdFailedToLoad. + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {'key1': 'value1'}, + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + + // The ad reference should be freed when load failure occurs. + expect(instanceManager.adFor(0), isNull); + + // Check that load error matches. + final LoadAdError result = await resultsCompleter.future; + expect(result.code, 1); + expect(result.domain, 'domain'); + expect(result.message, 'message'); + expect(result.responseInfo!.responseId, responseInfo.responseId); + expect( + result.responseInfo!.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect(result.responseInfo!.responseExtras, responseInfo.responseExtras); + List responses = + result.responseInfo!.adapterResponses!; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }); + + test('onAdFailedToLoad ad manager interstitial', () async { + final Completer resultsCompleter = Completer(); + final AdManagerAdRequest request = AdManagerAdRequest(); + await AdManagerInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: AdManagerInterstitialAdLoadCallback( + onAdLoaded: (ad) => null, + onAdFailedToLoad: (error) => resultsCompleter.complete(error), + ), + ); + + expect(log, [ + isMethodCall( + 'loadAdManagerInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + // Simulate onAdFailedToLoad. + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {}, + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await handlePlatformMessage(data); + // The ad reference should be freed when load failure occurs. + expect(instanceManager.adFor(0), isNull); + + // Check that load error matches. + final LoadAdError result = await resultsCompleter.future; + expect(result.code, 1); + expect(result.domain, 'domain'); + expect(result.message, 'message'); + expect(result.responseInfo!.responseId, responseInfo.responseId); + expect( + result.responseInfo!.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect(result.responseInfo!.responseExtras, responseInfo.responseExtras); + List responses = + result.responseInfo!.adapterResponses!; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }); + + test('onAdFailedToLoad rewarded', () async { + final Completer resultsCompleter = Completer(); + final AdRequest request = AdRequest(); + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) => null, + onAdFailedToLoad: (error) => resultsCompleter.complete(error), + ), + ); + + expect(log, [ + isMethodCall( + 'loadRewardedAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + // Simulate onAdFailedToLoad. + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {'key1': 1234}, + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + + // The ad reference should be freed when load failure occurs. + expect(instanceManager.adFor(0), isNull); + + // Check that load error matches. + final LoadAdError result = await resultsCompleter.future; + expect(result.code, 1); + expect(result.domain, 'domain'); + expect(result.message, 'message'); + expect(result.responseInfo!.responseId, responseInfo.responseId); + expect( + result.responseInfo!.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect(result.responseInfo!.responseExtras, responseInfo.responseExtras); + List responses = + result.responseInfo!.adapterResponses!; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }); + + test('onNativeAdImpression', () async { + final Completer adEventCompleter = Completer(); + + final NativeAd native = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: 'testId', + listener: NativeAdListener( + onAdImpression: (Ad ad) => adEventCompleter.complete(ad), + ), + request: AdRequest(), + ); + + await native.load(); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onAdImpression', + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + + expect(adEventCompleter.future, completion(native)); + }); + + test('AdapterResponseInfo encoding', () async { + var testAdapterResponseInfo = (adId) async { + final Completer loadCompleter = Completer(); + + AdRequest request = AdRequest(); + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + loadCompleter.complete(ad); + }, + onAdFailedToLoad: (error) => null, + ), + ); + + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + final loadedAdapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + final responseInfo = ResponseInfo( + mediationAdapterClassName: 'adapter', + adapterResponses: [adapterResponseInfo], + responseId: 'id', + loadedAdapterResponseInfo: loadedAdapterResponseInfo, + responseExtras: {}, + ); + final methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdLoaded', + 'responseInfo': responseInfo, + }); + + ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + final ad = await loadCompleter.future; + + expect(ad.responseInfo!.mediationAdapterClassName!, 'adapter'); + expect(ad.responseInfo!.responseId!, 'id'); + expect(ad.responseInfo!.responseExtras, responseInfo.responseExtras); + final adapterResponse = ad.responseInfo!.adapterResponses!.first; + expect(adapterResponse.adapterClassName, 'adapter-name'); + expect(adapterResponse.latencyMillis, 500); + expect(adapterResponse.description, 'message'); + expect(adapterResponse.adUnitMapping, {'key': 'value'}); + expect(adapterResponse.adSourceName, 'adSourceName'); + expect(adapterResponse.adSourceId, 'adSourceId'); + expect(adapterResponse.adSourceInstanceName, 'adSourceInstanceName'); + expect(adapterResponse.adSourceInstanceId, 'adSourceInstanceId'); + final loadedResponse = ad.responseInfo!.loadedAdapterResponseInfo!; + expect(loadedResponse.adapterClassName, 'adapter-name'); + expect(loadedResponse.latencyMillis, 500); + expect(loadedResponse.description, 'message'); + expect(loadedResponse.adUnitMapping, {'key': 'value'}); + expect(loadedResponse.adSourceName, 'adSourceName'); + expect(loadedResponse.adSourceId, 'adSourceId'); + expect(loadedResponse.adSourceInstanceName, 'adSourceInstanceName'); + expect(loadedResponse.adSourceInstanceId, 'adSourceInstanceId'); + }; + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testAdapterResponseInfo(0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testAdapterResponseInfo(1); + }); + + test('onRewardedAdUserEarnedReward', () async { + final Completer> resultCompleter = + Completer>(); + + RewardedAd? rewarded; + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: AdRequest(), + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + rewarded = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedAd createdAd = instanceManager.adFor(0) as RewardedAd; + createdAd.rewardedAdLoadCallback.onAdLoaded(createdAd); + // Reward callback is now set when you call show. + await rewarded!.show( + onUserEarnedReward: (ad, item) => + resultCompleter.complete([ad, item]), + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onRewardedAdUserEarnedReward', + 'rewardItem': RewardItem(1, 'one'), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + + final List result = await resultCompleter.future; + expect(result[0], rewarded!); + expect(result[1].amount, 1); + expect(result[1].type, 'one'); + }); + + test('onPaidEvent', () async { + Completer> resultCompleter = Completer>(); + + final BannerAd banner = BannerAd( + adUnitId: 'test-ad-unit', + size: AdSize.banner, + listener: BannerAdListener( + onPaidEvent: (Ad ad, double value, precision, String currencyCode) => + resultCompleter.complete([ + ad, + value, + precision, + currencyCode, + ]), + ), + request: AdRequest(), + ); + + await banner.load(); + + // Check precision type: unknown + MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onPaidEvent', + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }); + + ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + + await handlePlatformMessage(data); + + List result = await resultCompleter.future; + expect(result[0], banner); + expect(result[1], 1.2345); + expect(result[2], PrecisionType.unknown); + expect(result[3], 'USD'); + + // Unknown precision outside 0-3 range. + resultCompleter = Completer>(); + methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onPaidEvent', + 'valueMicros': 1.2345, + 'precision': 9999, + 'currencyCode': 'USD', + }); + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage( + instanceManager.channel.codec.encodeMethodCall(methodCall), + ); + result = await resultCompleter.future; + expect(result[2], PrecisionType.unknown); + + // Check precision type: estimated. + // Also check that callback is invoked successfully for int valueMicros. + resultCompleter = Completer>(); + methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onPaidEvent', + 'valueMicros': 12345, // int + 'precision': 1, + 'currencyCode': 'USD', + }); + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage( + instanceManager.channel.codec.encodeMethodCall(methodCall), + ); + result = await resultCompleter.future; + expect(result[1], 12345); + expect(result[2], PrecisionType.estimated); + + // Check precision type: publisherProvided. + resultCompleter = Completer>(); + methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onPaidEvent', + 'valueMicros': 1.2345, + 'precision': 2, + 'currencyCode': 'USD', + }); + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage(data); + + result = await resultCompleter.future; + expect(result[2], PrecisionType.publisherProvided); + + // Check precision type: precise. + resultCompleter = Completer>(); + methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onPaidEvent', + 'valueMicros': 1.2345, + 'precision': 3, + 'currencyCode': 'USD', + }); + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage(data); + + result = await resultCompleter.future; + expect(result[2], PrecisionType.precise); + }); + + test('encode/decode AdSize', () async { + final ByteData byteData = codec.encodeMessage(AdSize.banner)!; + expect(codec.decodeMessage(byteData), AdSize.banner); + }); + + test('encode/decode AdRequest Android', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + + final AdRequest adRequest = AdRequest( + keywords: ['1', '2', '3'], + contentUrl: 'contentUrl', + nonPersonalizedAds: false, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 12345, + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + + final AdRequest decodedRequest = AdRequest( + keywords: ['1', '2', '3'], + contentUrl: 'contentUrl', + nonPersonalizedAds: false, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 12345, + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + final ByteData byteData = codec.encodeMessage(adRequest)!; + expect(codec.decodeMessage(byteData), decodedRequest); + }); + + test('encode/decode AdRequest iOS', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + final AdRequest adRequest = AdRequest( + keywords: ['1', '2', '3'], + contentUrl: 'contentUrl', + nonPersonalizedAds: false, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 12345, + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + + final ByteData byteData = codec.encodeMessage(adRequest)!; + AdRequest decoded = codec.decodeMessage(byteData); + expect(decoded.httpTimeoutMillis, null); + expect(decoded.neighboringContentUrls, adRequest.neighboringContentUrls); + expect(decoded.contentUrl, adRequest.contentUrl); + expect(decoded.nonPersonalizedAds, adRequest.nonPersonalizedAds); + expect(decoded.keywords, adRequest.keywords); + expect(decoded.mediationExtrasIdentifier, 'identifier'); + }); + + test('encode/decode $LoadAdError', () async { + final ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'class', + adapterResponses: null, + responseExtras: {}, + ); + final ByteData byteData = codec.encodeMessage( + LoadAdError(1, 'domain', 'message', responseInfo), + )!; + final LoadAdError error = codec.decodeMessage(byteData); + expect(error.code, 1); + expect(error.domain, 'domain'); + expect(error.message, 'message'); + expect(error.responseInfo?.responseId, responseInfo.responseId); + expect(error.responseInfo?.responseExtras, responseInfo.responseExtras); + expect( + error.responseInfo?.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect(error.responseInfo?.adapterResponses, null); + }); + + test('encode/decode $RewardItem', () async { + final ByteData byteData = codec.encodeMessage(RewardItem(1, 'type'))!; + + final RewardItem result = codec.decodeMessage(byteData); + expect(result.amount, 1); + expect(result.type, 'type'); + }); + + test('encode/decode $InlineAdaptiveSize', () async { + ByteData byteData = codec.encodeMessage( + AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(100), + )!; + + InlineAdaptiveSize result = codec.decodeMessage(byteData); + expect(result.orientation, null); + expect(result.width, 100); + expect(result.maxHeight, null); + expect(result.height, 0); + + byteData = codec.encodeMessage( + AdSize.getPortraitInlineAdaptiveBannerAdSize(200), + )!; + + result = codec.decodeMessage(byteData); + expect(result.orientation, Orientation.portrait); + expect(result.width, 200); + expect(result.maxHeight, null); + expect(result.height, 0); + + byteData = codec.encodeMessage( + AdSize.getLandscapeInlineAdaptiveBannerAdSize(20), + )!; + + result = codec.decodeMessage(byteData); + expect(result.orientation, Orientation.landscape); + expect(result.width, 20); + expect(result.maxHeight, null); + expect(result.height, 0); + + byteData = codec.encodeMessage( + AdSize.getInlineAdaptiveBannerAdSize(20, 50), + )!; + + result = codec.decodeMessage(byteData); + expect(result.orientation, null); + expect(result.width, 20); + expect(result.maxHeight, 50); + expect(result.height, 0); + }); + + test('encode/decode $AnchoredAdaptiveBannerAdSize', () async { + final ByteData byteDataPortrait = codec.encodeMessage( + AnchoredAdaptiveBannerAdSize( + Orientation.portrait, + width: 23, + height: 34, + ), + )!; + + final AnchoredAdaptiveBannerAdSize resultPortrait = codec.decodeMessage( + byteDataPortrait, + ); + expect(resultPortrait.orientation, Orientation.portrait); + expect(resultPortrait.width, 23); + expect(resultPortrait.height, -1); + + final ByteData byteDataLandscape = codec.encodeMessage( + AnchoredAdaptiveBannerAdSize( + Orientation.landscape, + width: 34, + height: 23, + ), + )!; + + final AnchoredAdaptiveBannerAdSize resultLandscape = codec.decodeMessage( + byteDataLandscape, + ); + expect(resultLandscape.orientation, Orientation.landscape); + expect(resultLandscape.width, 34); + expect(resultLandscape.height, -1); + + final ByteData byteData = codec.encodeMessage( + AnchoredAdaptiveBannerAdSize(null, width: 45, height: 34), + )!; + + final AnchoredAdaptiveBannerAdSize result = codec.decodeMessage(byteData); + expect(result.orientation, null); + expect(result.width, 45); + expect(result.height, -1); + }); + + test('encode/decode $SmartBannerAdSize', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + final ByteData byteData = codec.encodeMessage( + SmartBannerAdSize(Orientation.portrait), + )!; + + final SmartBannerAdSize result = codec.decodeMessage(byteData); + expect(result.orientation, Orientation.portrait); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final WriteBuffer expectedBuffer = WriteBuffer(); + expectedBuffer.putUint8(143); + + final WriteBuffer actualBuffer = WriteBuffer(); + codec.writeAdSize(actualBuffer, SmartBannerAdSize(Orientation.portrait)); + expect( + expectedBuffer.done().buffer.asInt8List(), + actualBuffer.done().buffer.asInt8List(), + ); + }); + + test('encode/decode $FluidAdSize', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + final ByteData byteData = codec.encodeMessage(FluidAdSize())!; + + final FluidAdSize result = codec.decodeMessage(byteData); + expect(result.width, -3); + expect(result.height, -3); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final WriteBuffer expectedBuffer = WriteBuffer(); + expectedBuffer.putUint8(130); + + final WriteBuffer actualBuffer = WriteBuffer(); + codec.writeAdSize(actualBuffer, FluidAdSize()); + expect( + expectedBuffer.done().buffer.asInt8List(), + actualBuffer.done().buffer.asInt8List(), + ); + }); + + test('encode/decode $AdManagerAdRequest Android', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final AdManagerAdRequest request = AdManagerAdRequest( + keywords: ['who'], + contentUrl: 'dat', + customTargeting: {'boy': 'who'}, + customTargetingLists: >{ + 'him': ['is'], + }, + nonPersonalizedAds: true, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 5000, + publisherProvidedId: 'test-pub-id', + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + final ByteData byteData = codec.encodeMessage(request)!; + + final AdManagerAdRequest decodedRequest = AdManagerAdRequest( + keywords: ['who'], + contentUrl: 'dat', + customTargeting: {'boy': 'who'}, + customTargetingLists: >{ + 'him': ['is'], + }, + nonPersonalizedAds: true, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 5000, + publisherProvidedId: 'test-pub-id', + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + expect(codec.decodeMessage(byteData), decodedRequest); + }); + + test('encode/decode $AdManagerAdRequest iOS', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + final AdManagerAdRequest request = AdManagerAdRequest( + keywords: ['who'], + contentUrl: 'dat', + customTargeting: {'boy': 'who'}, + customTargetingLists: >{ + 'him': ['is'], + }, + nonPersonalizedAds: true, + neighboringContentUrls: ['url1.com', 'url2.com'], + httpTimeoutMillis: 5000, + publisherProvidedId: 'test-pub-id', + mediationExtrasIdentifier: 'identifier', + extras: {'key': 'value'}, + ); + + final ByteData byteData = codec.encodeMessage(request)!; + AdManagerAdRequest decoded = codec.decodeMessage(byteData); + expect(decoded.httpTimeoutMillis, null); + expect(decoded.neighboringContentUrls, request.neighboringContentUrls); + expect(decoded.contentUrl, request.contentUrl); + expect(decoded.nonPersonalizedAds, request.nonPersonalizedAds); + expect(decoded.keywords, request.keywords); + expect(decoded.publisherProvidedId, request.publisherProvidedId); + expect(decoded.customTargeting, request.customTargeting); + expect(decoded.customTargetingLists, request.customTargetingLists); + expect(decoded.mediationExtrasIdentifier, 'identifier'); + }); + + test('ad click native', () async { + var testNativeClick = (eventName, adId) async { + final Completer adClickCompleter = Completer(); + + final NativeAd native = NativeAd( + adUnitId: 'test-ad-unit', + factoryId: 'testId', + listener: NativeAdListener( + onAdClicked: (ad) => adClickCompleter.complete(ad), + ), + request: AdRequest(), + ); + + await native.load(); + + final MethodCall methodCall = MethodCall( + 'onAdEvent', + {'adId': adId, 'eventName': eventName}, + ); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await handlePlatformMessage(data); + + expect(adClickCompleter.future, completion(native)); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testNativeClick('adDidRecordClick', 0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testNativeClick('onAdClicked', 1); + }); + + test('ad click rewarded', () async { + var testRewardedClick = (eventName, adId) async { + final Completer adClickCompleter = Completer(); + + // Load an ad + RewardedAd? rewarded; + AdRequest request = AdRequest(); + await RewardedAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedAdLoadCallback: RewardedAdLoadCallback( + onAdLoaded: (ad) { + rewarded = ad; + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdClicked: (ad) => adClickCompleter.complete(ad), + ); + }, + onAdFailedToLoad: (error) => null, + ), + ); + + MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdLoaded', + }); + + ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await handlePlatformMessage(data); + + // Handle adDidRecordClick method call + methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': eventName, + }); + + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage(data); + + expect(adClickCompleter.future, completion(rewarded!)); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testRewardedClick('adDidRecordClick', 0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testRewardedClick('onAdClicked', 1); + }); + + test('ad click interstitial', () async { + var testClick = (eventName, adId) async { + final Completer adClickCompleter = Completer(); + + // Load an ad + InterstitialAd? interstitialAd; + AdRequest request = AdRequest(); + await InterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitialAd = ad; + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdClicked: (ad) => adClickCompleter.complete(ad), + ); + }, + onAdFailedToLoad: (error) => null, + ), + ); + + MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdLoaded', + }); + + ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await handlePlatformMessage(data); + + // Handle adDidRecordClick method call + methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': eventName, + }); + + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage(data); + + expect(adClickCompleter.future, completion(interstitialAd!)); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testClick('adDidRecordClick', 0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testClick('onAdClicked', 1); + }); + + test('ad click interstitial', () async { + var testClick = (eventName, adId) async { + final Completer adClickCompleter = Completer(); + + // Load an ad + InterstitialAd? interstitialAd; + AdRequest request = AdRequest(); + await InterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: InterstitialAdLoadCallback( + onAdLoaded: (ad) { + interstitialAd = ad; + ad.fullScreenContentCallback = FullScreenContentCallback( + onAdClicked: (ad) => adClickCompleter.complete(ad), + ); + }, + onAdFailedToLoad: (error) => null, + ), + ); + + MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdLoaded', + }); + + ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await handlePlatformMessage(data); + + // Handle adDidRecordClick method call + methodCall = MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': eventName, + }); + + data = instanceManager.channel.codec.encodeMethodCall(methodCall); + await handlePlatformMessage(data); + + expect(adClickCompleter.future, completion(interstitialAd!)); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testClick('adDidRecordClick', 0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testClick('onAdClicked', 1); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/admanager_banner_ad_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/admanager_banner_ad_test.dart new file mode 100644 index 00000000..b2fdaa14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/admanager_banner_ad_test.dart @@ -0,0 +1,360 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'test_util.dart'; + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('Ad Manager Banner Ad Tests', () { + final List log = []; + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'loadAdManagerBannerAd': + case 'disposeAd': + return Future.value(); + default: + assert(false); + return null; + } + }); + }); + + test('android loaded events', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + AdManagerAdRequest request = AdManagerAdRequest(); + + // Check that listener callbacks are invoked + Completer loaded = Completer(); + Completer> failedToLoad = Completer>(); + Completer opened = Completer(); + Completer clicked = Completer(); + Completer impression = Completer(); + Completer closed = Completer(); + Completer> paidEvent = Completer>(); + + AdManagerBannerAdListener bannerListener = AdManagerBannerAdListener( + onAdLoaded: (ad) => loaded.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoad.complete([ad, error]), + onAdImpression: (ad) => impression.complete(ad), + onPaidEvent: (ad, value, precision, currency) => + paidEvent.complete([ad, value, precision, currency]), + onAdClicked: (ad) => clicked.complete(ad), + onAdClosed: (ad) => closed.complete(ad), + onAdOpened: (ad) => opened.complete(ad), + ); + + var bannerAd = AdManagerBannerAd( + sizes: [AdSize.banner], + adUnitId: 'ad-unit', + listener: bannerListener, + request: request, + ); + await bannerAd.load(); + + expect(log, [ + isMethodCall( + 'loadAdManagerBannerAd', + arguments: { + 'adId': 0, + 'adUnitId': 'ad-unit', + 'request': request, + 'sizes': [AdSize.banner], + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + AdManagerBannerAd createdAd = + instanceManager.adFor(0) as AdManagerBannerAd; + expect(instanceManager.adFor(0), isNotNull); + expect(bannerAd, createdAd); + expect(await loaded.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdImpression', instanceManager); + expect(await impression.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clicked.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdOpened', instanceManager); + expect(await opened.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClosed', instanceManager); + expect(await closed.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clicked.future, bannerAd); + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEvent.future; + expect(paidEventCallback[0], bannerAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('onAdFailedToLoad banner', () async { + var testOnAdFailedToLoad = (adId) async { + final Completer> resultsCompleter = + Completer>(); + + final AdManagerBannerAd banner = AdManagerBannerAd( + adUnitId: 'test-ad-unit', + sizes: [AdSize.banner], + listener: AdManagerBannerAdListener( + onAdFailedToLoad: (Ad ad, LoadAdError error) => + resultsCompleter.complete([ad, error]), + ), + request: AdManagerAdRequest(), + ); + + await banner.load(); + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {'key': 'value'}, + ); + + final MethodCall methodCall = + MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); + + final List results = await resultsCompleter.future; + expect(results[0], banner); + expect(results[1].code, 1); + expect(results[1].domain, 'domain'); + expect(results[1].message, 'message'); + expect(results[1].responseInfo.responseId, responseInfo.responseId); + expect( + results[1].responseInfo.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect( + results[1].responseInfo.responseExtras, + responseInfo.responseExtras, + ); + List responses = + results[1].responseInfo.adapterResponses; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testOnAdFailedToLoad(0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testOnAdFailedToLoad(1); + }); + + test('ios loaded events', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + AdManagerAdRequest request = AdManagerAdRequest(); + + // Check that listener callbacks are invoked + Completer loaded = Completer(); + Completer> failedToLoad = Completer>(); + Completer opened = Completer(); + Completer clicked = Completer(); + Completer impression = Completer(); + Completer closed = Completer(); + Completer willDismiss = Completer(); + Completer> paidEvent = Completer>(); + + AdManagerBannerAdListener bannerListener = AdManagerBannerAdListener( + onAdLoaded: (ad) => loaded.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoad.complete([ad, error]), + onAdImpression: (ad) => impression.complete(ad), + onPaidEvent: (ad, value, precision, currency) => + paidEvent.complete([ad, value, precision, currency]), + onAdClicked: (ad) => clicked.complete(ad), + onAdClosed: (ad) => closed.complete(ad), + onAdOpened: (ad) => opened.complete(ad), + onAdWillDismissScreen: (ad) => willDismiss.complete(ad), + ); + + var bannerAd = AdManagerBannerAd( + sizes: [AdSize.banner], + adUnitId: 'ad-unit', + listener: bannerListener, + request: request, + ); + await bannerAd.load(); + + expect(log, [ + isMethodCall( + 'loadAdManagerBannerAd', + arguments: { + 'adId': 0, + 'adUnitId': 'ad-unit', + 'request': request, + 'sizes': [AdSize.banner], + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + AdManagerBannerAd createdAd = + instanceManager.adFor(0) as AdManagerBannerAd; + expect(instanceManager.adFor(0), isNotNull); + expect(bannerAd, createdAd); + expect(await loaded.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onBannerImpression', instanceManager); + expect(await impression.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'adDidRecordClick', instanceManager); + expect(await clicked.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerWillPresentScreen', + instanceManager, + ); + expect(await opened.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerDidDismissScreen', + instanceManager, + ); + expect(await closed.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerWillDismissScreen', + instanceManager, + ); + expect(await willDismiss.future, bannerAd); + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEvent.future; + expect(paidEventCallback[0], bannerAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('dispose banner', () async { + final AdManagerBannerAd banner = AdManagerBannerAd( + adUnitId: 'test-ad-unit', + sizes: [AdSize.banner], + listener: AdManagerBannerAdListener(), + request: AdManagerAdRequest(), + ); + + await banner.load(); + log.clear(); + await banner.dispose(); + expect(log, [ + isMethodCall('disposeAd', arguments: {'adId': 0}), + ]); + + expect(instanceManager.adFor(0), isNull); + expect(instanceManager.adIdFor(banner), isNull); + }); + + test('calling dispose without awaiting load', () { + final AdManagerBannerAd banner = AdManagerBannerAd( + adUnitId: 'test-ad-unit', + sizes: [AdSize.banner], + listener: AdManagerBannerAdListener(), + request: AdManagerAdRequest(), + ); + + banner.load(); + banner.dispose(); + expect(instanceManager.adFor(0), isNull); + expect(instanceManager.adIdFor(banner), isNull); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/app_open_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/app_open_test.dart new file mode 100644 index 00000000..9b38f01b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/app_open_test.dart @@ -0,0 +1,292 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'test_util.dart'; + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('App Open Tests', () { + final List log = []; + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'loadAppOpenAd': + case 'showAdWithoutView': + case 'disposeAd': + return Future.value(); + default: + assert(false); + return null; + } + }); + }); + + test('load show android', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + AppOpenAd? appOpenAd; + AdRequest request = AdRequest(); + await AppOpenAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: AppOpenAdLoadCallback( + onAdLoaded: (ad) { + appOpenAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + + expect(log, [ + isMethodCall( + 'loadAppOpenAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + AppOpenAd createdAd = instanceManager.adFor(0) as AppOpenAd; + (createdAd).adLoadCallback.onAdLoaded(createdAd); + expect(instanceManager.adFor(0), isNotNull); + expect(appOpenAd, createdAd); + + log.clear(); + + // Show the ad and verify method call. + await appOpenAd!.show(); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + + // Check that full screen events are passed correctly. + Completer impressionCompleter = Completer(); + Completer failedToShowCompleter = Completer(); + Completer showedCompleter = Completer(); + Completer dismissedCompleter = Completer(); + Completer clickedCompleter = Completer(); + + appOpenAd!.fullScreenContentCallback = FullScreenContentCallback( + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdShowedFullScreenContent: (ad) => showedCompleter.complete(ad), + onAdFailedToShowFullScreenContent: (ad, error) => + failedToShowCompleter.complete(ad), + onAdDismissedFullScreenContent: (ad) => dismissedCompleter.complete(ad), + onAdClicked: (ad) => clickedCompleter.complete(ad), + ); + + await TestUtil.sendAdEvent(0, 'onAdImpression', instanceManager); + expect(await impressionCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clickedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'onAdShowedFullScreenContent', + instanceManager, + ); + expect(await showedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'onAdDismissedFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'onFailedToShowFullScreenContent', + instanceManager, + {'error': AdError(1, 'domain', 'message')}, + ); + expect(await failedToShowCompleter.future, appOpenAd); + + // Check paid event callback + Completer> paidEventCompleter = Completer>(); + appOpenAd!.onPaidEvent = (ad, value, precision, currency) { + paidEventCompleter.complete([ad, value, precision, currency]); + }; + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEventCompleter.future; + expect(paidEventCallback[0], appOpenAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('load show ios', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + AppOpenAd? appOpenAd; + AdRequest request = AdRequest(); + await AppOpenAd.load( + adUnitId: 'test-ad-unit', + request: request, + adLoadCallback: AppOpenAdLoadCallback( + onAdLoaded: (ad) { + appOpenAd = ad; + }, + onAdFailedToLoad: (error) {}, + ), + ); + + expect(log, [ + isMethodCall( + 'loadAppOpenAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + AppOpenAd createdAd = instanceManager.adFor(0) as AppOpenAd; + (createdAd).adLoadCallback.onAdLoaded(createdAd); + expect(instanceManager.adFor(0), isNotNull); + expect(appOpenAd, createdAd); + + log.clear(); + + // Show the ad and verify method call. + await appOpenAd!.show(); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + + // Check that full screen events are passed correctly. + Completer impressionCompleter = Completer(); + Completer failedToShowCompleter = Completer(); + Completer showedCompleter = Completer(); + Completer dismissedCompleter = Completer(); + Completer willDismissCompleter = Completer(); + Completer clickedCompleter = Completer(); + + appOpenAd!.fullScreenContentCallback = FullScreenContentCallback( + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdShowedFullScreenContent: (ad) => showedCompleter.complete(ad), + onAdFailedToShowFullScreenContent: (ad, error) => + failedToShowCompleter.complete(ad), + onAdDismissedFullScreenContent: (ad) => dismissedCompleter.complete(ad), + onAdWillDismissFullScreenContent: (ad) => + willDismissCompleter.complete(ad), + onAdClicked: (ad) => clickedCompleter.complete(ad), + ); + + await TestUtil.sendAdEvent(0, 'adDidRecordImpression', instanceManager); + expect(await impressionCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent(0, 'adDidRecordClick', instanceManager); + expect(await clickedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'adWillPresentFullScreenContent', + instanceManager, + ); + expect(await showedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'adDidDismissFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'adWillDismissFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, appOpenAd); + + await TestUtil.sendAdEvent( + 0, + 'didFailToPresentFullScreenContentWithError', + instanceManager, + {'error': AdError(1, 'domain', 'message')}, + ); + expect(await failedToShowCompleter.future, appOpenAd); + + // Check paid event callback + Completer> paidEventCompleter = Completer>(); + appOpenAd!.onPaidEvent = (ad, value, precision, currency) { + paidEventCompleter.complete([ad, value, precision, currency]); + }; + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEventCompleter.future; + expect(paidEventCallback[0], appOpenAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/banner_ad_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/banner_ad_test.dart new file mode 100644 index 00000000..c54b87fb --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/banner_ad_test.dart @@ -0,0 +1,380 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'test_util.dart'; + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('Banner Ad Tests', () { + final List log = []; + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'loadBannerAd': + case 'disposeAd': + return Future.value(); + default: + assert(false); + return null; + } + }); + }); + + test('android loaded events', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + AdRequest request = AdRequest(); + + // Check that listener callbacks are invoked + Completer loaded = Completer(); + Completer> failedToLoad = Completer>(); + Completer opened = Completer(); + Completer clicked = Completer(); + Completer impression = Completer(); + Completer closed = Completer(); + Completer> paidEvent = Completer>(); + + BannerAdListener bannerListener = BannerAdListener( + onAdLoaded: (ad) => loaded.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoad.complete([ad, error]), + onAdImpression: (ad) => impression.complete(ad), + onPaidEvent: (ad, value, precision, currency) => + paidEvent.complete([ad, value, precision, currency]), + onAdClicked: (ad) => clicked.complete(ad), + onAdClosed: (ad) => closed.complete(ad), + onAdOpened: (ad) => opened.complete(ad), + ); + + var bannerAd = BannerAd( + size: AdSize.banner, + adUnitId: 'ad-unit', + listener: bannerListener, + request: request, + ); + await bannerAd.load(); + + expect(log, [ + isMethodCall( + 'loadBannerAd', + arguments: { + 'adId': 0, + 'adUnitId': 'ad-unit', + 'request': request, + 'size': AdSize.banner, + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + BannerAd createdAd = instanceManager.adFor(0) as BannerAd; + expect(instanceManager.adFor(0), isNotNull); + expect(bannerAd, createdAd); + expect(await loaded.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdImpression', instanceManager); + expect(await impression.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clicked.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdOpened', instanceManager); + expect(await opened.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClosed', instanceManager); + expect(await closed.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clicked.future, bannerAd); + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEvent.future; + expect(paidEventCallback[0], bannerAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('onAdFailedToLoad banner', () async { + var testOnAdFailedToLoad = (adId) async { + final Completer> resultsCompleter = + Completer>(); + + final BannerAd banner = BannerAd( + adUnitId: 'test-ad-unit', + size: AdSize.banner, + listener: BannerAdListener( + onAdFailedToLoad: (Ad ad, LoadAdError error) => + resultsCompleter.complete([ad, error]), + ), + request: AdRequest(), + ); + + await banner.load(); + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {'key': 'value'}, + ); + + final MethodCall methodCall = + MethodCall('onAdEvent', { + 'adId': adId, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); + + final List results = await resultsCompleter.future; + expect(results[0], banner); + expect(results[1].code, 1); + expect(results[1].domain, 'domain'); + expect(results[1].message, 'message'); + expect(results[1].responseInfo.responseId, responseInfo.responseId); + expect( + results[1].responseInfo.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect( + results[1].responseInfo.responseExtras, + responseInfo.responseExtras, + ); + List responses = + results[1].responseInfo.adapterResponses; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }; + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await testOnAdFailedToLoad(0); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + await testOnAdFailedToLoad(1); + }); + + test('ios loaded events', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + AdRequest request = AdRequest(); + + // Check that listener callbacks are invoked + Completer loaded = Completer(); + Completer> failedToLoad = Completer>(); + Completer opened = Completer(); + Completer clicked = Completer(); + Completer impression = Completer(); + Completer closed = Completer(); + Completer willDismiss = Completer(); + Completer> paidEvent = Completer>(); + + BannerAdListener bannerListener = BannerAdListener( + onAdLoaded: (ad) => loaded.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoad.complete([ad, error]), + onAdImpression: (ad) => impression.complete(ad), + onPaidEvent: (ad, value, precision, currency) => + paidEvent.complete([ad, value, precision, currency]), + onAdClicked: (ad) => clicked.complete(ad), + onAdClosed: (ad) => closed.complete(ad), + onAdOpened: (ad) => opened.complete(ad), + onAdWillDismissScreen: (ad) => willDismiss.complete(ad), + ); + + var bannerAd = BannerAd( + size: AdSize.banner, + adUnitId: 'ad-unit', + listener: bannerListener, + request: request, + ); + await bannerAd.load(); + + expect(log, [ + isMethodCall( + 'loadBannerAd', + arguments: { + 'adId': 0, + 'adUnitId': 'ad-unit', + 'request': request, + 'size': AdSize.banner, + }, + ), + ]); + + // Simulate load callback + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + + BannerAd createdAd = instanceManager.adFor(0) as BannerAd; + expect(instanceManager.adFor(0), isNotNull); + expect(bannerAd, createdAd); + expect(await loaded.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'onBannerImpression', instanceManager); + expect(await impression.future, bannerAd); + + await TestUtil.sendAdEvent(0, 'adDidRecordClick', instanceManager); + expect(await clicked.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerWillPresentScreen', + instanceManager, + ); + expect(await opened.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerDidDismissScreen', + instanceManager, + ); + expect(await closed.future, bannerAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerWillDismissScreen', + instanceManager, + ); + expect(await willDismiss.future, bannerAd); + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEvent.future; + expect(paidEventCallback[0], bannerAd); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('dispose banner', () async { + final BannerAd banner = BannerAd( + adUnitId: 'test-ad-unit', + size: AdSize.banner, + listener: BannerAdListener(), + request: AdRequest(), + ); + + await banner.load(); + log.clear(); + await banner.dispose(); + expect(log, [ + isMethodCall('disposeAd', arguments: {'adId': 0}), + ]); + + expect(instanceManager.adFor(0), isNull); + expect(instanceManager.adIdFor(banner), isNull); + }); + + test('calling dispose without awaiting load', () { + final BannerAd banner = BannerAd( + adUnitId: 'test-ad-unit', + size: AdSize.banner, + listener: BannerAdListener(), + request: AdRequest(), + ); + + banner.load(); + banner.dispose(); + expect(instanceManager.adFor(0), isNull); + expect(instanceManager.adIdFor(banner), isNull); + }); + + test('isMounted returns correct value', () { + final BannerAd banner = BannerAd( + adUnitId: 'test-ad-unit', + size: AdSize.banner, + listener: BannerAdListener(), + request: AdRequest(), + ); + + expect(instanceManager.adIdFor(banner), isNull); + expect(banner.isMounted, isFalse); + + banner.load(); + final int? adId = instanceManager.adIdFor(banner); + expect(adId, isNotNull); + expect(banner.isMounted, isFalse); + + instanceManager.mountWidgetAdId(adId!); + expect(banner.isMounted, isTrue); + + instanceManager.unmountWidgetAdId(adId); + expect(banner.isMounted, isFalse); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/fluid_ad_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/fluid_ad_test.dart new file mode 100644 index 00000000..c1e54031 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/fluid_ad_test.dart @@ -0,0 +1,268 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'test_util.dart'; + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('Fluid Ad Tests', () { + final List log = []; + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'loadFluidAd': + case 'disposeAd': + return Future.value(); + default: + assert(false); + return null; + } + }); + }); + + test('load android with callbacks', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + + Completer impressionCompleter = Completer(); + Completer loadedCompleter = Completer(); + Completer> failedToLoadCompleter = + Completer>(); + Completer openedCompleter = Completer(); + Completer closedCompleter = Completer(); + Completer willDismissCompleter = Completer(); + Completer> paidEventCompleter = Completer>(); + Completer> appEventCompleter = Completer>(); + Completer> heightChangedCompleter = + Completer>(); + + final FluidAdManagerBannerAd fluidAd = FluidAdManagerBannerAd( + adUnitId: 'testId', + listener: AdManagerBannerAdListener( + onAdLoaded: (ad) => loadedCompleter.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoadCompleter.complete([ad, error]), + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdOpened: (ad) => openedCompleter.complete(ad), + onAdClosed: (ad) => closedCompleter.complete(ad), + onPaidEvent: (ad, value, precision, currencyCode) => + paidEventCompleter.complete([ad, value, precision, currencyCode]), + onAppEvent: (ad, name, data) => + appEventCompleter.complete([ad, name, data]), + onAdWillDismissScreen: (ad) => willDismissCompleter.complete(ad), + ), + onFluidAdHeightChangedListener: (ad, height) => + heightChangedCompleter.complete([ad, height]), + request: AdManagerAdRequest(), + ); + + await fluidAd.load(); + expect(log, [ + isMethodCall( + 'loadFluidAd', + arguments: { + 'adId': 0, + 'adUnitId': 'testId', + 'sizes': [FluidAdSize()], + 'request': AdManagerAdRequest(), + }, + ), + ]); + + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + Ad loadedAd = await loadedCompleter.future; + expect(instanceManager.adFor(0), fluidAd); + expect(loadedAd, loadedAd); + + await TestUtil.sendAdEvent(0, 'onAdImpression', instanceManager); + expect(await impressionCompleter.future, loadedAd); + + await TestUtil.sendAdEvent(0, 'onAdOpened', instanceManager); + expect(await openedCompleter.future, loadedAd); + + await TestUtil.sendAdEvent(0, 'onAdClosed', instanceManager); + expect(await closedCompleter.future, loadedAd); + + const heightChangedArgs = {'height': 25}; + await TestUtil.sendAdEvent( + 0, + 'onFluidAdHeightChanged', + instanceManager, + heightChangedArgs, + ); + expect(await heightChangedCompleter.future, [fluidAd, 25]); + + LoadAdError error = LoadAdError(1, 'domain', 'message', null); + var errorArgs = {'loadAdError': error}; + await TestUtil.sendAdEvent( + 0, + 'onAdFailedToLoad', + instanceManager, + errorArgs, + ); + List adAndError = await failedToLoadCompleter.future; + expect(adAndError[0], loadedAd); + expect(adAndError[1].toString(), error.toString()); + + const appEventArgs = {'name': 'name', 'data': '1234'}; + await TestUtil.sendAdEvent( + 0, + 'onAppEvent', + instanceManager, + appEventArgs, + ); + expect(await appEventCompleter.future, [fluidAd, 'name', '1234']); + + // will dismiss is iOS only event. + var willDismissCompleted = false; + unawaited( + willDismissCompleter.future.whenComplete( + () => willDismissCompleted = true, + ), + ); + await TestUtil.sendAdEvent( + 0, + 'onBannerWillDismissScreen', + instanceManager, + ); + expect(willDismissCompleted, false); + }); + + test('load iOS with callbacks', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + Completer impressionCompleter = Completer(); + Completer loadedCompleter = Completer(); + Completer> failedToLoadCompleter = + Completer>(); + Completer openedCompleter = Completer(); + Completer closedCompleter = Completer(); + Completer willDismissCompleter = Completer(); + Completer> paidEventCompleter = Completer>(); + Completer> appEventCompleter = Completer>(); + Completer> heightChangedCompleter = + Completer>(); + + final FluidAdManagerBannerAd fluidAd = FluidAdManagerBannerAd( + adUnitId: 'testId', + listener: AdManagerBannerAdListener( + onAdLoaded: (ad) => loadedCompleter.complete(ad), + onAdFailedToLoad: (ad, error) => + failedToLoadCompleter.complete([ad, error]), + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdOpened: (ad) => openedCompleter.complete(ad), + onAdClosed: (ad) => closedCompleter.complete(ad), + onPaidEvent: (ad, value, precision, currencyCode) => + paidEventCompleter.complete([ad, value, precision, currencyCode]), + onAppEvent: (ad, name, data) => + appEventCompleter.complete([ad, name, data]), + onAdWillDismissScreen: (ad) => willDismissCompleter.complete(ad), + ), + onFluidAdHeightChangedListener: (ad, height) => + heightChangedCompleter.complete([ad, height]), + request: AdManagerAdRequest(), + ); + + await fluidAd.load(); + expect(log, [ + isMethodCall( + 'loadFluidAd', + arguments: { + 'adId': 0, + 'adUnitId': 'testId', + 'sizes': [FluidAdSize()], + 'request': AdManagerAdRequest(), + }, + ), + ]); + + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + Ad loadedAd = await loadedCompleter.future; + expect(instanceManager.adFor(0), fluidAd); + expect(loadedAd, loadedAd); + + await TestUtil.sendAdEvent(0, 'onBannerImpression', instanceManager); + expect(await impressionCompleter.future, loadedAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerWillPresentScreen', + instanceManager, + ); + expect(await openedCompleter.future, loadedAd); + + await TestUtil.sendAdEvent( + 0, + 'onBannerDidDismissScreen', + instanceManager, + ); + expect(await closedCompleter.future, loadedAd); + + const heightChangedArgs = {'height': 25}; + await TestUtil.sendAdEvent( + 0, + 'onFluidAdHeightChanged', + instanceManager, + heightChangedArgs, + ); + expect(await heightChangedCompleter.future, [fluidAd, 25]); + + LoadAdError error = LoadAdError(1, 'domain', 'message', null); + var errorArgs = {'loadAdError': error}; + await TestUtil.sendAdEvent( + 0, + 'onAdFailedToLoad', + instanceManager, + errorArgs, + ); + List adAndError = await failedToLoadCompleter.future; + expect(adAndError[0], loadedAd); + expect(adAndError[1].toString(), error.toString()); + + const appEventArgs = {'name': 'name', 'data': '1234'}; + await TestUtil.sendAdEvent( + 0, + 'onAppEvent', + instanceManager, + appEventArgs, + ); + expect(await appEventCompleter.future, [fluidAd, 'name', '1234']); + + // will dismiss is iOS only event. + await TestUtil.sendAdEvent( + 0, + 'onBannerWillDismissScreen', + instanceManager, + ); + expect(await willDismissCompleter.future, fluidAd); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.dart new file mode 100644 index 00000000..ab7eddad --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.dart @@ -0,0 +1,638 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_inspector_containers.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/src/webview_controller_util.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'mobile_ads_test.mocks.dart'; + +@GenerateMocks([WebViewController, AdInstanceManager, WebViewControllerUtil]) +void main() { + group('Mobile Ads', () { + TestWidgetsFlutterBinding.ensureInitialized(); + + final List log = []; + final AdMessageCodec codec = AdMessageCodec(); + + setUpAll(() { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + }); + + setUp(() async { + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + log.clear(); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler( + MethodChannel( + 'plugins.flutter.io/google_mobile_ads', + StandardMethodCodec(AdMessageCodec()), + ), + (MethodCall methodCall) async { + log.add(methodCall); + switch (methodCall.method) { + case 'MobileAds#initialize': + return InitializationStatus({ + 'aName': AdapterStatus( + AdapterInitializationState.notReady, + 'desc', + 0, + ), + }); + case '_init': + case 'MobileAds#setSameAppKeyEnabled': + case 'MobileAds#setAppMuted': + case 'MobileAds#setAppVolume': + case 'MobileAds#disableSDKCrashReporting': + case 'MobileAds#disableMediationInitialization': + return null; + case 'MobileAds#getVersionString': + return Future.value('Test-SDK-Version'); + case 'MobileAds#updateRequestConfiguration': + return null; + case 'MobileAds#registerWebView': + return null; + case 'MobileAds#getRequestConfiguration': + return RequestConfiguration( + maxAdContentRating: MaxAdContentRating.ma, + tagForChildDirectedTreatment: + TagForChildDirectedTreatment.yes, + tagForUnderAgeOfConsent: TagForUnderAgeOfConsent.no, + testDeviceIds: ['test-device-id'], + ); + case 'AdSize#getAnchoredAdaptiveBannerAdSize': + return null; + default: + assert(false); + return null; + } + }, + ); + }); + + test('encode/decode $AdapterInitializationState', () { + final ByteData byteData = codec.encodeMessage( + AdapterInitializationState.ready, + )!; + + final AdapterInitializationState result = codec.decodeMessage(byteData); + expect(result, AdapterInitializationState.ready); + }); + + test('encode/decode $AdapterStatus', () { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final ByteData byteData = codec.encodeMessage( + AdapterStatus(AdapterInitializationState.notReady, 'describe', 23), + )!; + + AdapterStatus result = codec.decodeMessage(byteData); + expect(result.state, AdapterInitializationState.notReady); + expect(result.description, 'describe'); + expect(result.latency, 0.023); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + result = codec.decodeMessage(byteData); + expect(result.state, AdapterInitializationState.notReady); + expect(result.description, 'describe'); + expect(result.latency, 23); + }); + + test('handle int values for AdapterStatus', () { + final WriteBuffer buffer = WriteBuffer(); + codec.writeValue(buffer, AdapterInitializationState.ready); + codec.writeValue(buffer, 'aDescription'); + codec.writeValue(buffer, 23); + + expect( + () => codec.readValueOfType( + 136 /* AdMessageCodec._valueAdapterStatus */, + ReadBuffer(buffer.done()), + ), + returnsNormally, + ); + }); + + test('encode/decode $InitializationStatus', () { + final ByteData byteData = codec.encodeMessage( + InitializationStatus({ + 'adMediation': AdapterStatus( + AdapterInitializationState.ready, + 'aDescription', + 0, + ), + }), + )!; + + final InitializationStatus result = codec.decodeMessage(byteData); + expect(result.adapterStatuses, hasLength(1)); + final AdapterStatus status = result.adapterStatuses['adMediation']!; + expect(status.state, AdapterInitializationState.ready); + expect(status.description, 'aDescription'); + expect(status.latency, 0); + }); + + test('$MobileAds.initialize', () async { + final InitializationStatus result = await MobileAds.instance.initialize(); + + expect(log, [ + isMethodCall('_init', arguments: null), + isMethodCall('MobileAds#initialize', arguments: null), + ]); + + expect(result.adapterStatuses, hasLength(1)); + final AdapterStatus status = result.adapterStatuses['aName']!; + expect(status.state, AdapterInitializationState.notReady); + expect(status.description, 'desc'); + expect(status.latency, 0); + }); + + test('$MobileAds.registerWebView', () async { + instanceManager = MockAdInstanceManager(); + final webView = MockWebViewController(); + when( + instanceManager.registerWebView(webView), + ).thenAnswer((realInvocation) => Future.value()); + await MobileAds.instance.registerWebView(webView); + + verify(instanceManager.registerWebView(webView)); + }); + + test('$MobileAds.registerWebView android', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final mockWebViewControllerUtil = MockWebViewControllerUtil(); + when(mockWebViewControllerUtil.webViewIdentifier(any)).thenReturn(1); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + webViewControllerUtil: mockWebViewControllerUtil, + ); + final webView = MockWebViewController(); + await MobileAds.instance.registerWebView(webView); + + expect(log, [ + isMethodCall('MobileAds#registerWebView', arguments: {'webViewId': 1}), + ]); + }); + + test('$MobileAds.registerWebView iOS', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + final mockWebViewControllerUtil = MockWebViewControllerUtil(); + when(mockWebViewControllerUtil.webViewIdentifier(any)).thenReturn(1); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + webViewControllerUtil: mockWebViewControllerUtil, + ); + final webView = MockWebViewController(); + await MobileAds.instance.registerWebView(webView); + + expect(log, [ + isMethodCall('MobileAds#registerWebView', arguments: {'webViewId': 1}), + ]); + }); + + test('$MobileAds.openAdInspector success', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler( + MethodChannel( + 'plugins.flutter.io/google_mobile_ads', + StandardMethodCodec(AdMessageCodec()), + ), + (MethodCall methodCall) async { + return null; + }, + ); + + Completer completer = Completer(); + MobileAds.instance.openAdInspector((error) { + completer.complete(error); + }); + + AdInspectorError? error = await completer.future; + expect(error, null); + }); + + test('$MobileAds.openAdInspector error', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler( + MethodChannel( + 'plugins.flutter.io/google_mobile_ads', + StandardMethodCodec(AdMessageCodec()), + ), + (MethodCall methodCall) async { + throw PlatformException( + code: '1', + details: 'details', + message: 'message', + ); + }, + ); + + Completer completer = Completer(); + MobileAds.instance.openAdInspector((error) { + completer.complete(error); + }); + + AdInspectorError? error = await completer.future; + expect(error!.message, 'message'); + expect(error.code, '1'); + expect(error.domain, 'details'); + }); + + test('$MobileAds.setSameAppKeyEnabled', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + await MobileAds.instance.setSameAppKeyEnabled(true); + + expect(log, [ + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': true}, + ), + ]); + + await MobileAds.instance.setSameAppKeyEnabled(false); + + expect(log, [ + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': true}, + ), + isMethodCall( + 'MobileAds#setSameAppKeyEnabled', + arguments: {'isEnabled': false}, + ), + ]); + }); + + test('encode/decode empty native ad options', () { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + ByteData byteData = codec.encodeMessage(NativeAdOptions())!; + + NativeAdOptions result = codec.decodeMessage(byteData); + expect(result.mediaAspectRatio, null); + expect(result.adChoicesPlacement, null); + expect(result.requestCustomMuteThisAd, null); + expect(result.shouldRequestMultipleImages, null); + expect(result.shouldReturnUrlsForImageAssets, null); + expect(result.videoOptions, null); + + byteData = codec.encodeMessage( + NativeAdOptions(videoOptions: VideoOptions()), + )!; + result = codec.decodeMessage(byteData); + expect(result.mediaAspectRatio, null); + expect(result.adChoicesPlacement, null); + expect(result.requestCustomMuteThisAd, null); + expect(result.shouldRequestMultipleImages, null); + expect(result.shouldReturnUrlsForImageAssets, null); + expect(result.videoOptions!.clickToExpandRequested, null); + expect(result.videoOptions!.customControlsRequested, null); + expect(result.videoOptions!.startMuted, null); + }); + + test('encode/decode native ad options', () { + NativeAdOptions nativeAdOptions = NativeAdOptions( + adChoicesPlacement: AdChoicesPlacement.topRightCorner, + mediaAspectRatio: MediaAspectRatio.unknown, + videoOptions: VideoOptions( + clickToExpandRequested: false, + customControlsRequested: false, + startMuted: false, + ), + requestCustomMuteThisAd: false, + shouldRequestMultipleImages: false, + shouldReturnUrlsForImageAssets: false, + ); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + ByteData byteData = codec.encodeMessage(nativeAdOptions)!; + + NativeAdOptions result = codec.decodeMessage(byteData); + expect(result.mediaAspectRatio, MediaAspectRatio.unknown); + expect(result.adChoicesPlacement, AdChoicesPlacement.topRightCorner); + expect(result.requestCustomMuteThisAd, false); + expect(result.shouldRequestMultipleImages, false); + expect(result.shouldReturnUrlsForImageAssets, false); + expect(result.videoOptions!.startMuted, false); + expect(result.videoOptions!.customControlsRequested, false); + expect(result.videoOptions!.clickToExpandRequested, false); + + nativeAdOptions = NativeAdOptions( + adChoicesPlacement: AdChoicesPlacement.bottomLeftCorner, + mediaAspectRatio: MediaAspectRatio.landscape, + videoOptions: VideoOptions( + clickToExpandRequested: true, + customControlsRequested: true, + startMuted: true, + ), + requestCustomMuteThisAd: true, + shouldRequestMultipleImages: true, + shouldReturnUrlsForImageAssets: true, + ); + + byteData = codec.encodeMessage(nativeAdOptions)!; + result = codec.decodeMessage(byteData); + + expect(result.mediaAspectRatio, MediaAspectRatio.landscape); + expect(result.adChoicesPlacement, AdChoicesPlacement.bottomLeftCorner); + expect(result.requestCustomMuteThisAd, true); + expect(result.shouldRequestMultipleImages, true); + expect(result.shouldReturnUrlsForImageAssets, true); + expect(result.videoOptions!.startMuted, true); + expect(result.videoOptions!.customControlsRequested, true); + expect(result.videoOptions!.clickToExpandRequested, true); + }); + + test('$MobileAds.setAppMuted', () async { + await MobileAds.instance.setAppMuted(true); + + expect(log, [ + isMethodCall('MobileAds#setAppMuted', arguments: {'muted': true}), + ]); + + await MobileAds.instance.setAppMuted(false); + + expect(log, [ + isMethodCall('MobileAds#setAppMuted', arguments: {'muted': true}), + isMethodCall('MobileAds#setAppMuted', arguments: {'muted': false}), + ]); + }); + + test('$MobileAds.setAppVolume', () async { + await MobileAds.instance.setAppVolume(1.0); + + expect(log, [ + isMethodCall('MobileAds#setAppVolume', arguments: {'volume': 1.0}), + ]); + }); + + test('$MobileAds.disableSDKCrashReporting', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + await MobileAds.instance.disableSDKCrashReporting(); + + expect(log, [ + isMethodCall('MobileAds#disableSDKCrashReporting', arguments: null), + ]); + }); + + test('$MobileAds.disableMediationInitialization', () async { + await MobileAds.instance.disableMediationInitialization(); + + expect(log, [ + isMethodCall( + 'MobileAds#disableMediationInitialization', + arguments: null, + ), + ]); + }); + + test('$MobileAds.getVersionString', () async { + await MobileAds.instance.getVersionString(); + + expect(log, [ + isMethodCall('MobileAds#getVersionString', arguments: null), + ]); + }); + + test('$AdSize.getAnchoredAdaptiveBannerAdSize', () async { + await AdSize.getAnchoredAdaptiveBannerAdSize(Orientation.portrait, 23); + + expect(log, [ + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'orientation': 'portrait', 'width': 23}, + ), + ]); + + await AdSize.getAnchoredAdaptiveBannerAdSize(Orientation.landscape, 34); + + expect(log, [ + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'orientation': 'portrait', 'width': 23}, + ), + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'orientation': 'landscape', 'width': 34}, + ), + ]); + + await AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(45); + + expect(log, [ + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'orientation': 'portrait', 'width': 23}, + ), + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'orientation': 'landscape', 'width': 34}, + ), + isMethodCall( + 'AdSize#getAnchoredAdaptiveBannerAdSize', + arguments: {'width': 45}, + ), + ]); + }); + + test('encode/decode $MobileAds.getRequestConfiguration', () async { + RequestConfiguration requestConfig = await MobileAds.instance + .getRequestConfiguration(); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + ByteData byteData = codec.encodeMessage(requestConfig)!; + RequestConfiguration result = codec.decodeMessage(byteData); + + expect(result.maxAdContentRating, MaxAdContentRating.ma); + expect( + result.tagForChildDirectedTreatment, + TagForChildDirectedTreatment.yes, + ); + expect(result.tagForUnderAgeOfConsent, TagForUnderAgeOfConsent.no); + expect(result.testDeviceIds, ['test-device-id']); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + byteData = codec.encodeMessage(requestConfig)!; + result = codec.decodeMessage(byteData); + + expect(result.maxAdContentRating, MaxAdContentRating.ma); + expect( + result.tagForChildDirectedTreatment, + TagForChildDirectedTreatment.yes, + ); + expect(result.tagForUnderAgeOfConsent, TagForUnderAgeOfConsent.no); + expect(result.testDeviceIds, ['test-device-id']); + }); + + test('$MobileAds.RequestConfiguration', () async { + RequestConfiguration requestConfiguration = RequestConfiguration( + maxAdContentRating: MaxAdContentRating.ma, + tagForChildDirectedTreatment: TagForChildDirectedTreatment.yes, + tagForUnderAgeOfConsent: TagForUnderAgeOfConsent.no, + testDeviceIds: ['test-device-id'], + ); + + await MobileAds.instance.updateRequestConfiguration(requestConfiguration); + + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + RequestConfiguration result = await MobileAds.instance + .getRequestConfiguration(); + expect(result.maxAdContentRating, MaxAdContentRating.ma); + expect( + result.tagForChildDirectedTreatment, + TagForChildDirectedTreatment.yes, + ); + expect(result.tagForUnderAgeOfConsent, TagForUnderAgeOfConsent.no); + expect(result.testDeviceIds, ['test-device-id']); + expect(log, [ + isMethodCall( + 'MobileAds#updateRequestConfiguration', + arguments: { + 'maxAdContentRating': MaxAdContentRating.ma, + 'tagForChildDirectedTreatment': TagForChildDirectedTreatment.yes, + 'testDeviceIds': ['test-device-id'], + 'tagForUnderAgeOfConsent': TagForUnderAgeOfConsent.no, + }, + ), + isMethodCall('MobileAds#getRequestConfiguration', arguments: null), + ]); + + debugDefaultTargetPlatformOverride = TargetPlatform.android; + result = await MobileAds.instance.getRequestConfiguration(); + expect(result.maxAdContentRating, MaxAdContentRating.ma); + expect( + result.tagForChildDirectedTreatment, + TagForChildDirectedTreatment.yes, + ); + expect(result.tagForUnderAgeOfConsent, TagForUnderAgeOfConsent.no); + expect(result.testDeviceIds, ['test-device-id']); + expect(log, [ + isMethodCall( + 'MobileAds#updateRequestConfiguration', + arguments: { + 'maxAdContentRating': MaxAdContentRating.ma, + 'tagForChildDirectedTreatment': TagForChildDirectedTreatment.yes, + 'testDeviceIds': ['test-device-id'], + 'tagForUnderAgeOfConsent': TagForUnderAgeOfConsent.no, + }, + ), + isMethodCall('MobileAds#getRequestConfiguration', arguments: null), + isMethodCall('MobileAds#getRequestConfiguration', arguments: null), + ]); + }); + + test('encode/decode native template font style', () { + NativeTemplateFontStyle.values.forEach((fontStyle) { + final byteData = codec.encodeMessage(fontStyle)!; + final result = codec.decodeMessage(byteData); + expect(result, fontStyle); + }); + }); + + test('encode/decode native template type', () { + TemplateType.values.forEach((templateType) { + final byteData = codec.encodeMessage(templateType)!; + final result = codec.decodeMessage(byteData); + expect(result, templateType); + }); + }); + + test('encode/decode empty native text style', () { + final textStyle = NativeTemplateTextStyle(); + final byteData = codec.encodeMessage(textStyle); + final result = codec.decodeMessage(byteData); + expect(result, textStyle); + }); + + test('encode/decode non-empty native text style', () { + final textStyle = NativeTemplateTextStyle( + textColor: Colors.red.shade900, + backgroundColor: Colors.blue.withAlpha(50), + style: NativeTemplateFontStyle.normal, + size: 20, + ); + final byteData = codec.encodeMessage(textStyle); + final result = codec.decodeMessage(byteData); + expect(result, textStyle); + }); + + test('encode/decode empty native template style', () { + final templateStyle = NativeTemplateStyle( + templateType: TemplateType.medium, + ); + final byteData = codec.encodeMessage(templateStyle); + final result = codec.decodeMessage(byteData); + expect(result, templateStyle); + }); + + test('encode/decode non-empty native template style, ios', () { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + final templateStyle = NativeTemplateStyle( + templateType: TemplateType.medium, + callToActionTextStyle: NativeTemplateTextStyle(), + primaryTextStyle: NativeTemplateTextStyle( + textColor: Colors.blue.shade900, + ), + secondaryTextStyle: NativeTemplateTextStyle( + backgroundColor: Colors.green.shade900, + style: NativeTemplateFontStyle.italic, + ), + tertiaryTextStyle: NativeTemplateTextStyle(size: 15), + mainBackgroundColor: Colors.cyan.shade900, + cornerRadius: 12, + ); + final byteData = codec.encodeMessage(templateStyle); + final result = codec.decodeMessage(byteData); + expect(result, templateStyle); + }); + + test('encode/decode non-empty native template style, android', () { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final templateStyle = NativeTemplateStyle( + templateType: TemplateType.medium, + callToActionTextStyle: NativeTemplateTextStyle(), + primaryTextStyle: NativeTemplateTextStyle( + textColor: Colors.blue.shade900, + ), + secondaryTextStyle: NativeTemplateTextStyle( + backgroundColor: Colors.green.shade900, + style: NativeTemplateFontStyle.italic, + ), + tertiaryTextStyle: NativeTemplateTextStyle(size: 15), + mainBackgroundColor: Color.fromARGB(1, 2, 3, 4), + cornerRadius: 12, + ); + final byteData = codec.encodeMessage(templateStyle); + final NativeTemplateStyle result = codec.decodeMessage(byteData); + // cornerRadius is dropped on android + expect(result.cornerRadius, null); + expect(result.templateType, templateStyle.templateType); + expect(result.callToActionTextStyle, templateStyle.callToActionTextStyle); + expect(result.primaryTextStyle, templateStyle.primaryTextStyle); + expect(result.secondaryTextStyle, templateStyle.secondaryTextStyle); + expect(result.tertiaryTextStyle, templateStyle.tertiaryTextStyle); + expect(result.mainBackgroundColor, templateStyle.mainBackgroundColor); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.mocks.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.mocks.dart new file mode 100644 index 00000000..95d6bd0b --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/mobile_ads_test.mocks.dart @@ -0,0 +1,754 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in google_mobile_ads/test/mobile_ads_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i9; +import 'dart:typed_data' as _i10; +import 'dart:ui' as _i3; + +import 'package:flutter/services.dart' as _i4; +import 'package:google_mobile_ads/src/ad_containers.dart' as _i13; +import 'package:google_mobile_ads/src/ad_inspector_containers.dart' as _i15; +import 'package:google_mobile_ads/src/ad_instance_manager.dart' as _i12; +import 'package:google_mobile_ads/src/mobile_ads.dart' as _i6; +import 'package:google_mobile_ads/src/request_configuration.dart' as _i7; +import 'package:google_mobile_ads/src/webview_controller_util.dart' as _i5; +import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i14; +import 'package:webview_flutter/src/navigation_delegate.dart' as _i11; +import 'package:webview_flutter/webview_flutter.dart' as _i8; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart' + as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePlatformWebViewController_0 extends _i1.SmartFake + implements _i2.PlatformWebViewController { + _FakePlatformWebViewController_0(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeObject_1 extends _i1.SmartFake implements Object { + _FakeObject_1(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeOffset_2 extends _i1.SmartFake implements _i3.Offset { + _FakeOffset_2(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeMethodChannel_3 extends _i1.SmartFake implements _i4.MethodChannel { + _FakeMethodChannel_3(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeWebViewControllerUtil_4 extends _i1.SmartFake + implements _i5.WebViewControllerUtil { + _FakeWebViewControllerUtil_4(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeInitializationStatus_5 extends _i1.SmartFake + implements _i6.InitializationStatus { + _FakeInitializationStatus_5(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeRequestConfiguration_6 extends _i1.SmartFake + implements _i7.RequestConfiguration { + _FakeRequestConfiguration_6(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +/// A class which mocks [WebViewController]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWebViewController extends _i1.Mock implements _i8.WebViewController { + MockWebViewController() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.PlatformWebViewController get platform => + (super.noSuchMethod( + Invocation.getter(#platform), + returnValue: _FakePlatformWebViewController_0( + this, + Invocation.getter(#platform), + ), + ) + as _i2.PlatformWebViewController); + + @override + _i9.Future loadFile(String? absoluteFilePath) => + (super.noSuchMethod( + Invocation.method(#loadFile, [absoluteFilePath]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadFlutterAsset(String? key) => + (super.noSuchMethod( + Invocation.method(#loadFlutterAsset, [key]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadHtmlString(String? html, {String? baseUrl}) => + (super.noSuchMethod( + Invocation.method(#loadHtmlString, [html], {#baseUrl: baseUrl}), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadRequest( + Uri? uri, { + _i2.LoadRequestMethod? method = _i2.LoadRequestMethod.get, + Map? headers = const {}, + _i10.Uint8List? body, + }) => + (super.noSuchMethod( + Invocation.method( + #loadRequest, + [uri], + {#method: method, #headers: headers, #body: body}, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future currentUrl() => + (super.noSuchMethod( + Invocation.method(#currentUrl, []), + returnValue: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future canGoBack() => + (super.noSuchMethod( + Invocation.method(#canGoBack, []), + returnValue: _i9.Future.value(false), + ) + as _i9.Future); + + @override + _i9.Future canGoForward() => + (super.noSuchMethod( + Invocation.method(#canGoForward, []), + returnValue: _i9.Future.value(false), + ) + as _i9.Future); + + @override + _i9.Future goBack() => + (super.noSuchMethod( + Invocation.method(#goBack, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future goForward() => + (super.noSuchMethod( + Invocation.method(#goForward, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future reload() => + (super.noSuchMethod( + Invocation.method(#reload, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setNavigationDelegate(_i11.NavigationDelegate? delegate) => + (super.noSuchMethod( + Invocation.method(#setNavigationDelegate, [delegate]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future clearCache() => + (super.noSuchMethod( + Invocation.method(#clearCache, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future clearLocalStorage() => + (super.noSuchMethod( + Invocation.method(#clearLocalStorage, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future runJavaScript(String? javaScript) => + (super.noSuchMethod( + Invocation.method(#runJavaScript, [javaScript]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future runJavaScriptReturningResult(String? javaScript) => + (super.noSuchMethod( + Invocation.method(#runJavaScriptReturningResult, [javaScript]), + returnValue: _i9.Future.value( + _FakeObject_1( + this, + Invocation.method(#runJavaScriptReturningResult, [javaScript]), + ), + ), + ) + as _i9.Future); + + @override + _i9.Future addJavaScriptChannel( + String? name, { + required void Function(_i2.JavaScriptMessage)? onMessageReceived, + }) => + (super.noSuchMethod( + Invocation.method( + #addJavaScriptChannel, + [name], + {#onMessageReceived: onMessageReceived}, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future removeJavaScriptChannel(String? javaScriptChannelName) => + (super.noSuchMethod( + Invocation.method(#removeJavaScriptChannel, [ + javaScriptChannelName, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future getTitle() => + (super.noSuchMethod( + Invocation.method(#getTitle, []), + returnValue: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future scrollTo(int? x, int? y) => + (super.noSuchMethod( + Invocation.method(#scrollTo, [x, y]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future scrollBy(int? x, int? y) => + (super.noSuchMethod( + Invocation.method(#scrollBy, [x, y]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future<_i3.Offset> getScrollPosition() => + (super.noSuchMethod( + Invocation.method(#getScrollPosition, []), + returnValue: _i9.Future<_i3.Offset>.value( + _FakeOffset_2(this, Invocation.method(#getScrollPosition, [])), + ), + ) + as _i9.Future<_i3.Offset>); + + @override + _i9.Future enableZoom(bool? enabled) => + (super.noSuchMethod( + Invocation.method(#enableZoom, [enabled]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setBackgroundColor(_i3.Color? color) => + (super.noSuchMethod( + Invocation.method(#setBackgroundColor, [color]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setJavaScriptMode(_i2.JavaScriptMode? javaScriptMode) => + (super.noSuchMethod( + Invocation.method(#setJavaScriptMode, [javaScriptMode]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setUserAgent(String? userAgent) => + (super.noSuchMethod( + Invocation.method(#setUserAgent, [userAgent]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setOnConsoleMessage( + void Function(_i2.JavaScriptConsoleMessage)? onConsoleMessage, + ) => + (super.noSuchMethod( + Invocation.method(#setOnConsoleMessage, [onConsoleMessage]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setOnJavaScriptAlertDialog( + _i9.Future Function(_i2.JavaScriptAlertDialogRequest)? + onJavaScriptAlertDialog, + ) => + (super.noSuchMethod( + Invocation.method(#setOnJavaScriptAlertDialog, [ + onJavaScriptAlertDialog, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setOnJavaScriptConfirmDialog( + _i9.Future Function(_i2.JavaScriptConfirmDialogRequest)? + onJavaScriptConfirmDialog, + ) => + (super.noSuchMethod( + Invocation.method(#setOnJavaScriptConfirmDialog, [ + onJavaScriptConfirmDialog, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setOnJavaScriptTextInputDialog( + _i9.Future Function(_i2.JavaScriptTextInputDialogRequest)? + onJavaScriptTextInputDialog, + ) => + (super.noSuchMethod( + Invocation.method(#setOnJavaScriptTextInputDialog, [ + onJavaScriptTextInputDialog, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future getUserAgent() => + (super.noSuchMethod( + Invocation.method(#getUserAgent, []), + returnValue: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setOnScrollPositionChange( + void Function(_i2.ScrollPositionChange)? onScrollPositionChange, + ) => + (super.noSuchMethod( + Invocation.method(#setOnScrollPositionChange, [ + onScrollPositionChange, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); +} + +/// A class which mocks [AdInstanceManager]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAdInstanceManager extends _i1.Mock implements _i12.AdInstanceManager { + MockAdInstanceManager() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.MethodChannel get channel => + (super.noSuchMethod( + Invocation.getter(#channel), + returnValue: _FakeMethodChannel_3( + this, + Invocation.getter(#channel), + ), + ) + as _i4.MethodChannel); + + @override + _i5.WebViewControllerUtil get webViewControllerUtil => + (super.noSuchMethod( + Invocation.getter(#webViewControllerUtil), + returnValue: _FakeWebViewControllerUtil_4( + this, + Invocation.getter(#webViewControllerUtil), + ), + ) + as _i5.WebViewControllerUtil); + + @override + _i9.Future<_i6.InitializationStatus> initialize() => + (super.noSuchMethod( + Invocation.method(#initialize, []), + returnValue: _i9.Future<_i6.InitializationStatus>.value( + _FakeInitializationStatus_5( + this, + Invocation.method(#initialize, []), + ), + ), + ) + as _i9.Future<_i6.InitializationStatus>); + + @override + _i9.Future<_i13.AdSize?> getAdSize(_i13.Ad? ad) => + (super.noSuchMethod( + Invocation.method(#getAdSize, [ad]), + returnValue: _i9.Future<_i13.AdSize?>.value(), + ) + as _i9.Future<_i13.AdSize?>); + + @override + _i13.Ad? adFor(int? adId) => + (super.noSuchMethod(Invocation.method(#adFor, [adId])) as _i13.Ad?); + + @override + int? adIdFor(_i13.Ad? ad) => + (super.noSuchMethod(Invocation.method(#adIdFor, [ad])) as int?); + + @override + bool isWidgetAdIdMounted(int? adId) => + (super.noSuchMethod( + Invocation.method(#isWidgetAdIdMounted, [adId]), + returnValue: false, + ) + as bool); + + @override + void mountWidgetAdId(int? adId) => super.noSuchMethod( + Invocation.method(#mountWidgetAdId, [adId]), + returnValueForMissingStub: null, + ); + + @override + void unmountWidgetAdId(int? adId) => super.noSuchMethod( + Invocation.method(#unmountWidgetAdId, [adId]), + returnValueForMissingStub: null, + ); + + @override + _i9.Future loadBannerAd(_i13.BannerAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadBannerAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadInterstitialAd(_i13.InterstitialAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadInterstitialAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadNativeAd(_i13.NativeAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadNativeAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadRewardedAd(_i13.RewardedAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadRewardedAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadRewardedInterstitialAd( + _i13.RewardedInterstitialAd? ad, + ) => + (super.noSuchMethod( + Invocation.method(#loadRewardedInterstitialAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadAppOpenAd(_i13.AppOpenAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadAppOpenAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadAdManagerBannerAd(_i13.AdManagerBannerAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadAdManagerBannerAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadFluidAd(_i13.FluidAdManagerBannerAd? ad) => + (super.noSuchMethod( + Invocation.method(#loadFluidAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future loadAdManagerInterstitialAd( + _i13.AdManagerInterstitialAd? ad, + ) => + (super.noSuchMethod( + Invocation.method(#loadAdManagerInterstitialAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future disposeAd(_i13.Ad? ad) => + (super.noSuchMethod( + Invocation.method(#disposeAd, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future showAdWithoutView(_i13.AdWithoutView? ad) => + (super.noSuchMethod( + Invocation.method(#showAdWithoutView, [ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future<_i7.RequestConfiguration> getRequestConfiguration() => + (super.noSuchMethod( + Invocation.method(#getRequestConfiguration, []), + returnValue: _i9.Future<_i7.RequestConfiguration>.value( + _FakeRequestConfiguration_6( + this, + Invocation.method(#getRequestConfiguration, []), + ), + ), + ) + as _i9.Future<_i7.RequestConfiguration>); + + @override + _i9.Future updateRequestConfiguration( + _i7.RequestConfiguration? requestConfiguration, + ) => + (super.noSuchMethod( + Invocation.method(#updateRequestConfiguration, [ + requestConfiguration, + ]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setSameAppKeyEnabled(bool? isEnabled) => + (super.noSuchMethod( + Invocation.method(#setSameAppKeyEnabled, [isEnabled]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setAppMuted(bool? muted) => + (super.noSuchMethod( + Invocation.method(#setAppMuted, [muted]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setAppVolume(double? volume) => + (super.noSuchMethod( + Invocation.method(#setAppVolume, [volume]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future setImmersiveMode( + _i13.AdWithoutView? ad, + bool? immersiveModeEnabled, + ) => + (super.noSuchMethod( + Invocation.method(#setImmersiveMode, [ad, immersiveModeEnabled]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future disableSDKCrashReporting() => + (super.noSuchMethod( + Invocation.method(#disableSDKCrashReporting, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future disableMediationInitialization() => + (super.noSuchMethod( + Invocation.method(#disableMediationInitialization, []), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future getVersionString() => + (super.noSuchMethod( + Invocation.method(#getVersionString, []), + returnValue: _i9.Future.value( + _i14.dummyValue( + this, + Invocation.method(#getVersionString, []), + ), + ), + ) + as _i9.Future); + + @override + _i9.Future setServerSideVerificationOptions( + _i13.ServerSideVerificationOptions? options, + _i13.Ad? ad, + ) => + (super.noSuchMethod( + Invocation.method(#setServerSideVerificationOptions, [options, ad]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future openDebugMenu(String? adUnitId) => + (super.noSuchMethod( + Invocation.method(#openDebugMenu, [adUnitId]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + _i9.Future registerWebView(_i8.WebViewController? controller) => + (super.noSuchMethod( + Invocation.method(#registerWebView, [controller]), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) + as _i9.Future); + + @override + int getWebViewId(_i8.WebViewController? controller) => + (super.noSuchMethod( + Invocation.method(#getWebViewId, [controller]), + returnValue: 0, + ) + as int); + + @override + void openAdInspector(_i15.OnAdInspectorClosedListener? listener) => + super.noSuchMethod( + Invocation.method(#openAdInspector, [listener]), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [WebViewControllerUtil]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWebViewControllerUtil extends _i1.Mock + implements _i5.WebViewControllerUtil { + MockWebViewControllerUtil() { + _i1.throwOnMissingStub(this); + } + + @override + int webViewIdentifier(_i8.WebViewController? controller) => + (super.noSuchMethod( + Invocation.method(#webViewIdentifier, [controller]), + returnValue: 0, + ) + as int); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/rewarded_interstitial_ad_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/rewarded_interstitial_ad_test.dart new file mode 100644 index 00000000..96bf75db --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/rewarded_interstitial_ad_test.dart @@ -0,0 +1,519 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; +import 'test_util.dart'; + +// ignore_for_file: deprecated_member_use_from_same_package +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('Rewarded Interstitial Ad Tests', () { + final List log = []; + + setUp(() async { + log.clear(); + instanceManager = AdInstanceManager( + 'plugins.flutter.io/google_mobile_ads', + ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(instanceManager.channel, ( + MethodCall methodCall, + ) async { + log.add(methodCall); + switch (methodCall.method) { + case 'loadRewardedInterstitialAd': + case 'showAdWithoutView': + case 'disposeAd': + case 'setServerSideVerificationOptions': + return Future.value(); + default: + assert(false); + return null; + } + }); + }); + + test('load show rewarded interstitial android', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + RewardedInterstitialAd? rewardedInterstitial; + AdRequest request = AdRequest(); + await RewardedInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + rewardedInterstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedInterstitialAd createdAd = + instanceManager.adFor(0) as RewardedInterstitialAd; + (createdAd).rewardedInterstitialAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + expect(rewardedInterstitial, createdAd); + + log.clear(); + await rewardedInterstitial!.show( + onUserEarnedReward: (ad, reward) => null, + ); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + + // Check that full screen events are passed correctly. + Completer impressionCompleter = + Completer(); + Completer failedToShowCompleter = + Completer(); + Completer showedCompleter = + Completer(); + Completer dismissedCompleter = + Completer(); + Completer clickedCompleter = + Completer(); + + rewardedInterstitial!.fullScreenContentCallback = + FullScreenContentCallback( + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdShowedFullScreenContent: (ad) => showedCompleter.complete(ad), + onAdFailedToShowFullScreenContent: (ad, error) => + failedToShowCompleter.complete(ad), + onAdDismissedFullScreenContent: (ad) => + dismissedCompleter.complete(ad), + onAdClicked: (ad) => clickedCompleter.complete(ad), + ); + + await TestUtil.sendAdEvent(0, 'onAdImpression', instanceManager); + expect(await impressionCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'onAdShowedFullScreenContent', + instanceManager, + ); + expect(await showedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'onAdDismissedFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent(0, 'onAdClicked', instanceManager); + expect(await clickedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'onFailedToShowFullScreenContent', + instanceManager, + {'error': AdError(1, 'domain', 'message')}, + ); + expect(await failedToShowCompleter.future, rewardedInterstitial); + + // Check paid event callback + Completer> paidEventCompleter = Completer>(); + rewardedInterstitial!.onPaidEvent = (ad, value, precision, currency) { + paidEventCompleter.complete([ad, value, precision, currency]); + }; + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEventCompleter.future; + expect(paidEventCallback[0], rewardedInterstitial); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('load show rewarded interstitial ios', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + RewardedInterstitialAd? rewardedInterstitial; + AdRequest request = AdRequest(); + await RewardedInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + rewardedInterstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedInterstitialAd createdAd = + instanceManager.adFor(0) as RewardedInterstitialAd; + (createdAd).rewardedInterstitialAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + expect(rewardedInterstitial, createdAd); + + log.clear(); + await rewardedInterstitial!.show( + onUserEarnedReward: (ad, reward) => null, + ); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + + // Check that full screen events are passed correctly. + Completer impressionCompleter = + Completer(); + Completer failedToShowCompleter = + Completer(); + Completer showedCompleter = + Completer(); + Completer dismissedCompleter = + Completer(); + Completer clickedCompleter = + Completer(); + Completer willDismissCompleter = + Completer(); + + rewardedInterstitial!.fullScreenContentCallback = + FullScreenContentCallback( + onAdImpression: (ad) => impressionCompleter.complete(ad), + onAdShowedFullScreenContent: (ad) => showedCompleter.complete(ad), + onAdFailedToShowFullScreenContent: (ad, error) => + failedToShowCompleter.complete(ad), + onAdDismissedFullScreenContent: (ad) => + dismissedCompleter.complete(ad), + onAdClicked: (ad) => clickedCompleter.complete(ad), + onAdWillDismissFullScreenContent: (ad) => + willDismissCompleter.complete(ad), + ); + + await TestUtil.sendAdEvent(0, 'adDidRecordImpression', instanceManager); + expect(await impressionCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'adWillPresentFullScreenContent', + instanceManager, + ); + expect(await showedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'adDidDismissFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'adWillDismissFullScreenContent', + instanceManager, + ); + expect(await dismissedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent(0, 'adDidRecordClick', instanceManager); + expect(await clickedCompleter.future, rewardedInterstitial); + + await TestUtil.sendAdEvent( + 0, + 'didFailToPresentFullScreenContentWithError', + instanceManager, + {'error': AdError(1, 'domain', 'message')}, + ); + expect(await failedToShowCompleter.future, rewardedInterstitial); + + // Check paid event callback + Completer> paidEventCompleter = Completer>(); + rewardedInterstitial!.onPaidEvent = (ad, value, precision, currency) { + paidEventCompleter.complete([ad, value, precision, currency]); + }; + + const paidEventArgs = { + 'valueMicros': 1.2345, + 'precision': 0, + 'currencyCode': 'USD', + }; + await TestUtil.sendAdEvent( + 0, + 'onPaidEvent', + instanceManager, + paidEventArgs, + ); + List paidEventCallback = await paidEventCompleter.future; + expect(paidEventCallback[0], rewardedInterstitial); + expect(paidEventCallback[1], 1.2345); + expect(paidEventCallback[2], PrecisionType.unknown); + expect(paidEventCallback[3], 'USD'); + }); + + test('load show rewarded interstitial with $AdManagerAdRequest', () async { + RewardedInterstitialAd? rewardedInterstitial; + AdManagerAdRequest request = AdManagerAdRequest(); + await RewardedInterstitialAd.loadWithAdManagerAdRequest( + adUnitId: 'test-ad-unit', + adManagerRequest: request, + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + rewardedInterstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedInterstitialAd createdAd = + instanceManager.adFor(0) as RewardedInterstitialAd; + (createdAd).rewardedInterstitialAdLoadCallback.onAdLoaded(createdAd); + + expect(log, [ + isMethodCall( + 'loadRewardedInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': null, + 'adManagerRequest': request, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + log.clear(); + await rewardedInterstitial!.show( + onUserEarnedReward: (ad, reward) => null, + ); + expect(log, [ + isMethodCall( + 'showAdWithoutView', + arguments: {'adId': 0}, + ), + ]); + }); + + test('onAdFailedToLoad rewarded interstitial', () async { + final Completer resultsCompleter = Completer(); + final AdRequest request = AdRequest(); + await RewardedInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: request, + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) => null, + onAdFailedToLoad: (error) => resultsCompleter.complete(error), + ), + ); + + expect(log, [ + isMethodCall( + 'loadRewardedInterstitialAd', + arguments: { + 'adId': 0, + 'adUnitId': 'test-ad-unit', + 'request': request, + 'adManagerRequest': null, + }, + ), + ]); + + expect(instanceManager.adFor(0), isNotNull); + + // Simulate onAdFailedToLoad. + AdError adError = AdError(1, 'domain', 'error-message'); + AdapterResponseInfo adapterResponseInfo = AdapterResponseInfo( + adapterClassName: 'adapter-name', + latencyMillis: 500, + description: 'message', + adUnitMapping: {'key': 'value'}, + adError: adError, + adSourceName: 'adSourceName', + adSourceId: 'adSourceId', + adSourceInstanceName: 'adSourceInstanceName', + adSourceInstanceId: 'adSourceInstanceId', + ); + + List adapterResponses = [adapterResponseInfo]; + ResponseInfo responseInfo = ResponseInfo( + responseId: 'id', + mediationAdapterClassName: 'className', + adapterResponses: adapterResponses, + responseExtras: {'key': 12345}, + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onAdFailedToLoad', + 'loadAdError': LoadAdError(1, 'domain', 'message', responseInfo), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); + + // The ad reference should be freed when load failure occurs. + expect(instanceManager.adFor(0), isNull); + + // Check that load error matches. + final LoadAdError result = await resultsCompleter.future; + expect(result.code, 1); + expect(result.domain, 'domain'); + expect(result.message, 'message'); + expect(result.responseInfo!.responseId, responseInfo.responseId); + expect( + result.responseInfo!.mediationAdapterClassName, + responseInfo.mediationAdapterClassName, + ); + expect(result.responseInfo!.responseExtras, responseInfo.responseExtras); + List responses = + result.responseInfo!.adapterResponses!; + expect(responses.first.adapterClassName, 'adapter-name'); + expect(responses.first.latencyMillis, 500); + expect(responses.first.description, 'message'); + expect(responses.first.adUnitMapping, {'key': 'value'}); + expect(responses.first.adError!.code, 1); + expect(responses.first.adError!.message, 'error-message'); + expect(responses.first.adError!.domain, 'domain'); + }); + + test('onRewardedInterstitialAdUserEarnedReward', () async { + final Completer> resultCompleter = + Completer>(); + + RewardedInterstitialAd? rewardedInterstitial; + await RewardedInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: AdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + rewardedInterstitial = ad; + }, + onAdFailedToLoad: (error) => null, + ), + ); + + RewardedInterstitialAd createdAd = + instanceManager.adFor(0) as RewardedInterstitialAd; + createdAd.rewardedInterstitialAdLoadCallback.onAdLoaded(createdAd); + // Reward callback is now set when you call show. + await rewardedInterstitial!.show( + onUserEarnedReward: (ad, item) => + resultCompleter.complete([ad, item]), + ); + + final MethodCall methodCall = MethodCall('onAdEvent', { + 'adId': 0, + 'eventName': 'onRewardedInterstitialAdUserEarnedReward', + 'rewardItem': RewardItem(1, 'one'), + }); + + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); + + final List result = await resultCompleter.future; + expect(result[0], rewardedInterstitial!); + expect(result[1].amount, 1); + expect(result[1].type, 'one'); + }); + + test('setServerSideVerificationOptions', () async { + final adLoadCompleter = Completer(); + await RewardedInterstitialAd.load( + adUnitId: 'test-ad-unit', + request: AdRequest(), + rewardedInterstitialAdLoadCallback: RewardedInterstitialAdLoadCallback( + onAdLoaded: (ad) { + adLoadCompleter.complete(ad); + }, + onAdFailedToLoad: (_) => null, + ), + ); + + await TestUtil.sendAdEvent(0, 'onAdLoaded', instanceManager); + expect(adLoadCompleter.isCompleted, true); + final ad = await adLoadCompleter.future; + + log.clear(); + final ssv = ServerSideVerificationOptions( + userId: 'id', + customData: 'data', + ); + await ad.setServerSideOptions(ssv); + expect(log, [ + isMethodCall( + 'setServerSideVerificationOptions', + arguments: { + 'adId': 0, + 'serverSideVerificationOptions': ssv, + }, + ), + ]); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/test_util.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/test_util.dart new file mode 100644 index 00000000..cfaa6b6e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/test_util.dart @@ -0,0 +1,47 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/src/ad_instance_manager.dart'; + +/// Shared test functions. +class TestUtil { + /// Mocks sending an ad event to [instanceManager]. + /// + /// Creates an `onAdEvent` [MethodCall] with [adId], [eventName] and + /// [additionalArgs], encodes it into [ByteData] and sends it as a platform + /// message to [instanceManager]. + static Future sendAdEvent( + int adId, + String eventName, + AdInstanceManager instanceManager, [ + Map? additionalArgs, + ]) async { + Map args = {'adId': adId, 'eventName': eventName}; + additionalArgs?.entries.forEach( + (element) => args[element.key] = element.value, + ); + final MethodCall methodCall = MethodCall('onAdEvent', args); + final ByteData data = instanceManager.channel.codec.encodeMethodCall( + methodCall, + ); + await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .handlePlatformMessage( + 'plugins.flutter.io/google_mobile_ads', + data, + (data) {}, + ); + } +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.dart new file mode 100644 index 00000000..4f44551e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.dart @@ -0,0 +1,80 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:google_mobile_ads/src/ump/consent_form_impl.dart'; +import 'package:google_mobile_ads/src/ump/form_error.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'consent_form_impl_test.mocks.dart'; + +@GenerateMocks([UserMessagingChannel]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('ConsentFormImpl', () { + late MockUserMessagingChannel mockChannel; + + setUp(() async { + mockChannel = MockUserMessagingChannel(); + UserMessagingChannel.instance = mockChannel; + }); + + test('show() success', () async { + when(mockChannel.show(any, any)).thenAnswer((realInvocation) { + realInvocation.positionalArguments[1](null); + }); + ConsentFormImpl form = ConsentFormImpl(1); + Completer errorCompleter = Completer(); + + form.show((formError) => errorCompleter.complete(formError)); + + FormError? error = await errorCompleter.future; + + expect(errorCompleter.isCompleted, true); + expect(error, null); + }); + + test('show() failure', () async { + FormError error = FormError(errorCode: 1, message: 'msg'); + when(mockChannel.show(any, any)).thenAnswer((realInvocation) { + realInvocation.positionalArguments[1](error); + }); + ConsentFormImpl form = ConsentFormImpl(1); + Completer errorCompleter = Completer(); + + form.show((formError) => errorCompleter.complete(formError)); + + FormError? completedError = await errorCompleter.future; + + expect(errorCompleter.isCompleted, true); + expect(error, completedError); + }); + + test('dispose()', () async { + ConsentFormImpl form = ConsentFormImpl(1); + + when( + mockChannel.disposeConsentForm(form), + ).thenAnswer((realInvocation) => Future.value()); + + await form.dispose(); + verify(mockChannel.disposeConsentForm(form)); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.mocks.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.mocks.dart new file mode 100644 index 00000000..72bb79f7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_impl_test.mocks.dart @@ -0,0 +1,140 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in google_mobile_ads/test/ump/consent_form_impl_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; + +import 'package:google_mobile_ads/src/ump/consent_form.dart' as _i6; +import 'package:google_mobile_ads/src/ump/consent_information.dart' as _i4; +import 'package:google_mobile_ads/src/ump/consent_request_parameters.dart' + as _i3; +import 'package:google_mobile_ads/src/ump/form_error.dart' as _i7; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [UserMessagingChannel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserMessagingChannel extends _i1.Mock + implements _i2.UserMessagingChannel { + MockUserMessagingChannel() { + _i1.throwOnMissingStub(this); + } + + @override + void requestConsentInfoUpdate( + _i3.ConsentRequestParameters? params, + _i4.OnConsentInfoUpdateSuccessListener? successListener, + _i4.OnConsentInfoUpdateFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#requestConsentInfoUpdate, [ + params, + successListener, + failureListener, + ]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future isConsentFormAvailable() => + (super.noSuchMethod( + Invocation.method(#isConsentFormAvailable, []), + returnValue: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.ConsentStatus> getConsentStatus() => + (super.noSuchMethod( + Invocation.method(#getConsentStatus, []), + returnValue: _i5.Future<_i4.ConsentStatus>.value( + _i4.ConsentStatus.notRequired, + ), + ) + as _i5.Future<_i4.ConsentStatus>); + + @override + _i5.Future reset() => + (super.noSuchMethod( + Invocation.method(#reset, []), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); + + @override + _i5.Future canRequestAds() => + (super.noSuchMethod( + Invocation.method(#canRequestAds, []), + returnValue: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.PrivacyOptionsRequirementStatus> + getPrivacyOptionsRequirementStatus() => + (super.noSuchMethod( + Invocation.method(#getPrivacyOptionsRequirementStatus, []), + returnValue: _i5.Future<_i4.PrivacyOptionsRequirementStatus>.value( + _i4.PrivacyOptionsRequirementStatus.notRequired, + ), + ) + as _i5.Future<_i4.PrivacyOptionsRequirementStatus>); + + @override + void loadConsentForm( + _i6.OnConsentFormLoadSuccessListener? successListener, + _i6.OnConsentFormLoadFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#loadConsentForm, [successListener, failureListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> loadAndShowConsentFormIfRequired() => + (super.noSuchMethod( + Invocation.method(#loadAndShowConsentFormIfRequired, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + void show( + _i6.ConsentForm? consentForm, + _i6.OnConsentFormDismissedListener? onConsentFormDismissedListener, + ) => super.noSuchMethod( + Invocation.method(#show, [consentForm, onConsentFormDismissedListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> showPrivacyOptionsForm() => + (super.noSuchMethod( + Invocation.method(#showPrivacyOptionsForm, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + _i5.Future disposeConsentForm(_i6.ConsentForm? consentForm) => + (super.noSuchMethod( + Invocation.method(#disposeConsentForm, [consentForm]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.dart new file mode 100644 index 00000000..27a510aa --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.dart @@ -0,0 +1,133 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:google_mobile_ads/src/ump/consent_form.dart'; +import 'package:google_mobile_ads/src/ump/consent_form_impl.dart'; +import 'package:google_mobile_ads/src/ump/form_error.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'consent_form_test.mocks.dart'; + +@GenerateNiceMocks(>[MockSpec()]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('ConsentForm', () { + late MockUserMessagingChannel mockChannel; + + setUp(() async { + mockChannel = MockUserMessagingChannel(); + UserMessagingChannel.instance = mockChannel; + }); + + test('showPrivacyOptionsForm success', () async { + Completer formCompleter = Completer(); + + await ConsentForm.showPrivacyOptionsForm( + (formError) => formCompleter.complete(formError), + ); + + FormError? formError = await formCompleter.future; + expect(formError, null); + }); + + test('showPrivacyOptionsForm failure', () async { + FormError? testError = FormError(errorCode: 1, message: 'testErrorMsg'); + when( + mockChannel.showPrivacyOptionsForm(), + ).thenAnswer((realInvocation) => Future.value(testError)); + Completer formCompleter = Completer(); + + await ConsentForm.showPrivacyOptionsForm( + (formError) => formCompleter.complete(formError), + ); + + FormError? formError = await formCompleter.future; + expect(formError, testError); + }); + + test('loadConsentForm() success', () async { + ConsentForm form = ConsentFormImpl(2); + + when(mockChannel.loadConsentForm(any, any)).thenAnswer( + (realInvocation) => realInvocation.positionalArguments[0](form), + ); + + Completer successCompleter = Completer(); + Completer errorCompleter = Completer(); + + ConsentForm.loadConsentForm( + (consentForm) => successCompleter.complete(consentForm), + (formError) => errorCompleter.complete(formError), + ); + + ConsentForm responseForm = await successCompleter.future; + expect(successCompleter.isCompleted, true); + expect(errorCompleter.isCompleted, false); + expect(form, responseForm); + }); + + test('loadConsentForm() failure', () async { + FormError formError = FormError(errorCode: 1, message: 'message'); + + when(mockChannel.loadConsentForm(any, any)).thenAnswer( + (realInvocation) => realInvocation.positionalArguments[1](formError), + ); + + Completer successCompleter = Completer(); + Completer errorCompleter = Completer(); + + ConsentForm.loadConsentForm( + (consentForm) => successCompleter.complete(consentForm), + (formError) => errorCompleter.complete(formError), + ); + + FormError responseError = await errorCompleter.future; + expect(formError, responseError); + expect(successCompleter.isCompleted, false); + expect(errorCompleter.isCompleted, true); + }); + + test('loadAndShowConsentFormIfRequired success', () async { + Completer formCompleter = Completer(); + + await ConsentForm.loadAndShowConsentFormIfRequired( + (formError) => formCompleter.complete(formError), + ); + + FormError? formError = await formCompleter.future; + expect(formError, null); + }); + + test('loadAndShowConsentFormIfRequired failure', () async { + FormError? testError = FormError(errorCode: 1, message: 'testErrorMsg'); + when( + mockChannel.loadAndShowConsentFormIfRequired(), + ).thenAnswer((realInvocation) => Future.value(testError)); + Completer formCompleter = Completer(); + + await ConsentForm.loadAndShowConsentFormIfRequired( + (formError) => formCompleter.complete(formError), + ); + + FormError? formError = await formCompleter.future; + expect(formError, testError); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.mocks.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.mocks.dart new file mode 100644 index 00000000..301aee2f --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_form_test.mocks.dart @@ -0,0 +1,147 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in google_mobile_ads/test/ump/consent_form_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; + +import 'package:google_mobile_ads/src/ump/consent_form.dart' as _i6; +import 'package:google_mobile_ads/src/ump/consent_information.dart' as _i4; +import 'package:google_mobile_ads/src/ump/consent_request_parameters.dart' + as _i3; +import 'package:google_mobile_ads/src/ump/form_error.dart' as _i7; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [UserMessagingChannel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserMessagingChannel extends _i1.Mock + implements _i2.UserMessagingChannel { + @override + void requestConsentInfoUpdate( + _i3.ConsentRequestParameters? params, + _i4.OnConsentInfoUpdateSuccessListener? successListener, + _i4.OnConsentInfoUpdateFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#requestConsentInfoUpdate, [ + params, + successListener, + failureListener, + ]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future isConsentFormAvailable() => + (super.noSuchMethod( + Invocation.method(#isConsentFormAvailable, []), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.ConsentStatus> getConsentStatus() => + (super.noSuchMethod( + Invocation.method(#getConsentStatus, []), + returnValue: _i5.Future<_i4.ConsentStatus>.value( + _i4.ConsentStatus.notRequired, + ), + returnValueForMissingStub: _i5.Future<_i4.ConsentStatus>.value( + _i4.ConsentStatus.notRequired, + ), + ) + as _i5.Future<_i4.ConsentStatus>); + + @override + _i5.Future reset() => + (super.noSuchMethod( + Invocation.method(#reset, []), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); + + @override + _i5.Future canRequestAds() => + (super.noSuchMethod( + Invocation.method(#canRequestAds, []), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.PrivacyOptionsRequirementStatus> + getPrivacyOptionsRequirementStatus() => + (super.noSuchMethod( + Invocation.method(#getPrivacyOptionsRequirementStatus, []), + returnValue: _i5.Future<_i4.PrivacyOptionsRequirementStatus>.value( + _i4.PrivacyOptionsRequirementStatus.notRequired, + ), + returnValueForMissingStub: + _i5.Future<_i4.PrivacyOptionsRequirementStatus>.value( + _i4.PrivacyOptionsRequirementStatus.notRequired, + ), + ) + as _i5.Future<_i4.PrivacyOptionsRequirementStatus>); + + @override + void loadConsentForm( + _i6.OnConsentFormLoadSuccessListener? successListener, + _i6.OnConsentFormLoadFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#loadConsentForm, [successListener, failureListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> loadAndShowConsentFormIfRequired() => + (super.noSuchMethod( + Invocation.method(#loadAndShowConsentFormIfRequired, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + returnValueForMissingStub: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + void show( + _i6.ConsentForm? consentForm, + _i6.OnConsentFormDismissedListener? onConsentFormDismissedListener, + ) => super.noSuchMethod( + Invocation.method(#show, [consentForm, onConsentFormDismissedListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> showPrivacyOptionsForm() => + (super.noSuchMethod( + Invocation.method(#showPrivacyOptionsForm, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + returnValueForMissingStub: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + _i5.Future disposeConsentForm(_i6.ConsentForm? consentForm) => + (super.noSuchMethod( + Invocation.method(#disposeConsentForm, [consentForm]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.dart new file mode 100644 index 00000000..9e8027e7 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.dart @@ -0,0 +1,140 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ump/consent_information_impl.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'consent_information_impl_test.mocks.dart'; + +@GenerateMocks([UserMessagingChannel]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('ConsentInformationImpl', () { + late MockUserMessagingChannel mockChannel; + late ConsentInformationImpl consentInfo; + + setUp(() async { + mockChannel = MockUserMessagingChannel(); + UserMessagingChannel.instance = mockChannel; + consentInfo = ConsentInformationImpl(); + }); + + test('reset()', () async { + when(mockChannel.reset()).thenAnswer((_) => Future.value()); + + await consentInfo.reset(); + + verify(mockChannel.reset()); + }); + + test('getConsentStatus()', () async { + ConsentStatus status = ConsentStatus.required; + when( + mockChannel.getConsentStatus(), + ).thenAnswer((_) => Future.value(status)); + + ConsentStatus responseStatus = await consentInfo.getConsentStatus(); + + verify(mockChannel.getConsentStatus()); + expect(responseStatus, status); + }); + + test('isConsentFormAvailable()', () async { + when( + mockChannel.isConsentFormAvailable(), + ).thenAnswer((_) => Future.value(false)); + + bool isConsentFormAvailable = await consentInfo.isConsentFormAvailable(); + + verify(mockChannel.isConsentFormAvailable()); + expect(isConsentFormAvailable, false); + }); + + test('requestConsentInfoUpdate() success', () async { + when(mockChannel.requestConsentInfoUpdate(any, any, any)).thenAnswer(( + invocation, + ) { + invocation.positionalArguments[1](); + }); + + ConsentRequestParameters params = ConsentRequestParameters(); + Completer successCompleter = Completer(); + Completer errorCompleter = Completer(); + + consentInfo.requestConsentInfoUpdate( + params, + () => successCompleter.complete(), + (error) => errorCompleter.complete(error), + ); + + await successCompleter.future; + verify(mockChannel.requestConsentInfoUpdate(params, any, any)); + expect(successCompleter.isCompleted, true); + expect(errorCompleter.isCompleted, false); + }); + + test('requestConsentInfoUpdate() failure', () async { + FormError formError = FormError(errorCode: 1, message: 'msg'); + when(mockChannel.requestConsentInfoUpdate(any, any, any)).thenAnswer(( + invocation, + ) { + invocation.positionalArguments[2](formError); + }); + + ConsentRequestParameters params = ConsentRequestParameters(); + Completer successCompleter = Completer(); + Completer errorCompleter = Completer(); + + consentInfo.requestConsentInfoUpdate( + params, + () => successCompleter.complete(), + (error) => errorCompleter.complete(error), + ); + + FormError responseError = await errorCompleter.future; + verify(mockChannel.requestConsentInfoUpdate(params, any, any)); + expect(successCompleter.isCompleted, false); + expect(errorCompleter.isCompleted, true); + expect(responseError, formError); + }); + + test('canRequestAds()', () async { + when(mockChannel.canRequestAds()).thenAnswer((_) => Future.value(true)); + + bool canRequestAds = await consentInfo.canRequestAds(); + + verify(mockChannel.canRequestAds()); + expect(canRequestAds, true); + }); + + test('getPrivacyOptionsRequirementStatus()', () async { + when(mockChannel.getPrivacyOptionsRequirementStatus()).thenAnswer( + (_) => Future.value(PrivacyOptionsRequirementStatus.required), + ); + + PrivacyOptionsRequirementStatus status = await consentInfo + .getPrivacyOptionsRequirementStatus(); + + verify(mockChannel.getPrivacyOptionsRequirementStatus()); + expect(status, PrivacyOptionsRequirementStatus.required); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.mocks.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.mocks.dart new file mode 100644 index 00000000..3edbd3b1 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/consent_information_impl_test.mocks.dart @@ -0,0 +1,140 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in google_mobile_ads/test/ump/consent_information_impl_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; + +import 'package:google_mobile_ads/src/ump/consent_form.dart' as _i6; +import 'package:google_mobile_ads/src/ump/consent_information.dart' as _i4; +import 'package:google_mobile_ads/src/ump/consent_request_parameters.dart' + as _i3; +import 'package:google_mobile_ads/src/ump/form_error.dart' as _i7; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [UserMessagingChannel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserMessagingChannel extends _i1.Mock + implements _i2.UserMessagingChannel { + MockUserMessagingChannel() { + _i1.throwOnMissingStub(this); + } + + @override + void requestConsentInfoUpdate( + _i3.ConsentRequestParameters? params, + _i4.OnConsentInfoUpdateSuccessListener? successListener, + _i4.OnConsentInfoUpdateFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#requestConsentInfoUpdate, [ + params, + successListener, + failureListener, + ]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future isConsentFormAvailable() => + (super.noSuchMethod( + Invocation.method(#isConsentFormAvailable, []), + returnValue: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.ConsentStatus> getConsentStatus() => + (super.noSuchMethod( + Invocation.method(#getConsentStatus, []), + returnValue: _i5.Future<_i4.ConsentStatus>.value( + _i4.ConsentStatus.notRequired, + ), + ) + as _i5.Future<_i4.ConsentStatus>); + + @override + _i5.Future reset() => + (super.noSuchMethod( + Invocation.method(#reset, []), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); + + @override + _i5.Future canRequestAds() => + (super.noSuchMethod( + Invocation.method(#canRequestAds, []), + returnValue: _i5.Future.value(false), + ) + as _i5.Future); + + @override + _i5.Future<_i4.PrivacyOptionsRequirementStatus> + getPrivacyOptionsRequirementStatus() => + (super.noSuchMethod( + Invocation.method(#getPrivacyOptionsRequirementStatus, []), + returnValue: _i5.Future<_i4.PrivacyOptionsRequirementStatus>.value( + _i4.PrivacyOptionsRequirementStatus.notRequired, + ), + ) + as _i5.Future<_i4.PrivacyOptionsRequirementStatus>); + + @override + void loadConsentForm( + _i6.OnConsentFormLoadSuccessListener? successListener, + _i6.OnConsentFormLoadFailureListener? failureListener, + ) => super.noSuchMethod( + Invocation.method(#loadConsentForm, [successListener, failureListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> loadAndShowConsentFormIfRequired() => + (super.noSuchMethod( + Invocation.method(#loadAndShowConsentFormIfRequired, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + void show( + _i6.ConsentForm? consentForm, + _i6.OnConsentFormDismissedListener? onConsentFormDismissedListener, + ) => super.noSuchMethod( + Invocation.method(#show, [consentForm, onConsentFormDismissedListener]), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i7.FormError?> showPrivacyOptionsForm() => + (super.noSuchMethod( + Invocation.method(#showPrivacyOptionsForm, []), + returnValue: _i5.Future<_i7.FormError?>.value(), + ) + as _i5.Future<_i7.FormError?>); + + @override + _i5.Future disposeConsentForm(_i6.ConsentForm? consentForm) => + (super.noSuchMethod( + Invocation.method(#disposeConsentForm, [consentForm]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_channel_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_channel_test.dart new file mode 100644 index 00000000..0b92a19e --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_channel_test.dart @@ -0,0 +1,460 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:google_mobile_ads/src/ump/consent_form_impl.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_channel.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_codec.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('UserMessagingChannel', () { + late MethodChannel methodChannel; + late UserMessagingChannel channel; + setUp(() async { + methodChannel = MethodChannel( + 'test-channel', + StandardMethodCodec(UserMessagingCodec()), + ); + channel = UserMessagingChannel(methodChannel); + }); + + test('requestConsentInfoUpdate() success', () async { + ConsentRequestParameters params = ConsentRequestParameters( + tagForUnderAgeOfConsent: true, + consentDebugSettings: ConsentDebugSettings(), + ); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + expect( + call.method, + equals('ConsentInformation#requestConsentInfoUpdate'), + ); + expect(call.arguments, equals({'params': params})); + return Future.value(); + }); + + Completer successCompleter = Completer(); + Completer failureCompleter = Completer(); + // Test function + channel.requestConsentInfoUpdate( + params, + () { + successCompleter.complete(); + }, + (error) { + failureCompleter.complete(error); + }, + ); + await successCompleter.future; + + expect(successCompleter.isCompleted, true); + expect(failureCompleter.isCompleted, false); + }); + + test('requestConsentInfoUpdate() failure', () async { + ConsentRequestParameters params = ConsentRequestParameters( + tagForUnderAgeOfConsent: true, + consentDebugSettings: ConsentDebugSettings(), + ); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + expect( + call.method, + equals('ConsentInformation#requestConsentInfoUpdate'), + ); + expect(call.arguments, equals({'params': params})); + return Future.error( + PlatformException( + code: '1', + message: 'message', + details: 'details', + ), + ); + }); + + Completer successCompleter = Completer(); + Completer failureCompleter = Completer(); + + // Test function + channel.requestConsentInfoUpdate( + params, + () { + successCompleter.complete(); + }, + (error) { + failureCompleter.complete(error); + }, + ); + + FormError error = await failureCompleter.future; + expect(successCompleter.isCompleted, false); + expect(failureCompleter.isCompleted, true); + FormError expectedError = FormError(errorCode: 1, message: 'message'); + expect(error, equals(expectedError)); + }); + + test('isConsentFormAvailable() true', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + expect( + call.method, + equals('ConsentInformation#isConsentFormAvailable'), + ); + expect(call.arguments, null); + return Future.value(true); + }); + + bool isAvailable = await channel.isConsentFormAvailable(); + + expect(isAvailable, true); + }); + + test('isConsentFormAvailable() false', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + expect( + call.method, + equals('ConsentInformation#isConsentFormAvailable'), + ); + expect(call.arguments, null); + return Future.value(false); + }); + + bool isAvailable = await channel.isConsentFormAvailable(); + + expect(isAvailable, false); + }); + + test('getConsentStatus()', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + expect(call.method, equals('ConsentInformation#getConsentStatus')); + expect(call.arguments, null); + return Future.value(1); + }); + + ConsentStatus status = await channel.getConsentStatus(); + + expect(status, ConsentStatus.notRequired); + }); + + test('reset()', () async { + String? method; + dynamic arguments; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.value(); + }); + + await channel.reset(); + + expect(method, equals('ConsentInformation#reset')); + expect(arguments, null); + }); + + test('loadConsentForm() success', () async { + String? method; + dynamic arguments; + ConsentForm consentForm = ConsentFormImpl(1); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.value(consentForm); + }); + + Completer successCompleter = Completer(); + Completer failureCompleter = Completer(); + + // Test function + channel.loadConsentForm( + (consentForm) => successCompleter.complete(consentForm), + (formError) => failureCompleter.complete(formError), + ); + + ConsentForm response = await successCompleter.future; + expect(successCompleter.isCompleted, true); + expect(failureCompleter.isCompleted, false); + expect(method, equals('UserMessagingPlatform#loadConsentForm')); + expect(arguments, null); + expect(response, equals(consentForm)); + }); + + test('loadConsentForm() error', () async { + String? method; + dynamic arguments; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.error( + PlatformException(code: '2', message: 'message'), + ); + }); + + Completer successCompleter = Completer(); + Completer failureCompleter = Completer(); + + // Test function + channel.loadConsentForm( + (consentForm) => successCompleter.complete(consentForm), + (formError) => failureCompleter.complete(formError), + ); + + FormError error = await failureCompleter.future; + expect(successCompleter.isCompleted, false); + expect(failureCompleter.isCompleted, true); + expect(method, equals('UserMessagingPlatform#loadConsentForm')); + expect(arguments, null); + expect(error, FormError(errorCode: 2, message: 'message')); + }); + + test('show() success', () async { + String? method; + dynamic arguments; + ConsentFormImpl consentForm = ConsentFormImpl(1); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.value(); + }); + + Completer successCompleter = Completer(); + + // Test function + channel.show(consentForm, (error) => successCompleter.complete(error)); + + FormError? error = await successCompleter.future; + expect(successCompleter.isCompleted, true); + expect(method, equals('ConsentForm#show')); + expect(arguments, {'consentForm': consentForm}); + expect(error, null); + }); + + test('show() error', () async { + String? method; + dynamic arguments; + ConsentFormImpl consentForm = ConsentFormImpl(1); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.error(PlatformException(code: '55', message: 'msg')); + }); + + Completer successCompleter = Completer(); + + // Test function + channel.show(consentForm, (error) => successCompleter.complete(error)); + + FormError? error = await successCompleter.future; + expect(successCompleter.isCompleted, true); + expect(method, equals('ConsentForm#show')); + expect(arguments, {'consentForm': consentForm}); + expect(error, FormError(errorCode: 55, message: 'msg')); + }); + + test('disposeConsentForm()', () async { + String? method; + dynamic arguments; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (MethodCall call) async { + method = call.method; + arguments = call.arguments; + return Future.value(); + }); + + ConsentForm consentForm = ConsentFormImpl(1); + await channel.disposeConsentForm(consentForm); + + expect(method, equals('ConsentForm#dispose')); + expect(arguments, {'consentForm': consentForm}); + }); + + test('canRequestAds()', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect(call.method, equals('ConsentInformation#canRequestAds')); + expect(call.arguments, null); + return Future.value(true); + }); + + bool canRequestAds = await channel.canRequestAds(); + + expect(canRequestAds, true); + }); + + test('getPrivacyOptionsRequirementStatus() maps 1 to required', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('ConsentInformation#getPrivacyOptionsRequirementStatus'), + ); + expect(call.arguments, null); + return Future.value(1); + }); + + PrivacyOptionsRequirementStatus privacyStatus = await channel + .getPrivacyOptionsRequirementStatus(); + + expect(privacyStatus, PrivacyOptionsRequirementStatus.required); + }); + + test( + 'getPrivacyOptionsRequirementStatus() maps 0 to notRequired', + () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('ConsentInformation#getPrivacyOptionsRequirementStatus'), + ); + expect(call.arguments, null); + return Future.value(0); + }); + + PrivacyOptionsRequirementStatus privacyStatus = await channel + .getPrivacyOptionsRequirementStatus(); + + expect(privacyStatus, PrivacyOptionsRequirementStatus.notRequired); + }, + ); + + test('loadAndShowConsentFormIfRequired() success', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#loadAndShowConsentFormIfRequired'), + ); + expect(call.arguments, null); + return Future.value(); + }); + Completer successCompleter = Completer(); + + successCompleter.complete(channel.loadAndShowConsentFormIfRequired()); + + FormError? error = await successCompleter.future; + expect(error, null); + }); + + test('loadAndShowConsentFormIfRequired() failure', () async { + FormError? testError = FormError(errorCode: 55, message: 'msg'); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#loadAndShowConsentFormIfRequired'), + ); + expect(call.arguments, null); + return Future.value(testError); + }); + Completer failureCompleter = Completer(); + + failureCompleter.complete(channel.loadAndShowConsentFormIfRequired()); + + FormError? error = await failureCompleter.future; + expect(failureCompleter.isCompleted, true); + expect(error, testError); + }); + + test('loadAndShowConsentFormIfRequired() error', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#loadAndShowConsentFormIfRequired'), + ); + expect(call.arguments, null); + return Future.error(PlatformException(code: '55', message: 'msg')); + }); + Completer errorCompleter = Completer(); + + errorCompleter.complete(channel.loadAndShowConsentFormIfRequired()); + + FormError? error = await errorCompleter.future; + expect(errorCompleter.isCompleted, true); + expect(error, FormError(errorCode: 55, message: 'msg')); + }); + + test('showPrivacyOptionsForm() success', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#showPrivacyOptionsForm'), + ); + expect(call.arguments, null); + return Future.value(); + }); + Completer successCompleter = Completer(); + + successCompleter.complete(channel.showPrivacyOptionsForm()); + + FormError? error = await successCompleter.future; + expect(error, null); + }); + + test('showPrivacyOptionsForm() failure', () async { + FormError? testError = FormError(errorCode: 55, message: 'msg'); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#showPrivacyOptionsForm'), + ); + expect(call.arguments, null); + return Future.value(testError); + }); + Completer failureCompleter = Completer(); + + failureCompleter.complete(channel.showPrivacyOptionsForm()); + + FormError? error = await failureCompleter.future; + expect(failureCompleter.isCompleted, true); + expect(error, testError); + }); + + test('showPrivacyOptionsForm() error', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(methodChannel, (call) async { + expect( + call.method, + equals('UserMessagingPlatform#showPrivacyOptionsForm'), + ); + expect(call.arguments, null); + return Future.error(PlatformException(code: '55', message: 'msg')); + }); + Completer errorCompleter = Completer(); + + errorCompleter.complete(channel.showPrivacyOptionsForm()); + + FormError? error = await errorCompleter.future; + expect(errorCompleter.isCompleted, true); + expect(error, FormError(errorCode: 55, message: 'msg')); + }); + }); +} diff --git a/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_codec_test.dart b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_codec_test.dart new file mode 100644 index 00000000..6f89bc14 --- /dev/null +++ b/mih_ui/android/build/ios/SourcePackages/google_mobile_ads-8.0.0/test/ump/user_messaging_codec_test.dart @@ -0,0 +1,84 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:google_mobile_ads/src/ump/consent_form_impl.dart'; +import 'package:google_mobile_ads/src/ump/user_messaging_codec.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('UserMessagingCodec', () { + /// Sut. + final UserMessagingCodec codec = UserMessagingCodec(); + + test('encode and decode empty ConsentRequestParameters', () async { + ConsentRequestParameters params = ConsentRequestParameters(); + final ByteData? byteData = codec.encodeMessage(params); + ConsentRequestParameters decodedParams = codec.decodeMessage(byteData); + expect(params, decodedParams); + }); + + test('encode and decode empty ConsentDebugSettings', () async { + ConsentDebugSettings debugSettings = ConsentDebugSettings(); + ByteData? byteData = codec.encodeMessage(debugSettings); + ConsentDebugSettings decodedDebugSettings = codec.decodeMessage(byteData); + expect(debugSettings, decodedDebugSettings); + }); + + test('encode and decode ConsentDebugSettings only geography', () async { + ConsentDebugSettings debugSettings = ConsentDebugSettings( + debugGeography: DebugGeography.debugGeographyDisabled, + ); + ByteData? byteData = codec.encodeMessage(debugSettings); + ConsentDebugSettings decodedDebugSettings = codec.decodeMessage(byteData); + expect(debugSettings, decodedDebugSettings); + }); + + test('encode and decode ConsentDebugSettings only testIds', () async { + ConsentDebugSettings debugSettings = ConsentDebugSettings( + testIdentifiers: ['test-identifier1', 'test-identifier2'], + ); + ByteData? byteData = codec.encodeMessage(debugSettings); + ConsentDebugSettings decodedDebugSettings = codec.decodeMessage(byteData); + expect(debugSettings, equals(decodedDebugSettings)); + }); + + test('encode and decode ConsentDebugSettings testIds and geo', () async { + ConsentDebugSettings debugSettings = ConsentDebugSettings( + debugGeography: DebugGeography.debugGeographyEea, + testIdentifiers: ['test-identifier1', 'test-identifier2'], + ); + ByteData? byteData = codec.encodeMessage(debugSettings); + ConsentDebugSettings decodedDebugSettings = codec.decodeMessage(byteData); + expect(debugSettings, equals(decodedDebugSettings)); + }); + + test('encode and decode ConsentForm', () async { + ConsentFormImpl consentFormImpl = ConsentFormImpl(1); + ByteData? byteData = codec.encodeMessage(consentFormImpl); + ConsentForm decodedConsentForm = codec.decodeMessage(byteData); + expect(decodedConsentForm, equals(consentFormImpl)); + }); + + test('encode and decode FormError', () async { + FormError formError = FormError(errorCode: 123, message: 'testError'); + ByteData? byteData = codec.encodeMessage(formError); + FormError decodedFormError = codec.decodeMessage(byteData); + expect(decodedFormError, equals(formError)); + }); + }); +} diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/project/PROJECT@v11_mod=d0293ee0112d0357cf900112c05ab991_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/project/PROJECT@v11_mod=d0293ee0112d0357cf900112c05ab991_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json new file mode 100644 index 00000000..50cd74b5 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/project/PROJECT@v11_mod=d0293ee0112d0357cf900112c05ab991_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json @@ -0,0 +1 @@ +{"appPreferencesBuildSettings":{},"buildConfigurations":[{"buildSettings":{"ALWAYS_SEARCH_USER_PATHS":"NO","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION":"YES_AGGRESSIVE","CLANG_CXX_LANGUAGE_STANDARD":"gnu++14","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_ENABLE_OBJC_WEAK":"YES","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_DOCUMENTATION_COMMENTS":"YES","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"YES","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNGUARDED_AVAILABILITY":"YES_AGGRESSIVE","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","COPY_PHASE_STRIP":"NO","DEBUG_INFORMATION_FORMAT":"dwarf","ENABLE_STRICT_OBJC_MSGSEND":"YES","ENABLE_TESTABILITY":"YES","GCC_C_LANGUAGE_STANDARD":"gnu11","GCC_DYNAMIC_NO_PIC":"NO","GCC_NO_COMMON_BLOCKS":"YES","GCC_OPTIMIZATION_LEVEL":"0","GCC_PREPROCESSOR_DEFINITIONS":"POD_CONFIGURATION_DEBUG=1 DEBUG=1 $(inherited)","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","MTL_ENABLE_DEBUG_INFO":"INCLUDE_SOURCE","MTL_FAST_MATH":"YES","ONLY_ACTIVE_ARCH":"YES","PRODUCT_NAME":"$(TARGET_NAME)","STRIP_INSTALLED_PRODUCT":"NO","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"DEBUG","SWIFT_OPTIMIZATION_LEVEL":"-Onone","SWIFT_VERSION":"5.0","SYMROOT":"${SRCROOT}/../build"},"guid":"bfdfe7dc352907fc980b868725387e98aa7a69c2bf65b07ec18c8dbe4d98a7bc","name":"Debug"},{"buildSettings":{"ALWAYS_SEARCH_USER_PATHS":"NO","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION":"YES_AGGRESSIVE","CLANG_CXX_LANGUAGE_STANDARD":"gnu++14","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_ENABLE_OBJC_WEAK":"YES","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_DOCUMENTATION_COMMENTS":"YES","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"YES","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNGUARDED_AVAILABILITY":"YES_AGGRESSIVE","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","COPY_PHASE_STRIP":"NO","DEBUG_INFORMATION_FORMAT":"dwarf-with-dsym","ENABLE_NS_ASSERTIONS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","GCC_C_LANGUAGE_STANDARD":"gnu11","GCC_NO_COMMON_BLOCKS":"YES","GCC_PREPROCESSOR_DEFINITIONS":"POD_CONFIGURATION_PROFILE=1 $(inherited)","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","MTL_ENABLE_DEBUG_INFO":"NO","MTL_FAST_MATH":"YES","PRODUCT_NAME":"$(TARGET_NAME)","STRIP_INSTALLED_PRODUCT":"NO","SWIFT_COMPILATION_MODE":"wholemodule","SWIFT_OPTIMIZATION_LEVEL":"-O","SWIFT_VERSION":"5.0","SYMROOT":"${SRCROOT}/../build"},"guid":"bfdfe7dc352907fc980b868725387e983e0e781737f05c4d662f1beac8315a77","name":"Profile"},{"buildSettings":{"ALWAYS_SEARCH_USER_PATHS":"NO","CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED":"YES","CLANG_ANALYZER_NONNULL":"YES","CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION":"YES_AGGRESSIVE","CLANG_CXX_LANGUAGE_STANDARD":"gnu++14","CLANG_CXX_LIBRARY":"libc++","CLANG_ENABLE_MODULES":"YES","CLANG_ENABLE_OBJC_ARC":"YES","CLANG_ENABLE_OBJC_WEAK":"YES","CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING":"YES","CLANG_WARN_BOOL_CONVERSION":"YES","CLANG_WARN_COMMA":"YES","CLANG_WARN_CONSTANT_CONVERSION":"YES","CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS":"YES","CLANG_WARN_DIRECT_OBJC_ISA_USAGE":"YES_ERROR","CLANG_WARN_DOCUMENTATION_COMMENTS":"YES","CLANG_WARN_EMPTY_BODY":"YES","CLANG_WARN_ENUM_CONVERSION":"YES","CLANG_WARN_INFINITE_RECURSION":"YES","CLANG_WARN_INT_CONVERSION":"YES","CLANG_WARN_NON_LITERAL_NULL_CONVERSION":"YES","CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF":"YES","CLANG_WARN_OBJC_LITERAL_CONVERSION":"YES","CLANG_WARN_OBJC_ROOT_CLASS":"YES_ERROR","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"YES","CLANG_WARN_RANGE_LOOP_ANALYSIS":"YES","CLANG_WARN_STRICT_PROTOTYPES":"YES","CLANG_WARN_SUSPICIOUS_MOVE":"YES","CLANG_WARN_UNGUARDED_AVAILABILITY":"YES_AGGRESSIVE","CLANG_WARN_UNREACHABLE_CODE":"YES","CLANG_WARN__DUPLICATE_METHOD_MATCH":"YES","COPY_PHASE_STRIP":"NO","DEBUG_INFORMATION_FORMAT":"dwarf-with-dsym","ENABLE_NS_ASSERTIONS":"NO","ENABLE_STRICT_OBJC_MSGSEND":"YES","GCC_C_LANGUAGE_STANDARD":"gnu11","GCC_NO_COMMON_BLOCKS":"YES","GCC_PREPROCESSOR_DEFINITIONS":"POD_CONFIGURATION_RELEASE=1 $(inherited)","GCC_WARN_64_TO_32_BIT_CONVERSION":"YES","GCC_WARN_ABOUT_RETURN_TYPE":"YES_ERROR","GCC_WARN_UNDECLARED_SELECTOR":"YES","GCC_WARN_UNINITIALIZED_AUTOS":"YES_AGGRESSIVE","GCC_WARN_UNUSED_FUNCTION":"YES","GCC_WARN_UNUSED_VARIABLE":"YES","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","MTL_ENABLE_DEBUG_INFO":"NO","MTL_FAST_MATH":"YES","PRODUCT_NAME":"$(TARGET_NAME)","STRIP_INSTALLED_PRODUCT":"NO","SWIFT_COMPILATION_MODE":"wholemodule","SWIFT_OPTIMIZATION_LEVEL":"-O","SWIFT_VERSION":"5.0","SYMROOT":"${SRCROOT}/../build"},"guid":"bfdfe7dc352907fc980b868725387e9880fffdb081d1ceb505494a2f72912a5f","name":"Release"}],"classPrefix":"","defaultConfigurationName":"Release","developmentRegion":"en","groupTree":{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98d0b25d39b515a574839e998df229c3cb","path":"../Podfile","sourceTree":"SOURCE_ROOT","type":"file"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f5e4ec7c8e38b008f7f7c3a9bd4a401e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/app_settings-7.0.0/ios/app_settings/Sources/app_settings/AppSettingsPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9888e3ab526532341a5b566628d447ac8f","name":"app_settings","path":"app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fa9a31af2f04da80e43125746faef349","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988841ff692007360f2f6b51e07273427a","name":"app_settings","path":"app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98433728c6157b2b64fd28c84306daac04","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9811229002c85d49c31b190a8db8a11e71","name":"app_settings","path":"app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983c55a8a126d11bd35cae1348f60d554b","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9831fe13b405e0c87b865873dff48b574c","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b8efedc672f6cecced7a7a1cac7b8799","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981d028851cf57fc21af3531e2bfee8600","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98227668d37a4e895dcda5f82093546f64","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986ef8aaca5b7de7bce54c598e8136ebf9","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980e0d8d16aabf77aeacf7563312cbe86d","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9860bed12f143a445c4879038194fea56b","name":"..","path":"..","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98a3dc3576e1e38afd167d6415d986fe47","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/app_settings-7.0.0/ios/app_settings/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9868b0c4e5d81cecb53e406903944533e3","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c6626661d52970110983c57d13deceb4","name":"app_settings","path":"app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eb8795f1f7151238c44c70dc43aa70be","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f146fefad0d90e99ebd9c232f62a7925","name":"app_settings","path":"app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cec0a1ed7f47956a474953fc4595c551","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986bf009729d094b4f8c44d33c297f40c5","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e04242359af722fe7de72e861cbe5f20","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9834162d784f785b84b8aefde7689d859d","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98465c04ca24d1ea5fed26f17551a07563","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9875a4364cd191c4f15d02ee6ac1a23193","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9881237af5c353e7cf1051943341d47a0b","name":"Git","path":"../Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f0745151330f19fa5281176df81811de","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988f68cfb9804603a3e611363fa6727915","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987a3b2e728f9d6fdd7f85065429a8bf93","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983fb14232318f920208fe4162aadd1e42","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9832cc7db1f950bd66acb8879b4f1bccb1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f09f0f24b4e38959d65a45c04af00e37","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a6c57b90ec41cc06d89a82a177a49b04","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/app_settings-7.0.0/ios/app_settings/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e989a44a427d1e6525a95450fa77cdd8d17","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/app_settings-7.0.0/ios/app_settings.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e980fcd13aaefa26396d8acba43ed0bf89e","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/app_settings-7.0.0/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9865b949ba7b72894e728c5e156a244e6c","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9828c6e8a90a7a09ef2ea9c1a65a1ad213","path":"app_settings.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b8ecd436f5a48de64e24bcea345336fb","path":"app_settings-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9886184509472824a8712d952bd3a1d25a","path":"app_settings-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9840ba091849ac80d1d21b8288461fefa1","path":"app_settings-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fdf0be27e7b47159d9d8b87c584ea45f","path":"app_settings-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e9790273c34cf01756c3ac2cbd541c6d","path":"app_settings.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981916adc978ad471261fb8f5e1e97ed3a","path":"app_settings.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9804f728d4825970c34fec2208e196d4ad","path":"ResourceBundle-app_settings_privacy-app_settings-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98aaa57944349cafc01450ca9ee326bed4","name":"Support Files","path":"../../../../Pods/Target Support Files/app_settings","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e04b5323e0d0bdf3b22fdaa14ce45ae3","name":"app_settings","path":"../.symlinks/plugins/app_settings/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e982f6dd2634fb467a93787bdea5788bf12","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98907782cde961601e7eb5c0486a5b08fc","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988b277c50dfc4a3e82554f2a10e35eda7","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983ef0ea0d8027d33bfaabcb40b6b63fca","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f76a3f826db660164ea4e58a8e9db313","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98241b0eb8251c7ab8760735e4b7231185","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981cddc05486d742776651509876719ffb","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f163409ae91c50e2c1f69fbadc8821f3","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981214cf7b70026b3b7133e703a3e81b3c","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d82881cb26a943fa58b54b71c0b83c22","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ccc38113989cb0b1fbb7305caa3b369e","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983f47ad0c78c21eaa69ac826aaaf10a6e","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98099d298f0f61dcbb06e078f11764f1ef","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984a851565313bd39d4f6b6112f363422c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9862555adfe5832a41f6fc4b1a79cfd9e9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a6be0c65d0b3b994d6569761ec2f228e","name":"..","path":".pub-cache","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982078aae39ae683382f05de711a185375","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation/Camera.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f60a8d6ef410a8896e992632f5a8d7ab","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation/CameraPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9831ffb27713bc35caf090dde2758982a0","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation/DefaultCamera.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e5dd02315188486cffb3b793528ee079","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation/QueueUtils.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98f6c9672891824c16c7e6f777ea17fc85","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98405619e08eb70b9dac88141b45809428","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/CameraProperties.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98dcb3e4b3f551bf7e25dfd5bbe6837c44","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTAssetWriter.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a03e14e92e8450839f90b1192ebe60f9","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCam.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989ae78c91c7fe89bf08cd07030744a390","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCamConfiguration.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987cc915a467358158a059f6a1005df343","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCameraDeviceDiscovering.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981c411b19a591008768a1751626bec02c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCameraPermissionManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e7037d382b9763757e10e512c62f1916","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCamMediaSettingsAVWrapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98121c74ca9aaca4dbb8b55621309a9732","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCaptureConnection.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980bd9f3a524e2e4dba9733fa90f4aac3b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCaptureDevice.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98903b72cc5b5c782aaff128c3205f4efe","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCaptureDeviceFormat.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989d8f330e18415a31deb52b2bed8a2137","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCapturePhotoOutput.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984824be8742f3e743f090fe6c33d6ef75","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCaptureSession.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ea07288fba88427eaf97221cb0a082ea","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTCaptureVideoDataOutput.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c741b00c0189ecdcede99a30c61cf5ca","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTDeviceOrientationProviding.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b6418130a13953d8c503f48653d8efa3","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTFormatUtils.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b2170aed3422e923d0c594950dc68411","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTImageStreamHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98df6cdfb488e9420dcab5902c4835df8f","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTPermissionServicing.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982a862aae24ada2357f02abc8f69dfd4e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTSavePhotoDelegate.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9867161938a759dfccd8e5a78c167a3c1d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTThreadSafeEventChannel.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9805a0d5448fe595b27ad6b8273406e808","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/FLTWritableData.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983e9ded2512976d1035610e24a7a82a62","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/messages.g.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9851599d94c80ec88693114889217d19ec","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/QueueUtils.m","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988a496b0b1313fdf74b9c7b937fa522af","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/camera_avfoundation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bec2388e2d0f9bf3dcc989355dae261c","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/CameraProperties.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d376cf7afbf6b4a27ea861e42e9e18a","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTAssetWriter.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bdcc6ea8f95ca3d31fda7ca6d0ec07bf","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCam.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98061b944840a544e7c2244b7dec0cea3c","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCam_Test.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9884ca4421e20e7795c8f05c67c31cd7a6","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCamConfiguration.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981307d949f1eec051061c3f81e12003be","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCameraDeviceDiscovering.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b73d4fa19990e40f5ed65965564379bb","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCameraPermissionManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9806d75717294b36105ee335141a42c17c","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCamMediaSettingsAVWrapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981fbc9e9c8a4aa0a1eaacee019fdbf2f4","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureConnection.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989b272d09f5b565b076e8b0a8a66fb95c","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureDevice.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bbc3cd20c75ab4d15083fe2822084151","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureDeviceFormat.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9827732205233ea745d3d17d702bae0902","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureOutput.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98aa00a66f606a5894ff7b9c4193c2336d","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCapturePhotoOutput.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9805f59dff71b98dff44bcb35e99826611","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureSession.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f88bdf71c2ece055e64ef37dfcb946a1","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTCaptureVideoDataOutput.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b5b5f640e4853c81fca0b5da550bdcf5","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTDeviceOrientationProviding.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9841f506e6acdddbc3a5d078988dde4c22","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTEventChannel.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9877689363904fdc263f22d395bf46b7ff","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTFormatUtils.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98dc0df62ffc0de3ec3f484ffd1a9ef4da","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTImageStreamHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d2795a25b9f9f995f8a6605e26802aa1","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTPermissionServicing.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c013c9fa841e7f4843f3a4bde01ca879","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTSavePhotoDelegate.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98646bcd0bc1969f167312816d9267a516","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTSavePhotoDelegate_Test.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d35201bc6359822c132fbf3930cae9a9","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTThreadSafeEventChannel.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98df47c568f003e0086d5a88268b6eb7a7","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/FLTWritableData.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bd068a0e6483485d78dc23696eba3638","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/messages.g.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9809496e61d8f399d92800b33bdded072b","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation/Sources/camera_avfoundation_objc/include/camera_avfoundation/QueueUtils.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98720dd63de74ad024614aa4abb19e519d","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9833e1da7d2aa110d3c3d45110325a6233","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980fb268c16bb3797c2019ef9db59e0048","name":"camera_avfoundation_objc","path":"camera_avfoundation_objc","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9849f52d038cfbc22f3b9dacdb87e6e2de","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9873401c8405e805e3bc3993de725e7df2","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985a688ab6bfba7266f08b9f5e5c53dbec","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98867ada4264934aebf36f89cb19518fb0","name":"camera_avfoundation","path":"camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eb40b1e369b2fcc9a5eec48da27f28ba","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9838b67d3e6e5a6033efe85aaf811aef69","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e9c1db63f6999b893a6331e42325c7d7","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983270c1ce1714080d15920ec308e831da","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9814e32b562c195bfdc400e4a9d9e51712","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbb3e378d0e8174deba4355285c9e1da","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98900ef292b8660e0c41c98d05dcf446f4","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987f5cd018d276006bc73477d3afda0cf0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9842880957de531609d7c9f73bd4d95f3c","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9896535628810cd04acd2a97306ca82274","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c73ca0370b3b8cdb5a88e7f675303ccc","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d2d84f26aae453043067979ccdc88d7b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9823dcb1c7b5c292debaa1ba714d4913ac","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fa32e371169eb70bcc78011edeffdce2","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9848a3f6690a788534c9add8c45820fd84","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/ios/camera_avfoundation.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9843698f9b7a15e52408cc7c1082d32940","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/camera_avfoundation-0.9.21+2/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e32012cf02cb775fd480ab488b49aa25","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98b075b472a37c0cb498df8a9c1bbfabb6","path":"camera_avfoundation.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986340a78c7da800e0528a24e97f21d303","path":"camera_avfoundation-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e9d27d157c4759fc3f852f5aaf9f770f","path":"camera_avfoundation-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cdce89c428e61807b80568c28f8cf4df","path":"camera_avfoundation-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98571a31becba8fba4259df5e7da0ef95b","path":"camera_avfoundation-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e983535bec86897f82e29e35c2a37087d79","path":"camera_avfoundation.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e989ea7a1b7622f37728c5db7b6902fabc9","path":"camera_avfoundation.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ba4b8152da8f221e2c3ae3f513312ae3","path":"ResourceBundle-camera_avfoundation_privacy-camera_avfoundation-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981b9b5b0f8efbde555b4b2d16e08422df","name":"Support Files","path":"../../../../Pods/Target Support Files/camera_avfoundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98868ea2c0aec702c3eb3c44293cfe342b","name":"camera_avfoundation","path":"../.symlinks/plugins/camera_avfoundation/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a14950a917a0df000272111b3af00e58","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources/device_info_plus/DeviceIdentifiers.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f1edbc3ed8b2196eaa0d7f969ebdde47","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources/device_info_plus/FPPDeviceInfoPlusPlugin.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98c10991a7301e313966d8722e62961e70","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources/device_info_plus/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bd45822b13e3ce1eed9c6622596d0bb0","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources/device_info_plus/include/device_info_plus/DeviceIdentifiers.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c2d16edfd8321a1d2a6421b3cbc221c7","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources/device_info_plus/include/device_info_plus/FPPDeviceInfoPlusPlugin.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98a36f478c28e4c74c87e6789b6bda487b","name":"device_info_plus","path":"device_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988ccc673f6900230d346706c867dff96c","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983114e333923452f967f09fd557bec68c","name":"device_info_plus","path":"device_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a48dad5e47a6c3b4008dd269a358f2dc","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9892a23ed194e0fbac325f6866b93f390a","name":"device_info_plus","path":"device_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983b2b17f4bf00ad4702021bf744c70b33","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fe5b97c828eb8d8d42456a4d3d485187","name":"device_info_plus","path":"device_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98232f37c0ef599d3c2a7a9ff7af2c9eb9","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9805222b040a2619c7ab29391e344a705d","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9895fded9ebca0746ccb4be19405fbf727","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98241b2e715d2657ff7f9a34c2f332cd25","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d57295f821f5d909f74a1e93793bf30a","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986248d8602b7dff2c11a5e9c877bcbd7a","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981819dbd6c107d3de474ab2728b424117","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982070bfc5818879e8e22cae46e614aa5b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e5e96b78a60f6211aeee0b626360de68","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98edd2f48e225e6aaa855ea062d46604d3","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9807f3830ccb1a100cca5b3cd98ecfb9c4","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989dd701511f33509e51d9d787c4a844b7","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c3f3a9b09503921fb15ebb9377f8c928","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983cd44b39da9ed60b459eaeab065e1f3f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9880ed93f98b6c01706770e2e4ae63126c","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98e99d8fc33ed917a25369652f285edca4","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/ios/device_info_plus.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98ac11e22a794ad2d0d45851ed7b46b7c7","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/device_info_plus-11.4.0/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98007e8ca70d89e97ce0481f2cd3db9d21","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e980cf749b6e02f8e783a05b1810ab2520a","path":"device_info_plus.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9807f6b982d3ceb175b963a37c743705ca","path":"device_info_plus-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e984b05d44895ac38c0aee2a39267e26c58","path":"device_info_plus-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9855d928725338010b58bc023bf60c7982","path":"device_info_plus-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9835406ea787e507a99238a6afb0ce83bf","path":"device_info_plus-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c5ea3636852338c982e52209ddd197d0","path":"device_info_plus.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c321042b295c1853a19a7fc9918a7454","path":"device_info_plus.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e560abfc525c03080899e7db2c340f05","path":"ResourceBundle-device_info_plus_privacy-device_info_plus-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980a0143b7abe232a638c3e436c9c85b04","name":"Support Files","path":"../../../../Pods/Target Support Files/device_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989c60fe42b61655fae2fe43bdf7932aaf","name":"device_info_plus","path":"../.symlinks/plugins/device_info_plus/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981339c3a7ce270306613c6cbf72ac67cd","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/FileInfo.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9801fd6a14089a47c1e1b32718bdf22178","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/FilePickerPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986778635029f602b4f750099540bf2fc6","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/FileUtils.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bfd42a1232cd7e5dc79651040aca6fa8","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/ImageUtils.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98b551b0a25b90abd62be165059ca67d67","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98194a7baf55c88f6759045c696de2d397","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker-umbrella.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f2597b2bfcfbe350f782de7028884db9","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker/FileInfo.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9848c85bbc8fed7f463b54a8a831976dcb","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker/FilePickerPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980bb97ec29a5da2b10289db8377230b28","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker/FileUtils.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9815da8454f786c30d7b23218e31792c1f","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker/ImageUtils.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e987ec33e1da9908dbb8ee4c30e837b13e3","name":"file_picker","path":"file_picker","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98508440893bd5066e3ed1a7c01d72713f","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98876ccbed581dfb1ccf9cb46b0dcef1ac","name":"file_picker","path":"file_picker","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9876238cc084bb01942c389c823e08ba8e","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9825253bdf39f4939aa9d309bad44cd90e","name":"file_picker","path":"file_picker","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98204b4c48a8401aeeb2c66d9da2dc6406","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987af8e00fed6cfb19c85be586fb50af29","name":"file_picker","path":"file_picker","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98af20fe2d494dee2b229dff5de201c31d","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b8d348eb13875215537f678da0e57cd9","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c329f592babb941bd0763b1c29ce4315","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ae0c00c2af685d25f88eb893e62a30b9","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98adc3e4d983100667be4dee2b80d0dfc6","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984571879cbdba5837952da95d61733458","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98086cdd35191d4e5c012daa4ec75a907a","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988f4b179bf3118ebc76c9bd5515b59302","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98753ef7b019af866f654b60914c737b0b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cf4df5d694361eaf7ac7886f24593f44","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9853314b05f9d7966a9967a7b09d288fda","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d08d2178502ea4607f6e2f4952d5dd61","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b370b5aeb90be8635fad89141f9cb533","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ef196c3b56089166e1172c7e48cb7973","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ced152461fa73008f07b089d6eadb4f3","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e984dcd2513e8f43ff19eec26a338dd1a2b","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker/Sources/file_picker/include/file_picker.modulemap","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e985f9564a0a4b3e872fc7a2dd8cd1eb5ff","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/ios/file_picker.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e989fdf3c52996ab43f52e59c5173f22c1d","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_picker-10.1.9/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e989432d8dee89a4175d16eba8758c97325","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9824779eff23f0e074f7df07c4155cef03","path":"file_picker.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d5f93b22efc88a714a54d4c0f0e25b81","path":"file_picker-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e77bdbd62eeb428668775386c90f3736","path":"file_picker-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980b7fc2d4c6b3db79d638479249afd0ba","path":"file_picker-prefix.pch","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e980e6a79d9461f52673e9cd16e5e9ce12b","path":"file_picker.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9855ea28d68c6105425b28b0dc67fbf53b","path":"file_picker.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ef2de4f3fb1ffd72ab2c607dd8196a86","path":"ResourceBundle-file_picker_ios_privacy-file_picker-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ed67d9ccf470b161929b2089bd3d76e0","name":"Support Files","path":"../../../../Pods/Target Support Files/file_picker","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98457261c914b5712a0c81b7b673210d45","name":"file_picker","path":"../.symlinks/plugins/file_picker/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dc2b0e58e1746182ef03bafc59d5834f","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios/Classes/Dialog.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ff33475189cdb687ddb89ac3219b5661","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios/Classes/FileSaverPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ddd81e0874cadf29b2be4336e4173aaf","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios/Classes/FileSaverPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986d800696c536df7c30346254f4e8cf2a","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios/Classes/SwiftFileSaverPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9815659e089ff36a5bee530818f43fbcb7","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d4aebdd7893e3b8cb089d50ca9b4bc78","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e6d7d8cbf3b5ec411c67c1f03fe81ead","name":"file_saver","path":"file_saver","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aafb9d1e47f6452625d310831d69dddf","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98099c89238181468086df85246b398b85","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9847f9e04d2f254a8af26cb75921d3299b","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ab82ab63c3848d1a0a7ed78d67d5da4e","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b7cf840946693dab6a74f830612074e9","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9860ffc888692e201c70ed64468e588547","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c2d1131dc6f4976e4d3ab6f4176bb3de","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984c791f289c18e2e4a16e5d8fa411c975","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983faeb485f301a9e52bf1bb69ba50ad91","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b434ad4133669ae4f6a08cb4e16d1b46","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cbcf96434e5a7a4b6d5a57177315499a","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980343e6b54eb1617a0d8fe398a6533dcb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988198233d35ce8b6c3ebb9ad34b8bbd83","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9825bd1584ea6cd4b633f757b2d188df26","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/ios/file_saver.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98be8ad76d02f75772a3daccc4dc4bd919","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_saver-0.3.1/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d51c541c07ea154916a1264b33490194","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e989257c31a5aedd8cbb19c763c9e8f796e","path":"file_saver.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e9b49b292faafa97f299b4d375bb94e8","path":"file_saver-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98afdb65ab8153857d00d3058fef46ef65","path":"file_saver-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c3048b85162d65fa5f89103599a57d7f","path":"file_saver-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988f5f13c3729537a5e4850a3184ef1504","path":"file_saver-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9862b76e562a43dac8471f624a5cd9d3f8","path":"file_saver.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98344086c33f6b20ad518611d4b42807b0","path":"file_saver.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98400a94e16fad4b8af7b4e60ab51c11df","name":"Support Files","path":"../../../../Pods/Target Support Files/file_saver","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984bfa932ae3b4edac96a7310960837f24","name":"file_saver","path":"../.symlinks/plugins/file_saver/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9829fbee1379c76a8f9639197078562c42","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios/Sources/file_selector_ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98507f8f34c468201e4a5bd4c96ef42b4b","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986ee0a3df2feb3af8fc441fe81a045863","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98afe351d95e6d56fb7d6e1926d0bc16c1","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e2bb22e2b6e057e7a42bfecc709a093f","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f8f4bdacf126ec47df60ba4953e1eb6e","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982e7e37300e43e96cb98a05aadc3bbc49","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988551db43a644178c4426a752151e8daf","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989b41c5a386d48a0b9781d40539831e9d","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9860e60b3396bf587cf7e3881b72ff918a","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dc89a1a75464472b23df731aee581a25","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980311fb2e79751151e623b7fd57d7fdff","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989a8e9a9d9f60722b296838fc82cf42ab","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98256aa9c17d570110e0beabc2f63ed1be","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98295899a4f9811e1bf954b10afc74c580","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f0ea88b68751cab794b769dc586bd419","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios/Sources/file_selector_ios/FileSelectorPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981d83a354ff745f0961d1610ff6de246a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios/Sources/file_selector_ios/messages.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98179ec458b3b02e28a62624469e6b3a80","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios/Sources/file_selector_ios/ViewPresenter.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985325558c396579d5a0998664ac0536ce","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9852ed467fbc4a63c5a9875642f31ac8d8","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f73f6a770a7a6bde630a133ebafed198","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985f061352dd57853318525a163e622d61","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98de7c5b0b652730d3cef22285ad226ace","name":"file_selector_ios","path":"file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981fde57e4d630f694ad318aa71b0c0ac2","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980daa7ba2676ab006d9bdaa50e8bf3e7f","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9898c49504ad2de913f1c38e3802a21ed8","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9840dc9570b973353d8fafc8b5f6bb4020","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a36c35510ef07657da1eda88c2ad136e","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9800bdb19987b89731ec900cf46c7d72fb","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fc436f922c705674880aa06b040181b9","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98567f33f5ac28e20caa07498eb380b103","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bc048ab2780b32d4a6b86c99601be916","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9816e498c459b4f09f5c4c2feb907c85d6","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9802aa9bfe13ebb25b8fb6245d7d520a0d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982bd06e41d732a5c90627c4807cd83d4d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9874cffb2cc2072f394f34138a88466826","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98733c2da0ac2206061d0f27c458e2a4eb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988977a0a3c8225e1d387342c56f44688c","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98359cebf352a3518635389663c1f7a510","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/ios/file_selector_ios.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98ed9f8e4fd8e348d71e2afdc4b73c98bb","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/file_selector_ios-0.5.3+2/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98c5dee314251dd376898dcecc730dea89","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98b3f56de7e9056dca05895f8157e6d185","path":"file_selector_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c109472dcd25a3e59c31080f0ebdf811","path":"file_selector_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e983d14e1b4813a27bcd54316850245ae19","path":"file_selector_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9870d9c2c42e712e711980fdc6bb373bf6","path":"file_selector_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9844d411eb7b3f7cc8e9589148720c721a","path":"file_selector_ios-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e982b66b547d250357cf91d1817df7cb423","path":"file_selector_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98f68cdcb857b34033c4bd7d63083cfeef","path":"file_selector_ios.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9812c099916240a2b77dcfb319effe267a","path":"ResourceBundle-file_selector_ios_privacy-file_selector_ios-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985babe41be37b5ab0444cb57623720986","name":"Support Files","path":"../../../../Pods/Target Support Files/file_selector_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98107535039bfff6c5c3c358e9a299f06e","name":"file_selector_ios","path":"../.symlinks/plugins/file_selector_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98157eaa509705c5a0a8cf3ea2683f01c3","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9811391913961f2b0ab6847057591d15a2","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProviderFactory.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988426fad311447aa6640aeb8b4fe3b1d2","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/FLTFirebaseAppCheckPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986cf945052e9a5cc9cf921ff7b6631624","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/FLTTokenRefreshStreamHandler.m","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987257dfc73b43963823ab3e833020d53b","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/include/FLTAppCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e6e862ae88920fd2aa08c4d49b573983","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/include/FLTAppCheckProviderFactory.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9872317cb485910fd1580965e87f2fb858","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/include/FLTFirebaseAppCheckPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980c7e27df05ae77bf0663c37468ec4d68","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources/firebase_app_check/include/FLTTokenRefreshStreamHandler.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98564cbd84e342d2634ffbe1403141db62","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f83b499872a81ddce8a470a21cd946dc","name":"firebase_app_check","path":"firebase_app_check","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981ec7b586de1bbbfb2e5eb5afd0e6deba","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98981359a205b2897b4a0d0e46108f0341","name":"firebase_app_check","path":"firebase_app_check","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d3d0143f5e5f4a3ce09b9b7e63d97e56","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987d4475d9485b3f2a9a12772af3ed9894","name":"firebase_app_check","path":"firebase_app_check","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bb1b77d43ad6ecddb49404e1d3682124","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f36e3f7d6876ec318283ffecdab3107b","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aa9a1a5f3db45001bebdce1fde36d727","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aba650793e06d81d390c0775d7a81b29","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983a52d319578d9d10b8d52643bed7e195","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a638b971fcad8c56f52b163de6f696b8","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984e18da2ecf2e80176dcb9cb8b29d310c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983658cf26719deeda9913fc12baf6d77b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98735a4ee8c6a39809e6473f773fcd82e4","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987fdb79a4ac09a13bebcf786f26aaed22","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9890da5e363aa4e4f2945eb226a050a96d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983c71bc945af531d92aa843a6039c94c9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987b761a8f9efe17c9331540deab200caa","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ffd3ab3d1b3687a2fe92b627fda8631e","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98511b0c271f946a7bcd65c0200b4c4ba7","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98612a9b3c58bbaa0aac92bb05e45f03c0","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/ios/firebase_app_check.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98349e639efc819bf8f3b41a18d6c0c6ad","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_app_check-0.4.1+2/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985a160f4e68a8315154c9105d8fa9512e","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98e110ba9f039db5afe23ccf33b7dd7621","path":"firebase_app_check.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b3b0eb48012053daff698e8d2eecd384","path":"firebase_app_check-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9850170c0ec5e7dd0abfa10964ebf7e97d","path":"firebase_app_check-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9885d0d93c676ce6b51858cb35fc28982f","path":"firebase_app_check-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d6d26726976b2e08a5c89968805d3304","path":"firebase_app_check-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c25cf455db1669644df3712dd48f7fb4","path":"firebase_app_check.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e912e07d424cdf8e7522667434d5bd3f","path":"firebase_app_check.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e983e873219b4c28f6aa94cae144a02fbc2","name":"Support Files","path":"../../../../Pods/Target Support Files/firebase_app_check","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9872628f55a9c36767bf41234cfc6edce2","name":"firebase_app_check","path":"../.symlinks/plugins/firebase_app_check/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985f541d6ffe1082b2902e65204c08509d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98eb223ecb002d14c77278863d78c4c318","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9810eacf503f471242fc9c2cd78a82403c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982532bb5826be388841ede9effca1df18","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988936fde4a4450628a9e214e0ddf0d394","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98347fb9c4a5c7c79fec72e40d077e4345","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9827bee845e2266de322863f00bfdc2a26","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983b118aa12a63ca9f9945efeaf253ff7b","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e5b528b032881616d1c665dec13dafa8","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982864d491b842dd5124ecf14b972d65b6","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981e72e46c04aafea5aa972ae5ea48241d","name":"Private","path":"Private","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f0e96d34aebeddb83a8166ed2181b114","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c3935a7024d5af57e2ec647f59ad2f2d","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a49b0809685262c84b0c7c8e57a010be","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988689674edf888352c71bf40c2d6f06d8","name":"Public","path":"Public","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9890cc3cf56c4ecf56185609200fef724d","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b91537a86d8ff142a9a71b8543239399","name":"firebase_auth","path":"firebase_auth","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980c63fca4d0b30ac0d7cfade6fd7baa20","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983a2957f31c0fb614c2422385ab6155f4","name":"firebase_auth","path":"firebase_auth","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981d60c05c946f47724bdb454d7de281ef","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98229e2b9089e61e9eabb1f4a499a64615","name":"firebase_auth","path":"firebase_auth","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986a0fa468b029d67c97345fb834bc931a","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98741c70ed9ad1eb5fbdd778fd4484be0a","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dd9bf61fb0655d366bbc1c3e855eac94","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98478621876b3c3d888f232c66debf4bec","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b66211302ba1386603286639e59770c4","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98228eedd3ba4ec4acd830d20161e362cc","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b185c6679d8573a0ffd09d5579ae11f8","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a1e73a8aaf7ce19a5d84eeeaccc32dfb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987fe2023fc5ff68aa1da0fdeca7b0df29","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987647079dd59585983c77beee248d10e7","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986b054a87f6e233291b07e9f149bc3a0e","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ce4ff64aeb7fe05be2de2df043bdfa3b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b62dae0d7686e4c073aa785c0a7d688a","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988b12bbefe94fd8ef4e4519d37fd1749a","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9887b26a9570a167c9446e05aeab24c807","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98ce17bcb37ce91b48392f21e3b8f53153","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/ios/firebase_auth.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9878d157505d191a41a233bd57c85dc7c6","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_auth-6.1.2/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98250a038d829d93037b230634d8fcfe74","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e989de135d90bfbb20369e2dc6ad3c0745d","path":"firebase_auth.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f9755ae3b2d4cab1fb3158b533f2c9d1","path":"firebase_auth-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c7f50bbff88343cda26e3c4a52387742","path":"firebase_auth-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9851c7bbdf5b67faf577e1d1d8eddb6f2a","path":"firebase_auth-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983fadff5bdce928842849d4dcd99e8422","path":"firebase_auth-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9895b607e38dd439202402e1eb97e7bfe3","path":"firebase_auth.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e987f882ba03ab88d6bb0c7d3cbdee44856","path":"firebase_auth.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98016135d329d6ef78ce73bc76958be3d5","name":"Support Files","path":"../../../../Pods/Target Support Files/firebase_auth","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c171ded7240f41b51a6f2138ba58edc7","name":"firebase_auth","path":"../.symlinks/plugins/firebase_auth/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98601b2da428ba75eb289e1c54c7e54ac2","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/dummy.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9807da482b8ec6e4d8948d658c8bdf02e5","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/FLTFirebaseCorePlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989977ba840e207e56a3bdbda80a4d8615","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/FLTFirebasePlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f5cce0e89494288c3baf0f38b30e399f","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/FLTFirebasePluginRegistry.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9878e159148fb5c54711d45b5262f445b4","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/messages.g.m","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987dfea0c140a7a0ea66e66dcf646b175b","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/include/firebase_core/dummy.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b2eb7b9f5e3786b97a3a72dd22421a5e","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebaseCorePlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f772990796156a555335464dc3c777ca","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f3bd2cacbaac9079f1396cb3fa6d0e27","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/include/firebase_core/FLTFirebasePluginRegistry.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9867153d6814ea6c8bee7037d6d146ce78","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources/firebase_core/include/firebase_core/messages.g.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9865b7968e761564e08d12c9baa7a054db","name":"firebase_core","path":"firebase_core","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9883a0b4ef9a2e69c000683ea94de10c73","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9892eccf4f3b7fa905e15ef08d0ece99fa","name":"firebase_core","path":"firebase_core","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c2dffe17be86963f22d459ed1d86418b","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9891358efa3d3e96f174405fead3a13ae2","name":"firebase_core","path":"firebase_core","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98502b12fb82269c9c0b8fb45094229336","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981bbb0d29bf97b1d72e684b0b138cda31","name":"firebase_core","path":"firebase_core","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98448bc5db7077b4318118247985e9706c","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a8c1e5487da4a3a2b3cc746df3c71d97","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9850fe7df43146e3a935e2a013f5ca1764","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98135505935bca92d9516e6903e6b1571a","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98692ed695e9bf9ef940975e909acd6638","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9890f352f6bbf5e1270326ef1fe0d88d88","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9801539e7991909202027b2e1fc36bdf88","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a30283f68c11da265135eb85954528f5","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98178b6dde2c1b75f36da1ef9fa891985b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987a6b9ef64f37e718251dd126ecc57e99","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981b7e3d9c7086a471cf27b040c59ab89f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d5c64535fce20f343aadb66d204e6778","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9836f9e6541249e85036c90cafd1fd27c8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cc7654428522c87bf7bea58d5fc1c95d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9897d6d766394d9dba4af94ccd75caf4b8","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9853ba03282c86f64e463a449b10b6feb1","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/ios/firebase_core.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e981c7364f8c5643856b3049712de31e099","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/firebase_core-4.4.0/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98f99ef99c04ea749b9b7bc097d01f2c2d","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e986cbc2b6bb34ce8d05827fd1947dc4b53","path":"firebase_core.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a993adacba3286d6cf47f3ca504b1406","path":"firebase_core-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98007f03499a039437f1f99bde28395952","path":"firebase_core-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98aecf6fabd4fa4b1c8ffda5f839904465","path":"firebase_core-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b775542e692f38065f43634092d616ce","path":"firebase_core-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98b022d73df32750d90180fee080a0f7d1","path":"firebase_core.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9808ccd97494fd54f1603a316a163aab94","path":"firebase_core.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9877290915f01301806d110f784aa47c34","name":"Support Files","path":"../../../../Pods/Target Support Files/firebase_core","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982c77c79f8d278ef39cf766a1ab2e35c4","name":"firebase_core","path":"../.symlinks/plugins/firebase_core/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a8bcf9b778aff46eca5e22cafa52131b","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios/Classes/FlDownloaderPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98914c048b53a42f42ba49718548e5cd81","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios/Classes/FlDownloaderPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9851df058efa51527351690153e2e7a913","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios/Classes/SwiftFlDownloaderPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d475df7a54432602f65236f0001dcb78","name":"Classes","path":"Classes","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9831fe485b45a69a8422a609fface14279","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9803405e5102a3ee40cbb4583ab5ca6eec","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fef6ddba1b5e1232a9d6d37983179d87","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98964ba06116a1df14720bb9048a88f165","name":"fl_downloader","path":"fl_downloader","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f34f778596ab56ad4e8931ed917554f7","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9817008544f61b16a1efdcc47dbaba93be","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98297a87ebe04307afc7e2d74dd6dcab72","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9882ae3c175903986a074928722796df5a","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cf035c538d2f0b99ec303fb4744ef49e","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f3e54afb40aae197eddcd74c76d2df0f","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9876dbca351375c820c41118bb9cf9561c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e7ec519797345e1f834899777e5441ea","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c1408300b02654c8b20066c91bc8b79c","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dc96525f14f17580f9e3a5051189fa9c","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b1adba523e0f600659236656a2385897","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980d2e7dc4cebf78c19af905a8474b3d9e","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ae79df9b7e9fb8e31f39f9c108119a8b","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98ddb20a4fc1d66afd701be5f8a445437f","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/ios/fl_downloader.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9868eecf589861f1e12ff1b3335e246971","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/fl_downloader-2.0.2/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98161c2e9c04b3bb3a64da701c20bd918d","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e982efdc85ce2f64d67f95747c395e92b1d","path":"fl_downloader.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9841face9f91cced866f2eca4a4b6c1da2","path":"fl_downloader-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e988fccddba73755faa02856c09466bd235","path":"fl_downloader-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98289ec58bc3b1befc6553881b2fb56fc8","path":"fl_downloader-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e9683ad27cd35a81b03f764dc06cfad0","path":"fl_downloader-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984e4a588da55ed3c53fbd1e10e58fd1c6","path":"fl_downloader.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c91d9e268657e7dd6c060d3e603cc2b1","path":"fl_downloader.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9889b843431f88debf830b71694c181718","path":"ResourceBundle-fl_downloader_privacy-fl_downloader-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98770c68ab7d9e26ed5320fdf79e4127eb","name":"Support Files","path":"../../../../Pods/Target Support Files/fl_downloader","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e535f7f89dcf23e627ce560fcbf27f07","name":"fl_downloader","path":"../.symlinks/plugins/fl_downloader/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98878ac19076103d7e2a82471b805965be","path":"Flutter.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d5cf7725c652e90a9f4af34bcd4e69ed","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98dcbcbc7a5e77c993122880547c8ba2bb","path":"Flutter.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e982275ed66a3f7f3088878aa0c9e2d181a","path":"Flutter.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988e42623e005514899b0b1ea654daa4be","name":"Support Files","path":"../Pods/Target Support Files/Flutter","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9848bfce14ccc39b7a75fedcbde12a921f","name":"Flutter","path":"../Flutter","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ed4c5781f08ac474801af38d03dae69c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/ios/flutter_native_splash/Sources/flutter_native_splash/FlutterNativeSplashPlugin.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98fe3a5ec7d39edfd3a806d5f27e4564cd","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/ios/flutter_native_splash/Sources/flutter_native_splash/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f50f5cea49c7a2be171197f72c2cb1ad","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/ios/flutter_native_splash/Sources/flutter_native_splash/include/flutter_native_splash/FlutterNativeSplashPlugin.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9808f268d5b9df60bba67b9fd0c29c05b6","name":"flutter_native_splash","path":"flutter_native_splash","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983d680a884a248fe65950f39cc3768e67","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98be78d0783dec2c0a89a792d5f05ce8dd","name":"flutter_native_splash","path":"flutter_native_splash","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e31a8fab07e05142c7d46ee4b405919e","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b418bce29d3313ae0a404593276dedf9","name":"flutter_native_splash","path":"flutter_native_splash","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ff5e907fed81d0e3e5a3a0555f6349ac","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983d4d7725d200341bb229a31bdbe06958","name":"flutter_native_splash","path":"flutter_native_splash","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9878799cdc0318e044f92f5a91b35a1096","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c0ccd530353d852c3a7ed6a0279249e6","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980dd3d0903b6a73e305a08084dff245ec","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98376cae92cf402a27fcecfee7d6dcc1cb","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a00410193349da21cc2b1f3c4034ba10","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9865cc46cc97efdb21a1483fc13cf87f48","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984022d2e4ee99326725df8769e42d4a3c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d69b98052ba5a4014becc316ac8cc287","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d10a9c1d4dc219af77c81eacc7cbfe98","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bfd72b3f36ffda8878b61c12b3d69748","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c9c621363dc6b8d5e20e054054e36150","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98951a6a7df7346cf226cf7a4b0d152f1c","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984eb6a970107be74df6b904b39de0b6ba","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98140cd6a7644ab36f518bf4ad22a7d3eb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989e2ff8efe01edbed51decf543222911c","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/ios/flutter_native_splash/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9839bcba16f3a4b5b55a1c4dbae6818d09","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/ios/flutter_native_splash.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9816d242432067f169fb5e634b8da553a4","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_native_splash-2.4.6/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981644d34b5ba12a8fcbca4e962da1a49c","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9831bb9f78ecf54ee2f2ca2622a012015a","path":"flutter_native_splash.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c166ee5988b20398d317d310c58eb4b1","path":"flutter_native_splash-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98eb2ed9da81ceef0af7f4a8b579f6dc40","path":"flutter_native_splash-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a242fee531fc9ef1ddaaaa74fcf205ae","path":"flutter_native_splash-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c086e8c7ed209047f486aa181b9d15d3","path":"flutter_native_splash-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984615091c333da42672bfd26263153e2c","path":"flutter_native_splash.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98eccf4b0b561ffd1dcb573fa88f797247","path":"flutter_native_splash.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e47fc30ab84ee592f9392f7679ce4df2","path":"ResourceBundle-flutter_native_splash_privacy-flutter_native_splash-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ba002b704616ff51eccbbf740cc19d4a","name":"Support Files","path":"../../../../Pods/Target Support Files/flutter_native_splash","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9884625c55b5029f9d3ac00695d3ec4f1d","name":"flutter_native_splash","path":"../.symlinks/plugins/flutter_native_splash/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98273545ef5ac201300b0bb57c4690f008","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/AudioCategory.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988f4f0b636ec4f957216c6e152d4e6b99","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/AudioCategoryOptions.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98497ea7215b16a92c8bf53dd577da1a03","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/AudioModes.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98df53373bea73f458559a5c4b8e8a4d93","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/FlutterTtsPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bfeb1e815de07bb393e068cd889f2c82","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/FlutterTtsPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989645eb0ac136e2e344e1b31f8f5743b7","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/Classes/SwiftFlutterTtsPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e795de7ad9d01eca4e8106970b494fc2","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9896bf9785b74e587bc9e91fbb4da8a435","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9858a83b402bb384dd6952816528fa7bbf","name":"flutter_tts","path":"flutter_tts","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98025b02f52f99e3decaab62aa1a291023","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9836d8083626fc0dc75b7b8e541ffd9e45","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982c279b3e418919ef5f065730bf07a3c1","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b3c3cf9f62fc1da56d8b6bff85524539","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a0b564e42e305c647ab1881da5a03693","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98299ed66fcf0e4be7c0ec188b0d43e29f","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a3cf26d212ebef093548b626061332e3","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98269a01fd0639d9a3e9e948f82caf0f60","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98941778a8285fce310defd4a5d3efddf1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9813b3dae129ca362ee7543b76405999f1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e94adf6fc7d648ea52858ddd73e2e4a5","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a4697b90150da6f09c432db7f33c8897","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98966cd8c92fd96e89dc448540e3d8724f","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e984197658a19c08e23c61b5ca21864856e","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/ios/flutter_tts.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9850213c3e5ab4d6823caa18df0c548483","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/flutter_tts-4.2.3/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e982c885b13886e6ac5b7c770330e1994b4","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98664d028a9be00addb39c144173cd67aa","path":"flutter_tts.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b11e2a9ab729e7e8322eb0a54ccd2fb5","path":"flutter_tts-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98bb1e92c4af064ddec8a8064aea018b35","path":"flutter_tts-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ba1a138da2847d5260f85431acbaf697","path":"flutter_tts-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9825cfe228bef73c17089a941802e513b1","path":"flutter_tts-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98b8e89d3c9864142bc7587bc7895448f7","path":"flutter_tts.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98111c994b75369b574157edb8fabcd0dc","path":"flutter_tts.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9850a5c296a4de5727af3ec2b788a12c81","name":"Support Files","path":"../../../../Pods/Target Support Files/flutter_tts","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985664ee4df152ddc248af7315dbd9e2a9","name":"flutter_tts","path":"../.symlinks/plugins/flutter_tts/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ecf8248839ba4e6f17d3532feb14821b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/GeolocatorPlugin.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98a5e5404fb09ecfe1c9c3cd85e3ab5448","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e067790bbee9fb9376d0c77605d73661","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Constants/ErrorCodes.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98f389d7590be5e9db0ca57c059ca0108b","name":"Constants","path":"Constants","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9825eb273bb3a088732d81eeb1c19af553","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Handlers/GeolocationHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a8a273d3c64641ffd71fe5f8c04b4132","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Handlers/LocationAccuracyHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988c15f7293e9ecd2b1063ce877015924a","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Handlers/LocationServiceStreamHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989c2cb05698df9b731b1c1c1e59a898de","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Handlers/PermissionHandler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d01f765a57f90a102cc78be24a15233c","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Handlers/PositionStreamHandler.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e66506db49d7cfd1dafabb24cf81fa67","name":"Handlers","path":"Handlers","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9817d4eb1b3c3ac1e9ddcfc14974bec284","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator-umbrella.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986f7ca76bd9fb989518a0786f66daa730","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/GeolocatorPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e8c93c09dbe016d2a985868756c3daf2","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/GeolocatorPlugin_Test.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b8a07e04f908cc8061e28409eec78500","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Constants/ErrorCodes.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98564b47353e7d1bdd7258fa20cf38a285","name":"Constants","path":"Constants","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985d7e5bf3eb3e1529ebbb131e40709a84","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/GeolocationHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982a3cc027245753495848a1caefc6d9f4","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/GeolocationHandler_Test.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983f42416849bce11b33d814523ade52b1","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/LocationAccuracyHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981f6af95e734f0e05952c002243f2cb28","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/LocationServiceStreamHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98892d93e77cafda119e30c32988406d93","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/PermissionHandler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98184bfb0fe7b895691bee4935d2b5d50f","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Handlers/PositionStreamHandler.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981536bb489c24983c514c14d4cc16e595","name":"Handlers","path":"Handlers","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ae7e46b06e0aeb71210643f8094d1b27","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/ActivityTypeMapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9894545c5eb4d21f54d2b3ad4447240a56","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/AuthorizationStatusMapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d79d9d7f2df01bec5fd1e10cbe9b2f76","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/LocationAccuracyMapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981fc28c232ec55d2d1c2305e98d7bd92a","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/LocationDistanceMapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d33e281aa21213bf9ee3ca2d26a8cb52","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/LocationMapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981700891532905651a54cc9a07dd2c6b3","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/PermissionUtils.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e2f51025ce37ba6eff3a96efa381b796","path":"../../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/geolocator_apple/Utils/ServiceStatus.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985667aa0966b78f13fc94b8d52ef07069","name":"Utils","path":"Utils","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ac40486a435ceade9d60db208ec16e1b","name":"geolocator_apple","path":"geolocator_apple","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b84b1441d770b214bd709d8f5b1d3248","name":"include","path":"include","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98394614911d329fd59c3c1e287c4f7ac2","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/ActivityTypeMapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98acbd88adba80f77ca7a9d08f07fa7223","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/AuthorizationStatusMapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982ea9c75e15c2f0e5172d62007ca22170","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/LocationAccuracyMapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98230a202d71e90bc984b72ad2f09fb2f4","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/LocationDistanceMapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c64b3141b3e00a1e02e21e19f1e7eaab","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/LocationMapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982631bb95675558dfb73b76bfc58028b0","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/Utils/PermissionUtils.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981cc49838fe0b164a24b0497426ed1872","name":"Utils","path":"Utils","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9845a18a64d01086b3a5e03e0726c72ad5","name":"geolocator_apple","path":"geolocator_apple","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f8f310240676888551cbce2c4a38ad04","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985ae39fd60e91694e50d5459c5ee7554b","name":"geolocator_apple","path":"geolocator_apple","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d5416b91657cb5aadd074a2eafcb298e","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9850beea1f1eb7e3285a009c040ac337c0","name":"geolocator_apple","path":"geolocator_apple","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988381e2d6db0934bae3374082488deb07","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985987c10e62d5ae59c4d30cdfbf7dcd0c","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a675fc008b4ccd74ed68303bc64d51d3","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b262dff1a6946a390062fb8d44e8f00b","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98792dfcec259d0cb8e896589f0772723f","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986be7bd9b69c24b311636c049fd830ced","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c86148aec55a4345d66ce5d25dee1fc5","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ee55db4b9ab3c92c4677f00cc66f472f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a4cc776aa809ddbed08a35eba77ff870","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b192d0a4c1d3cbab73af086e3bc29707","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98443c081a5b6c842b7c474b70b1b6a0b1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989fdf0343f9596072ec5a0e066bd81b3d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983c0b90a4c6156242cbdc6088a1ac2755","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9893bce549659923dc4c5c1624e81ca6c8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981227750ff5a7875e98c4bf141d19a15a","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9876a2864167e24de1f0fa64edb99c0ffb","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple.podspec","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98820d0afbd7a010746242a58f46799999","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/darwin/geolocator_apple/Sources/geolocator_apple/include/GeolocatorPlugin.modulemap","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98011268945c36b9ceebbfbccceda6605e","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/geolocator_apple-2.3.13/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9804b6f8c808c7283afff93f2ea8ea9951","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e980fd6cecba834abe29b2f15b93f28d8dc","path":"geolocator_apple.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9820b9343c256beee0a1c63afec1a67796","path":"geolocator_apple-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98be534d3a4f1db11fbd07c81b7ce20a53","path":"geolocator_apple-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982f75c0f88f4beefbabfbdf79c68646d4","path":"geolocator_apple-prefix.pch","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98cca55d6c772db4d637cf770c880e5bab","path":"geolocator_apple.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98563a39b273a0c88e1e2a4a289bb4eff2","path":"geolocator_apple.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98228627942149fc66c3cc7f2f156393bc","path":"ResourceBundle-geolocator_apple_privacy-geolocator_apple-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9802ee4e2e69248bd9f3bc1cc7df1b2a72","name":"Support Files","path":"../../../../Pods/Target Support Files/geolocator_apple","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9883ddda10d177543347d7414387e6b93f","name":"geolocator_apple","path":"../.symlinks/plugins/geolocator_apple/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98de6a43df899eca99ef9a76eb3ad60a9b","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/gma_mediation_meta-1.4.1/ios/Classes/GmaMediationMetaPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988a3b9138be85eef20087693f3733b9f7","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982d2a97b6721af734cb336d4d9d14a978","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981f344dd3f0f476e94dc4032988ad21c8","name":"gma_mediation_meta","path":"gma_mediation_meta","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dde06cdf7aa79311d49d807bef0624e1","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f7c585e7d69cd1784bc451798af821ba","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ca3755d9ea9e625f6b0e1c9595df0e73","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cd07de7ece829229a5cd7f4589e9aa1b","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986c0eb47a69c5ef033ed2c06578cd755f","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98610ddb3253d894b958fd8caac55fb7c2","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98be22ace52c66610bf4fa74c9371763ee","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fc76fa81069a6d2456610d26c09ad29a","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f54631f5283fc4486540a839cd548473","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9838bf4e5370d028d02019f69e624fb766","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ce9da887ab31570c31b5be39af990c99","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987794cbefd29dcd5b55d4f24c0eb9b86b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98266a86b0874d5a77fcb3f14df27a7dad","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/gma_mediation_meta-1.4.1/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e984c9a371b4768a47036f74a85762a5756","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/gma_mediation_meta-1.4.1/ios/gma_mediation_meta.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98d440111c4f17e6cc15039d3a647ca4a1","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/gma_mediation_meta-1.4.1/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986a11c846835b0464eedb907d8a69504c","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9840c032e476c20c8ce93e53da92990570","path":"gma_mediation_meta.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984dfc7910e2cd9fac3233404165834daa","path":"gma_mediation_meta-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e984c4389c03478134caa5f9063a397ed56","path":"gma_mediation_meta-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c0926e1ab9cccf8e6f6be6ce2d92d03c","path":"gma_mediation_meta-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f8de3b0000f893d550dd9f3b81ebc5cf","path":"gma_mediation_meta-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984313c60e6f9802ff746f03392a8606c6","path":"gma_mediation_meta.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98a3553afa0a155f1b7d0b159f832c1bdf","path":"gma_mediation_meta.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986f31c7fc7caf3bdd20a857979520b8b4","name":"Support Files","path":"../../../../Pods/Target Support Files/gma_mediation_meta","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d7acdcb1524eae7cf10e61cf08cb5fdb","name":"gma_mediation_meta","path":"../.symlinks/plugins/gma_mediation_meta/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"file.xib","guid":"bfdfe7dc352907fc980b868725387e982d53de7511db5a956fe99a4cfd6a3fc6","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.xib","sourceTree":"","type":"file"},{"fileType":"file.xib","guid":"bfdfe7dc352907fc980b868725387e98fb4a1331e3e12b4a42dc22a871d90dbc","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.xib","sourceTree":"","type":"file"},{"fileType":"file.xib","guid":"bfdfe7dc352907fc980b868725387e983b2fa426a77c6733b0fe8cfa17eaaa44","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.xib","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9884fa7ea4fe0a8f9617c20bf588117864","name":"GoogleAdsMobileIosNativeTemplates","path":"GoogleAdsMobileIosNativeTemplates","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d4f0f60e1ddab0be85f75b22ed409506","name":"NativeTemplates","path":"NativeTemplates","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b9015572d98d9472a3d4483c35531f25","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aa53af110a5d2ca85b38a84f94ac5b9a","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ec9b1a5199f447b986e2adf8d0d674f4","name":"google_mobile_ads","path":"google_mobile_ads","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98376b309d1833fec568dfaf24eb9421ae","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984bb13b21c45d4120ba0107eae0515b20","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98031bd58572f072f627e4717b1dd7302d","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988adf2653fd4903237dc0df4428ff7586","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9822338e4ddc0acc85067c540dca84ad25","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aaf47f53e032b61400089f260cbd02c4","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98408c01383c6581d63d2bf947b72a631a","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988d96046b8193b5a333e1c55964adf092","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e32f3ed8f4797a454f2dd4902f43b22f","name":"..","path":".pub-cache","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984240dfeec000ca8d0ac4a90a031aaf0a","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAd_Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f5aab5940ee683a0f59b1e8870b802dc","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAd_Internal.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9890fd4326c9f214196bd5a0490007afcd","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAdInstanceManager_Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9806b9260a8591ca252226b8bacbb7c485","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAdInstanceManager_Internal.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984d482976b92aa362238438f33e1d3847","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAdUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981c6389e12e9d4a39af9fc2b794895960","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAdUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9835c6106e9c677e5754054f0a9010d0fb","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAppStateNotifier.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986b6b176839f0b199c05b9bfda1b0289a","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTAppStateNotifier.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981f6abf8441aeddf38e2ee5b6e097cc8f","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTConstants.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989cc1f81c38bb9851f4050d8234e27827","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsCollection_Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e42ceda20f7996f4f1db9cb68f5f0e82","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsCollection_Internal.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b3f9c06c5fdf0e42530f281cca9fc44f","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98220dcc23917995a27d0f53057040c555","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c6a0457f533d1b1ca15ab8a5364ef37b","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsReaderWriter_Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981d5d659ea3fece667574bfd04ef72e19","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTGoogleMobileAdsReaderWriter_Internal.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9864b4634ab3a98b02e906a6583e29134f","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTMediationExtras.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985ef5b1cd5b86a3e538a197c1ab9a9812","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTMediationNetworkExtrasProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d65e11739777d0c59cb6a89a4b9c2e57","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTMobileAds_Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986b796972877c18df3d6f5af3cab27e5c","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTMobileAds_Internal.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9816ecde728aa88cc29920a74c71a2d3db","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTNSString.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9815cfebf454d95d6d62ffbab198236c6c","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/FLTNSString.m","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9881de238705aaccdfd3c39ad39d8a29c1","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateColor.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988d7783f13036a505334aa6f36adb89c1","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateColor.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9885218f34df8f4718b80b621799778241","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateFontStyle.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983ac31ec6480613fd151e1b624e682774","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateFontStyle.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ae8af11166b7347d9e0d43f78afdb3c0","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateStyle.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982281f17e05329e9e471231e98f942168","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateStyle.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9832d9b8c3de108888f7fc0fad5d829a47","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateTextStyle.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98147317a5801ba72c5dde82a8e257712f","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateTextStyle.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98809c667f0a0b2817398014a088224434","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateType.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98760f6bc37adfc3ac8632fa54f20c218f","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/FLTNativeTemplateType.m","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987a51e4f40d97cb9adc27b2e42cc25b62","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985ae4ef538e0272a808791bf1392f7c73","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTFullScreenTemplateView.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9864317c934a174460acab2d786935fa3a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981bf4bcbaf79a603383c23645090bc955","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTMediumTemplateView.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fd894f45ca741629b38f8f4692bca46a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bb573db16d21ecd76a77b185c52f7253","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTSmallTemplateView.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b98042b15a1b65a5f73b8fcdf63acd94","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e50cbcfd7237202c92423678a691838b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/NativeTemplates/GoogleAdsMobileIosNativeTemplates/GADTTemplateView.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e22d2696fa4128be851081cad482c8ca","name":"GoogleAdsMobileIosNativeTemplates","path":"GoogleAdsMobileIosNativeTemplates","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9878f5abbe620b2e8f6a4390b145252a4d","name":"NativeTemplates","path":"NativeTemplates","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ef6f527da899ce3d0d655df4fdba772c","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/UserMessagingPlatform/FLTUserMessagingPlatformManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98048f3e8812e4b1dbde8a2d474f511920","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/UserMessagingPlatform/FLTUserMessagingPlatformManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988b4c2f093c31a9f200c8f45161df3c2a","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e0475a3f5954ad23ef9e699046810e3b","path":"../../../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/Classes/UserMessagingPlatform/FLTUserMessagingPlatformReaderWriter.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98dad257b2dc557b5727b68304c8db7c68","name":"UserMessagingPlatform","path":"UserMessagingPlatform","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98652188a5dadc38381ce172c0a890a2d9","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98316dd38887a1f93cdd4aed18b9206ca3","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989f5def3f99247a4e5f3306e4cd362673","name":"google_mobile_ads","path":"google_mobile_ads","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b5ac357f74183bc9482ddcd74b572bbd","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c2893b7d24aa0fd3a648431c7b0e9c82","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dd4d05261f2ae641fa61ddd23af5d353","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981f6ebd6d176bba55713745781b8387aa","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b37d2e32904d4a0ea297c1f290b7c606","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9887d41874091dbc0baa25eba67d3771a1","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e01d7aea4e1c42e5ae031ae391df8bee","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980b14ece76648d45a7694fdd53bc1b89e","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b52f528a2d23a47141a16e12ee3bb5f5","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983e09922b13fb7922db913c5cecb6dfc9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dcca5929f51f2ff75f3c6665deaca4b7","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9832a0b2d76a5eb8bc4df634032ddb094b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d586424c2adfb4f169f17da152584525","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98df51c537cbbedf201548e3015c045e25","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/ios/google_mobile_ads.podspec","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9862400f15c02a5ef1ec8ecfaef3f7ced3","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/google_mobile_ads-6.0.0/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988615fe3270ee13fa5314e4dbb4ab6e06","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98e39985f68bed7c23f6357cd57514a24d","path":"google_mobile_ads.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987e0d2c8d0bc0abdac28d339bd37fbf90","path":"google_mobile_ads-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e982abb331ffa780984b732eed18ee28a91","path":"google_mobile_ads-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d5e12e1d3c3b1f23c6cd830e343dc6d1","path":"google_mobile_ads-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989f6df57e9714d47de1bef126b3e8e39b","path":"google_mobile_ads-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e988dc0dcaabffa36a9e85d057769df808d","path":"google_mobile_ads.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e987e81c25c7cd2ea8e1b445f8bd4d6b142","path":"google_mobile_ads.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98f38de7551f2125889ef78735a231e53e","path":"ResourceBundle-google_mobile_ads-google_mobile_ads-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9891034568da8507d682335bda04778476","name":"Support Files","path":"../../../../Pods/Target Support Files/google_mobile_ads","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d9941c6f385413bb79945672657edd9a","name":"google_mobile_ads","path":"../.symlinks/plugins/google_mobile_ads/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e981c0fc8adcffe31e3d3685bd10445f9cd","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98da07b66e687bcbf99c81507f3fa9e64e","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982d4f84dfc677164f81435cfa43940016","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983e11ed30721e5a2cee7bce29ccffe730","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982ae8c257e1efdca417b1c8f0012899cc","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982ae444c9a0418625fe9e141afe81ea26","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984a3ab10da857c080e1cc9e25d33b2fde","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983fd00daa76d564c345b637deda52955b","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98096bcae33ae335715cbe3cb8ce9d0e13","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986e563f61e104a3d28b8404f1e8a1f7a3","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989617cecf02203d772cf081fa0c6f0f58","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981f43c77ddeb048b032cc259322695d32","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9871a2f55396f5166c5ff56b22cb4b755a","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bb74272151f913340680065928af3ce7","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981f0e16b10198c8a690a982ff263b28dd","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98566106fb34bacfb516ebf07d57920aa6","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/FLTImagePickerImageUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f8dc4d6581fb8f5b5c907ac0b21fbb8c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/FLTImagePickerMetaDataUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98247c332c7d249620a850bd09f2121a84","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/FLTImagePickerPhotoAssetUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d989ee30069916d663cfe91d1c5986fe","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/FLTImagePickerPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9851702874b3473204d01c1a11a3c97351","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/FLTPHPickerSaveImageToPathOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9822975da8370cfc43e8dbd1e7dc4f64f1","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/messages.g.m","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987912c452cf5c073488f6736d535565ca","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios-umbrella.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98455184b1ebf4d6916746f5fbc500d738","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTImagePickerImageUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c324ea36454852a92ca5c1e7c63badd3","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTImagePickerMetaDataUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9874d33145b4eb026db783767a8627f331","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTImagePickerPhotoAssetUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989aa410188bb1b807675bd70c43b501ec","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTImagePickerPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bb38f172fc4f9f4727a3dedcca07fc48","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTImagePickerPlugin_Test.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ee2e909a182ee943c5a04d5112d38a65","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/FLTPHPickerSaveImageToPathOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9866acc8882d2e86af3542c91447a63240","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/image_picker_ios/messages.g.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e984bff86a4ae208acca7e8f3edde3349a8","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d92d06a2a7dfd824112b881a81eb823e","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984055f0fd326256f2a5690ea71673950e","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981fde58f25a799138a5f1aa130753e79a","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982ab17ac8f24bde6143c8e649d4fba7eb","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e7c37ffdfa773622116c690b4cb90ddb","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983fbadda5b97589ce7268d233dafdb4e4","name":"image_picker_ios","path":"image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987020ad53317b6ccf0b145ed56f4d3cc2","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989226fd8b91f9ec19c7f8883460b0781d","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98307c7c089d35d30d4487bc7cac15a713","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981bc570ede355a302a3befc3cb8689d8f","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cea525b9106a703dc0ad2bff81a1dfbc","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f0cee4536b4fb3adb61d85704a1f7f37","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9822f241e08519d18a55baf464a3f21051","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d84b2c5672fb971b765f6064f815a455","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e31e3e08e801da744827fba265a26f14","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dfdd704e537a3b57bf99d1e132a355c0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983e3a7ae225290a3dde92676b7accd9f9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e039bdc8098998efc62c8e03514ae442","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a64c00a081e4cb1a1757f594c24dfe21","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983903c77482219b08cba6bc6dc17fe368","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d643500561c05175a0ac846b0b9e173e","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9800c91b577b618860a700212250b82834","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios.podspec","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98722af0b7732a4475f77425bc1a36494d","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/ios/image_picker_ios/Sources/image_picker_ios/include/ImagePickerPlugin.modulemap","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e986feda6f198332eb63fb859e5c1c63de4","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/LICENSE","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e984b54b854d4e2f20fe857df8c0d5359e9","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9863b7488f95b6a6719ccb5d551e115df2","path":"image_picker_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981b14112e34d16a8429f88ce19e8279b2","path":"image_picker_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ee7633b1ae300ba0c6b6fd48ae71897f","path":"image_picker_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9866bdc7888bc2d2fad11e557d980f6a89","path":"image_picker_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98be516318204b40d33cd2aae70dc8508d","path":"image_picker_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e988b179e3ba3eb0643314ef47fd544fc52","path":"image_picker_ios.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9891c072d768664a665bd917d9fb86b64b","path":"ResourceBundle-image_picker_ios_privacy-image_picker_ios-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986005838bae7db4ccd23bb111860ed544","name":"Support Files","path":"../../../../Pods/Target Support Files/image_picker_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983e707e67ff9de078598cf378ca36c302","name":"image_picker_ios","path":"../.symlinks/plugins/image_picker_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e988634a8b747b6724232b5af5f382a225c","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986a59cf187a3c389807c4fd95e2dfffd9","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987117cc34deea68ff28e2dda88711d4f4","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988b85f2b2839d7d2859e9dc8a9da51090","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c12f07efaf9181201809923dcfd2387a","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989b1517a0932ce9821210d415a0fe71c8","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aabae4d6b4484cb02e890b2ee4dd3796","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bdb2a8d13a6a5e260c48f1c8ea0fc5d4","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9840d7bb21ee580dca1b4349e00408e602","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d43d768a039f5c5c1c302bb39594b5dd","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98983f0809aae4ffeb577b2755b857d656","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98420655301fc25a8ad87e1c88daaf5158","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9868386d84ba8a5631aadc2e4a93e253ea","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980245b4fc742e1c55d360d159e4d043b9","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98474060547ad5e3dd080fc0e1f3443e66","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ae1aa1da940b2cf3059d58fa5aeb575e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/FLALocalAuthPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98cd73448a566c5be29cdf42df00abfae5","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/messages.g.m","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ad898343d17a563826d8df8267c2a015","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/include/local_auth_darwin/FLALocalAuthPlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9851693e394b4c9a3739669bc6f2853f65","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/include/local_auth_darwin/FLALocalAuthPlugin_Test.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98448a4b5517b9d1847c69072fe92810da","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources/local_auth_darwin/include/local_auth_darwin/messages.g.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98a161d315eb479673f14f048ecec71ace","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e0993c0c0c14992f88f3a12bb073566c","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981e08ed4b60b83e7e8e7b2fda795cd7d4","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a664ca07bd86e12815faa8f3d3f0d536","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d954f47e5d84ec48455aa08747c33827","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987f541783438bad867179de50aa657f05","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b2455ccb25cc63d20f4dd630f777c090","name":"local_auth_darwin","path":"local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f955c1d915f5ff1e58eb09e0c8607b1a","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a104ccd45ce06bf5900d08c1c796370a","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986cde0c65c9d1dc7e54c9aefa046e52e0","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98859c5dd5bbc9fb3c911d4835f2176ddb","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985789b4ec5c32a92659c4f54a96654ff8","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9882fd9a1cb48c89cf7db806d60b639688","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987da109f3fcd566c68d0a71053e79e9e2","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989ece9917c7a78b655d96d54d73b52b5f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ea18ee006ddd6cc0f30cc3cefe94bca1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98362c091e5bb0c5c1f7d1108694d1981f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989ed423038afdece5f9060eed156c53c8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98938a3b76dab16da59e842d15467d1f1d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b5a571a7306c7692a4f06783193986a8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9895a9a2debccd059637563251bfd9a4b5","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9849f9ad3572f69a73197f55ddc28ea453","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98644dcfa7bd2b0106a6c8d2d8476a9817","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98209a4fdd5d9ae4cbea101fd4b9ac1b61","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/local_auth_darwin-1.4.3/darwin/local_auth_darwin.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988518b601351060613d86cf587996dc0a","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e985ca8dbb907229aaa2ebbeceda59847e5","path":"local_auth_darwin.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9824eab6a2af2aa1812cce719f02ee9fd4","path":"local_auth_darwin-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e989cba074aefbb8832b5cb7321632706bb","path":"local_auth_darwin-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980618c0f1ad79cdd311f394dff3967355","path":"local_auth_darwin-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9842b9afd398f7b12fdbd878a1e1fdb5cb","path":"local_auth_darwin-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9826aabbf6d6b2201c6400dd7fc8a0967f","path":"local_auth_darwin.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9835c7588ceebde0ed281cc6f972ef1ccc","path":"local_auth_darwin.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e986bb45d983e17d10ea3b7cdd19dd7e38f","path":"ResourceBundle-local_auth_darwin_privacy-local_auth_darwin-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986578359082dc6ffe2e1830deffedbce8","name":"Support Files","path":"../../../../Pods/Target Support Files/local_auth_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9818f43d70ae5ae68bc8fbc41d640bbea8","name":"local_auth_darwin","path":"../.symlinks/plugins/local_auth_darwin/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9824acc442c11de2383c5d3273c1b19a5c","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988aba2706d98ddd7a6dc31a5499defbf2","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e9ed8d07101f9db66a96a1c9cef85c30","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9805dd8c75e5ea0befbef77f45cbd86e60","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d871d584c248036aaed46ca4fa429edb","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98044c1ac090289fed3b759322d50cedb7","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b6a779c28a3f4efedd949b4f1e4c6191","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985f3d8b477830437ce4ada19e1b5722c8","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982c7261caca783852ebd35ec0f0422291","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9841017bf02c854f15b2d686e0ae208bc1","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982e01021d8d491102b55805698b184b15","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982c51bbf17124dc9c1cf3f9ba3717551b","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eaefceff45c680b6e71184a855e019cf","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987f87522472d02d87c6ddbef97f318073","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98861976a212c011927ae4f88525c96a69","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98883be13daebbdfdcf10e362bc3ef4ebb","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/DetectionSpeed.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e4be4892db4744593107b72e6b06cf75","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/DeviceOrientationStreamHandler.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982f3d32c7820c33deaf24eed4a2774a69","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/MobileScannerError.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c373041b232771156d382a714478862a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/MobileScannerErrorCodes.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98168d2dc9c91bbc22b520b7c63b90d589","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources/mobile_scanner/MobileScannerPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e987e52e71ae15abca9499d22d731e79093","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981034511db0e33593a7e24a8689e03dc5","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fb8decc8a3ee62d5c8bd8d6ff4e6a8d1","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980344bf8982bcf4491bc008234ff0fcc8","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a65e0fad22390424b48a01758cef44da","name":"mobile_scanner","path":"mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98805362ab01323890c2f101180aac3146","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dcaf8c0f1c406b771b601bd03bd05ffc","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98febfbba35bcd28b5c786aa01f98775fd","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ce592632bfd50415262d6073599edf4c","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c4e401ec77efc9baaf7de1c0a08b6afb","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98503199427b7f6244bb4275ac5f5c326b","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987dd94584331a980095c2e60245c1ee96","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98324797d58b9def5767a0745d8c5609d9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eab1b30239eeeb221fca4cfda1345842","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e01b6bb8d3e8a8f49e5d0d75a4a82171","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f3309c2dbd9ef1c343168ea2097bc4f0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c9da9563e708c27be8c99c4d410e8efc","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9887a70e30388ce53e62499fbc0fce9069","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980c14abc1bde0bd3b2bdc0e29c685e757","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ad5334b6bac4ad344aa880b4601fc04b","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98bb78f53d6ab63b17ee387b790371faac","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98ced8939ee4857b8341f6cf6e5bb5d63b","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/mobile_scanner-7.0.1/darwin/mobile_scanner.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98cbaa519368773b3e3b95c7685deaa37c","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9870e66361762eade18fd3880b17b645a3","path":"mobile_scanner.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98cbd2a7736d3f622183620d97dabb51d6","path":"mobile_scanner-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98752d460c6673671f9a3d8fc5de663580","path":"mobile_scanner-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985e33baa0fee6473a955354e7f8cc33f6","path":"mobile_scanner-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98be2efddfa0659e6c19ce1a5acc94ec6d","path":"mobile_scanner-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981144f00ce89ffa4e0260914a9ffec527","path":"mobile_scanner.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98227c1f919eedf604acd47c56a9ef7ec4","path":"mobile_scanner.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9880348f8db14a00e978804a7a30575ab9","path":"ResourceBundle-mobile_scanner_privacy-mobile_scanner-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9850c49c9a619d580948e905f1396f2052","name":"Support Files","path":"../../../../Pods/Target Support Files/mobile_scanner","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986660600985587db3f4fd512ec43f00df","name":"mobile_scanner","path":"../.symlinks/plugins/mobile_scanner/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98fc1d853ed7c38ec64399121ac6e96d53","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/ios/package_info_plus/Sources/package_info_plus/FPPPackageInfoPlusPlugin.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98acc94a90b20547c25ffbe2fd16f0028a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/ios/package_info_plus/Sources/package_info_plus/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9863bbc9af63b79ccfc69082c52a621490","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/ios/package_info_plus/Sources/package_info_plus/include/package_info_plus/FPPPackageInfoPlusPlugin.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ec26db8cff8be69e06208096a9126930","name":"package_info_plus","path":"package_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a1a67ddde90d066ba2022a927b4e98eb","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988699e4da4becaef0a1ac36f07d8776bd","name":"package_info_plus","path":"package_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9842eb7b6c3e22c7afc5dfa288fabe15bd","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981816d6915b070b17d0288bc02767d225","name":"package_info_plus","path":"package_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bad84403344a2a37869eba2ab8207792","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98681ce0736a8210205eb8f0ed9dc2db2b","name":"package_info_plus","path":"package_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98964df0280cd77c6908661090e0e0b166","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9853581a26e5697f1c1ec9c0629bd83adc","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ec85ce4148ac92bd095e375b17d95e4f","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9871a06ec8240d9376a36b7220b3c94d40","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983344d09607e5a6c28315d3f3bd8f7091","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987ac3b022cec7952e060c896e6fe17d37","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98470eb399928e70cacf78873b8757f16d","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9873f3362bc730baeb2fd566fde4263650","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982b69b96c034fb5c4b33f4f8bef6056c6","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bd70896a280a65efe7aa4b3dfc1532be","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c78aa5e5e2721974953cd630ba85bef0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d3c6ade55cf67bcc5f4061a618229940","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c1e9dbd83409eb01531ec5f1890c0aef","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988b26e1bf28ece0a5abd348ad25e5999f","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9818577de128738c0001838f30d3ffe53e","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/ios/package_info_plus/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e987408988d1ac9cd58bc6fa8fc72dbf5e3","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98197f1bc65ac62ab93395d8f362167b7c","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/package_info_plus-9.0.0/ios/package_info_plus.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980d9ce43aa4051118d4ba16e97a1ad789","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98b89c2ba62b22f68dd279ae606bb8ae54","path":"package_info_plus.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c0d03884f20c6bbb2234aee407c81ed1","path":"package_info_plus-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98a6d3c99877b2803f710cde83388bb691","path":"package_info_plus-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f21428ed2f4991c32f54ad4813e1185c","path":"package_info_plus-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9833f3c33eca65f1240c201c729d3fbde7","path":"package_info_plus-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98089a265d15a8f52f9e25ea32540ea5cd","path":"package_info_plus.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9811034d0cd45341ec5fddd8ae14b45098","path":"package_info_plus.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e989ec4e8aeff1ecfcc0a71c01da47fc909","path":"ResourceBundle-package_info_plus_privacy-package_info_plus-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985c2e5b22608ecf3b4083bc02d2510b75","name":"Support Files","path":"../../../../Pods/Target Support Files/package_info_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987d881465b8818ec65e6dcbeb956ffa8c","name":"package_info_plus","path":"../.symlinks/plugins/package_info_plus/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9874c74ec17bfbd10a54d1903d5290b3df","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/darwin/path_provider_foundation/Sources/path_provider_foundation/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9838811231718361e03f6a6f5b0e7ddb99","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984642c6d2ebf224ba3de29d6821cbcc10","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98677fd2a57575d5131eff5d425348c887","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982d5632d83ca8d57f349dada054228591","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98786becd39f6681899ae2dd404dd1f78c","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9857dfc698f7a79bcd9f319cd4c2d98140","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98432314e81e7092b11184c1a7d181bc81","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9816fbe7da58336d952d041f94a1bc85b6","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a098541608a7f9e1c5817ac9132b47a7","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9852b81003c0995afdb0000259d0f4594a","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989afb5afec06430c97b3b2f61cff07fc7","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989b2b67c4bc239098b0503a1df083cecf","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9800a7b873701d158826c9cb8ce11131a3","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988c0f0d00966b5e9aff4694328c464698","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9803bb7f63530cdb500ba84b0a1a44af44","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/darwin/path_provider_foundation/Sources/path_provider_foundation/messages.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9840d362b89ea106c24e2dbcd47a7474bd","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/darwin/path_provider_foundation/Sources/path_provider_foundation/PathProviderPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d9bf38d48d544173972c22a616404b57","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984b8c8ffd0faca63eb7b740929479e246","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98405871963a7cd1eb0117dea12841dd5e","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aa680aeb5c3feeea2fd5b86a2f1b5869","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e856ee72c0490dfb0bd61a8fcfb5d861","name":"path_provider_foundation","path":"path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988e14b8283940a6fd396ece6b42eaec65","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f7aab821e6f39bdf50bec325bee76914","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9814166559beb12033812190a1a8e7c2b3","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cd32eff5e58575df2c6e82645aa2d5f6","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987286b835751e66eb2f992e11073b616b","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbd02bff4315677521cea12777433d2a","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b692cb638bace96a65b3ca97ebf10032","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983fe85b685e60662e755230f70f3bfeb8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9884b00bc54c753a42df0619e849eaced0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987e2667ec713d517158a2455f95ad1646","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980a4f8d189879c752b0dcd6d8c3394588","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fec6efcb827e519915cba9aa364233ce","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9807bf2e9671f046ff64af3dd3d3a0b990","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98075f7c62fe07db619950a060ebb46575","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b2e1cadbf8bb9cf184f0fe169903860a","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/darwin/path_provider_foundation/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98e2e6372384412b0830fc2ca98b25a530","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98f17f32406d0dccbc459b441bafec6243","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/darwin/path_provider_foundation.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98222477848e7b9efbb61cc198ff1b7f21","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e985cfaea5a640b1a62dc651b7f529211e5","path":"path_provider_foundation.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9854c6536298ac986565a978d13cd2d6f9","path":"path_provider_foundation-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98d6d45e0d7553ba58d1a7877e9b3f96fe","path":"path_provider_foundation-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a289b076da08725fe00774cd7ad8b4c4","path":"path_provider_foundation-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b67bc92c615d1dba3ac53bf7b30bdb94","path":"path_provider_foundation-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98237671cfe20903d6f94682d7135ab52a","path":"path_provider_foundation.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e980e0c5fa0e8218bd665f72f14cbfc898f","path":"path_provider_foundation.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98373e4c3054ae7574a3dd7a706f79e106","path":"ResourceBundle-path_provider_foundation_privacy-path_provider_foundation-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98628498300c79d88e3fcb7b7bf656ec9e","name":"Support Files","path":"../../../../Pods/Target Support Files/path_provider_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9820447c1054b9b30460031f2917861ec9","name":"path_provider_foundation","path":"../.symlinks/plugins/path_provider_foundation/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983df66a6182a9ad3e5e664af1554596bb","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios/Classes/CustomPrintPaper.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f47fd36e52148ce929fdb4b957af7e73","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios/Classes/PrintingPlugin.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98176d3062b5d63f50555ac516d1a7b762","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios/Classes/PrintingPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98151367d82561314a10d2c18601c9b287","path":"../../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios/Classes/PrintJob.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ab0392ba39c134b3ec6f8601d9893489","name":"Classes","path":"Classes","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98087e5486c2e156481ea05814c260f972","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9882d75c73cb6db70eb7b4d9d6ea67f1ba","name":"printing","path":"printing","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981cf5798b87794211255574b3785f8d2c","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b69aa20c54da6a7ca61f71f9f5154fe1","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986ffb7d697cc617ae171b2be9d286f81e","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cec35e0e83294cb99d373197a425e43d","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a13f52c383f6cbe98f720592bdadbb56","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98198b537365c6899d60087aba11560af1","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987baad726cba30fef8a460bb3ff176ac8","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f6ce5004c3020cecac483e257ccc5bc0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a5c58f67cc012876091c336dc3da5edb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9825cef2983a4c7eb4445dfeea6dd00791","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9857d0c815ce8304db09febb9a7b580835","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e10cf535c11c2cd9ad5f43f9d3dfa130","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e2d292fce55a6e7f60dbeb231266dc0b","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98d162ae822bd46ba05b9f0f48df1b68f4","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/printing-5.14.2/ios/printing.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98303dc51b6e656d9629205c0eaefb4951","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e989d8bf593c88fe175d14008f9be275fa3","path":"printing.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986c7db250b8f3f408d66f6e7a19972379","path":"printing-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98d630bb7df80c590d187e195052024cfc","path":"printing-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b72932e33a788d6a5520d61abf413bac","path":"printing-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bd71f2ad20b6a88b723ff05b2d7e23ad","path":"printing-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c744f4c75270e1fd52589ff556e2583a","path":"printing.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9848711414c4cdd6db7086eae6ec63ab7b","path":"printing.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e51f17e1ca8b4a6152a5489b5664a1e8","name":"Support Files","path":"../../../../Pods/Target Support Files/printing","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9873c0ad2aa32b467fea9afa937b4c7089","name":"printing","path":"../.symlinks/plugins/printing/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9897ece101e217083edce53455b9b44d62","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios/Sources/quick_actions_ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98cb5590f03822fc53833c734b124287c7","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c586bf8ceb44d835c3c3e2f5ae36f722","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98de0320573ce6b2fab8c8b43255e3bf25","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9804f476290fe72ac5d72b9b771ac0d59b","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ceb67ec1fdcb7621eae1c0326030a557","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ca0624caccb146211d1cc30d20bcf033","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bd86253e8a8990ab69fc34ab8c330cad","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987b2a49136fab89a1e971c745460e15e5","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982aac00b04ab468ee9299762af8fb0ca5","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fad47c95356407bf4ee2ad99a7549394","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ac9b51e6d29980808b011122a8773610","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d76b040de2101ea72db53418a885f6c2","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9857713be709b36c3e1348273355d3bb02","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9820ac54803a9034ce057fb85ec67eaf61","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e0db4c45eaeb1548f9f07595cdd1ca45","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios/Sources/quick_actions_ios/messages.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98775d552104d6921b0e48e28110e132e4","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios/Sources/quick_actions_ios/QuickActionsPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a6e06b4bf97089fc1190fe51ed103c37","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios/Sources/quick_actions_ios/ShortcutItemProviding.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98406147dfb0affea230b8d4b68c704012","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ad7ed4966235ad5dc8474dfbb54a5b3f","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cb105d7b20bdf97d72e09129ff2aae15","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f5d3d629332cee98d197a685473ef6f3","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fedb4eab167925f8f5f0454da1e6de29","name":"quick_actions_ios","path":"quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f58981ceda09bb778384630d970b0d94","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ea5d5bbda5e005716443f89447c6145e","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98738fe071c432a1e9dedd58870ef2210e","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987ad13f6004a3230b786732c0d108733e","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b8e825af6478872c567eb724bf0ae5dd","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982511764bc99cbad0017358f152bb63a1","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983cf3ac36805ad5a1caaeb64ef2ab3211","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98347f1caadbeb57701a3f277701db1173","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e1deffa7d429deec9db4eae11ee53dfa","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eabe60d52a9e59cb6f5a31e3c98b6e12","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbd7856a89b8ca57db500cacaab432dc","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9870774b2885d4245155f8909378712f3d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a18d5206c296d845d0371fd278376225","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9830f0dc0b053620845dafc314a2efef9b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9825e5ca8176fa252a5fd570fdc41edddb","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e981a23fd7e5b6cc9532a52bfbd111d23d1","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9833bf9fcf313f2973d53fd78116cbb315","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/quick_actions_ios-1.2.1/ios/quick_actions_ios.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9803d03268848b7474d601e1b9e470aace","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e983f087e6d1e8105ea50e5369b77dd3b08","path":"quick_actions_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98dac7ee7a1bbc4495acb5a734dbbf08a0","path":"quick_actions_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e985a208a09642b31e8de604d9a38c86ba0","path":"quick_actions_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98671d96aa09413e195a8533cd8379d33d","path":"quick_actions_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98da1a1802428a351085dc1c5dc1b95b0e","path":"quick_actions_ios-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9899a3c545d51db50c0cf261030b824669","path":"quick_actions_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98968b3bc9ee9e49b2679f77b1c2b31c1d","path":"quick_actions_ios.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98aa75aaf2a1cb28f231d27bcb0722d697","path":"ResourceBundle-quick_actions_ios_privacy-quick_actions_ios-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980b133fb8ee737cd0f2c62147871f7db0","name":"Support Files","path":"../../../../Pods/Target Support Files/quick_actions_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bee18466b48e125b26e27b89d0966163","name":"quick_actions_ios","path":"../.symlinks/plugins/quick_actions_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98174d15dc574e8aee233cdb78708e065d","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981b45d40a383cdedf63df1f3c52747e07","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9895d1e15f4e90ff4d93f2b2392cf5816f","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984864a3169b57ad9e28db829a6c0f8cb1","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982b0061c1d71d45db1a09a76c8c651424","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d53bdd44fdf3dd6aa5ce089e9c70f604","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c41d459fcb9fa21cfeecdc707f41b610","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9812a9dfb700e2028e311f72b17fc895fe","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983b055601b6561b145460fd9e83f51fdf","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d44f75339d1c97dd77d3fcd0d0461ec2","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982cf8dcda7b3d0c6826390782a818f4dd","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbfe5a0cfdccfaa97756c27c11a1163b","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98be05ef96388bfaf7d25af31c78bc46dc","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ab43803dcddfc883a4c5289aee2c263e","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984c5e9c2213310378a70ddcb21a5dd955","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d529b9317f808bc4a0526a0decb58f08","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/InputHelper.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d73a5e56d5e68038cb1377eaa90fae0d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/RecordConfig.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f53359071b6f1be5f1da4cef27596689","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/Recorder.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98298a93bc02eef963b4228ac4db4f6bb8","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/RecordIosPlugin.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b298ec0b59e4cce28ccc0be3e7f0e5e7","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/delegate/RecorderDelegateProtocols.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982241e0e04227dc7964af065d6a2bbc3c","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/delegate/RecorderFileDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a41a7891113627a2fa24db24ce22900a","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/delegate/RecorderStreamDelegate.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98102a207de48aa6b7865bb655255eb97d","name":"delegate","path":"delegate","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983a371912ff4d411448f255abead2ed59","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/extension/RecorderFormatExtension.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b47ae3223bc0ccc52b53627d750e2de0","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources/record_ios/extension/RecorderSessionExtension.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9832324292047684aa08caf2ce0ae9bb1f","name":"extension","path":"extension","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987fcf899c133497aaccaa04d4acf3681b","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98557123c7f4bafc3f9d1f9184dc85c36c","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982cd4f595c2c50ffa8f12eb71f4b8bddb","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98878c508b646e6248b458c11f23244e69","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988d938106dc88ee8f285b1e5486f6edf0","name":"record_ios","path":"record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981447272ccca9ab7d3f9477f564d18ccf","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9833105a495e73929ac21221ace3f8cefa","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983792ec2fe8d3bf6bd7b3820f8e05659b","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fe2d04969e4e34e300424e28e3c5749b","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ffcbf189e92121eafab95990787d8ee3","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98676b00d49ca97bf8dd1dd8b9aa44ea6a","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9880282f9e9a0852b43d2d1b8f2bc6da0c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9871180fe05d2c8572c124b71c6461cb92","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9878189e5be9adb9fc9b73ebbb47d8a97e","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98466b7514ab90b5afb3b8278924713411","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9887a1fcbcd2589d5a6e3516393b1db1ba","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983efc6897fae7cf668bcbc35d168b51a1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98edcba3aae3bd37e2218d1089ea173bb4","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c281712cdfd17fee37b4bd5b1841992b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a03a4b35be5d9e85a7fb7aa0339d6aa0","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98e1d6b96b4af9220b0f65082f541a6aa4","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98ce484c2575078cc12acbdde631a99151","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/record_ios-1.1.4/ios/record_ios.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981d5a61ddabdfd430bfcfcd290130190f","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9834ac0094b64a1032543b289ff0408be0","path":"record_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98255804e028753f5b8536b2b911ccb620","path":"record_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e4be1a427c54a06ffabcaa130de2c968","path":"record_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98480e6a92f83c6bb52a5901f688fc7040","path":"record_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980c4abcf4c655f36e0d31f147be4ed645","path":"record_ios-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e983daf253e7f620ff0705af75496c7b612","path":"record_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e985629505f5ce763e2c6637f93384c9362","path":"record_ios.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e5ca843c47a9788b2db2b9dde08c3daa","path":"ResourceBundle-record_ios_privacy-record_ios-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9816bac2eecba87f20264d1ae2a9bc5e69","name":"Support Files","path":"../../../../Pods/Target Support Files/record_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985d22b1f5e2b6fe75edd6191c37e39101","name":"record_ios","path":"../.symlinks/plugins/record_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98b567af24496618e3e6787600e87a49bf","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios/Sources/screen_brightness_ios/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982068862e6717c819c4fbc09fb536b24a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios/Sources/screen_brightness_ios/ScreenBrightnessIosPlugin.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98cf5aede3c3831b4f8bb98fbaee4e8fbb","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios/Sources/screen_brightness_ios/StreamHandler/BaseStreamHandler.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988e75d6c80cb6aa025440d7188964cd4c","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios/Sources/screen_brightness_ios/StreamHandler/ScreenBrightnessChangedStreamHandler.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9874d1a6d58b9d742f0585bd07182b814f","name":"StreamHandler","path":"StreamHandler","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984fa668abf7c9619e3cfe68413bfd3c48","name":"screen_brightness_ios","path":"screen_brightness_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982cf65bc832853db0a77191533efb77f5","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9896fc17dd81a5a10e141e106731f514b2","name":"screen_brightness_ios","path":"screen_brightness_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cfb23e79d351931fbdc8641f383a954c","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ddc4bc6bfd114d83e9b0659cf9de43b0","name":"screen_brightness_ios","path":"screen_brightness_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9828bf95cf7cce1890fee4a38f487eb5c7","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983335bbe674626a01d75a3742e0c48ab0","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988c161eae72ee6134907b93514654e3af","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e8dd8457b68b460a7f872aa003429071","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980de842c1d6652e7b8883117ed2154cdb","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbf8dd493f43a4598e0c517f04c088bb","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985a1723fa7f75edf0af67129e8a9a562b","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a3a4fb3b74e4a8c4a47f9240d537a611","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c60ae4642ba11e10aaeb77c209af10bb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98aaad6c0e344dc634c87ef0e4bc1c9a03","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988eb364ca3ffbb4de057b6804cd163394","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983142062fc9cde280e9c55f45fee3b7fa","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9885c050b29381cffdbca0b90e5592ea71","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989c3590c2a3270d996dbb84227e1e1876","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c6ade37d3c830a7144d5ac6398170d1c","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98b0915e66297459a9e12167487802adf1","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98a59d5ae9e26912fde3acebf778deaaca","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/screen_brightness_ios-2.1.2/ios/screen_brightness_ios.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98498dca81558e0027ed3f0baace98590b","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e983400f120914c24945cfbd231fe5c63e2","path":"ResourceBundle-screen_brightness_ios_privacy-screen_brightness_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e988d824f7ca473d4d9de96b1e3c06e9dd0","path":"screen_brightness_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d17b81a48ac298f16189bcd229ac4ecc","path":"screen_brightness_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c3fc5c181f687f7753a51ddd197f3105","path":"screen_brightness_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c8d1b3771b7963ecdf65329021b3b33a","path":"screen_brightness_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987ab43a0db493d8c4b0f8700a9bfc1b25","path":"screen_brightness_ios-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98bcd767e09eacb2538a5dd8f4781036cb","path":"screen_brightness_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e478cdbb3210aa9b19b78eddddb7437c","path":"screen_brightness_ios.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98904b687b3fa631fbc1440c9a46f2ee8f","name":"Support Files","path":"../../../../Pods/Target Support Files/screen_brightness_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981579436772685ebdac93ede5e1d42a63","name":"screen_brightness_ios","path":"../.symlinks/plugins/screen_brightness_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98119c9eb9886f3635874ecb6a94a2f0d4","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98599bbd5b1a4bdbf5bed39a964d34f18c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/ios/share_plus/Sources/share_plus/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986c6ddc4ee2f3ea412c1028067a0fee4c","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/ios/share_plus/Sources/share_plus/include/share_plus/FPPSharePlusPlugin.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e983d4f6b4b3ea9373c5507d9353d49b7e0","name":"share_plus","path":"share_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b70fe759825ed1ee9c375ad6032721d9","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c031457ec4352cc7b1e0b422667da097","name":"share_plus","path":"share_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c202cfd8b8c92dd0bf2b027958aaa905","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ff5021a81a1d8e99cd5f9ce177d63508","name":"share_plus","path":"share_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9809db9d2a512ef8f094061ebd6fbd54f2","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989f483b4be001cca9d711aa2ba566d331","name":"share_plus","path":"share_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bfc043e3f7c2c8921db3de166162ac8e","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e2b5b0f7d41421ffee952d9daf7dc83f","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9869808550973ecb112263c763e971f956","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c08eb0711ab0623c4a4c8d45359e060a","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c6af78477aa25f5d330368714d1a895f","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98365ca200dffc26fa46d745e2b3b25f4c","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981ef0a29baaac601f8f19b64dd0f7cdf0","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985e4cac157b5628bf4d3788068f4f375d","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ab42ea15b65127fe5712c39f6b592998","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98396db10edc10cd3116c133d05df79e3c","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c8199d891ae54b218d13c73dc7d3c057","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f7798944d5b1e1f39fe75418851c56f4","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e3f7ac5a05b261acd5a1730475ff0b8b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985cc0a390af6375cb0ad89dc0475dc657","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9891a8faf7db2593973fe985b900554efd","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/ios/share_plus/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9868445a1bb92ff184a5e20b5e5a3a39a9","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98ef64afb2023c5878036dc7c6817e9ba1","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/share_plus-11.0.0/ios/share_plus.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98154c936dc6036ad046d6363c8f61bd43","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98378bbd516f5eec2de41e524e24bc7e49","path":"ResourceBundle-share_plus_privacy-share_plus-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98906e870770dfa375bc32a874a460571b","path":"share_plus.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ac3d4b3149126b081d5bc50806117e1a","path":"share_plus-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ff64f8e5620d92a1fb974b44aaf31a50","path":"share_plus-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e22c09ce8800821b844c11a9a207132d","path":"share_plus-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983a3ff60a16fd5c441672e7e40ef2e624","path":"share_plus-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98de35fcdac3f67fe0119b4d27e7b7c6d4","path":"share_plus.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98d3219dc3abe23add073ba57e4e5929db","path":"share_plus.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d48a2ad2172506e2edc53483822fde13","name":"Support Files","path":"../../../../Pods/Target Support Files/share_plus","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987bc749703266092de2678c42954db62e","name":"share_plus","path":"../.symlinks/plugins/share_plus/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98251f6f0c0dfa900ccd058f8d5f09e39b","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/darwin/shared_preferences_foundation/Sources/shared_preferences_foundation/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98874a84db9ab4c0b9f22d421b7cd204c7","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d260bd6770b72dfa4da36eadfee166df","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e3e39e128c5809bd49040f00361eae7c","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9850ffa628d1919f0ec705f9de24bda6c1","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985e64e7994fe3fdc22525b6459b9f48cd","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988cad9c321014aed10048c97d530dfc9e","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ce1edebbcbeb4dc57286acae03d36057","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988f8bdc4d5afea8e36320c0e1e34946cb","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e25e360fe18b437b2db3a93fa43b847a","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986a22bf476083da0ba2e2549f7102806f","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fd58d2e1a8250ce2aa53840a0efebd81","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986d5878a7dc724f2c66e8f251b07ed4dc","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cca72625c4f27b28e95966284d25a066","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9880a7725720f6588f2fa64a41717c07f3","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d7fd3cf0401e3393c461b2ae7c1591c7","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/darwin/shared_preferences_foundation/Sources/shared_preferences_foundation/messages.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f19bf67647b9b4da54e0115f35b62be4","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/darwin/shared_preferences_foundation/Sources/shared_preferences_foundation/SharedPreferencesPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986d6f4d0088b7c72652b95fc0ebb93926","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982f66ae4f5b415172e3dca64e9e8e5a4e","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982ac4dff249a7528e93cd77a7f162f234","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986e413e350fae1f0103b443a6a45fb56b","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98986cd207c1e8622480ebb094be785bc4","name":"shared_preferences_foundation","path":"shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9831549fc1ad6b0e5fe2b6dbae6500a1a5","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c53c5f7a985e5d8906fa525678a4ed74","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987fee99b78dd5109cdba3de5751dad705","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989e87820aba3f967f8f414a3668bc8c32","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983424e39400373f6dfe6b3293723b2d63","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9890236d39b36a50b18dfee2b67a45863e","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f5c4325e1db9ad21e4acf5deb1a99531","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9863074831eac277e55e30016b23204e0b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98093130e99afc1f5f553deb94624455a9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988be645abfbd88edc4f33f359acd532f1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984434ce912622f5061aa4c626b2217185","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ca7021dd2115aeea2deec8d2f69b6bc9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98570f6c2adb30c44a00ee3c91c056c116","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c835a8cb19147cf0930aaca9c0e17f92","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9859a08326d1ab9bd0425c51f76de45d5a","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/darwin/shared_preferences_foundation/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98ce1dd3ced01a13751360e124369d38d6","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e9898024370ef0cf83a515f865ba5f18b1f","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/darwin/shared_preferences_foundation.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98b4363ea9f157c04918d640a76ca81521","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c65a8a036f40f9a6657c7c81348dd3ff","path":"ResourceBundle-shared_preferences_foundation_privacy-shared_preferences_foundation-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9878a138126e157c84d17eb1152493dc20","path":"shared_preferences_foundation.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9857a0115412b61e72a46155af7b48b848","path":"shared_preferences_foundation-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9805edc661fdbdf6644df331c393174c01","path":"shared_preferences_foundation-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981bfa857f3b9b99abe02ca6fc7b5bd990","path":"shared_preferences_foundation-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d9c07036facadf4c2fe7142051423416","path":"shared_preferences_foundation-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981ea619c6c09d50e42998ac2381b017c9","path":"shared_preferences_foundation.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e988abaddbc7dac244a9dd3a827969bb097","path":"shared_preferences_foundation.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ef7e6af9b5bd6c7f5706ccb9a18c5adf","name":"Support Files","path":"../../../../Pods/Target Support Files/shared_preferences_foundation","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980d9e95ccc7793f6ae3460b9735cb8db8","name":"shared_preferences_foundation","path":"../.symlinks/plugins/shared_preferences_foundation/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9853ec5b69fdc2191f1ca7a8b03970be07","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98200d0fa3707fc5ee74afc160d893d31d","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985dcda6b1cb6811b67d0e643bc9f80b04","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981e185c6bd005e3d15397062c4574f504","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a482ae21cd5e935a49125ee7f4334a4f","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984d9b6acbccf02f63b8c74455872502ad","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9827b2476097951d4ba4a438df6bdab0c3","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d9e91246b255bd2e9e7a0efaec4a6ae0","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f73a85e7ab7083d26c1cae3a39f97d28","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bcc6e45d9dccbce5db97a93454702552","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985e4092a639794880dacb330ad8d18b90","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9802c8af15eb3ab80ccbae2168af891649","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987e2b6109c38b758dc68f384f773a778f","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9885f86e0d5bd71fdf4bd51f069cb5a8d4","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987fab1129b9c51c893011735af55b4bf7","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9879477fd65084cc006d19101f02256fe0","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteCursor.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9830c704358e50b5466ffb0fa7d6c2e209","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteCursor.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980e35fc805e7942676dde7f6a6cceca96","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabase.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982ce4fd3b13126d36c4c105bebc0d9fd1","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabase.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98592da7f3a49d3059663aa71a58cd0a4a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabaseAdditions.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c6a0774da49442d88e4fb061e345fcbf","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabaseAdditions.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ac0abeeeb91ccc5902df814d398020ae","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabaseQueue.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98018efb908ca6e0716b824fc860f61c9b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDatabaseQueue.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980c6eff3a04d8f600b147b66f518c810b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinDB.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9812a82c89a68ff3aa4668003694edb150","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinImport.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987a187bee2cf8e65d0c11cbf842b8d0a7","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinResultSet.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9853e6f394a4d03f7b423702095b9e1482","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDarwinResultSet.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985d2f0271270070876a34fb6538811993","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDatabase.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c8dd825ce814e57bbe46ce1cda93d700","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteDatabase.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985e37b28cf8fbbaa7f69a2cadcd43d21c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteImport.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988b79e3ba836e166f4d2c19a363e77ef6","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f0b4b8929472bef1ea1691b2d60d35bb","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqfliteOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c9475c24e421f8b84743f5f595dcf902","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqflitePlugin.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e7fb17279cf291b6e4e53390f27f299e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/SqflitePlugin.m","sourceTree":"","type":"file"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d68895a313533798394d82163692c629","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/include/sqflite_darwin/SqfliteImportPublic.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985cac4af7f944cc0b3df8c11a0e43e286","path":"../../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources/sqflite_darwin/include/sqflite_darwin/SqflitePluginPublic.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e983846aced2fd599b48a93ac2106e72ea4","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987f0259db830b9d38038571b93242197e","name":"include","path":"include","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9807c4dffe6a0500abb6cc0bb91e07e058","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f974f7c51012fce9ac1b91791d37afe3","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983d081cb1752b8ebe9a76fadf13026796","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dbc9fe22e4ef90d187fd3abafc65457b","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98945dcff18e1f67dcfd7037cbd18b50c4","name":"sqflite_darwin","path":"sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981410346a0e55a9c7843f10860bad76f2","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981a6a34cd1c98dc3ad701f6eb02d8dbe5","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989fcf587fd16f1f9a48d3555a22e1b458","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e46648f321b2c1f4b91db77505e08f30","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f6fd94c2b590faa93e53f862ea2ee79e","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980e25c3aaf34ca14c48b2996219026a75","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98848fee2ce1a3a8df150c97e859589977","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9832c2025d830b21b09a6f91d377e96ec6","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985fb2cee421f991423182d3789b3dff5b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988e34517bb9c674813ab2b4b2286d24c8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9835007b95f817704dba1eeceed30c9fcb","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9893e83fc7d01a44b30af889d682c66137","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9836406f81de276cf028bf598208c2e046","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983f2adab1decb9579e798ade3e8f94b41","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9836faaaa2c50b49a85977ed4562d12b6b","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98d6dae8f9e68af4ae0bfa937e10346c24","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/LICENSE","sourceTree":"","type":"file"},{"fileType":"net.daringfireball.markdown","guid":"bfdfe7dc352907fc980b868725387e983d2cf05e8641bfb9bd4e0c8a0d9acb1e","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/README.md","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98cd6558be7189756cef630598ee7d2bb0","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/darwin/sqflite_darwin.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ecbba56932b85a43762bec99b6225df1","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98f4c1bfaaeeabeda1e584c9b61c8588cd","path":"ResourceBundle-sqflite_darwin_privacy-sqflite_darwin-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e988dc8cfd8a4a13f0f776d30a86da3a4c4","path":"sqflite_darwin.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982eb21757b507687455f8acb8e01017e3","path":"sqflite_darwin-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c5b713749c67afaec2446d918bc88dec","path":"sqflite_darwin-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984350c2c970d218895c0b6757b272d815","path":"sqflite_darwin-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983e7d9fa60b774739ab0d6568bf07a351","path":"sqflite_darwin-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9875a911280513a51a1fcc833a02e1e86d","path":"sqflite_darwin.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98b2e50aea12e109eb95c45970b36f8a43","path":"sqflite_darwin.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e984b076e246ad5a420d39bd8da89e9420a","name":"Support Files","path":"../../../../Pods/Target Support Files/sqflite_darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98311733b06bfed642b6f8f4347779ecf3","name":"sqflite_darwin","path":"../.symlinks/plugins/sqflite_darwin/darwin","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9853502a1c45cb54adc332a8b75ff6be4e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/syncfusion_flutter_pdfviewer-29.2.10/ios/syncfusion_flutter_pdfviewer/Sources/syncfusion_flutter_pdfviewer/SyncfusionFlutterPdfViewerPlugin.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e987361f6fd54e39b6be5032d54d3249f45","name":"syncfusion_flutter_pdfviewer","path":"syncfusion_flutter_pdfviewer","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9803debb445f6700abe7749ae6aee19411","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9888c353835eb8ac179d64e97ed5dd2d1c","name":"syncfusion_flutter_pdfviewer","path":"syncfusion_flutter_pdfviewer","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9829d95cda9e4e6450a4ac6fb90943c7e9","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a190abdb74ac76152a243d43c1608ed3","name":"syncfusion_flutter_pdfviewer","path":"syncfusion_flutter_pdfviewer","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98febf987d2ebbbed1a6084dfb281decc4","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981169ca70ca26e5814cf73ad7de6b4451","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9881968911210413bf0459a1a6f921df0e","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9876e9964386e015101a3090fcf115536e","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cc01a49f34442ae45ba994342cfb1704","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a7aa0d77acd4da36a80bd7da7daf9573","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98038a90b861a28e5b4b8dd5aa24bc0b5f","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985846007afd74f6d4389c61c2f76b19a7","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c98f66cdb2c668eb9c9535e3b005afc8","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989d999538e9f35e3be808f783dbe6f043","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d6e839cb13db77a3fccadfa0deeb4f79","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980af197b92723af06582e4ddbdef77b89","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989f762b6a7039344e7f57bba56b844b07","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980ad2d568d7cc8d3f2d64dc169cf65208","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98afaac2d6f80c35a2f08aa0e9cd39ae94","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/syncfusion_flutter_pdfviewer-29.2.10/ios/syncfusion_flutter_pdfviewer/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e986fbd8db7f6bd33265d8a0fbc7bf95baa","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/syncfusion_flutter_pdfviewer-29.2.10/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e98bb18158157998dde524ca6578c72094d","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/syncfusion_flutter_pdfviewer-29.2.10/ios/syncfusion_flutter_pdfviewer.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9854f9fda2b4b51ecd1bc53558d995bc7a","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98ca3b4a62b17a3dd6a49cf8261bef40b3","path":"syncfusion_flutter_pdfviewer.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98532284d033f3de271a1fd34a6aa57476","path":"syncfusion_flutter_pdfviewer-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9891436df15c3476add531fc85739f9a58","path":"syncfusion_flutter_pdfviewer-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980d895796e7cf3b42d3e6950740583b8a","path":"syncfusion_flutter_pdfviewer-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d31e2d30267b93d0385170731adefbb0","path":"syncfusion_flutter_pdfviewer-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e09431f2c48fb9c271b2728be33c6101","path":"syncfusion_flutter_pdfviewer.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98029debb13536e6240d86d056b253ac21","path":"syncfusion_flutter_pdfviewer.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9800c0f9f91c852b221b37cecf2f479c3f","name":"Support Files","path":"../../../../Pods/Target Support Files/syncfusion_flutter_pdfviewer","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986405124520db5bbc660c502b34a6f3b1","name":"syncfusion_flutter_pdfviewer","path":"../.symlinks/plugins/syncfusion_flutter_pdfviewer/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e980ee24ebd45c579186ae60d129b553bed","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources/url_launcher_ios/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e983d2890ba5d2b8b269c748965a331730f","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987520c262b6c2e979764aed69fdf32580","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989c722067f6a359083dda4e1536613554","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9858c8c92512b49fbe6824f8b48f6c0dc6","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d87575751022a51df7df777f5818d930","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9819e6d8989c33a6c0f519379ed13a2963","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d3ecfc14f6db2f1e8f0cef6667055759","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98df65b3e5e40d04dc670a86423b2533e3","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9859baa4fef5a224f6957b22b0e5995c23","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986cbb1861a8f18a765aad58ce5f42505d","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f6c7572d23448bd4432b9a80fa50c814","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980170d6e7944e19473dc55e89ca1efe4e","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b15defc0cd422ee3772c3c0fca9df85c","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9849d868a4281d70fcc25e81e90964831e","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988b923c7f69904073f11cfb33f486be4e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources/url_launcher_ios/Launcher.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981f993b8fa34154c706d827a98b25e1b7","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources/url_launcher_ios/messages.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984136e6ab77e9cac49cc5bb8eca9cdee4","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources/url_launcher_ios/URLLauncherPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9873c2ef5634c43bf05dc1b4493b3cc0b5","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources/url_launcher_ios/URLLaunchSession.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98f7a951a8e510f5c77a167fa5f406f30b","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988076b64b29be3aa0ae63152231c08121","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984333c1daf9320db8d4305234533ac190","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b21c586a7e355d208732425a25de3120","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9846c810908615f89ab4002301193dabdd","name":"url_launcher_ios","path":"url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980dc4bca2f03c988785c812e28bcb6977","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9819edfc49fd527d321efc12a0ece4ebc5","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984e76f9c29de1caa99df42e1843192668","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986c2696a5a32da72599133df7fcbb834e","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98696f7e811412224e394426b9c2d2d0b3","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e985658e8b040b574f365203f09537074bf","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ece97ae1843dbb5501f96a0f66b436e7","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984535507c482b7d2a985b233a26beefa0","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9827ebd5bbdcb0658dcdca8d6fe4694f59","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9894fa141c55a394fd3e5af8000bf7171a","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9805ff6868c01273fe2b08de00332fd407","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98305d7b742e47a78e158d75cc79761002","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9867d1b2556e9e5a7f8c774f33c555d794","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989c312a0089ac5da7bc277df82ce310c9","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987569535e74f4a5e60b7fb32576cd6292","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e983fc96bbb2314238fd6b66a3010e2da59","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e981b8afb2a57a8b22a69787c6c3021c344","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/ios/url_launcher_ios.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e7e46da2c78b474b1f377a2a5200b24e","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e981afd7e37c2302b41538c45325ea46350","path":"ResourceBundle-url_launcher_ios_privacy-url_launcher_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98801fa898db7d7e32d77d6db2a1f7cecd","path":"url_launcher_ios.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98dfc96d715d809f6ba8cb9e157b3e9dea","path":"url_launcher_ios-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9834025b90949043ebbfb75a96412e3376","path":"url_launcher_ios-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a71cb6b5b12314ddf260df4fa2971d1b","path":"url_launcher_ios-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9806f3adb2e55f13bf793c40eca5d3b6b1","path":"url_launcher_ios-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e986b056fb7813eab8b622dbbdb4b6201da","path":"url_launcher_ios.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e982e8b062cb2e7d8455d114188a1500a94","path":"url_launcher_ios.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d70cf7d694633b07145f76f63d1daf60","name":"Support Files","path":"../../../../Pods/Target Support Files/url_launcher_ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98154d1a1da41b6ca907f1f93121bbccc3","name":"url_launcher_ios","path":"../.symlinks/plugins/url_launcher_ios/ios","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9835179e6884138d623d1c2669625be172","path":"../../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98b58196d6d929cb727eca51ff4a3f332e","name":"Resources","path":"Resources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986cf8af6e1da86e64d914f5c16f15dc58","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9834c41063a580fdcf4a173c7fded36c8a","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dcd89bf8cb2381907f4c2e0d445ddac7","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98330bb9bfeba52568e79ebcb765dd5382","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bf1ded961775c6e8cba10375b2d2c67d","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b026a2e46c415bd79f19fdadefd611d6","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98875b65cbcdaa1429e932dd3b8a651800","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98220e4856ff0e495cfe0fbe92563b05ad","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981ee67f07af35a222236d2e377be24584","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981dbf8ebc1fd79bffb781145e48542a3c","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98505954285a7918a2eb0b12e43345cffb","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98715ead64085d97a2cf3d2582b3016b5a","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98235da93c52be11c66c714582d9ea97b3","name":"..","path":".","sourceTree":"","type":"group"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986ae0ecde56284e1c58ce266e014e4407","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/AuthenticationChallengeResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ffad4f1ea24597bdb838ed18709ce0bc","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/AuthenticationChallengeResponseProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986cf40d51c23844c27b2d3847574a999b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ErrorProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ccb07914d3f2ac2700b37e1af527dcb6","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/FlutterAssetManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c274a9bb2f458649df20b73def238a31","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/FlutterViewFactory.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b087fab6a6147e88ea8188b98eb479b2","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/FrameInfoProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983f800f06f13b5c13b4116ae2800ebd62","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/GetTrustResultResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9858a1908524c1677a38ba9bec48112f5d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/GetTrustResultResponseProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98936d1a39e1338c5cff1f46f1bdcbd970","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/HTTPCookieProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b7c272896c5e5a1f7466f96e730ef7f7","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/HTTPCookieStoreProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c92dad67cbc17d9bb7df16017787161e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/HTTPURLResponseProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989c9816f986731e3e1d1441ad2f76dc0e","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/NavigationActionProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9880ed52f43c3c027879cb9c6fa4a7ad00","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/NavigationDelegateProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98978f7d76a4c8e6fe24dc8571670abd23","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/NavigationResponseProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986681d4e22fff219fca4ec770df70c9e1","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/NSObjectProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d4eec0353bf3d879db362a265046b0e7","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/PreferencesProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e980d2fd3010d16903a103f41c3d714b7e9","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ProxyAPIRegistrar.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988a05d69eb8d96765483690bed6c8821a","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScriptMessageHandlerProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98758323be30595585a4e9d22cb3236be5","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScriptMessageProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b4d68270040b8330c48a9bfda2ee1f78","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewDelegateProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e3f1b198c65452c6f005bd694e225209","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/ScrollViewProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983ea44e48c15b67058eab146e81a72a1b","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/SecCertificateProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9847e082023cbf1f0ad654c010c16055b9","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/SecTrustProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9888e40043e949782763c5e735d32e3a70","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/SecurityOriginProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9881237e59a4bd058f54f8676a7cd5b107","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/SecWrappers.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985a450fed3b83a420034fb96375aeaa79","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/StructWrappers.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f452d1e497caac321e297e891b43bdb8","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/UIDelegateProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9813ac29d09ae3837e5525c4b1de95e553","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/UIViewProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98fb109f357f6fb05d543e2466bcb69c4d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/URLAuthenticationChallengeProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98823c5c55a09222a1e95e42f7723b1e09","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/URLCredentialProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d37a1bf89227943cc5f9bf8dedaec4de","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/URLProtectionSpaceProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9809ccb0b60ddd3aa24d201b1fbbf78872","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/URLProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985e9a33b760a4323436cf8a2ac5237f2c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/URLRequestProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98507cc65c36bbdd5e0f5f59644120aa86","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/UserContentControllerProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985144a306910625f395b522423bd48599","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/UserScriptProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983eb7aeab09594d1843bdb8ee61e437b3","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebKitLibrary.g.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d5f967adad441e2ff1ad91ba479d4fcd","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebpagePreferencesProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e987d4bd25f4b769d8f640b3dd0b8ae5a1c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebsiteDataStoreProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986201e1488ad29294b96f9cba25c0615c","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebViewConfigurationProxyAPIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9861f6692e45bf40cd6897b227a33ace1d","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebViewFlutterPlugin.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98639301e9eea43149be010207d55747c9","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebViewFlutterWKWebViewExternalAPI.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98494f5fc7ec16230a398c9f181fa0e807","path":"../../../../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources/webview_flutter_wkwebview/WebViewProxyAPIDelegate.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9887ed74d2206a86b64035c6235eb880f6","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f837658afc62b58eb35f97b4aed0911b","name":"Sources","path":"Sources","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98cc1df8469fe93283799d16ba719853cd","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984b895be428eb62faecfa1d08b3027c3e","name":"darwin","path":"darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e982f3ce22c660c05014650f2141be351cb","name":"webview_flutter_wkwebview","path":"webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f7efc2891320ad7d23a9595c044f24c9","name":"plugins","path":"plugins","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98998268b88352c706bd623fa125d78e14","name":".symlinks","path":".symlinks","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98abca3298a5bbc0bb4dd9d8cf1a74bdfe","name":"ios","path":"ios","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983142103ba60fc80021c44c082cbb2085","name":"mih_ui","path":"mih_ui","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98bfddf9a72add8798c0680e3a822bd3a3","name":"mih-project","path":"mih-project","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98903a8d20c712a7208dee388e7930522c","name":"mih_main","path":"mih_main","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fd91bff3257c874eb7cab94656aec62a","name":"Git","path":"Git","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980f7aca0d0e8ccada61efb73023ffbee1","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f2a10bc8d167cbe076b355a408fa1528","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983684033a11df7c3dbdc9173f2b967a01","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dad8d4d48da518b4832fe56aa6d7ff26","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981f702a8f32c7edf17307d7f348f4da1b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984ac2a3f47720a624cda98c6c63a91a1b","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983f1a4db6964609522e21e9f0a5118001","name":"..","path":"..","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98e2cb78a131c73a2e02585d8c14d7b887","name":"..","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview/Sources","sourceTree":"","type":"group"},{"children":[{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9824ff62429bccb22ecfe1ee60ed3f0072","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/LICENSE","sourceTree":"","type":"file"},{"fileType":"text.script.ruby","guid":"bfdfe7dc352907fc980b868725387e986ce959ed8b55c93c838e281b49f59f62","path":"../../../../../../../../../.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.22.0/darwin/webview_flutter_wkwebview.podspec","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9850235b1d0bbef722e3fc04cc5177d23c","name":"Pod","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98383792c148c7b66f5320330479ad4069","path":"ResourceBundle-webview_flutter_wkwebview_privacy-webview_flutter_wkwebview-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9833349cd22b47af494bc42934f0744298","path":"webview_flutter_wkwebview.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9859611e05685d6f3b5c95a6eec6a330ea","path":"webview_flutter_wkwebview-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98a6ceb29d6c56ef325d1f665bba652df2","path":"webview_flutter_wkwebview-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981acb8967a15abebef01740364c041793","path":"webview_flutter_wkwebview-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98be6867ee97e573510941c1420420ae39","path":"webview_flutter_wkwebview-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98d8979ec56d38d5f43a66a4cc2fbcb401","path":"webview_flutter_wkwebview.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984206827662d5208f461a0eccfc0e621b","path":"webview_flutter_wkwebview.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980c4cd0ca3d3ff6fcb84398d2a3358a0a","name":"Support Files","path":"../../../../Pods/Target Support Files/webview_flutter_wkwebview","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e984dba023a8957e9dc8093649b3d3333da","name":"webview_flutter_wkwebview","path":"../.symlinks/plugins/webview_flutter_wkwebview/darwin","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e989b4d6c5fa47ecb7daee271dbede5ad52","name":"Development Pods","path":"","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98d6bdeaa5b175cb64de0845531dd3a07a","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/AVFoundation.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98f85abfcd8b98daa4c08612ae63641e69","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/AVKit.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e982680e93f57d9a3d8e73bd93b7e3e0f36","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/ImageIO.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98fc74d0fed09821b42c8c83fca08fddb2","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Photos.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98e4170aa7f984f5a13b58a3c42c24b3e6","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/SafariServices.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e9820c167798bdb228b4ab52bb2aa7eb24b","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Security.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98e0217d662efb0603efc52f1254a3c7a8","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/SystemConfiguration.framework","sourceTree":"DEVELOPER_DIR","type":"file"},{"fileType":"wrapper.framework","guid":"bfdfe7dc352907fc980b868725387e98f2f44ab0d0f0ce315b53d31757eb8db6","path":"Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework","sourceTree":"DEVELOPER_DIR","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e984edace956042c415757881081562809b","name":"iOS","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e986f57df5597ed36b645cb934c885be56d","name":"Frameworks","path":"","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98014d81339f7078c553aad067e2c1e542","path":"AppCheckCore/Sources/Public/AppCheckCore/AppCheckCore.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9828b098957cb273088cb9694f57f6aa9b","path":"AppCheckCore/Sources/AppAttestProvider/DCAppAttestService+GACAppAttestService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98eda68ffa8acf6341bdd6764dc69f14ea","path":"AppCheckCore/Sources/AppAttestProvider/DCAppAttestService+GACAppAttestService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d5afb74f6affa743e0f460b5372128c","path":"AppCheckCore/Sources/DeviceCheckProvider/DCDevice+GACDeviceCheckTokenGenerator.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c82d9f039480b6a3f302f98e59983983","path":"AppCheckCore/Sources/DeviceCheckProvider/DCDevice+GACDeviceCheckTokenGenerator.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c693a9d5b43f3dd47c9a722b20606f0d","path":"AppCheckCore/Sources/AppAttestProvider/API/GACAppAttestAPIService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98539f97205232fdc1451a9f7c8097d9f6","path":"AppCheckCore/Sources/AppAttestProvider/API/GACAppAttestAPIService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9895fad991994f740ea3a0d0ae15aa1ae4","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestArtifactStorage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b83a24afd65346b2bf12ca652c517f99","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestArtifactStorage.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9879746c4764bdf06155261adb67d0ecda","path":"AppCheckCore/Sources/AppAttestProvider/API/GACAppAttestAttestationResponse.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98087e9537dc37fc002b865cca978e783c","path":"AppCheckCore/Sources/AppAttestProvider/API/GACAppAttestAttestationResponse.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9858fc7456770843d79df60a4fac1e1f21","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestKeyIDStorage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988feba12f52eda30148e94b936a418633","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestKeyIDStorage.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98881b0a9e4c6413cc3a4330c7764cb89e","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppAttestProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98577f1fe42e5dc5c2e7e55299acf301aa","path":"AppCheckCore/Sources/AppAttestProvider/GACAppAttestProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fb187d533907cbad809ebd88436c4a78","path":"AppCheckCore/Sources/AppAttestProvider/GACAppAttestProviderState.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98358267319aee2a1f6097c2d48c844228","path":"AppCheckCore/Sources/AppAttestProvider/GACAppAttestProviderState.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987f13dc02d10ed5c4ba105bb7b6fbc4e4","path":"AppCheckCore/Sources/AppAttestProvider/Errors/GACAppAttestRejectionError.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ca28cb9281f2e84ed045a06550b0e564","path":"AppCheckCore/Sources/AppAttestProvider/Errors/GACAppAttestRejectionError.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98492f8c730664e908ffe340f7496c9f79","path":"AppCheckCore/Sources/AppAttestProvider/GACAppAttestService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98aea1bf88784f644740e8ef1f765d1763","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestStoredArtifact.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985813b18e8935c4f95e05bcd74f837249","path":"AppCheckCore/Sources/AppAttestProvider/Storage/GACAppAttestStoredArtifact.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f0b1f732a61c77e8d848d5868deb0b62","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheck.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9827ca8bd13e7ceee923e143162527ddf4","path":"AppCheckCore/Sources/Core/GACAppCheck.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9837bc6335678372d578e6d02db1629af0","path":"AppCheckCore/Sources/Core/APIService/GACAppCheckAPIService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984e54641bd8600d981f2b8ae39a870e00","path":"AppCheckCore/Sources/Core/APIService/GACAppCheckAPIService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c61395722d06659205139c45a25e2676","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckAvailability.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98da0f4edada96d01491b50b373b8e2d17","path":"AppCheckCore/Sources/Core/Backoff/GACAppCheckBackoffWrapper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98174dfe48f0936468875402ed704dabc2","path":"AppCheckCore/Sources/Core/Backoff/GACAppCheckBackoffWrapper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b1e121e7f892a1088bfc28fd83c4b2dc","path":"AppCheckCore/Sources/Core/Utils/GACAppCheckCryptoUtils.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9829007e4ebcafeb1e46a41c025d1c75c6","path":"AppCheckCore/Sources/Core/Utils/GACAppCheckCryptoUtils.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9838ab10c273a7e47d831e4ac8a3a5ac4c","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckDebugProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984be13140013cec049e7b151fd1988622","path":"AppCheckCore/Sources/DebugProvider/GACAppCheckDebugProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98dac18db19a745421b5c65b10b4f4d79a","path":"AppCheckCore/Sources/DebugProvider/API/GACAppCheckDebugProviderAPIService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9808d0d0571ccc4b7e15d946a45268ab43","path":"AppCheckCore/Sources/DebugProvider/API/GACAppCheckDebugProviderAPIService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e1dae2413b60766fd26fdafb05789b08","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckErrors.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f3de26ba5b5c36f5aeffb5c06f1623ec","path":"AppCheckCore/Sources/Core/Errors/GACAppCheckErrors.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9829d2cfb34695f3b70daac392c3ac42be","path":"AppCheckCore/Sources/Core/Errors/GACAppCheckErrorUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981cf6381f55e9ecb15799f109ba22813e","path":"AppCheckCore/Sources/Core/Errors/GACAppCheckErrorUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9840d287a87e37c64d0a718e1abe22ea0b","path":"AppCheckCore/Sources/Core/Errors/GACAppCheckHTTPError.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9893049ceada4e29aa457dfc968b35d04d","path":"AppCheckCore/Sources/Core/Errors/GACAppCheckHTTPError.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cd2ca0d4f82d3b33ee4ad429fe8459b0","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983ef18a79e17b5bdc30cb4f2b4274fdb9","path":"AppCheckCore/Sources/Core/GACAppCheckLogger.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bd9686f220f85a0a984b226ac6bf56e2","path":"AppCheckCore/Sources/Core/GACAppCheckLogger+Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9874128677a6ece04c6192ff43793cd2a3","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98782156c69d76c8c6493e13d013c7ce68","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckSettings.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982441595d23425e7fc95dc3f4a540e4da","path":"AppCheckCore/Sources/Core/GACAppCheckSettings.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986a8e8f52ce1983fc319f91887811f274","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStorage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982b8462cd169d1e0749ac27072f89f63e","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStorage.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9829195948780728699af6ecdf82603694","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStoredToken.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9828e7a28a227cdf431de4bf2858a41bbe","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStoredToken.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e10e47fb86648c98be3656c0ccca10e5","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStoredToken+GACAppCheckToken.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987533d8eadf98de75a39414c45f84c97a","path":"AppCheckCore/Sources/Core/Storage/GACAppCheckStoredToken+GACAppCheckToken.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9818e104a51a5ccc214c42f6a98edeef45","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTimer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f4e9b20932af00aaa09e6fad037bc675","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTimer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a20441f218b6e5f9df32f6fd2cd3c3a6","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckToken.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988d91cc71f5ce438497a6057117f8c354","path":"AppCheckCore/Sources/Core/GACAppCheckToken.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ab95d45482b4f15cf9b35a49cabce56a","path":"AppCheckCore/Sources/Core/APIService/GACAppCheckToken+APIResponse.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985f834f5e6923ec908549b8f62a618c71","path":"AppCheckCore/Sources/Core/APIService/GACAppCheckToken+APIResponse.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ed76d12f5c543a6a57822cdb488c14fc","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckTokenDelegate.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98835e9bec84d11ab061c8232c82eb1d7e","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTokenRefresher.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98234709d52c7321a4980d4abdb69bdab2","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTokenRefresher.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9806f6d128aff99460ffc6c94ba1bc162c","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTokenRefreshResult.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c749ee5587e64f95f2b09ed09f61b050","path":"AppCheckCore/Sources/Core/TokenRefresh/GACAppCheckTokenRefreshResult.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980c5f74743a1066c09331ff78287d8b6a","path":"AppCheckCore/Sources/Public/AppCheckCore/GACAppCheckTokenResult.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9848eaaee93b51e8f77bc9842360a966dd","path":"AppCheckCore/Sources/Core/GACAppCheckTokenResult.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b18aaaf052e27db0b53d9fa8af58d2c2","path":"AppCheckCore/Sources/DeviceCheckProvider/API/GACDeviceCheckAPIService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a68711618db6b4b78c1e1f9eba53a069","path":"AppCheckCore/Sources/DeviceCheckProvider/API/GACDeviceCheckAPIService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ea3377b1e0c0bdef3341745d6980d9c2","path":"AppCheckCore/Sources/Public/AppCheckCore/GACDeviceCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9827dd64bc5511da2695473b94ff768e19","path":"AppCheckCore/Sources/DeviceCheckProvider/GACDeviceCheckProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986d751b4b66302242538b97dc19e6cc3c","path":"AppCheckCore/Sources/DeviceCheckProvider/GACDeviceCheckTokenGenerator.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a451f8861c61957089616af539f9e48b","path":"AppCheckCore/Sources/Core/APIService/GACURLSessionDataResponse.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c0bd7a1ba78b0e4556aa605a1ba1a2e1","path":"AppCheckCore/Sources/Core/APIService/GACURLSessionDataResponse.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98695cb111b5ba9a097c1007af207f49de","path":"AppCheckCore/Sources/Core/APIService/NSURLSession+GACPromises.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bbce17ed01d5c32b82156eaf7a9cc458","path":"AppCheckCore/Sources/Core/APIService/NSURLSession+GACPromises.m","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98672f89e6abf7bc498589f929ef4ce877","path":"AppCheckCore.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c7d21c3328d9ad46039795667d6cc430","path":"AppCheckCore-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e7dec041b2f08935fbb856955fc66d96","path":"AppCheckCore-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981b9edf1174753b93be76528df893f4d1","path":"AppCheckCore-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e989ea1b5ad8cedbe34b515d7efe8552fea","path":"AppCheckCore.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98bc298d5906127a42ca6675d4cbce0891","path":"AppCheckCore.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ec495a89e7a8b257ccadbb7eaf4c3523","name":"Support Files","path":"../Target Support Files/AppCheckCore","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e988bcb684524b48bade77ba348047cfd68","name":"AppCheckCore","path":"AppCheckCore","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a7167b35e446804e288fc5f3108fd0e0","path":"Sources/DKImagePickerController/View/Cell/DKAssetGroupCellItemProtocol.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984737ea76e0a4c76036af3b355fdec0ed","path":"Sources/DKImagePickerController/View/Cell/DKAssetGroupDetailBaseCell.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98eba5be275263271fcd1bf32ee797809b","path":"Sources/DKImagePickerController/View/Cell/DKAssetGroupDetailCameraCell.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b76a64655dc550f5ebec2f9ff3200413","path":"Sources/DKImagePickerController/View/Cell/DKAssetGroupDetailImageCell.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e980f1347790a1fae83f056fa4b808c3cd0","path":"Sources/DKImagePickerController/View/DKAssetGroupDetailVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9876da5a8044ee25187970ba558822731d","path":"Sources/DKImagePickerController/View/Cell/DKAssetGroupDetailVideoCell.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9849e6729fc1e44edf7426ac54b962a26b","path":"Sources/DKImagePickerController/View/DKAssetGroupGridLayout.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a8ca137552a3696b8a3ae1c151998fe9","path":"Sources/DKImagePickerController/View/DKAssetGroupListVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98add192413820866011e7588ab8d50a1b","path":"Sources/DKImagePickerController/DKImageAssetExporter.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986747ae603292c978ec451164346bb561","path":"Sources/DKImagePickerController/DKImageExtensionController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9804eba36085f83cab0f06e047a1723201","path":"Sources/DKImagePickerController/DKImagePickerController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985f34fcdb8acab7b808291804ea4c93a4","path":"Sources/DKImagePickerController/DKImagePickerControllerBaseUIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9804fc4899b4975caa6c83b0bcabd7bdcd","path":"Sources/DKImagePickerController/View/DKPermissionView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9847c7fe098b50f268068840c428bc95bc","path":"Sources/DKImagePickerController/DKPopoverViewController.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ee77237c63b5b2d99fb3bff9d88bdbac","name":"Core","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98335a94dbe483545144593a747bf57488","path":"Sources/DKImageDataManager/Model/DKAsset.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c856fc1f1a5df75e1f335a24f80a324c","path":"Sources/DKImageDataManager/Model/DKAsset+Export.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9883b700d4c655a66d2eb0ecd5009867cc","path":"Sources/DKImageDataManager/Model/DKAsset+Fetch.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98227220f91dfab4c4322ac4ed581b024b","path":"Sources/DKImageDataManager/Model/DKAssetGroup.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98df6555ed20370a218636d2d1ef042bff","path":"Sources/DKImageDataManager/DKImageBaseManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983c5b7868d9cf3226bd45e2f7fde341f2","path":"Sources/DKImageDataManager/DKImageDataManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98034544f799334fac9753d3c062ac4eb5","path":"Sources/DKImageDataManager/DKImageGroupDataManager.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980b04c7ce3b4c4fc3cdc8d706c268e067","name":"ImageDataManager","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9873c16ebd0704c7e74ef2732a8617faf4","path":"Sources/Extensions/DKImageExtensionGallery.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98803813ee40633c05ccd6363e45670f9a","name":"PhotoGallery","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c04e1fef39dccde86db40118bcaf63f7","path":"Sources/DKImagePickerController/Resource/DKImagePickerControllerResource.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98992e20e5c86d6ccae38bdf84a625f178","path":"Sources/DKImagePickerController/Resource/Resources/ar.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98fc42f53bf0b263eb43dfba42d468c1ee","path":"Sources/DKImagePickerController/Resource/Resources/Base.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98c0e0c44805bf91b9ddacc8f5c5de5887","path":"Sources/DKImagePickerController/Resource/Resources/da.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e985b7ec0450262a9573a0cb306273bc343","path":"Sources/DKImagePickerController/Resource/Resources/de.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98a0d3580855f196150587aeedde49d8ee","path":"Sources/DKImagePickerController/Resource/Resources/en.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e988591a2b29b958ca4ab9f3147bafa7a8a","path":"Sources/DKImagePickerController/Resource/Resources/es.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98d68c0474e2f03eb8c7fccab1413bcc77","path":"Sources/DKImagePickerController/Resource/Resources/fr.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98418e94a9d7a67843e706121817b95d23","path":"Sources/DKImagePickerController/Resource/Resources/hu.lproj","sourceTree":"","type":"file"},{"fileType":"folder.assetcatalog","guid":"bfdfe7dc352907fc980b868725387e9844ff420afcb298679dede65a45ffceb5","path":"Sources/DKImagePickerController/Resource/Resources/Images.xcassets","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e987692caa5c901fbd366ce9848d0c1274c","path":"Sources/DKImagePickerController/Resource/Resources/it.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e9865b6e35f95ede252c917f53224dfc704","path":"Sources/DKImagePickerController/Resource/Resources/ja.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e983f2cd8e2aab8a62e70cd896c9a4fea53","path":"Sources/DKImagePickerController/Resource/Resources/ko.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98ca220a32ab2fe66aa595eba98989e624","path":"Sources/DKImagePickerController/Resource/Resources/nb-NO.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98c97c449e1eb67deb67ddecb8dcb88dc6","path":"Sources/DKImagePickerController/Resource/Resources/nl.lproj","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e988a7e09ab3fb0bccf3d6a0840f20edb02","path":"Sources/DKImagePickerController/Resource/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98360580afc3ea1e4816652b09373a6cd3","path":"Sources/DKImagePickerController/Resource/Resources/pt_BR.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e985edb9444e98b58b1ebe6043fbb03795f","path":"Sources/DKImagePickerController/Resource/Resources/ru.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e9882faf104037eae2f0a55bac80109a69f","path":"Sources/DKImagePickerController/Resource/Resources/tr.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98aa7d745938a0d9db3a2c382f9c57b33b","path":"Sources/DKImagePickerController/Resource/Resources/ur.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98693b26471f52ca7316a1d3e0c7dc0a7f","path":"Sources/DKImagePickerController/Resource/Resources/vi.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98e7d19f0ec38ff637cbd1084684e63ad4","path":"Sources/DKImagePickerController/Resource/Resources/zh-Hans.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e9822323136a1b52bdd7900e18b364dee99","path":"Sources/DKImagePickerController/Resource/Resources/zh-Hant.lproj","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e987d5cec5b9da575e4dd76fbfa813ffc1d","name":"Resources","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e9861ce1ecae12f6109ffdab5f33b0e688d","name":"Resource","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e987600b5d2e35ca259d6e8b8af16e2d27d","path":"DKImagePickerController.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9805cbd30dca7799b8a62e2c9aa2908321","path":"DKImagePickerController-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9871dfdaf22b47e644dabb30196ab019f0","path":"DKImagePickerController-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989f5bf9014f82c89ae940c2faeb8de5ca","path":"DKImagePickerController-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e6b5d8425df9cc686639898d81ab29bb","path":"DKImagePickerController-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9837b4eae1f2290b03d7d4aabded8138b2","path":"DKImagePickerController.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98c17784c5efe37bcec77e0c17b5660c20","path":"DKImagePickerController.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98cdaff8cf03e757205e0ffa1c64376011","path":"ResourceBundle-DKImagePickerController-DKImagePickerController-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98a2d4a00dbd51b88aae84475703fcbe2e","name":"Support Files","path":"../Target Support Files/DKImagePickerController","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b5ebc6f84912f477d46cfde0025e47ab","name":"DKImagePickerController","path":"DKImagePickerController","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98eb4d56e39dcd3c8f709fb6323e177298","path":"DKPhotoGallery/DKPhotoGallery.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98df24cc6698371aecc8afd7cf313cac20","path":"DKPhotoGallery/DKPhotoGalleryContentVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e987ad73074b99776b1116f9c2856ac5552","path":"DKPhotoGallery/Transition/DKPhotoGalleryInteractiveTransition.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e4d9272c60986ce5118264cb92283548","path":"DKPhotoGallery/DKPhotoGalleryScrollView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98cb2b24e4cd6fc396c5a1d3e43868d95f","path":"DKPhotoGallery/Transition/DKPhotoGalleryTransitionController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9843f4159faf9603bb660cb95efdf095b3","path":"DKPhotoGallery/Transition/DKPhotoGalleryTransitionDismiss.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98932cc722dd747e8adbcbd5e18fd5fb02","path":"DKPhotoGallery/Transition/DKPhotoGalleryTransitionPresent.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9827f7ef5f3ea80d79b40d7a4ac9588235","path":"DKPhotoGallery/DKPhotoIncrementalIndicator.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b77caf2d5e3738f780e1b59e29eabe0d","path":"DKPhotoGallery/DKPhotoPreviewFactory.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981b7dc05cd0d4c5bc74f25b88576cdaa2","name":"Core","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d0cc75a3c72b5f298ace8a3bf41f9195","path":"DKPhotoGallery/DKPhotoGalleryItem.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985adb8b3d068c6073592d841630e83ffb","name":"Model","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98eb71b1871db14bddb34f3b6dc48f5d95","path":"DKPhotoGallery/Preview/PDFPreview/DKPDFView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983ba539f64005bde8f3a4c989c13457f6","path":"DKPhotoGallery/Preview/ImagePreview/DKPhotoBaseImagePreviewVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dfa1e27846c545f78585767f808c0290","path":"DKPhotoGallery/Preview/DKPhotoBasePreviewVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98925864836a0b949ba0125aac269b941d","path":"DKPhotoGallery/Preview/DKPhotoContentAnimationView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9828fa2d719018a25fe1fb3c6ebb4ff951","path":"DKPhotoGallery/Preview/ImagePreview/DKPhotoImageDownloader.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f64f20afd463bd999a742dc203b790bd","path":"DKPhotoGallery/Preview/ImagePreview/DKPhotoImagePreviewVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98358107a82ec5ef5b395911951930fb60","path":"DKPhotoGallery/Preview/ImagePreview/DKPhotoImageUtility.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983e59331f8189f5e055881857d7ab4a95","path":"DKPhotoGallery/Preview/ImagePreview/DKPhotoImageView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9894ebedd554142c9762ffe051143f601a","path":"DKPhotoGallery/Preview/PDFPreview/DKPhotoPDFPreviewVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9824f019a6799511e6df48ed4fa1051373","path":"DKPhotoGallery/Preview/PlayerPreview/DKPhotoPlayerPreviewVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9857c00b0d4565e7a6a12ffd669506d74d","path":"DKPhotoGallery/Preview/DKPhotoProgressIndicator.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9817c7f07dc865de8893a20abc3a232f83","path":"DKPhotoGallery/Preview/DKPhotoProgressIndicatorProtocol.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bd8325023686436108c1116ee7b5d7bd","path":"DKPhotoGallery/Preview/QRCode/DKPhotoQRCodeResultVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98fef5a0935c29cb454c05b9981615539b","path":"DKPhotoGallery/Preview/QRCode/DKPhotoWebVC.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98941a4bd773c66feec3ba05f2f39973b3","path":"DKPhotoGallery/Preview/PlayerPreview/DKPlayerView.swift","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988e489eb1556188456366f3c28023a578","name":"Preview","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9828fefd0d3317647420ee3f37c82ec4a2","path":"DKPhotoGallery/Resource/DKPhotoGalleryResource.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e9803baa2fc67f8d76b2b108bf635be93dc","path":"DKPhotoGallery/Resource/Resources/Base.lproj","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e982a3b28f4eed66179cc3316238b0b3ee7","path":"DKPhotoGallery/Resource/Resources/en.lproj","sourceTree":"","type":"file"},{"fileType":"folder.assetcatalog","guid":"bfdfe7dc352907fc980b868725387e98812489e746316b8b3716cadbcf8878f0","path":"DKPhotoGallery/Resource/Resources/Images.xcassets","sourceTree":"","type":"file"},{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e988c57c65d211d763f44ecd815974cdf8f","path":"DKPhotoGallery/Resource/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"},{"fileType":"folder","guid":"bfdfe7dc352907fc980b868725387e98af5703700ee022e99305baf3e4656a2c","path":"DKPhotoGallery/Resource/Resources/zh-Hans.lproj","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981d1847f8aecbab7065793b6ed1d78cc9","name":"Resources","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98484ddf673e797dcb2ebabd9096caa83a","name":"Resource","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9828fd93070011af01c11522753663222e","path":"DKPhotoGallery.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ed6773dc19e610851f0ce6e641b9b3b5","path":"DKPhotoGallery-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98eca3c28d80db4703659c7505a841fd5e","path":"DKPhotoGallery-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984803f882072ffd350875889f6fd00ced","path":"DKPhotoGallery-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983e0ca2b7d01325e2be94eb703cc8834c","path":"DKPhotoGallery-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98284ffc1eae91e8f4cf71938bb6a26644","path":"DKPhotoGallery.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e986051e77661008cd9b8c42c9db89a8f91","path":"DKPhotoGallery.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e984d1dd876bf56120c5d4824839cdd4023","path":"ResourceBundle-DKPhotoGallery-DKPhotoGallery-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98791b452afe930675ebc7f222d389f86f","name":"Support Files","path":"../Target Support Files/DKPhotoGallery","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f6df08f909024b7f852c8e54decac825","name":"DKPhotoGallery","path":"DKPhotoGallery","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985f30da1e2858747ff1d5dbb8e614fcde","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdBridgeCommon.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98378f51297868f822d06d3dbf7066e8a7","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdBridgeCommon.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e1632d1666deb7ab4a20a9807837b175","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdBridgeContainer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980916d710f55a6510ec2236d4ca2eddad","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdBridgeContainer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b23f67914e22c93b5725e10243dbc413","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9859b9f4877a45e0020b0f013a3353c82e","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9865fb7d078872e4377946c879dcd12c79","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdCompanionView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980675651369bb073acbd08fe42a5161e6","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdCompanionView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ce93cdcc5205742b8a45336107ecc2dd","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdDefines.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9884ed10fcc262f319abf0a7bac72d51aa","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdDefines.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a82c28710dc0e35dc980cc2c0008a5c0","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdExperienceConfig.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981749539587073f7a0900dbff0a8d251e","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdExperienceConfig.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98787dcf0e51bdc42d1bdb1190490b5640","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdExtraHint.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986e9b8e2679b837ca9e6c0972d070db5e","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdExtraHint.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982e3093a68f23522d3acaaa37b752de2d","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdIconView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983bfb569f93d8319e00ac1512bdefd996","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdIconView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98eab5c7282e1bf65ccf39aac6e370833d","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdImage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9862d7edaa240d37690ac717f9db024e93","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdImage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ff5b60756d3f16f21bef0e4419dab4e2","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdOptionsView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98acc102a6a3f0c3a99f9f310b737b794a","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdOptionsView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985b1ee4b7dcc2a5a46b3d73399605cc3b","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdSDKNotificationManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e5041176a7f353afe09c75449a32b9c8","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdSDKNotificationManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988841e75bc2b6f7c6bcd5a69a0fa54a78","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdSettings.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981d46dfedeaf7f3980eca81be375a0655","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdSettings.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98be89424a1488672629ee4b0155524fa4","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdSettingsBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ce0df0afa7ddd4e666c26da1a00cdb48","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdSettingsBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980754644fc65b4c16ee2210deaffdbe88","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdSize.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98938f0fe0781310ac7bd714edeeaa8a19","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdSize.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9882f56ec957cfab6c2450547c39edd26d","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdUtilityBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b87e6e0d84621887ceebd551f81ff9da","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdUtilityBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9810de2bb9ec9aef610292ca5539c3e89e","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ed3bb26eb03a937908d954cae64ed8a2","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989a3b5e8381d205fc6b202e0b75b735fb","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAdViewBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e03b39ffef677af5616a11f258df7dee","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAdViewBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bb5e5cebb2bd53d1a04b0c6d5594c823","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98506d278cacc7e4336081071dd136e827","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a10ed5f31977972ae2c8ced6c11a89c2","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBAudienceNetworkAds.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b24c1436c3603b36737083c21557dea9","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBAudienceNetworkAds.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fd25fe14e890c20de44d70fb3c90cc7c","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBDynamicBannerAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980b35feb2a3784024bf1e5c1694479204","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBDynamicBannerAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d767e2834dc93d5a04636fa588e54934","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bce0521375e6f481a5770a663c2d94cb","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986895a62035a3ab073d663f6308f4b142","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBInterstitialAdBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e0233cc8f48f164f6dcccd8d5fafa5bf","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBInterstitialAdBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98395f0d28522f5b911327253718a41b88","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBMediaView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a3f76cb39078f642b2e02dd716dbf8ff","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBMediaView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980030f8b77e5cc7dc6d71308836ff866c","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBMediaViewVideoRenderer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bc7f79f4355b89c586490b5c9f289bb3","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBMediaViewVideoRenderer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a475ad9b2f52c40641abee2c56198121","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fba50ba6b35c2f37f8efd2f9f4daacca","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9856ac906686f9dc6db5ae72b054836ccc","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdBase.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982295e6dfe4ff004bd85d907e7a55d4fb","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdBase.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98740f359db1d0a268a509fe6d47112efa","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdBaseView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986492f403cfeb0644ec43f03c121c3679","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdBaseView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98edc65ca557d7a9060300ab67b9662859","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdCollectionViewAdProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b36055abf1129d808ab6cacdcbccaba1","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdCollectionViewAdProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98199a1e1340aa6e60b29907f26ead9bc1","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdCollectionViewCellProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98925bf2b00da26726de88e93a2a4f1e56","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdCollectionViewCellProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9814d3ba6df6d42e539acc6c93ef6bfc94","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983ae60eade3baf6d8e906aba844054b57","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ee4b4f4292b85e609c35c3dcb9248912","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980d45db556b84ae94ce4e46078f0df85b","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9824e49f1279dd45180ece3fc08c75ba36","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9812b63f693d659db8569076d6ccb7353e","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c9dd1a4cec0ea7cdae22d9e61a25bc30","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c41991b564f93766aaba04b99bc121eb","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987205755b85acf72129f49800e910012f","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9803f2f55fd6116a4615e87684de21e3ab","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984c54b733109f64120a65729950f711a7","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeAdViewAttributes.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983cf2b16f2c77a8946792104145320308","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeAdViewAttributes.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987c997a3be6362831c8aa6e0286fd3688","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeBannerAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987c8570d006f483f0c3aa0e9c727e4c7d","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeBannerAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989ed7a853d1365d7b9e2a8004207f79eb","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBNativeBannerAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987f17328259bed7b032673765c4ff2f52","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBNativeBannerAdView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b05774fa05fa68e72bbeca3f94034371","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBRewardedInterstitialAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ee2a542ba58a57e7d86e354e6608a3c9","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBRewardedInterstitialAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fc3cd5089234a53e65e9a84efd8b67bf","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBRewardedVideoAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9835e0c14be76420016208797d6f238e19","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBRewardedVideoAd.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980aaf99a60f6d67a0d28487a35e128cf0","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/FBRewardedVideoAdBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d0f0451fd494e057354cbeee896cfbc3","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/FBRewardedVideoAdBridge.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e38db7fa44e01f33905356808fb82d8f","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/Headers/UIView+FBNativeAdViewTag.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9859499c8cfe7e945035978a3a32243767","path":"Static/FBAudienceNetwork.xcframework/ios-arm64_x86_64-simulator/FBAudienceNetwork.framework/Headers/UIView+FBNativeAdViewTag.h","sourceTree":"","type":"file"},{"children":[{"fileType":"wrapper.xcframework","guid":"bfdfe7dc352907fc980b868725387e9884b95a9dece22dff00b910decf728631","path":"Static/FBAudienceNetwork.xcframework","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9830aaa3b2cc6399b4cf4102e834790539","name":"Frameworks","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9800817c14be55ffe583e047275a4b3cda","path":"Static/FBAudienceNetwork.xcframework/ios-arm64/FBAudienceNetwork.framework/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98be01a3e6e0756a45e82b4c77d2a75889","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e9885d367cde416a3b67a0542ca00669a48","path":"FBAudienceNetwork-xcframeworks.sh","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98ae2b6e690d9c19a64378428b59f82e0b","path":"FBAudienceNetwork.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98bf594d3cbb3ba4c66c475a7d56edf012","path":"FBAudienceNetwork.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e981b5b96984ff9136807c0f71d7f491493","path":"ResourceBundle-FBAudienceNetwork-FBAudienceNetwork-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e01f03beafa1c2122fceb6d19e38b2ba","name":"Support Files","path":"../Target Support Files/FBAudienceNetwork","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e987cd62d1eeef7de115a08dd9fda096c73","name":"FBAudienceNetwork","path":"FBAudienceNetwork","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989cdf761bfdb923827837a9ef42356175","path":"CoreOnly/Sources/Firebase.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98438f94efac4794553543cf1349c1431a","name":"CoreOnly","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e7f2a28e7b8ddc8b338bf3b440155a56","path":"Firebase.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984c35e946ddb98e62c2ccb9cc1055f1ac","path":"Firebase.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98c34cf5b01a9396117142bd03e118dc61","name":"Support Files","path":"../Target Support Files/Firebase","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e981b20b2d72239884cf9cd9a46246cecf1","name":"Firebase","path":"Firebase","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cc62704582d6538d2c8174cc4716bd01","path":"FirebaseAppCheck/Sources/Core/FIRApp+AppCheck.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985a9877f895a7208fca1225e9aac58deb","path":"FirebaseAppCheck/Sources/Core/FIRApp+AppCheck.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fbd90d23a9844d554e6c9a88b7a47396","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppAttestProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984f7216d9ae43747c39f20e03ebed994a","path":"FirebaseAppCheck/Sources/AppAttestProvider/FIRAppAttestProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983bc0545c109603b43fe7a712a18dd4ed","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheck.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e5c73c8c1278df91bc0ad8f58764b0ca","path":"FirebaseAppCheck/Sources/Core/FIRAppCheck.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980969a6e00d9b9e9eadd3837e5f867ec2","path":"FirebaseAppCheck/Sources/Core/FIRAppCheck+Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9876546db88afa14aa0230a40315a8e9cb","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckAvailability.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d015c60cb1e8278e460e203665420af4","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckComponent.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986055f501457bc6efb35bf3aa8c3a44a4","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckDebugProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984db12fbce05cdb1e7d06a4628004dfee","path":"FirebaseAppCheck/Sources/DebugProvider/FIRAppCheckDebugProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98868da319a13b4790783057bfbc4a8856","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckDebugProviderFactory.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bac4d0c002f00c3c0aadb1f86bea4db4","path":"FirebaseAppCheck/Sources/DebugProvider/FIRAppCheckDebugProviderFactory.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983250e0568fe4851d28a49a6f1cda2099","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckErrors.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9879f6b6f0297ecaf4f94f56f86cbecd39","path":"FirebaseAppCheck/Sources/Core/Errors/FIRAppCheckErrors.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98af65f253db51a8a01b417fbacaee2077","path":"FirebaseAppCheck/Sources/Core/Errors/FIRAppCheckErrorUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a467dc7f67b13c6f382fc0476ecf3578","path":"FirebaseAppCheck/Sources/Core/Errors/FIRAppCheckErrorUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982b2d142e274ac25a0561c078b47b5010","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988c010400b28cbe56f5bc69ec4f46feac","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckLogger.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98355bf2abe13f0f83f9f3bb625c809df7","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980d7be89019113857f905dea093b1ce52","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckProviderFactory.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f01ba42cf03b5479cb00e8e2f1e498f0","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckSettings.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e83b31792a4a77b69618b6c4e11a7b1e","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckSettings.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d719dfabd618a96b66dbf19219ed765b","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckToken.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9814f775d5813351265e9acad2e605cec6","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckToken.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d668922bc499462306878885b18a5df3","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckToken+Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9876df4e8ca94b5e724a4e852778743c1e","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckTokenResult.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ee9616d51dbd0978b6b1160bde75c0fe","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckTokenResult.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986ae26e21f215969b335fcf089dce8a46","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckValidator.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e48ac13f4b49e42bf03aa112e4b5d6e7","path":"FirebaseAppCheck/Sources/Core/FIRAppCheckValidator.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b169de74071925d7b12305e13c960697","path":"FirebaseCore/Extension/FIRAppInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d03e6a9e16ca15419865ec53d554960","path":"FirebaseCore/Extension/FIRComponent.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98955d9460628f5b5da0340d52b3be53ca","path":"FirebaseCore/Extension/FIRComponentContainer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d929aa8b59449447362db17859560b7","path":"FirebaseCore/Extension/FIRComponentType.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981059d7aa812d14711b030e28c61bcb6e","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRDeviceCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9852fe7745f4b2772e6cd3cba24e695be8","path":"FirebaseAppCheck/Sources/DeviceCheckProvider/FIRDeviceCheckProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c74baa67d92d7c59a439c5411d5e8e6b","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRDeviceCheckProviderFactory.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b99858e5d1ba7051c08bda553f5cbabe","path":"FirebaseAppCheck/Sources/DeviceCheckProvider/FIRDeviceCheckProviderFactory.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988d83ba06705aee54c5af980140a6c893","path":"FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FirebaseAppCheck.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fd3fc54900e75a3cfcce7c2bb219927b","path":"FirebaseCore/Extension/FirebaseCoreInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9852e8ed178d953a6776178ef48ee2814d","path":"FirebaseCore/Extension/FIRHeartbeatLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9816e853290c59ddfa95048f95507f1212","path":"FirebaseAppCheck/Sources/Core/FIRHeartbeatLogger+AppCheck.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9809a30ce0fe1dd3695686a996a065f387","path":"FirebaseAppCheck/Sources/Core/FIRHeartbeatLogger+AppCheck.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989213e7824c44f61ef818503291e680e0","path":"FirebaseAppCheck/Sources/Core/FIRInternalAppCheckProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985c461ab6a7e9879b6fa6169adaab3d61","path":"FirebaseAppCheck/Sources/Core/FIRInternalAppCheckProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982afb2c662f2c43daeead1d89b85cc4be","path":"FirebaseCore/Extension/FIRLibrary.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9889e260595c9bb6055f19e49c4ac1de2a","path":"FirebaseCore/Extension/FIRLogger.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e980211d9daa87a7ac73f52199f3828d9bc","path":"FirebaseAppCheck.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c97cf347ee33ebdbcaaf450c07f28d2e","path":"FirebaseAppCheck-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98aee35db10f9e9681f7d55fd50f470494","path":"FirebaseAppCheck-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9804717059d9181565ee5576a9e39236df","path":"FirebaseAppCheck-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98dcc81be3bb552d5ea4561a1ae5bb7340","path":"FirebaseAppCheck.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9858ca2cea4d0cfb89402980161e9a9cd8","path":"FirebaseAppCheck.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d5af18d2974cf2b5dcf20db5050fc6dc","name":"Support Files","path":"../Target Support Files/FirebaseAppCheck","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983560308e098e7b342a3809e629740fd6","name":"FirebaseAppCheck","path":"FirebaseAppCheck","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c0c7690085e912d942bf2e237c7d1c7b","path":"FirebaseAppCheck/Interop/dummy.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a7311458b4843df9e67745481ba7c0e5","path":"FirebaseAppCheck/Interop/Public/FirebaseAppCheckInterop/FIRAppCheckInterop.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9829de89cb8f108e22ea823c6be6f50bb8","path":"FirebaseAppCheck/Interop/Public/FirebaseAppCheckInterop/FIRAppCheckTokenResultInterop.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9844c414003af70893691ff86752a3f856","path":"FirebaseAppCheck/Interop/Public/FirebaseAppCheckInterop/FirebaseAppCheckInterop.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9872b498b3776044752bd0c53d637ca81b","path":"FirebaseAppCheckInterop.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982a30bb5a8768c4121de0072fc14d52a0","path":"FirebaseAppCheckInterop-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e980c7d6880ccab0cfe81163d5223da4b7c","path":"FirebaseAppCheckInterop-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d9599bd862208bd721e00a4a12690380","path":"FirebaseAppCheckInterop-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985a1fa15e8a7202370ebafaea17bc9527","path":"FirebaseAppCheckInterop-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98421994bc5dd043094766f7b84b26a0c6","path":"FirebaseAppCheckInterop.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98b37eb9d9e658784e2a78517cf0f13af6","path":"FirebaseAppCheckInterop.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980f3ab6077c6847a34ed9d8382cee65ce","name":"Support Files","path":"../Target Support Files/FirebaseAppCheckInterop","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a2ec04a7a30518162198b66acd03a635","name":"FirebaseAppCheckInterop","path":"FirebaseAppCheckInterop","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986ed0fe803e5e9f958a7a9c4d9341682d","path":"FirebaseAuth/Sources/Swift/ActionCode/ActionCodeInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98df840a4cc19a73fbfc9de23d95ea4708","path":"FirebaseAuth/Sources/Swift/ActionCode/ActionCodeOperation.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9812e153f43d8c8c8f356f5148e516cca0","path":"FirebaseAuth/Sources/Swift/ActionCode/ActionCodeSettings.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ee0255ea1e007a5b0217b62542c6b70d","path":"FirebaseAuth/Sources/Swift/ActionCode/ActionCodeURL.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dbe0c047f7ef2bbaa652ae3dc458a985","path":"FirebaseAuth/Sources/Swift/User/AdditionalUserInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9841946e8c5c51d7ff21c3c09451da596d","path":"FirebaseAuth/Sources/Swift/Auth/Auth.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98245f1ef0e5ded755952473e4d2276030","path":"FirebaseAuth/Sources/Swift/SystemService/AuthAPNSToken.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9895a020d668ee677ee2edc02b024aa625","path":"FirebaseAuth/Sources/Swift/SystemService/AuthAPNSTokenManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f171b0d6e6d7265241cf0eb8f4f3f584","path":"FirebaseAuth/Sources/Swift/SystemService/AuthAPNSTokenType.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98341d38a094f897cf5dd0a4918c8865f2","path":"FirebaseAuth/Sources/Swift/SystemService/AuthAppCredential.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f415edf05761e36c2f309be524c1706d","path":"FirebaseAuth/Sources/Swift/SystemService/AuthAppCredentialManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e980f6007ab2b4227db8a90954c2fe0bd54","path":"FirebaseAuth/Sources/Swift/Backend/AuthBackend.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e980771b86e7c5c94837366efba22ffc771","path":"FirebaseAuth/Sources/Swift/Backend/AuthBackendRPCIssuer.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985a832d2cff79b53693ec89e1007060f4","path":"FirebaseAuth/Sources/Swift/Auth/AuthComponent.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98929647b475e2c223c9e642a49d717b03","path":"FirebaseAuth/Sources/Swift/Utilities/AuthCondition.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981f237ef3f88f70d2cea687a28fb706a9","path":"FirebaseAuth/Sources/Swift/AuthProvider/AuthCredential.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9878d4a02f39de63e3d1106735da970ca7","path":"FirebaseAuth/Sources/Swift/Auth/AuthDataResult.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e987dcc3a7b3e74f870d6620b9a2a2ecf5c","path":"FirebaseAuth/Sources/Swift/Utilities/AuthDefaultUIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bfba41555dc0fdafe3758671a4c8b5c4","path":"FirebaseAuth/Sources/Swift/Auth/AuthDispatcher.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e0a494f1dd43b14ca8fbd67830a4299a","path":"FirebaseAuth/Sources/Swift/Utilities/AuthErrors.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9884262f11f18e1ece922d28e9a5d86359","path":"FirebaseAuth/Sources/Swift/Utilities/AuthErrorUtils.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b1cc66b4cfe08f3b3d9994f6667b1c8f","path":"FirebaseAuth/Sources/Swift/Auth/AuthGlobalWorkQueue.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9802ac367029fcec689c560e9c09956577","path":"FirebaseAuth/Sources/Swift/Utilities/AuthInternalErrors.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c55adbc69af63b3fae534d4d32bbb7d9","path":"FirebaseAuth/Sources/Swift/Storage/AuthKeychainServices.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c7ba925bcaab2ef799e067fb09524783","path":"FirebaseAuth/Sources/Swift/Storage/AuthKeychainStorage.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9811c9e44fde5c048982c7190a2b83b582","path":"FirebaseAuth/Sources/Swift/Storage/AuthKeychainStorageReal.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9854254b2427cbf1030d7399e4bf859971","path":"FirebaseAuth/Sources/Swift/Utilities/AuthLog.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98978d22922ec60f31d6f5a06b5fb057c2","path":"FirebaseAuth/Sources/Swift/Backend/RPC/AuthMFAResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9890e5f1c028980f312accdb59b79b8c9a","path":"FirebaseAuth/Sources/Swift/SystemService/AuthNotificationManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e31f8b7b95878bd97624e635f148c67f","path":"FirebaseAuth/Sources/Swift/Auth/AuthOperationType.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9847885db3e68e8f2c66b87e797e2b20b7","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/AuthProto.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983b65068db43de39e5b21be2c4940e213","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/Phone/AuthProtoFinalizeMFAPhoneRequestInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983266b5201df1b292d44394e8b0d06351","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/Phone/AuthProtoFinalizeMFAPhoneResponseInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98acb7d384e534589053b3d54ec83848e6","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/TOTP/AuthProtoFinalizeMFATOTPEnrollmentRequestInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988f0aa9a15a980855bb5cd22dd973231e","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/TOTP/AuthProtoFinalizeMFATOTPEnrollmentResponseInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9833c26626cd1780126c024ea0c1ab99a3","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/TOTP/AuthProtoFinalizeMFATOTPSignInRequestInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98601f5533331fe93d3990abed0a6d8df0","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/AuthProtoMFAEnrollment.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a00810df46bf1461328c3bae378e67ca","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/Phone/AuthProtoStartMFAPhoneRequestInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98657f85d6f26e1dccdccdadf67c06a872","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/Phone/AuthProtoStartMFAPhoneResponseInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ccdf38e87f3adf13c65d8b750a8a5d21","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/TOTP/AuthProtoStartMFATOTPEnrollmentRequestInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989704c064dda1053b269cf2b66cae4669","path":"FirebaseAuth/Sources/Swift/Backend/RPC/Proto/TOTP/AuthProtoStartMFATOTPEnrollmentResponseInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9897b3d707d3e694c92e507edb2f3b5ebc","path":"FirebaseAuth/Sources/Swift/AuthProvider/AuthProviderID.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9847039eb0446879e37839563d32a579c0","path":"FirebaseAuth/Sources/Swift/Utilities/AuthRecaptchaVerifier.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983df13d08c3764514e1e73c1415d6fa58","path":"FirebaseAuth/Sources/Swift/Backend/AuthRequestConfiguration.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9850eb76d161b30d916255873f47c062e9","path":"FirebaseAuth/Sources/Swift/Backend/AuthRPCRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d50924e3f8940afe7d774046e67792ae","path":"FirebaseAuth/Sources/Swift/Backend/AuthRPCResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c73511ff62a44b5597b9e19189dadd10","path":"FirebaseAuth/Sources/Swift/Auth/AuthSettings.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981b27190e33354e7e6a3225e2c828f557","path":"FirebaseAuth/Sources/Swift/SystemService/AuthStoredUserManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a72d1028678303be9b269ace9225904b","path":"FirebaseAuth/Sources/Swift/Auth/AuthTokenResult.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dabe9a937a43ec190006e0627054845a","path":"FirebaseAuth/Sources/Swift/Utilities/AuthUIDelegate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bdfcbc5d664bbafdd9f354c733bec51a","path":"FirebaseAuth/Sources/Swift/Utilities/AuthURLPresenter.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ad2e31ca91913c90d37f3a2d95bb0d2b","path":"FirebaseAuth/Sources/Swift/Storage/AuthUserDefaults.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d610f2d23e0d44e2585bc582e859d2b6","path":"FirebaseAuth/Sources/Swift/Utilities/AuthWebUtils.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e1bcfb7e241dd08c5ad005fb642710b6","path":"FirebaseAuth/Sources/Swift/Utilities/AuthWebView.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98892b63d4e763877cb5805dc850cd357a","path":"FirebaseAuth/Sources/Swift/Utilities/AuthWebViewController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e985650e463aa88e7a5e504ae565234621d","path":"FirebaseAuth/Sources/Swift/Base64URLEncodedStringExtension.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d5db2297cf3e649d29f50bdaed5ba04c","path":"FirebaseAuth/Sources/Swift/Backend/RPC/CreateAuthURIRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984a298505b96a98d10e522b4edf221ed6","path":"FirebaseAuth/Sources/Swift/Backend/RPC/CreateAuthURIResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988dfecf325d31fb2d9aff16796c653942","path":"FirebaseAuth/Sources/Swift/Backend/RPC/DeleteAccountRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f406a955a7d842430e2e924eca1f2640","path":"FirebaseAuth/Sources/Swift/Backend/RPC/DeleteAccountResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bb059cd18cd13115fe7d4b764e70af41","path":"FirebaseAuth/Sources/Swift/AuthProvider/EmailAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9869dc6e47e0a6966ada08fb3d58f5e210","path":"FirebaseAuth/Sources/Swift/Backend/RPC/EmailLinkSignInRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c0c5fe40ae00e565f4197361e56fec0b","path":"FirebaseAuth/Sources/Swift/Backend/RPC/EmailLinkSignInResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b26cf0e43da862e45d59c66508b01271","path":"FirebaseAuth/Sources/Swift/AuthProvider/FacebookAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98747bfd17f9aa097d0efe403170b79354","path":"FirebaseAuth/Sources/Swift/AuthProvider/FederatedAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98834ab9620e06639a5ff56bf792d9c5db","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Enroll/FinalizeMFAEnrollmentRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d8d289f2f9bf72c003ddd77b0878f2b6","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Enroll/FinalizeMFAEnrollmentResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f10397478c14950ef9599fdf2d3e642c","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/SignIn/FinalizeMFASignInRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984e4f4fa3681d3885991f826c7d0626b3","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/SignIn/FinalizeMFASignInResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98956799cfa2b05e7c9a8e6de92669e1d1","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRAuth.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9852ea9a7b923c00deb23d6be14aa04c11","path":"FirebaseAuth/Sources/ObjC/FIRAuth.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e29f01ee622b04136cc93b8ed10b0042","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRAuthErrors.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980471c1d2185273ed57ceb2cc5af91fd6","path":"FirebaseAuth/Sources/ObjC/FIRAuthErrorUtils.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f7f99a49e05d9d483849b82a5b042ab3","path":"FirebaseAuth/Sources/ObjC/FIRAuthProvider.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986e7ac5576571d35a0e6e17df8bef87c2","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FirebaseAuth.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98302380597dd450a0363d088676edafa9","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIREmailAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98db7c3d4ccbf8dc9059f98c1141a57e3b","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRFacebookAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9838bf347b940c7fcc4e312aca96b302b0","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRFederatedAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9868ce7c295a5827b53fa0ecbe02749a98","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRGameCenterAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986607cf0b965cb1545a435655d39e9385","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRGitHubAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989fe929ecdf26ddf9920484acf1cab280","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRGoogleAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e5f11c0f670144e5c3d5eba28a2e0bc6","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRMultiFactor.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985d13ff13c510386d418cd069fb618f57","path":"FirebaseAuth/Sources/ObjC/FIRMultiFactorConstants.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b8f740c8e02b1fc2f3f9baf571e56fe2","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRPhoneAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9883a078e0ca1c33c40bd03e510742f7e5","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRTwitterAuthProvider.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e10be73265b6d6dfa47fc284a8ef68ff","path":"FirebaseAuth/Sources/Public/FirebaseAuth/FIRUser.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9860e788c01b59d8c5e34377d048e9571f","path":"FirebaseAuth/Sources/Swift/AuthProvider/GameCenterAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9855d28a290f00d95e42828c0cce199a5e","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetAccountInfoRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9863b72be988c7f3f4f77f32a07cc998d6","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetAccountInfoResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9844d2b74824c486de8efcfb8c9f84924c","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetOOBConfirmationCodeRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98719fe830048a2ba1365eecb6632f72d2","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetOOBConfirmationCodeResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981bc7f28ea1e64999404ca4dd21dd0ea1","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetProjectConfigRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dfbbcf08b73d4a041622c799a84cf364","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetProjectConfigResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ae767345b9752815dba9af0829f647b1","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetRecaptchaConfigRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9806cce955c392c1f7a9e154850367e456","path":"FirebaseAuth/Sources/Swift/Backend/RPC/GetRecaptchaConfigResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b9b1eb7b36a3fff41786ab9d54bf826d","path":"FirebaseAuth/Sources/Swift/AuthProvider/GitHubAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98069027db4086db498c5c3aee779f8ca8","path":"FirebaseAuth/Sources/Swift/AuthProvider/GoogleAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981fea20a8743f49d4fd4d140bb89eda56","path":"FirebaseAuth/Sources/Swift/Backend/IdentityToolkitRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9844a657a5657e6fb389d0de83a143a4c2","path":"FirebaseAuth/Sources/Swift/MultiFactor/MultiFactor.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98fbaa3d86f6d124a450b9f0491119ef2b","path":"FirebaseAuth/Sources/Swift/MultiFactor/MultiFactorAssertion.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98abf7565fee3fc13cae4656dee1d87232","path":"FirebaseAuth/Sources/Swift/MultiFactor/MultiFactorInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982710250b86c363cad4a9df0dc1f552e3","path":"FirebaseAuth/Sources/Swift/MultiFactor/MultiFactorResolver.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98621647717ebb98ed5215a2363787ec60","path":"FirebaseAuth/Sources/Swift/MultiFactor/MultiFactorSession.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9887eb43b7b5c4665c64c0e5d668c0db4a","path":"FirebaseAuth/Sources/Swift/AuthProvider/OAuthCredential.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989534023b43aec676374fa28f504ebd7b","path":"FirebaseAuth/Sources/Swift/AuthProvider/OAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981d20a98d8d6380a1cc4bfbc035d066f5","path":"FirebaseAuth/Sources/Swift/AuthProvider/PhoneAuthCredential.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e983982f2b3dd103ab5403130fd0d68cf72","path":"FirebaseAuth/Sources/Swift/AuthProvider/PhoneAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984cc282790fe0653502d68810ce203862","path":"FirebaseAuth/Sources/Swift/MultiFactor/Phone/PhoneMultiFactorAssertion.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e2da331444b1f53e6dba6cb80e4bd821","path":"FirebaseAuth/Sources/Swift/MultiFactor/Phone/PhoneMultiFactorGenerator.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989efe2e2a211875271837aebcde4612e9","path":"FirebaseAuth/Sources/Swift/MultiFactor/Phone/PhoneMultiFactorInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9890e258ab83427e9b3af28df6cbba4069","path":"FirebaseAuth/Sources/Swift/Backend/RPC/ResetPasswordRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9857980f4cd36be429374abd8731e09dc2","path":"FirebaseAuth/Sources/Swift/Backend/RPC/ResetPasswordResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9842ed090caa16221d40b2deb5c1fc39a7","path":"FirebaseAuth/Sources/Swift/Backend/RPC/RevokeTokenRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e98566614e5a7eaa2d269e0707a52718","path":"FirebaseAuth/Sources/Swift/Backend/RPC/RevokeTokenResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bfc950ffeb67bb663f272c5ed9fedbd4","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SecureTokenRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e980e5fb7ae060697ed6919bcf3cedb0f75","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SecureTokenResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b4267b665e65b3b2e7bfe1594a1d1f5a","path":"FirebaseAuth/Sources/Swift/SystemService/SecureTokenService.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986cc1b3357462deb86550440d1f70a61b","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SendVerificationTokenRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d17a8f03b477f37a765a58084e0e5269","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SendVerificationTokenResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bee3b1251aecfd29166ec8b8a4b18b24","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SetAccountInfoRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9875781607f587883e67ef5fc29d71563b","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SetAccountInfoResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989757f793fe76ee3d65074635004dbb48","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SignInWithGameCenterRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98572304b8a4293ef6e15f1b6935aa3de6","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SignInWithGameCenterResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98666272423879d06e6542d05efdedb720","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SignUpNewUserRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98102c5f8ca0d2ebc5a06ccb97589db0cf","path":"FirebaseAuth/Sources/Swift/Backend/RPC/SignUpNewUserResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9875b69c0c8d62ef6ae2f4d5ccb2a50140","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Enroll/StartMFAEnrollmentRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ca7c8108003627e6f3faac826b461b2b","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Enroll/StartMFAEnrollmentResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981f8eac5b6857c6f90839ca30a2c3e6c4","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/SignIn/StartMFASignInRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a374d7222e915426b2f8ab3ba4d65ee5","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/SignIn/StartMFASignInResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ba30b785bf30ceb46a9118f6019d819b","path":"FirebaseAuth/Sources/Swift/SystemService/TokenRefreshCoalescer.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a235f0b77bf950d99dcce74d380bcd75","path":"FirebaseAuth/Sources/Swift/MultiFactor/TOTP/TOTPMultFactorAssertion.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f5f54f4445a2c9e87da1cea25995185a","path":"FirebaseAuth/Sources/Swift/MultiFactor/TOTP/TOTPMultiFactorGenerator.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989bb0668960c84bff388737525f9b3a81","path":"FirebaseAuth/Sources/Swift/MultiFactor/TOTP/TOTPMultiFactorInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986a7af298a7219b614606ae7ff2d749ae","path":"FirebaseAuth/Sources/Swift/MultiFactor/TOTP/TOTPSecret.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98bb1dadfa78eacc3f622bcccdd537b399","path":"FirebaseAuth/Sources/Swift/AuthProvider/TwitterAuthProvider.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98475bcd8f86ab153834b49971ed619ff5","path":"FirebaseAuth/Sources/Swift/User/User.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984e9998b48de1e3e79cde488b19940ce2","path":"FirebaseAuth/Sources/Swift/User/UserInfo.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e981e6263bb40c09d9f8dc13f069ceae880","path":"FirebaseAuth/Sources/Swift/User/UserInfoImpl.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d5276ff3ae57c9a7f98db3bccebc2370","path":"FirebaseAuth/Sources/Swift/User/UserMetadata.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e3a47805b413680ebb0c06709b493b25","path":"FirebaseAuth/Sources/Swift/User/UserProfileChangeRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98d104dd38e64d1362119c6d0e6e6c53a2","path":"FirebaseAuth/Sources/Swift/User/UserProfileUpdate.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9870ce2670d34fda92a4f9f6fab2cb3f05","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyAssertionRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986ea08be4fd634924346f78693900e71c","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyAssertionResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9803ec352f1d5e430050d78853042b369f","path":"FirebaseAuth/Sources/Swift/Backend/VerifyClientRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986e2c14a76174e5c401d360834cbcd241","path":"FirebaseAuth/Sources/Swift/Backend/VerifyClientResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98dc039d8f859c4d7a942b4a6efffb5c50","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyCustomTokenRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e9806bf6fed24708c67d77335a5235a6cc1","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyCustomTokenResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e984b3cebe055de35d309e97aecaa0a5a1b","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyPasswordRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986e0bef915cd1d6699aab05207038a96f","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyPasswordResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e701c1cb6f65239a251e4768e01df45e","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyPhoneNumberRequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e413e4e9aa35c4a57f446f64d1d7dbad","path":"FirebaseAuth/Sources/Swift/Backend/RPC/VerifyPhoneNumberResponse.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986632cf764cf74da0f8d3dbcbba1c5634","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Unenroll/WithdrawMFARequest.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982a785903ce725c51dc299f8f3d264a23","path":"FirebaseAuth/Sources/Swift/Backend/RPC/MultiFactor/Unenroll/WithdrawMFAResponse.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e983b9007b1d0935aee2ec307ea04061f0e","path":"FirebaseAuth/Sources/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9878fe7eb13fb9b14ae0aefa71f2ac2fb4","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9842f3c9c61827af042efa90bc656fcf02","path":"FirebaseAuth.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984b7089654a8476c04781946130828ff9","path":"FirebaseAuth-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98d9632ed755d6b03ff6528460a14194fe","path":"FirebaseAuth-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980cfa3bf3b7f73c30be0258c89af531d7","path":"FirebaseAuth-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98bbdee8c1686e5d6c3f4956eedcdb3dac","path":"FirebaseAuth.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9824122a566c18888ab83e78b3078e6f80","path":"FirebaseAuth.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98db5da4fd7970aeddce90c906e09f827d","path":"ResourceBundle-FirebaseAuth_Privacy-FirebaseAuth-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e983d795f3d7d4801b89b09dd23c6b87625","name":"Support Files","path":"../Target Support Files/FirebaseAuth","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fe0423eb1011f0dabb5decad0a189f59","name":"FirebaseAuth","path":"FirebaseAuth","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985df5bc504ec3263f252a622a8dde0a2c","path":"FirebaseAuth/Interop/dummy.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c1695f36a2224a2b1d7774e6d77eee60","path":"FirebaseAuth/Interop/Public/FirebaseAuthInterop/FIRAuthInterop.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98db9ebcd1c413e0272430cbf0539cce22","path":"FirebaseAuthInterop.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989fcb859732612135cbcb3779e0ded359","path":"FirebaseAuthInterop-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9818680ff65bab7884439f058722e68852","path":"FirebaseAuthInterop-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982a4ae442514f63382533fc2bd40840e1","path":"FirebaseAuthInterop-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b2956b9f464800c9411916e4fbb27729","path":"FirebaseAuthInterop-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e82dd82aa81c61839879590f112b6e6d","path":"FirebaseAuthInterop.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981506eb316e3225b6c1cb84ca6348d18b","path":"FirebaseAuthInterop.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9842adb397b33519898bb558c7c3a276b1","name":"Support Files","path":"../Target Support Files/FirebaseAuthInterop","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98fe9018f0e6e4e5f3ffb7e95560b8588d","name":"FirebaseAuthInterop","path":"FirebaseAuthInterop","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98230955bf7f5b9e02cf80179f183ff7ce","path":"FirebaseCore/Sources/FIRAnalyticsConfiguration.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ef90badd06be31069855a74a45016d0c","path":"FirebaseCore/Sources/FIRAnalyticsConfiguration.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981514e798aa63a0fd8e89ee17343dd566","path":"FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ed3eb3365ff3413002b88f88bb14f070","path":"FirebaseCore/Sources/FIRApp.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9815996f070a281d153a577e9dbcf3058d","path":"FirebaseCore/Extension/FIRAppInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9806c0b950b861c21b9963990ab43a4b89","path":"FirebaseCore/Sources/FIRBundleUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983928e1bb746c4dce582f3973204c6c1b","path":"FirebaseCore/Sources/FIRBundleUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b0744a7edc366118f880568d6132edfd","path":"FirebaseCore/Extension/FIRComponent.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988ed37762246bec784742e59fb1ae1dd0","path":"FirebaseCore/Sources/FIRComponent.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989fee6d5e33b87739a2dab9f66760c17e","path":"FirebaseCore/Extension/FIRComponentContainer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9819eb20fe822d32fe59693bb1af07e918","path":"FirebaseCore/Sources/FIRComponentContainer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984403d97edc979cc08bfdbddd3f49003b","path":"FirebaseCore/Sources/FIRComponentContainerInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9803a1d9e7c7406ae5b4488a23e5256418","path":"FirebaseCore/Extension/FIRComponentType.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b679246350869a9d1e1a3c06b9d5ac2f","path":"FirebaseCore/Sources/FIRComponentType.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cd384f769ff6a416ad0a47b308b7244f","path":"FirebaseCore/Sources/Public/FirebaseCore/FIRConfiguration.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b27bfcc87c6667390e6665cf5ed38907","path":"FirebaseCore/Sources/FIRConfiguration.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9877aeed262da4294e7eba3e108465f228","path":"FirebaseCore/Sources/FIRConfigurationInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d768dfd7daa1bdb257ad2abc4e232fcd","path":"FirebaseCore/Sources/Public/FirebaseCore/FirebaseCore.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fc76eb1628ab5a054f098490b4100f6d","path":"FirebaseCore/Extension/FirebaseCoreInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98800f413ba9d90bb10e7bab1cc8fbcfdb","path":"FirebaseCore/Sources/FIRFirebaseUserAgent.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98775c657f07790427fa1301264717a9fe","path":"FirebaseCore/Sources/FIRFirebaseUserAgent.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e2cf47785d0cb1b51d5ea1a97360174c","path":"FirebaseCore/Extension/FIRHeartbeatLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98981d973aa283cf55e0471a3517765b33","path":"FirebaseCore/Sources/FIRHeartbeatLogger.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a02d8ba298cf0862bbfc342c7074e5c7","path":"FirebaseCore/Extension/FIRLibrary.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a71e555b3b552897cbcd1316677dcec1","path":"FirebaseCore/Extension/FIRLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c004405cc6612ddabb4037b1f909c521","path":"FirebaseCore/Sources/FIRLogger.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988b4329a5d76b29e87e729d9cd7ad93a1","path":"FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986ff10679afde8d4204e7c212e534130a","path":"FirebaseCore/Sources/Public/FirebaseCore/FIROptions.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9892656d0ae210c7efada3c7523ed4ae30","path":"FirebaseCore/Sources/FIROptions.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989385cc843d99d2d634e9732484488b3f","path":"FirebaseCore/Sources/FIROptionsInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d8d49f4b04a791b6f8b72a3cca1ee103","path":"FirebaseCore/Sources/Public/FirebaseCore/FIRTimestamp.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981811e086c8b8e9b086cc158fbccd9d11","path":"FirebaseCore/Sources/FIRTimestamp.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98df0b9329b13401877770c564af2684fe","path":"FirebaseCore/Sources/FIRTimestampInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9881f4b7fbf5d308524566967a15d09dd2","path":"FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98fad9bf08165943a9291593d38681f1a9","path":"FirebaseCore/Sources/FIRVersion.m","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98d58b29168477f224a21c3f9676f8d359","path":"FirebaseCore/Sources/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d49c852e4a4dbcdd282d6a335751765b","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98d4900d1598abe8827c742658c338ad03","path":"FirebaseCore.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988860c8b4c7c5a5dae715e8cfb65d591d","path":"FirebaseCore-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e980a6c497f4f42db9c53403002052f8c38","path":"FirebaseCore-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98529e5f7bfff87cdbf13185e395700843","path":"FirebaseCore-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98cb16e8074f48ba05a2dfeb081f5bd1cb","path":"FirebaseCore.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9823bbf62c346537eed6e067e233fe0af3","path":"FirebaseCore.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c339f723c455897cc4e5846ca001c33c","path":"ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981be5108fd2324192c04384e8e98f2d74","name":"Support Files","path":"../Target Support Files/FirebaseCore","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d5e159ba4d96e56bba4dc7d2e139c597","name":"FirebaseCore","path":"FirebaseCore","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983addcf97f99326db0f50c64ef67acf87","path":"FirebaseCore/Extension/dummy.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980e9aa4b7906b3dcf65a309a2ebea54da","path":"FirebaseCore/Extension/FIRAppInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a4ef9427196371e4dc2731c21e69d49f","path":"FirebaseCore/Extension/FIRComponent.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9809785dc11744809391b61338a4ffac7b","path":"FirebaseCore/Extension/FIRComponentContainer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9862c85af582e57841e77b952dde7fa94c","path":"FirebaseCore/Extension/FIRComponentType.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ed46d3d90ff2fcfaef63e49a4aef56da","path":"FirebaseCore/Extension/FirebaseCoreInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9865742a13f039fe40a602469ea5f2c5a4","path":"FirebaseCore/Extension/FIRHeartbeatLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98355f9a272a7cc11736b4566ee8b3947d","path":"FirebaseCore/Extension/FIRLibrary.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f21af28e616ee0d4ff04c7a6421f4400","path":"FirebaseCore/Extension/FIRLogger.h","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98adf015b8b23a4183c14442061cb3cae9","path":"FirebaseCore/Extension/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981d5ebd0a397fd27c9f99071bb8629db3","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e983c14e80ab85f19ef5aacb70483bebe26","path":"FirebaseCoreExtension.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988de8032ed3bcd43a2fa9cb6a98756979","path":"FirebaseCoreExtension-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e982dedac294b14bf8e256212b8ed5832ab","path":"FirebaseCoreExtension-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e989321ef04d8a4ec7b0ef3f10f6590ec5b","path":"FirebaseCoreExtension-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ddc20f433ccc0f56de9a35da32254a03","path":"FirebaseCoreExtension-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e8f5202bf6c2927877bbede594254bac","path":"FirebaseCoreExtension.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e986a53acd8d9569d0c22497ed69917f900","path":"FirebaseCoreExtension.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e984fe616145e704e64056a1b2c3efe1f98","path":"ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e0cf868d06953d743485bdc6ba845117","name":"Support Files","path":"../Target Support Files/FirebaseCoreExtension","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98d9a4afcca097f04d6a0129dcb1a6c23e","name":"FirebaseCoreExtension","path":"FirebaseCoreExtension","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98593f6dae4d99a30c132d62107a81aa3d","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a54c9801248b47f1be63245cbf224d35","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatsPayload.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c4923971f83aa387b26c7b1cbb3461a3","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b11e742c4a53da542ea1cf321d4e26d0","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatController.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e982094f37cc1ad3624de7ad36386c6f411","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatLoggingTestUtils.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989c3eb4c9df3e35b9bec6678a11018e5d","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsBundle.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98a4e413da7fd7f4faf80ef89285732c22","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatsPayload.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e988bf2e7afd647207a48e69cf948defc3b","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/HeartbeatStorage.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98c954661eb8509838d8fb450920a2f8e0","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/RingBuffer.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f311c41c00ccd9d7c5b428bac6ece171","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/Storage.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98b98bef66718986a1b7d33bc52200004f","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98f6fd1de5036398d6723d5839a7b109e2","path":"FirebaseCore/Internal/Sources/Utilities/UnfairLock.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ce5e4868163131e336f7e6d43faeef31","path":"FirebaseCore/Internal/Sources/HeartbeatLogging/WeakContainer.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e985dedb4877ad3d0affcc4a716189451c7","path":"FirebaseCore/Internal/Sources/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988c1d78c43bc5eb4417b1f2338eebeaf2","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e989e456bbb211de15f51766c50e02f2c27","path":"FirebaseCoreInternal.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980896766df14a9046b4bc17a9df2f2c95","path":"FirebaseCoreInternal-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98937985b263edb9d830b2b21334cd29af","path":"FirebaseCoreInternal-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9897626e9d40c3b6b17941cad861bc0e00","path":"FirebaseCoreInternal-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f58230de926dbcf32485d1422b47f24e","path":"FirebaseCoreInternal-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98b94f751a83e7e0f1d4b42f2b77a60509","path":"FirebaseCoreInternal.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98d9147eb705ef7701ac589855737d9572","path":"FirebaseCoreInternal.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e986b218513940ce3e48cdc4c489b3ac8e5","path":"ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981124f88580b11e754cb4047243ded021","name":"Support Files","path":"../Target Support Files/FirebaseCoreInternal","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e983c09173dfc655a38a6d4e419fbd39ebd","name":"FirebaseCoreInternal","path":"FirebaseCoreInternal","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989b5a6d6941a300be315e89d9de2d68d7","path":"Sources/GoogleMobileAdsPlaceholder.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"wrapper.xcframework","guid":"bfdfe7dc352907fc980b868725387e98b826f3b2eec55eed6a10b55f0ca6a6a0","path":"Frameworks/GoogleMobileAdsFramework/GoogleMobileAds.xcframework","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985da7acad7847c0282de48c40c3457fd5","name":"Frameworks","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e9848de9a416078da1867623b75fba91210","path":"Frameworks/GoogleMobileAdsFramework/GoogleMobileAds.xcframework/ios-arm64/GoogleMobileAds.framework/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e980843427c6f3ea1b49b9d8a5ceb837cad","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98717449eaae37fe982873b032cd675c49","path":"Google-Mobile-Ads-SDK.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980db896d121df87c41c7bb87c65b3946e","path":"Google-Mobile-Ads-SDK-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c80d25f59959dcbd598cbcb223cd28c8","path":"Google-Mobile-Ads-SDK-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9849af401ecb9532c20e2a8e2308054636","path":"Google-Mobile-Ads-SDK-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d361e23934d13045cda7e58f8f9e857","path":"Google-Mobile-Ads-SDK-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e98dd60968e582a4ffe7188700abb88ad36","path":"Google-Mobile-Ads-SDK-xcframeworks.sh","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98eef3be20c160fe75bf8789e71fe75d9a","path":"Google-Mobile-Ads-SDK.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e988ad1fd18441580496a4b9e0a44f0cae8","path":"Google-Mobile-Ads-SDK.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9896b109092d68856da0f72913bf577584","path":"ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e986c13915044e459412dd17ecf59234571","name":"Support Files","path":"../Target Support Files/Google-Mobile-Ads-SDK","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98057e639f67d47cf34347b6e1af69daa7","name":"Google-Mobile-Ads-SDK","path":"Google-Mobile-Ads-SDK","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"wrapper.xcframework","guid":"bfdfe7dc352907fc980b868725387e98c43efdadfb220ffdf5295380ed083a19","path":"MetaAdapter-6.20.1.0/MetaAdapter.xcframework","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e981ab5211d0cd234a5ea9be5caa39e2398","name":"Frameworks","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e981d830042957b784950b124340b06562a","path":"GoogleMobileAdsMediationFacebook-xcframeworks.sh","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98f850c18f6937fd120321475e01101b34","path":"GoogleMobileAdsMediationFacebook.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98f12a631782f8376926b89f77c119f385","path":"GoogleMobileAdsMediationFacebook.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9839e617bebb881f967675a7ac65938fa2","name":"Support Files","path":"../Target Support Files/GoogleMobileAdsMediationFacebook","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98da1421052f8e4b7ff17543067dbeb8cf","name":"GoogleMobileAdsMediationFacebook","path":"GoogleMobileAdsMediationFacebook","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"wrapper.xcframework","guid":"bfdfe7dc352907fc980b868725387e986aa3915f04e13fe9166808a73b912cf8","path":"Frameworks/Release/UserMessagingPlatform.xcframework","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988062995fa7829a31a5cd3f53a0177dcc","name":"Frameworks","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98640b59ad05d12383de1650adc4f4bc54","path":"Frameworks/Release/UserMessagingPlatform.xcframework/ios-arm64/UserMessagingPlatform.framework/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985c8f2463fb70d5c97ecd73d01add1ce4","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e989119c064c9260b0fb80b69420a95fbd7","path":"GoogleUserMessagingPlatform-xcframeworks.sh","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e980fcd71e29c5847bc1bc9583f1118e75f","path":"GoogleUserMessagingPlatform.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e985c479bbc4c266fbeb3d57a3c706051fb","path":"GoogleUserMessagingPlatform.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98bf7c3664526b9abaddef0ea0511d0ccd","path":"ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98573971a6ed6f4086459e130630f389c5","name":"Support Files","path":"../Target Support Files/GoogleUserMessagingPlatform","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98f4780f57ef61b308f354bbc6939e42b2","name":"GoogleUserMessagingPlatform","path":"GoogleUserMessagingPlatform","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c29046bbab936122dbb0c2cfc14ba72d","path":"GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULAppDelegateSwizzler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9836a90af84591e983274e6666393b3a2e","path":"GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98eab1d503d7f2282f98d6d9a02d7ec14d","path":"GoogleUtilities/AppDelegateSwizzler/Internal/GULAppDelegateSwizzler_Private.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980cb51518c389a1e74d47410a29888c54","path":"GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULApplication.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98475fd4618ac5ac675f5ed1b8f6b6716f","path":"GoogleUtilities/Common/GULLoggerCodes.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ade842c0931397013938f333262dace9","path":"GoogleUtilities/AppDelegateSwizzler/Public/GoogleUtilities/GULSceneDelegateSwizzler.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bb8b15be2869f96e89cb90c94f936c88","path":"GoogleUtilities/AppDelegateSwizzler/GULSceneDelegateSwizzler.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988abc52683367496919aa598227a1331f","path":"GoogleUtilities/AppDelegateSwizzler/Internal/GULSceneDelegateSwizzler_Private.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98d4f06bfa9c5182a77e6e55f67e8cc512","name":"AppDelegateSwizzler","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d2f8185c0a44a500020d910dc85efd9a","path":"GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c27f8b93b1c490fbac91a853d0924367","path":"GoogleUtilities/Environment/GULAppEnvironmentUtil.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985108977873122d0fd57cf870ac976fae","path":"GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainStorage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9804c38c80ac78ea91dfede61e8a02a9f4","path":"GoogleUtilities/Environment/SecureStorage/GULKeychainStorage.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9852edbfb572efb173287d7f90327aaf76","path":"GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e76ed7edc7a31347233120173cdb2e3a","path":"GoogleUtilities/Environment/SecureStorage/GULKeychainUtils.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ed0c4266fd7527af26b4180205338e03","path":"GoogleUtilities/Environment/Public/GoogleUtilities/GULNetworkInfo.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98089b73b727d89e627dc2d8e0e82dc186","path":"GoogleUtilities/Environment/NetworkInfo/GULNetworkInfo.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985c18bce96838a531d4d7946d6ee3e86f","path":"third_party/IsAppEncrypted/Public/IsAppEncrypted.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c93ef45b447d11d19620fa2627f46021","path":"third_party/IsAppEncrypted/IsAppEncrypted.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98761489bb4112f6bc6df0aa40ef1c771c","name":"Environment","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98618f336933ff6de3d4b3c21ed135498e","path":"GoogleUtilities/Logger/Public/GoogleUtilities/GULLogger.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984a49ba4137eac58897391a09f550b916","path":"GoogleUtilities/Logger/GULLogger.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981958c32a9380d192ba5d6d582d804a04","path":"GoogleUtilities/Logger/Public/GoogleUtilities/GULLoggerLevel.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9877fe81efee4784e48ad0f8fe8e414f5e","name":"Logger","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98873946fb03e9b9792f4f2c868cb04157","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983e9921832e287ee04048d221e1bee849","path":"GoogleUtilities/Network/GULMutableDictionary.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b539eaa0485467aec39f108decf7ce35","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULNetwork.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987128275d56f53442e3921be1a6970593","path":"GoogleUtilities/Network/GULNetwork.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f596251d1ba47fb590a11c4fedd4bad6","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985b8cba972f211425405a63011c53445a","path":"GoogleUtilities/Network/GULNetworkConstants.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988a9a3e02046e4440587c711dad22de63","path":"GoogleUtilities/Network/GULNetworkInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98676e9831ef9ffb5a827c77d203afd919","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkLoggerProtocol.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98436c7dd83d7131340adf9904ee2a22d7","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e8161f35d2f39b644227bef4985f0d59","path":"GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkURLSession.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9823abfe0467d22e8134a5c86c0381cf91","path":"GoogleUtilities/Network/GULNetworkURLSession.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98129b859ec7a38d29ec21e6c03ace21af","name":"Network","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e22f64f75d44ed26f0063f98c220931a","path":"GoogleUtilities/NSData+zlib/Public/GoogleUtilities/GULNSData+zlib.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9817e6f355fc27ce11ca9eca96e7177a5a","path":"GoogleUtilities/NSData+zlib/GULNSData+zlib.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e989adb618c58879974baa4315a2f458a02","name":"NSData+zlib","path":"","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e985d3def67c82fae95425ab472ba727077","path":"GoogleUtilities/Privacy/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98181b9c10ada053953db4a2a3511f90be","name":"Resources","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98c4a9a338166ff287830de607a0dd3a4f","name":"Privacy","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c794a9f352278aabf8d2fa9bcf1b4ee3","path":"GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986a169b3bbe51ae95f696d081d0a7c6eb","path":"GoogleUtilities/Reachability/GULReachabilityChecker.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988c2d21cc3ccea47a9793788238de5094","path":"GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987937768805e8acc718e8e50513d69cbd","path":"GoogleUtilities/Reachability/GULReachabilityMessageCode.h","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985c8183b2a1b690d7fc5cf16eded0a660","name":"Reachability","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e988810e7fc4c8a26443c34ad145807005b","path":"GoogleUtilities.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d975ca315b4242d5baed303cb7aab051","path":"GoogleUtilities-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9858e770d96ac8d7973f4cf8649830ef88","path":"GoogleUtilities-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98845f39c98795e88b4a4937d3cf6cf467","path":"GoogleUtilities-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981ccda656ca076caea1e69514af198f0f","path":"GoogleUtilities.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e984a59f58d9dc78fdedc9a249bdac259e0","path":"GoogleUtilities.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98bc384638e42a052945bada9e63f9f837","path":"ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ff1fa82abe4489b8840a96f064678df8","name":"Support Files","path":"../Target Support Files/GoogleUtilities","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c5a84dc841d16549464a86e97f593c03","path":"GoogleUtilities/UserDefaults/Public/GoogleUtilities/GULUserDefaults.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ab52ae4e38d39e8507fe9603aa99a926","path":"GoogleUtilities/UserDefaults/GULUserDefaults.m","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ec31974f53c5a27c4ae9331d001d06a6","name":"UserDefaults","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98730de65bcbdfac7e956e6faf65c53e86","name":"GoogleUtilities","path":"GoogleUtilities","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98eb4aaedbcf9860120c58f6d4d062f032","path":"Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcher.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98cc293d93ed0348775d80402fa066a035","path":"Sources/Core/GTMSessionFetcher.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98dfa923d33e197f2f10f071abff2371ff","path":"Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcherLogging.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e555f92b94394e98b028c2f2173f7a28","path":"Sources/Core/GTMSessionFetcherLogging.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d312b9b5d7afb9da1592f829033a3206","path":"Sources/Core/Public/GTMSessionFetcher/GTMSessionFetcherService.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983b71212203a0dad88a8868b08a6dbc06","path":"Sources/Core/GTMSessionFetcherService.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983d4c09b113cf1215cd28e8d9ac61a23f","path":"Sources/Core/GTMSessionFetcherService+Internal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9885235b209117c45670e8a7e932ed032d","path":"Sources/Core/Public/GTMSessionFetcher/GTMSessionUploadFetcher.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f0441880a424196f2e774e387ed25a77","path":"Sources/Core/GTMSessionUploadFetcher.m","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98159e7e7e4b98dfa70678e12155a8ed77","path":"Sources/Core/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98a230ab3f02aa7b59b81f045a257a019d","name":"Resources","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98a3b6152264436bcb69edc55467bb085c","name":"Core","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98a25074687bd47b432124a152694eeb8d","path":"GTMSessionFetcher.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98043df5bc2e7d05caf248348a4d634e19","path":"GTMSessionFetcher-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98c1fd636888d3cfa01ec5b862d3399c64","path":"GTMSessionFetcher-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983987a537a915850cc63a9531255da27c","path":"GTMSessionFetcher-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98478e27dfe1d9ad49d28fafd65b85bf34","path":"GTMSessionFetcher.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e980d155ae95de828a9ae777ff4d23d3419","path":"GTMSessionFetcher.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9809bf32a80e7276875dd9bcc6a0b2ced3","path":"ResourceBundle-GTMSessionFetcher_Core_Privacy-GTMSessionFetcher-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98ae477d4033fdc504b018d76c247eb47c","name":"Support Files","path":"../Target Support Files/GTMSessionFetcher","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b6228db765bb282b42783fbadc6a0681","name":"GTMSessionFetcher","path":"GTMSessionFetcher","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9833df98e018adc77b9ee56cdc07aacd3f","path":"Sources/FBLPromises/include/FBLPromise.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c5db8499ea7419409c1cfaef6255d1d3","path":"Sources/FBLPromises/FBLPromise.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9865be438db2f61c5160b40adf875e6b14","path":"Sources/FBLPromises/include/FBLPromise+All.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98777d27b0a850f634f1b15c4202c2a016","path":"Sources/FBLPromises/FBLPromise+All.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ec2937fc269337ef369568770a9974f6","path":"Sources/FBLPromises/include/FBLPromise+Always.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ffaf0c786ee256fbae57c03e63ee964b","path":"Sources/FBLPromises/FBLPromise+Always.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986d7afd8b9ef329e8b8092b4b4d73ca33","path":"Sources/FBLPromises/include/FBLPromise+Any.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d2abfa3a17fc90c3c9f15d3fe7b22740","path":"Sources/FBLPromises/FBLPromise+Any.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d96fd933472cfe31b39378ea674cb4ef","path":"Sources/FBLPromises/include/FBLPromise+Async.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981ed65769418714c2f278ad25bd9f7a36","path":"Sources/FBLPromises/FBLPromise+Async.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984258d000b808182a55ed359ba4e63953","path":"Sources/FBLPromises/include/FBLPromise+Await.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98cb71e8d54abeffaf6876d55d161f8006","path":"Sources/FBLPromises/FBLPromise+Await.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988131c2b568eaafe86a12b2ad83d7db48","path":"Sources/FBLPromises/include/FBLPromise+Catch.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984a5efdb875e93d5ef617a439c38360ce","path":"Sources/FBLPromises/FBLPromise+Catch.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984bf3ce587970ab6f7feb6f67744292b5","path":"Sources/FBLPromises/include/FBLPromise+Delay.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b26e3f35080a2f116c44cf27fa7211e6","path":"Sources/FBLPromises/FBLPromise+Delay.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c73fcebb94e4884285929eea119100a0","path":"Sources/FBLPromises/include/FBLPromise+Do.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988c4e1d65136512ca7286df227a07f5ab","path":"Sources/FBLPromises/FBLPromise+Do.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ce3820605a66e6df7ad360709285dcaa","path":"Sources/FBLPromises/include/FBLPromise+Race.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984fce25a60148febae2186288f08b436e","path":"Sources/FBLPromises/FBLPromise+Race.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983f1026a051b69c332802557f54f5f15b","path":"Sources/FBLPromises/include/FBLPromise+Recover.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bbda8e0bcbecd512009527784f343c26","path":"Sources/FBLPromises/FBLPromise+Recover.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cf41e5e95c462c3dc24471acd8e6551e","path":"Sources/FBLPromises/include/FBLPromise+Reduce.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986bc4b82de6a07b4b56186b6d599cee80","path":"Sources/FBLPromises/FBLPromise+Reduce.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9876bb9188aba89de9ffca92bd18712f1a","path":"Sources/FBLPromises/include/FBLPromise+Retry.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b132b82c791d131185c0584a12d86eec","path":"Sources/FBLPromises/FBLPromise+Retry.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a8c1c5b1e81fee43b5a34049e1ebbef2","path":"Sources/FBLPromises/include/FBLPromise+Testing.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e983e0d7c9928fe1a8aedc0d9f70af2000e","path":"Sources/FBLPromises/FBLPromise+Testing.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98fb74040e3b4703dc724128dc4259fe39","path":"Sources/FBLPromises/include/FBLPromise+Then.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ade208b2779864b1dc5eccaf8a2e3787","path":"Sources/FBLPromises/FBLPromise+Then.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98859f6f736e1f8d98f41892e3f0b95c17","path":"Sources/FBLPromises/include/FBLPromise+Timeout.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ecaad0c1ae197eeb9134fb47589e7311","path":"Sources/FBLPromises/FBLPromise+Timeout.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980d24fc5ca57e8742be1a4aa5fca26a6c","path":"Sources/FBLPromises/include/FBLPromise+Validate.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b5d435fc4bd55488b943552a9c620acb","path":"Sources/FBLPromises/FBLPromise+Validate.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984901e26a9bf94289c40945076a433f5b","path":"Sources/FBLPromises/include/FBLPromise+Wrap.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98cfcaeda41cd8a5573825d9903c2fb4ed","path":"Sources/FBLPromises/FBLPromise+Wrap.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9845b5945be755a7e7bb5daae3aa99c2dc","path":"Sources/FBLPromises/include/FBLPromiseError.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98aa1ef7de5583853025e4a24a30edc99b","path":"Sources/FBLPromises/FBLPromiseError.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e986eee35874291a8ab220e7a802313658a","path":"Sources/FBLPromises/include/FBLPromisePrivate.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b8523b9773a8337dad012c738c7729d0","path":"Sources/FBLPromises/include/FBLPromises.h","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e988bb932e6bd0db8acade7ecd6b9275b8e","path":"Sources/FBLPromises/Resources/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e985b0b38ace790464e9ae87a9e60d781df","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98aa8fe4ac5bef26b7ccdedf7e33f0afff","path":"PromisesObjC.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f0de8f3e81d724b92d50c2f87e9f8c47","path":"PromisesObjC-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e981c9a4d0de8c15c822beab4e459b95339","path":"PromisesObjC-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b32e4e3946291ecb96c31535ac7e701c","path":"PromisesObjC-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9870bacfaf6cde3d89a76fe4e932cc6788","path":"PromisesObjC.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9889d254ad5933689bf555dbc41d2fcf23","path":"PromisesObjC.release.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ffa99e39df737e029151673e255b8518","path":"ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e988e0a79b29d8d06acd35992c3f300c06c","name":"Support Files","path":"../Target Support Files/PromisesObjC","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98eaa2548ef7c9368c0e0bc0a0d06fed6f","name":"PromisesObjC","path":"PromisesObjC","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f53a2b9142a2e19252d075f8af76efe2","path":"RecaptchaEnterprise/RecaptchaInterop/placeholder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9846288276371e5cec52e9a8a0d7bce8d6","path":"RecaptchaEnterprise/RecaptchaInterop/Public/RecaptchaInterop/RCAActionProtocol.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9888baa60dc9fe0ff0987f46e74e092236","path":"RecaptchaEnterprise/RecaptchaInterop/Public/RecaptchaInterop/RCARecaptchaClientProtocol.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985616a2553f97c6ad675d654cea953c03","path":"RecaptchaEnterprise/RecaptchaInterop/Public/RecaptchaInterop/RCARecaptchaProtocol.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9898b4264b684c69bf23f82e2a6781718d","path":"RecaptchaEnterprise/RecaptchaInterop/Public/RecaptchaInterop/RecaptchaInterop.h","sourceTree":"","type":"file"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e983d1e479aaab62448caf944f7a64cdecc","path":"RecaptchaInterop.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98eaaffa60434f1c632748d87268193d14","path":"RecaptchaInterop-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e983415c16ec9a84b848d88010a44012ae2","path":"RecaptchaInterop-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cee6e4bce2523a5d03ffcf632da2704e","path":"RecaptchaInterop-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c54e5d70b03e206695cd4cd8927c8cc8","path":"RecaptchaInterop-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9820adfbf68e5990b89cefc5d0ec651cfd","path":"RecaptchaInterop.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98e4c67bec0da225378144113a5283f5e7","path":"RecaptchaInterop.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98e539d82860197b6df3b978bac898e8d2","name":"Support Files","path":"../Target Support Files/RecaptchaInterop","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98541b599af1ad5ca4951ba2d00e657d7c","name":"RecaptchaInterop","path":"RecaptchaInterop","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d5777166096230085837e5a6300319ad","path":"SDWebImage/Private/NSBezierPath+SDRoundedCorners.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981927866bac5164139b4906c697c2ae1a","path":"SDWebImage/Private/NSBezierPath+SDRoundedCorners.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988cb0cdc02aa29fb804ef97672630b130","path":"SDWebImage/Core/NSButton+WebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9879873ec62bf39c031f9405690a0f73c5","path":"SDWebImage/Core/NSButton+WebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c822fa9c81a63d01137ef8b8fb09fb10","path":"SDWebImage/Core/NSData+ImageContentType.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ee02f559016795b3a0d12920773904b0","path":"SDWebImage/Core/NSData+ImageContentType.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98bef996f30e7cd8f81a41b150807d2a9d","path":"SDWebImage/Core/NSImage+Compatibility.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98054e5d375da8f4d58909b03284d2ffb5","path":"SDWebImage/Core/NSImage+Compatibility.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984094c7d883e6e69778784d589b0e06ff","path":"SDWebImage/Core/SDAnimatedImage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e057edb06a9fb0ee234d2501e566c13c","path":"SDWebImage/Core/SDAnimatedImage.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983a316a9a3c0d0918d8038d51d1ce2a7b","path":"SDWebImage/Core/SDAnimatedImagePlayer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9864350921c8a3eb6e2717b3957fc629b0","path":"SDWebImage/Core/SDAnimatedImagePlayer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981d5092826a9dbc8d0808fdcaa23aeb53","path":"SDWebImage/Core/SDAnimatedImageRep.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985042bb443803b56b9c76461c6b782096","path":"SDWebImage/Core/SDAnimatedImageRep.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e04128ff9b1a8ec5bb663090da8e9106","path":"SDWebImage/Core/SDAnimatedImageView.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98d6b7c5fd8f27324b1d4b9b72d5246584","path":"SDWebImage/Core/SDAnimatedImageView.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983d94e2a4234b8e8df332860ab5c28460","path":"SDWebImage/Core/SDAnimatedImageView+WebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9869d5460295efbc7dc43c12e14196373a","path":"SDWebImage/Core/SDAnimatedImageView+WebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981ee2ea2c0f3451ad81e4cd37571a9217","path":"SDWebImage/Private/SDAssociatedObject.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98162b8fefd8d643427787492f1c51da3d","path":"SDWebImage/Private/SDAssociatedObject.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988c36ed33a6b70955a1fe117c31119455","path":"SDWebImage/Private/SDAsyncBlockOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ee7eac77a5571e1e9e215e3c5a54cd59","path":"SDWebImage/Private/SDAsyncBlockOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98705e37d167e6aa4fe5e7a89434983b0b","path":"SDWebImage/Core/SDCallbackQueue.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988427fc8c610fd8f3e1bb219ece805796","path":"SDWebImage/Core/SDCallbackQueue.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ad42019143a452170ac8f0ccbe351bec","path":"SDWebImage/Private/SDDeviceHelper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98265fb41c11ac01db9fe94aa464810666","path":"SDWebImage/Private/SDDeviceHelper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98855529e142431b9ff21b7623dc2343aa","path":"SDWebImage/Core/SDDiskCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985212637a8a891d9412516918621e1a39","path":"SDWebImage/Core/SDDiskCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d9d549ee09361b3182ffb3a7cb2c4f16","path":"SDWebImage/Private/SDDisplayLink.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e26d3f5025495b220ddd4f6207f4587b","path":"SDWebImage/Private/SDDisplayLink.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9831d5facff92bfe7ff1b1f885cc66a0ef","path":"SDWebImage/Private/SDFileAttributeHelper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987aeb1677aa3f05f1761f846718835c50","path":"SDWebImage/Private/SDFileAttributeHelper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b10e1dc2d838c45be2daa77f2da23187","path":"SDWebImage/Core/SDGraphicsImageRenderer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f959b628d5b8052a17713834ad57fb09","path":"SDWebImage/Core/SDGraphicsImageRenderer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ccbf3bd085b02b578987707f8792f7b3","path":"SDWebImage/Core/SDImageAPNGCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9806ad195b6f8d839ae85aaad6a082e134","path":"SDWebImage/Core/SDImageAPNGCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987c0adab35058c318538f4dc83454ce4e","path":"SDWebImage/Private/SDImageAssetManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982d87c15323f45612fa9da3bf7eb1f67c","path":"SDWebImage/Private/SDImageAssetManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e987a842fd7d0d8113b0e4b745df45548eb","path":"SDWebImage/Core/SDImageAWebPCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980aaa2ce18060018d8582b15deb60717e","path":"SDWebImage/Core/SDImageAWebPCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98590daa9c16ed56ce3ab6dd2cc5e71b02","path":"SDWebImage/Core/SDImageCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98df178355066c42ee41917de773f15445","path":"SDWebImage/Core/SDImageCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e0f1d1916f1c2c74d3580b1a8beadbc9","path":"SDWebImage/Core/SDImageCacheConfig.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98591862058e662b5f63b1e4a002b7c7c5","path":"SDWebImage/Core/SDImageCacheConfig.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f9e678ebe42d48ec13e555aada3bc3d9","path":"SDWebImage/Core/SDImageCacheDefine.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f83f5f89240fd2c759541ca77d087f0c","path":"SDWebImage/Core/SDImageCacheDefine.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988da911fe8274c9c625d56ca791baefb0","path":"SDWebImage/Core/SDImageCachesManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e989af56a45d24d5431edf6bad850b00d11","path":"SDWebImage/Core/SDImageCachesManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98523fb53a069b36128e18dd0e59218348","path":"SDWebImage/Private/SDImageCachesManagerOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986bac22c527310784f1c006e87f3294ce","path":"SDWebImage/Private/SDImageCachesManagerOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9838cb0d098103b3b9e86956ad87b22b2d","path":"SDWebImage/Core/SDImageCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981c2992260f8b3902274cb45c5378a77c","path":"SDWebImage/Core/SDImageCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e088deb5da5e6541c7b77e9a11ea92c4","path":"SDWebImage/Core/SDImageCoderHelper.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e34fca7fb9515751e5b65daa60892205","path":"SDWebImage/Core/SDImageCoderHelper.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98c0a8f0a8b8deec84cfa655fb07cfa5ee","path":"SDWebImage/Core/SDImageCodersManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e982943aac92a9cbecd2cbbb9c61b214642","path":"SDWebImage/Core/SDImageCodersManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d86fa74c86e4b192ae203192c4ecbf7","path":"SDWebImage/Core/SDImageFrame.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e981af493bf2a6d92e228891b304a7c2b30","path":"SDWebImage/Core/SDImageFrame.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98be1b86c55734f717d0ca31fec781de9d","path":"SDWebImage/Private/SDImageFramePool.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9889a07bab11e055a44d47d0a84563e088","path":"SDWebImage/Private/SDImageFramePool.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9852dc3cd416a8f2168164e78857457a58","path":"SDWebImage/Core/SDImageGIFCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98a1d2c3a622ecffffe17ef46139139ca8","path":"SDWebImage/Core/SDImageGIFCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a7717b19769aeb6b9ee109e003eaf3c5","path":"SDWebImage/Core/SDImageGraphics.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984d09367fa07320c0ed18d8d09ef5757c","path":"SDWebImage/Core/SDImageGraphics.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b054f24c9d53f55652ce125ed0820b32","path":"SDWebImage/Core/SDImageHEICCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98616683757c0e1501dd6570169bfd41ac","path":"SDWebImage/Core/SDImageHEICCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9876f5fe642db8bd371f16f87ea2265fdd","path":"SDWebImage/Core/SDImageIOAnimatedCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988c25500f4df2d88e68f29160fa6d1d5a","path":"SDWebImage/Core/SDImageIOAnimatedCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98736d5194c32aab23367381e19d3ce3fd","path":"SDWebImage/Private/SDImageIOAnimatedCoderInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e27502a34cf0d8b4655a10b7a907244d","path":"SDWebImage/Core/SDImageIOCoder.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e986a6bcd435124a56335e622830e53d4c3","path":"SDWebImage/Core/SDImageIOCoder.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b5bfcc15d82c4bdb3694c0a573f3a82c","path":"SDWebImage/Core/SDImageLoader.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988f7a31d9a7fba991cd82fb921f090297","path":"SDWebImage/Core/SDImageLoader.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9854d83c03faf3ccae2f85ebc06d3edfd7","path":"SDWebImage/Core/SDImageLoadersManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bbe9461acf5722bf63f491f75f987246","path":"SDWebImage/Core/SDImageLoadersManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9818cbd8a1594265b40676b393a478ca19","path":"SDWebImage/Core/SDImageTransformer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980cd5a67e18edfb65db64920ac80317e1","path":"SDWebImage/Core/SDImageTransformer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988ce6991ade90f9118664f77be651e9e7","path":"SDWebImage/Private/SDInternalMacros.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98665db2580b70e0265552837a06ece510","path":"SDWebImage/Private/SDInternalMacros.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98615e5afab5c4b60f4f54bf4a24d5d7f4","path":"SDWebImage/Core/SDMemoryCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9803d55e2bb08b712edefa8542b0d821f2","path":"SDWebImage/Core/SDMemoryCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a1e40288f11809e02afe6d0add4ed3bc","path":"SDWebImage/Private/SDmetamacros.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98f3090cb74fc1105440000f3b094dac06","path":"SDWebImage/Private/SDWeakProxy.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988f335221864e0c7abd228aa513d49083","path":"SDWebImage/Private/SDWeakProxy.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982a45a60f2cf9e6b4362fdb5d961d3730","path":"WebImage/SDWebImage.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98645f30d4b737a9944563bf1acbd19e86","path":"SDWebImage/Core/SDWebImageCacheKeyFilter.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e984d3a38375b819f97a2e590d76e3d68be","path":"SDWebImage/Core/SDWebImageCacheKeyFilter.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982d6c2872630ef832dce2de99d07b9a55","path":"SDWebImage/Core/SDWebImageCacheSerializer.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98ed97a12539b70fccd51dec37544af27e","path":"SDWebImage/Core/SDWebImageCacheSerializer.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98843243bab3fa1f3d33a82459406db798","path":"SDWebImage/Core/SDWebImageCompat.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988dd995935f6b4bed79a6300837319a14","path":"SDWebImage/Core/SDWebImageCompat.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98b3d9d1eff24b478076662e7793cc0f81","path":"SDWebImage/Core/SDWebImageDefine.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e985c56464dbc24f4b98cd30d9927bd9b20","path":"SDWebImage/Core/SDWebImageDefine.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9852467a5c652bd848d515dcaabfba92be","path":"SDWebImage/Core/SDWebImageDownloader.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9870310f2e959bc3a5eff9174c850cbe6e","path":"SDWebImage/Core/SDWebImageDownloader.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e981c37503503856f7bb1bf94b84df33811","path":"SDWebImage/Core/SDWebImageDownloaderConfig.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98376eb6b21e867b2936731a0373f7aa37","path":"SDWebImage/Core/SDWebImageDownloaderConfig.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98566b09412f1c142b2d2182d03c2a7c53","path":"SDWebImage/Core/SDWebImageDownloaderDecryptor.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b463364ff9c18b81a6609b062a5130db","path":"SDWebImage/Core/SDWebImageDownloaderDecryptor.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98ba6dde7dbf6bb8b5d90dd818665d1c99","path":"SDWebImage/Core/SDWebImageDownloaderOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988d11b2e1b05020946624f2f29892aa00","path":"SDWebImage/Core/SDWebImageDownloaderOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d2287b1d56a60c6eccdf938b9aa947fd","path":"SDWebImage/Core/SDWebImageDownloaderRequestModifier.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b7defa3347432052375b438e2e2a471d","path":"SDWebImage/Core/SDWebImageDownloaderRequestModifier.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985db8e4d10c219b6975cdd62ddf92d0aa","path":"SDWebImage/Core/SDWebImageDownloaderResponseModifier.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987e7eb9b69db6e27a15c85f9fac88c21b","path":"SDWebImage/Core/SDWebImageDownloaderResponseModifier.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a20f21b83c952074caf5d18873e86258","path":"SDWebImage/Core/SDWebImageError.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98e94d1578f99b30508d8845d701648ecd","path":"SDWebImage/Core/SDWebImageError.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980db9b1158e6646728005aa55be435f85","path":"SDWebImage/Core/SDWebImageIndicator.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9812938caf7996c6d80dbf9271d3a6f958","path":"SDWebImage/Core/SDWebImageIndicator.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d48abcca92cf18856278d322cd682f4c","path":"SDWebImage/Core/SDWebImageManager.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f3d32e8ce6d42e2d053519de5c184f67","path":"SDWebImage/Core/SDWebImageManager.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e983f4f10857c92a9d96bc0bf380825345b","path":"SDWebImage/Core/SDWebImageOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c5d01b3d56827bfde5187df4ae8ae6f7","path":"SDWebImage/Core/SDWebImageOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9826c93ac59a6de6260adf7777d48a8e6b","path":"SDWebImage/Core/SDWebImageOptionsProcessor.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e980bace14250c740b8f01102fed49a6f3f","path":"SDWebImage/Core/SDWebImageOptionsProcessor.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985628e9529c81661cd2bf059df123f941","path":"SDWebImage/Core/SDWebImagePrefetcher.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98bd63cec024b8004a2cfea6c1f3c3a16d","path":"SDWebImage/Core/SDWebImagePrefetcher.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e985c307f6e0adf9012f1be72c3d0497a21","path":"SDWebImage/Core/SDWebImageTransition.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f249276cf2cb89b2af74b98fc236dc19","path":"SDWebImage/Core/SDWebImageTransition.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984b1e3ffd1fb39dc94affca31b4e27b9e","path":"SDWebImage/Private/SDWebImageTransitionInternal.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988fc042ecdc017c735af204f8c0612394","path":"SDWebImage/Core/UIButton+WebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98741d531661b69bd4c010ad24b33cb126","path":"SDWebImage/Core/UIButton+WebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d80e8bd3db060dde5d194ccc462db4de","path":"SDWebImage/Private/UIColor+SDHexString.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98fad610585409b4155dfb77dfb11aaff8","path":"SDWebImage/Private/UIColor+SDHexString.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e982c7dbddc604a244196428b8fc46f5cac","path":"SDWebImage/Core/UIImage+ExtendedCacheData.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b8c9eb74f63ffa618a81f634e2d0e973","path":"SDWebImage/Core/UIImage+ExtendedCacheData.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e984f21f0eb8f4805c253e862eb24369362","path":"SDWebImage/Core/UIImage+ForceDecode.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9810aa22726b627e7bbff26562ab33a902","path":"SDWebImage/Core/UIImage+ForceDecode.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98a364326f3629a82d35fe5e5601a7cfec","path":"SDWebImage/Core/UIImage+GIF.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b6a6fe4795e9ccd8158ae4c0af0f8c8c","path":"SDWebImage/Core/UIImage+GIF.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98eab3c5f10863c41bce28b75442dcfb0f","path":"SDWebImage/Core/UIImage+MemoryCacheCost.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987bc99a6470d3a1db520bcbccc094ac70","path":"SDWebImage/Core/UIImage+MemoryCacheCost.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988fe87f3480a506b882b7262afada35a2","path":"SDWebImage/Core/UIImage+Metadata.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9857856e03e3b248fde2b403cff7be0c2d","path":"SDWebImage/Core/UIImage+Metadata.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98d5f4296b72582a649e28a8d376925930","path":"SDWebImage/Core/UIImage+MultiFormat.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9858b4d3f93823a7a844e9af48e325ea6b","path":"SDWebImage/Core/UIImage+MultiFormat.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98350b1090302f51cfb21e01d8415c7609","path":"SDWebImage/Core/UIImage+Transform.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98f1cdf8141b4e6f72ce96cfc4e114ac93","path":"SDWebImage/Core/UIImage+Transform.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98099e64b0490c5209324be8367cf59b67","path":"SDWebImage/Core/UIImageView+HighlightedWebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9820c91663ac328caa6a772dc1aec7f895","path":"SDWebImage/Core/UIImageView+HighlightedWebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e9853d9196d0b2578d8a09ef594daec2b10","path":"SDWebImage/Core/UIImageView+WebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98c40558907257758691a97ebe7d32550e","path":"SDWebImage/Core/UIImageView+WebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98358c67ecbf86e16ee420fdc0f60209d6","path":"SDWebImage/Core/UIView+WebCache.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988613cca076d4233fbc8f533d7bf66208","path":"SDWebImage/Core/UIView+WebCache.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98338ff7df5b388b8cb6dc581ce584707b","path":"SDWebImage/Core/UIView+WebCacheOperation.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e988bfe961a333b087f09acd251c89287f8","path":"SDWebImage/Core/UIView+WebCacheOperation.m","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980f510685009abf4916684cac897048e9","path":"SDWebImage/Core/UIView+WebCacheState.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e987e9e853cad7160fab37152132380f5fa","path":"SDWebImage/Core/UIView+WebCacheState.m","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98f00a9964af8b3d1e72008eb9a3395135","path":"WebImage/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9876502081714d700f73b534ddf1747213","name":"Resources","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e980f66c8f3abfba9f5845a6849c9a74da6","name":"Core","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98e6e6af65a1e2b901f1e218c4025ec776","path":"ResourceBundle-SDWebImage-SDWebImage-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98542a3b506afea7cf05a6014e01afd827","path":"SDWebImage.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98b007c1bd88b3b03c3720e4d4ec6ce72d","path":"SDWebImage-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98fe6b49850f645e18d1be0585bb2dff16","path":"SDWebImage-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980811a6b206a0c52ca00d25ab2bfa6885","path":"SDWebImage-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e988e30be8bf3d4fd0d6c23a4784a17b51a","path":"SDWebImage-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98853911a66086d603dff7e7f648c6248b","path":"SDWebImage.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98924a369cb6c964ba34275d7ca3bc2dda","path":"SDWebImage.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9871f48d6bb622e460e9433040cdf01999","name":"Support Files","path":"../Target Support Files/SDWebImage","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98338e88a48b5dc4d1eb800f3b43a812d8","name":"SDWebImage","path":"SDWebImage","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98e40e39827e8180631013036cb2dfa2fa","path":"SwiftyGif/NSImage+SwiftyGif.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98319254f7e2beed7375a445c04910195a","path":"SwiftyGif/NSImageView+SwiftyGif.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98721903f80f4a8564791b330bfd01951f","path":"SwiftyGif/ObjcAssociatedWeakObject.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98289a02129447d57ed9106425e09cb6a0","path":"SwiftyGif/SwiftyGif.h","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e98ae29cbc96bfd2ba4fc42c1226f69b713","path":"SwiftyGif/SwiftyGifManager.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e989b199724c96ff32700c5818e07f19a57","path":"SwiftyGif/UIImage+SwiftyGif.swift","sourceTree":"","type":"file"},{"fileType":"sourcecode.swift","guid":"bfdfe7dc352907fc980b868725387e986d3515962c56f64e5bce62c72d467b1e","path":"SwiftyGif/UIImageView+SwiftyGif.swift","sourceTree":"","type":"file"},{"children":[{"fileType":"text.xml","guid":"bfdfe7dc352907fc980b868725387e98b3294ad38a1a774f918eb06a0d82d5fc","path":"SwiftyGif/PrivacyInfo.xcprivacy","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98da660a130eb921ce56819cd547890abc","name":"Resources","path":"","sourceTree":"","type":"group"},{"children":[{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98ff5eeda0914f5feba477e1b42dd88747","path":"ResourceBundle-SwiftyGif-SwiftyGif-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e9833fe566ea17ee70f00a37b770cd49975","path":"SwiftyGif.modulemap","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e9887989963270204aae9475498243cfbd6","path":"SwiftyGif-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98d9b96ec9e5d672ffebbc48d485500808","path":"SwiftyGif-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98cfbae3169e68879a7313f75db698346f","path":"SwiftyGif-prefix.pch","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98720d63afa192c3198e49d0e658ad9559","path":"SwiftyGif-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9858f3b516df641443530da1bc57fe9cb2","path":"SwiftyGif.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98ee297b6d0e4054f62dc3e42830b40034","path":"SwiftyGif.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98954abe070bafa0dab86324db53632408","name":"Support Files","path":"../Target Support Files/SwiftyGif","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98ec85f92f83a04cc8c6b5aff5f1d1b451","name":"SwiftyGif","path":"SwiftyGif","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98b9282a537e9e128893d471127342cf65","name":"Pods","path":"","sourceTree":"","type":"group"},{"guid":"bfdfe7dc352907fc980b868725387e985307a35fe1de7c38afb3dea5eb1bab9b","name":"Products","path":"","sourceTree":"","type":"group"},{"children":[{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e98a3f4680c874ecbcb5b5a6338bc13a426","path":"Pods-Runner.modulemap","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e9814181933c973297b0001d0e9ee64381d","path":"Pods-Runner-acknowledgements.markdown","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e9887440869a53d6020d968ddf6b9b30aa0","path":"Pods-Runner-acknowledgements.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98fed0970e703d355c9aff813f280aafdc","path":"Pods-Runner-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e9826e505869a67d81656859ded68178c1d","path":"Pods-Runner-frameworks.sh","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e98de02ac5005ab1eb052abf25c63731e95","path":"Pods-Runner-Info.plist","sourceTree":"","type":"file"},{"fileType":"text.script.sh","guid":"bfdfe7dc352907fc980b868725387e98f6f4dcb116856f2da0fa97d3015cb1af","path":"Pods-Runner-resources.sh","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e980ec6fbca7264a6936f2adfc48dd7f5bc","path":"Pods-Runner-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e9850cc7fc2d23136fb4fac488d6c47df20","path":"Pods-Runner.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98dc1a21852c7a085c7dd8f65cf0fa9907","path":"Pods-Runner.profile.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98f17abf55d75f35efcaf45a1185b085b6","path":"Pods-Runner.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e98cf3c1972df678a5e36df75a46391500d","name":"Pods-Runner","path":"Target Support Files/Pods-Runner","sourceTree":"","type":"group"},{"children":[{"fileType":"sourcecode.module-map","guid":"bfdfe7dc352907fc980b868725387e984c4f55ec853c945e234980557a98aed8","path":"Pods-RunnerTests.modulemap","sourceTree":"","type":"file"},{"fileType":"text","guid":"bfdfe7dc352907fc980b868725387e98fc0f7e7242f459f81e455145932dcafd","path":"Pods-RunnerTests-acknowledgements.markdown","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e985f8b68b152f46f18718da20c04e675cb","path":"Pods-RunnerTests-acknowledgements.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.objc","guid":"bfdfe7dc352907fc980b868725387e98022654f1ff78dd844d694dba2439dab2","path":"Pods-RunnerTests-dummy.m","sourceTree":"","type":"file"},{"fileType":"text.plist.xml","guid":"bfdfe7dc352907fc980b868725387e989e5ad6b9a07953a12c7008a15bd9c99c","path":"Pods-RunnerTests-Info.plist","sourceTree":"","type":"file"},{"fileType":"sourcecode.c.h","guid":"bfdfe7dc352907fc980b868725387e98e5e8bcdff29e5f8321be18f7989b4bc7","path":"Pods-RunnerTests-umbrella.h","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98144cd18850e477837c238075d5256ffe","path":"Pods-RunnerTests.debug.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e981b663a2c82f0220040296818ba53477e","path":"Pods-RunnerTests.profile.xcconfig","sourceTree":"","type":"file"},{"fileType":"text.xcconfig","guid":"bfdfe7dc352907fc980b868725387e98965b92d39d30a7872295adc2841cd1b1","path":"Pods-RunnerTests.release.xcconfig","sourceTree":"","type":"file"}],"guid":"bfdfe7dc352907fc980b868725387e9859551a2ccb1df711861b574920cd49bf","name":"Pods-RunnerTests","path":"Target Support Files/Pods-RunnerTests","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98dafc421ff02609f2772b356038eb9849","name":"Targets Support Files","path":"","sourceTree":"","type":"group"}],"guid":"bfdfe7dc352907fc980b868725387e98677e601b37074db53aff90e47c8f96d1","name":"Pods","path":"","sourceTree":"","type":"group"},"guid":"bfdfe7dc352907fc980b868725387e98","knownRegions":["Base","ar","da","de","en","es","fr","hu","it","ja","ko","nb-NO","nl","pt_BR","ru","tr","ur","vi","zh-Hans","zh-Hant"],"path":"/Users/yaso_meth/Git/mih_main/mih-project/mih_ui/ios/Pods/Pods.xcodeproj","projectDirectory":"/Users/yaso_meth/Git/mih_main/mih-project/mih_ui/ios/Pods","targets":["TARGET@v11_hash=ff5000f2df75d09390a7c02a18cf47cb","TARGET@v11_hash=de9cdf72fffe1fdedbf989540b2a67e3","TARGET@v11_hash=f8fcc6d355b2806d43f663daae6a06d4","TARGET@v11_hash=eb424d111b233087eeb27f0dcd5e1868","TARGET@v11_hash=cbb1eb454f498b998b145ed6dace7d98","TARGET@v11_hash=ddbefab0336a5b7a75af7835b2eb8ae3","TARGET@v11_hash=5bd0bad9e37ac0efe7eb7e9b6a040622","TARGET@v11_hash=ff93596a3d92ba01970679242c7f2f1b","TARGET@v11_hash=218c90a1920c10390be2408439f5191f","TARGET@v11_hash=754922e16fd2edb654ed183d0b9ffc4e","TARGET@v11_hash=d6e43cdf0cbce99338da86c88c7a9b38","TARGET@v11_hash=7dc9dce1405849bf477070cc9de38aed","TARGET@v11_hash=cc9ef9cfbfe34cf5230700b7d8fcc951","TARGET@v11_hash=a771b9f79fd75fad08749ef861b3bddf","TARGET@v11_hash=bca7282312c3cbd6420517c0b06b2299","TARGET@v11_hash=2044c736a22918f3a12ecb44d3e0c006","TARGET@v11_hash=e04e9400c66a280cff3815703b38f084","TARGET@v11_hash=c1be6d82376acb043052cbc000a547ae","TARGET@v11_hash=4cabd0c48a00d7a4ed741cb699f1cc8e","TARGET@v11_hash=ebe021611ae425ec05c93c24ce7a6607","TARGET@v11_hash=5815137460cbcfbe6d2f7a5b54b4ca09","TARGET@v11_hash=525a617ce5cf51a2c10a01508fbe4adf","TARGET@v11_hash=5319ba36858c0aa8d085cf090833a92c","TARGET@v11_hash=0b58e1096693d1b2f665847f3d6ed644","TARGET@v11_hash=0a63255185fd1fe5f5bce3e3d92075cc","TARGET@v11_hash=7aa8351d9b24919942e9946725aa9a4e","TARGET@v11_hash=76c81320e671cd52e5aa73c6af313230","TARGET@v11_hash=7c10b1b705eef3cc27b008fa5df200ca","TARGET@v11_hash=046b943ca2c386252fefb70091df62cb","TARGET@v11_hash=d014b307105d5d21e3d383fba60d7745","TARGET@v11_hash=98c62b097118c3a71fbcc1ac381d0554","TARGET@v11_hash=110600b415fe8fc7dd4ca8c0f3c4e215","TARGET@v11_hash=35adaf1be68b319de0505ded2815bc62","TARGET@v11_hash=ff36872ab1512227359a12a6bdfb005a","TARGET@v11_hash=f3bbe05679242975dafb6d8e69ca7557","TARGET@v11_hash=1140ca82d597cd38dc60054d3a158f68","TARGET@v11_hash=dbb0219d17436c670986b94b7945fa23","TARGET@v11_hash=55e76bc78bd49d51860d689a4f5e9c62","TARGET@v11_hash=cf214d336cf673b4a25ba8952e58ad2f","TARGET@v11_hash=25067fd2852a0fd76a8f9f479b2d4630","TARGET@v11_hash=d560c2e797b744ca35425688afeb9717","TARGET@v11_hash=3af0402199bd31e72f681872a46f8b81","TARGET@v11_hash=4b924fd5a51dd455efd4e7fe9f2f3ae9","TARGET@v11_hash=d1efbd94e043870162f1a431e0d81426","TARGET@v11_hash=a067526aa1156f18ea027d11109a29d4","TARGET@v11_hash=cccb0eb2cb0393abaa5f1f05d755160e","TARGET@v11_hash=eb71d09d11dfb3cc8ccae98e4e65ea84","TARGET@v11_hash=5248d9ba098cf8d77d31b3cf7f8b5a69","TARGET@v11_hash=46e4fdabe3969081354e9e5e60b64b4b","TARGET@v11_hash=bec8a7e752ab7d5daa41943969c542ce","TARGET@v11_hash=d204a2d23a6add831c951cc6c525c071","TARGET@v11_hash=aa56745ff0f6a68146d6117b991ff12e","TARGET@v11_hash=8078b8651d861575cd929af1542b7261","TARGET@v11_hash=a1626071b7e4461b7a78f87d063ecc17","TARGET@v11_hash=5b871dc0aeb742795842305fce24cf10","TARGET@v11_hash=1e4d2a3be90cd0a545f0c49cf9dce02c","TARGET@v11_hash=d67c7fe50f94aa30e853cef078cfecc9","TARGET@v11_hash=d5f04c64bab0734f1ab47fd9bcf15bc4","TARGET@v11_hash=6fb30a1c5b3e857d561640581873eb18","TARGET@v11_hash=ab724a4a507acc9a546958f9aaaa80fd","TARGET@v11_hash=14b6e6d9e2eda3680623b9cb266fb1b3","TARGET@v11_hash=4cc1f6e212912d53710de3aa08e4aa3c","TARGET@v11_hash=0b5c502676ea77f04ab6ea7a2e8956d9","TARGET@v11_hash=c832b6797055a73fc2a937f2ace5a80c","TARGET@v11_hash=558846d52469eb6457f7fa805fbcac19","TARGET@v11_hash=c7e279690d57f8e9617670c2dd8215da","TARGET@v11_hash=1f36083119fed8be641437f19af66acc","TARGET@v11_hash=6a019aebe92f33ef6d2d1a27354a274c","TARGET@v11_hash=61f30aa6dfaff3adeef504cd04583578","TARGET@v11_hash=4d623afd122ecb9d6d730809785df91d","TARGET@v11_hash=ec851e59095ec5bf084fefcd5588ef75","TARGET@v11_hash=211721151cd848f04aa31d195dc75f4a","TARGET@v11_hash=e48e30a0663eeb6ce1b0165ff162002a","TARGET@v11_hash=c5e74116acf786c1a12c0ae36c3b648b","TARGET@v11_hash=cc4efb059f8f4ef111f94e7221f71ad1","TARGET@v11_hash=8d133a19301914cd8e6a4b60878e87a2","TARGET@v11_hash=c57ff86689b99a8853e2ae591b9ac8c6","TARGET@v11_hash=1a4fe29d3cb9f9220793e4797839ee1f","TARGET@v11_hash=b77db6430f49f02a32943c46bd03734b","TARGET@v11_hash=3a7fbdb39c618b52ee7b40baa1e884b1","TARGET@v11_hash=dfe05d0a1a29529d21d126a4eec3834c","TARGET@v11_hash=b02384d9efc0e497521a0ba9096939bd","TARGET@v11_hash=376189dccaae382545d5e718c59412f6","TARGET@v11_hash=7b3186407410bb111b40b5143ff956ed","TARGET@v11_hash=fbb75b67977f7fd3136c2c9e82b06c66","TARGET@v11_hash=d360bbd5e759c5936a6004b5766066e3","TARGET@v11_hash=091b7b21a80cde9e2510d4e82d4cbd78","TARGET@v11_hash=1abbdfc13b53a75a94289fd5712275b6","TARGET@v11_hash=c369ca2358afe46d56e9c4f067675637","TARGET@v11_hash=a6be57b3049abd7b9f2b4e20f4ba91af"]} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=046b943ca2c386252fefb70091df62cb-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=046b943ca2c386252fefb70091df62cb-json new file mode 100644 index 00000000..3593aa04 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=046b943ca2c386252fefb70091df62cb-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98cb16e8074f48ba05a2dfeb081f5bd1cb","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCore","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCore","INFOPLIST_FILE":"Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FirebaseCore_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9853c6ca3436a16d495d26d90c62dc041f","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9823bbf62c346537eed6e067e233fe0af3","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCore","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCore","INFOPLIST_FILE":"Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCore_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9804059b68be909cf4b5d26662e7aca4cc","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9823bbf62c346537eed6e067e233fe0af3","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCore","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCore","INFOPLIST_FILE":"Target Support Files/FirebaseCore/ResourceBundle-FirebaseCore_Privacy-FirebaseCore-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCore_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98582157cc97f19ee6a02f760e6311d2a5","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98703ab6858e32f59e72e5cb10e19e6ee2","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e984d26d05f34861940fe601d8a1283f8c4","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d58b29168477f224a21c3f9676f8d359","guid":"bfdfe7dc352907fc980b868725387e98be033315ff722ee1672602020959c071"}],"guid":"bfdfe7dc352907fc980b868725387e9803f5a34bdf64a4474219ec56a84dc5d4","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98678fb6500ea02c78520816441717cc14","name":"FirebaseCore-FirebaseCore_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e981126092e527a43878ba047c0d6b5be37","name":"FirebaseCore_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=091b7b21a80cde9e2510d4e82d4cbd78-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=091b7b21a80cde9e2510d4e82d4cbd78-json new file mode 100644 index 00000000..ad32320e --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=091b7b21a80cde9e2510d4e82d4cbd78-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986b056fb7813eab8b622dbbdb4b6201da","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"url_launcher_ios","PRODUCT_NAME":"url_launcher_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e983bf7c387e6b30e7532f6cb4e6e71951b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982e8b062cb2e7d8455d114188a1500a94","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"url_launcher_ios","PRODUCT_NAME":"url_launcher_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9852e5f92b339577bcf682a1eb4792c8f4","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982e8b062cb2e7d8455d114188a1500a94","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/url_launcher_ios/url_launcher_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"url_launcher_ios","PRODUCT_NAME":"url_launcher_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98606903bd7be7dc87a070537db999d889","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9806f3adb2e55f13bf793c40eca5d3b6b1","guid":"bfdfe7dc352907fc980b868725387e98488b1aae650ee0880687b46866424107","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9803da34d77efef8ef3ce2c8ebbae5bdbc","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e988b923c7f69904073f11cfb33f486be4e","guid":"bfdfe7dc352907fc980b868725387e980199d549f7afb7c9e60eccd688e3ea3b"},{"fileReference":"bfdfe7dc352907fc980b868725387e981f993b8fa34154c706d827a98b25e1b7","guid":"bfdfe7dc352907fc980b868725387e98c0092cc84a327ca1f52286083ca2155f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dfc96d715d809f6ba8cb9e157b3e9dea","guid":"bfdfe7dc352907fc980b868725387e9888b1e74e60918c1dda1636aa70ed211a"},{"fileReference":"bfdfe7dc352907fc980b868725387e984136e6ab77e9cac49cc5bb8eca9cdee4","guid":"bfdfe7dc352907fc980b868725387e982f495a0a8d9589923d69caf11527df8e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9873c2ef5634c43bf05dc1b4493b3cc0b5","guid":"bfdfe7dc352907fc980b868725387e98146087d3efb3c217078c8450b09168b4"}],"guid":"bfdfe7dc352907fc980b868725387e98fa96dbb049cf26a8a5faf87ef8982665","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e982f8b7ae2e7caa8ede8091d9bb363b0d1"}],"guid":"bfdfe7dc352907fc980b868725387e988f4e5a15bd2f3cf26d08bb8eafccb083","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9829873fc0097fc1cd118d2ea1c7a9e44f","targetReference":"bfdfe7dc352907fc980b868725387e9891b3b8cc56823cdea4b418e009a423b2"}],"guid":"bfdfe7dc352907fc980b868725387e98e31bb378ac96256438f4a2e26e722c1b","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e9891b3b8cc56823cdea4b418e009a423b2","name":"url_launcher_ios-url_launcher_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98903e66fa03d6d27edaa18126a82c20fd","name":"url_launcher_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98f7a21f0cd31eecef97e8eaf4a819dde1","name":"url_launcher_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0a63255185fd1fe5f5bce3e3d92075cc-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0a63255185fd1fe5f5bce3e3d92075cc-json new file mode 100644 index 00000000..d1417ba5 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0a63255185fd1fe5f5bce3e3d92075cc-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bbdee8c1686e5d6c3f4956eedcdb3dac","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseAuth","PRODUCT_NAME":"FirebaseAuth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987caccb104bbe964690ab8e0e5f1c5343","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9824122a566c18888ab83e78b3078e6f80","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth.modulemap","PRODUCT_MODULE_NAME":"FirebaseAuth","PRODUCT_NAME":"FirebaseAuth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982fdc9bbe7faffc4d067b1a2e07cc439a","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9824122a566c18888ab83e78b3078e6f80","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuth/FirebaseAuth.modulemap","PRODUCT_MODULE_NAME":"FirebaseAuth","PRODUCT_NAME":"FirebaseAuth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c505d05a69d89c655a0f1147dc474bb8","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98956799cfa2b05e7c9a8e6de92669e1d1","guid":"bfdfe7dc352907fc980b868725387e9817c3bc70e081e5ec6276565281717acc","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e29f01ee622b04136cc93b8ed10b0042","guid":"bfdfe7dc352907fc980b868725387e98c44b2c01abc853ff34bbbb8fc91d6791","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986e7ac5576571d35a0e6e17df8bef87c2","guid":"bfdfe7dc352907fc980b868725387e9842661f22680c9f1263e79b6bbedfaccd","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980cfa3bf3b7f73c30be0258c89af531d7","guid":"bfdfe7dc352907fc980b868725387e981b28424805e56949e3655fdb82a0de2f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98302380597dd450a0363d088676edafa9","guid":"bfdfe7dc352907fc980b868725387e980d39f565349f833072c1a6591ec35993","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98db7c3d4ccbf8dc9059f98c1141a57e3b","guid":"bfdfe7dc352907fc980b868725387e987c42db9c96226a0452dd9d80946450ef","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9838bf347b940c7fcc4e312aca96b302b0","guid":"bfdfe7dc352907fc980b868725387e9801fe571211a9cabd3bede94b0c0fc944","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9868ce7c295a5827b53fa0ecbe02749a98","guid":"bfdfe7dc352907fc980b868725387e98c41463a4ca1694441164da665d4b554b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986607cf0b965cb1545a435655d39e9385","guid":"bfdfe7dc352907fc980b868725387e98edefd5b58c45704619147e682e6c90a8","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989fe929ecdf26ddf9920484acf1cab280","guid":"bfdfe7dc352907fc980b868725387e9868ff68e98182a13423fae838098eb353","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e5f11c0f670144e5c3d5eba28a2e0bc6","guid":"bfdfe7dc352907fc980b868725387e984545a36096e8fa496560ec2e969df1e2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b8f740c8e02b1fc2f3f9baf571e56fe2","guid":"bfdfe7dc352907fc980b868725387e982cee5fec0eb0252530315ea64386a065","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9883a078e0ca1c33c40bd03e510742f7e5","guid":"bfdfe7dc352907fc980b868725387e9866559041b1c3e70371e8e64815a59830","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e10be73265b6d6dfa47fc284a8ef68ff","guid":"bfdfe7dc352907fc980b868725387e98a65aa36a9db621cce28ef6868deeb51f","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9824d89d6decddd64cdca319e249c8d2c0","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e986ed0fe803e5e9f958a7a9c4d9341682d","guid":"bfdfe7dc352907fc980b868725387e9845fe1dcb670cd569b688b5db25faccea"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df840a4cc19a73fbfc9de23d95ea4708","guid":"bfdfe7dc352907fc980b868725387e9881ce2076d22304e0f5350bca852d323c"},{"fileReference":"bfdfe7dc352907fc980b868725387e9812e153f43d8c8c8f356f5148e516cca0","guid":"bfdfe7dc352907fc980b868725387e9817ec41ba2276e0af93836778015ad437"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ee0255ea1e007a5b0217b62542c6b70d","guid":"bfdfe7dc352907fc980b868725387e983ccc04f125c1991425ee2e1d144209c2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dbe0c047f7ef2bbaa652ae3dc458a985","guid":"bfdfe7dc352907fc980b868725387e98b76ba804eeea99a57ab49b7f86fbf1c5"},{"fileReference":"bfdfe7dc352907fc980b868725387e9841946e8c5c51d7ff21c3c09451da596d","guid":"bfdfe7dc352907fc980b868725387e980be46328ee4a69080b0a769bdcc6f9fb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98245f1ef0e5ded755952473e4d2276030","guid":"bfdfe7dc352907fc980b868725387e98f2a1a44676b214b0563a425b4b694964"},{"fileReference":"bfdfe7dc352907fc980b868725387e9895a020d668ee677ee2edc02b024aa625","guid":"bfdfe7dc352907fc980b868725387e9817bec36c2d0730388f65f8b9ef3bf497"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f171b0d6e6d7265241cf0eb8f4f3f584","guid":"bfdfe7dc352907fc980b868725387e989340b668922630a85e0b6cacabe4ac11"},{"fileReference":"bfdfe7dc352907fc980b868725387e98341d38a094f897cf5dd0a4918c8865f2","guid":"bfdfe7dc352907fc980b868725387e98bce252d11de26dee71f19c88dd9232c7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f415edf05761e36c2f309be524c1706d","guid":"bfdfe7dc352907fc980b868725387e98420daf1bf579fae112748c4d41948639"},{"fileReference":"bfdfe7dc352907fc980b868725387e980f6007ab2b4227db8a90954c2fe0bd54","guid":"bfdfe7dc352907fc980b868725387e98c3b390eb6a4ce356a9d0879dc791a46d"},{"fileReference":"bfdfe7dc352907fc980b868725387e980771b86e7c5c94837366efba22ffc771","guid":"bfdfe7dc352907fc980b868725387e9895a317bfc268a063f97bdb9f91b5e19b"},{"fileReference":"bfdfe7dc352907fc980b868725387e985a832d2cff79b53693ec89e1007060f4","guid":"bfdfe7dc352907fc980b868725387e984746eebd802da19934d8739a1666dbc9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98929647b475e2c223c9e642a49d717b03","guid":"bfdfe7dc352907fc980b868725387e98e147073a51831d4bf07d22bab9543b87"},{"fileReference":"bfdfe7dc352907fc980b868725387e981f237ef3f88f70d2cea687a28fb706a9","guid":"bfdfe7dc352907fc980b868725387e9845caf18783937c0fbf61cebefa37cbbe"},{"fileReference":"bfdfe7dc352907fc980b868725387e9878d4a02f39de63e3d1106735da970ca7","guid":"bfdfe7dc352907fc980b868725387e98cff1c48f2a25fe1a5e41fc8a0401115e"},{"fileReference":"bfdfe7dc352907fc980b868725387e987dcc3a7b3e74f870d6620b9a2a2ecf5c","guid":"bfdfe7dc352907fc980b868725387e98f6d8f64eba33a2d44d77cf31531ccb79"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bfba41555dc0fdafe3758671a4c8b5c4","guid":"bfdfe7dc352907fc980b868725387e98590329414946a82f9d0ea6c7d80dc15f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e0a494f1dd43b14ca8fbd67830a4299a","guid":"bfdfe7dc352907fc980b868725387e98c762fd4d8f4934171d40801407f41dad"},{"fileReference":"bfdfe7dc352907fc980b868725387e9884262f11f18e1ece922d28e9a5d86359","guid":"bfdfe7dc352907fc980b868725387e98375a0959c5a86fb6a35225ae6e03e3f7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b1cc66b4cfe08f3b3d9994f6667b1c8f","guid":"bfdfe7dc352907fc980b868725387e98fd1d0fd792add360986488219aaf8249"},{"fileReference":"bfdfe7dc352907fc980b868725387e9802ac367029fcec689c560e9c09956577","guid":"bfdfe7dc352907fc980b868725387e989cc5c451b28bbb6109baaa427000d2af"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c55adbc69af63b3fae534d4d32bbb7d9","guid":"bfdfe7dc352907fc980b868725387e986d601246ae790f43238f20cba79dd00a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c7ba925bcaab2ef799e067fb09524783","guid":"bfdfe7dc352907fc980b868725387e98f2d2084d52c20e790e05063a043438d4"},{"fileReference":"bfdfe7dc352907fc980b868725387e9811c9e44fde5c048982c7190a2b83b582","guid":"bfdfe7dc352907fc980b868725387e9825e652edb3e93370d2626e87e1c57c29"},{"fileReference":"bfdfe7dc352907fc980b868725387e9854254b2427cbf1030d7399e4bf859971","guid":"bfdfe7dc352907fc980b868725387e98345267a4fcc5d55443683fc4278faab8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98978d22922ec60f31d6f5a06b5fb057c2","guid":"bfdfe7dc352907fc980b868725387e987a2fd9f05f29358b61615006108cbca0"},{"fileReference":"bfdfe7dc352907fc980b868725387e9890e5f1c028980f312accdb59b79b8c9a","guid":"bfdfe7dc352907fc980b868725387e98cd23bc1c902ef586eaf5e165adca0cfc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e31f8b7b95878bd97624e635f148c67f","guid":"bfdfe7dc352907fc980b868725387e9837ad08567a3c2c71c8094bf789d485f3"},{"fileReference":"bfdfe7dc352907fc980b868725387e9847885db3e68e8f2c66b87e797e2b20b7","guid":"bfdfe7dc352907fc980b868725387e984c97ff9f5fb39f11a366429d98530b13"},{"fileReference":"bfdfe7dc352907fc980b868725387e983b65068db43de39e5b21be2c4940e213","guid":"bfdfe7dc352907fc980b868725387e986860813794c0607632822b953862b233"},{"fileReference":"bfdfe7dc352907fc980b868725387e983266b5201df1b292d44394e8b0d06351","guid":"bfdfe7dc352907fc980b868725387e9875ee3472953b0bbf6d545b77ccbac4e9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98acb7d384e534589053b3d54ec83848e6","guid":"bfdfe7dc352907fc980b868725387e9865af0270a3fafd7b7c80a5f8629d8731"},{"fileReference":"bfdfe7dc352907fc980b868725387e988f0aa9a15a980855bb5cd22dd973231e","guid":"bfdfe7dc352907fc980b868725387e984fb1c7bfa5efa0d31953f43ac5991ea2"},{"fileReference":"bfdfe7dc352907fc980b868725387e9833c26626cd1780126c024ea0c1ab99a3","guid":"bfdfe7dc352907fc980b868725387e9800d811f465c66bb18aafce5665c96c7c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98601f5533331fe93d3990abed0a6d8df0","guid":"bfdfe7dc352907fc980b868725387e983f3b2d863978b613c23b79dbac1c270e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a00810df46bf1461328c3bae378e67ca","guid":"bfdfe7dc352907fc980b868725387e983755fa6e9436f851d5d18c9bbfb25af1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98657f85d6f26e1dccdccdadf67c06a872","guid":"bfdfe7dc352907fc980b868725387e980dc238b1be26fb309e17af25897021d7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ccdf38e87f3adf13c65d8b750a8a5d21","guid":"bfdfe7dc352907fc980b868725387e9867ad3a23f2a07d7fc22907a4aa1c0887"},{"fileReference":"bfdfe7dc352907fc980b868725387e989704c064dda1053b269cf2b66cae4669","guid":"bfdfe7dc352907fc980b868725387e98ac349063f6baa67c90249276c9bba409"},{"fileReference":"bfdfe7dc352907fc980b868725387e9897b3d707d3e694c92e507edb2f3b5ebc","guid":"bfdfe7dc352907fc980b868725387e98c31243f48612b4f2554165a7ca11f96a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9847039eb0446879e37839563d32a579c0","guid":"bfdfe7dc352907fc980b868725387e98e88e53ce07b7520fae07a03464c27049"},{"fileReference":"bfdfe7dc352907fc980b868725387e983df13d08c3764514e1e73c1415d6fa58","guid":"bfdfe7dc352907fc980b868725387e986fbe9d540c525bf9dfa79fd4f818a616"},{"fileReference":"bfdfe7dc352907fc980b868725387e9850eb76d161b30d916255873f47c062e9","guid":"bfdfe7dc352907fc980b868725387e985584da6b07705cf1569b7d9fd68d8d16"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d50924e3f8940afe7d774046e67792ae","guid":"bfdfe7dc352907fc980b868725387e98880aeedab70c2576c448971aca1ce7f8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c73511ff62a44b5597b9e19189dadd10","guid":"bfdfe7dc352907fc980b868725387e9871bb034d5b8abafa5da705c94a309647"},{"fileReference":"bfdfe7dc352907fc980b868725387e981b27190e33354e7e6a3225e2c828f557","guid":"bfdfe7dc352907fc980b868725387e98f58ea67ff3215544e9117ffd20a78d21"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a72d1028678303be9b269ace9225904b","guid":"bfdfe7dc352907fc980b868725387e98d9a9615a52033ae1a824454dc64dbcbe"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dabe9a937a43ec190006e0627054845a","guid":"bfdfe7dc352907fc980b868725387e985f1459360c5b45cfdd1743a953091f18"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bdfcbc5d664bbafdd9f354c733bec51a","guid":"bfdfe7dc352907fc980b868725387e9807b459b35915dd4ab62eec31723dc0b5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ad2e31ca91913c90d37f3a2d95bb0d2b","guid":"bfdfe7dc352907fc980b868725387e98046f68092dbd8da6036eb8bdff7a3f0b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d610f2d23e0d44e2585bc582e859d2b6","guid":"bfdfe7dc352907fc980b868725387e9802d4339e254b660c20c8bc08ac3e8263"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e1bcfb7e241dd08c5ad005fb642710b6","guid":"bfdfe7dc352907fc980b868725387e98e69218efeea3524b658db0ff3073c5a7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98892b63d4e763877cb5805dc850cd357a","guid":"bfdfe7dc352907fc980b868725387e98ad9f5ed80dd976202f10cf014a4ce99d"},{"fileReference":"bfdfe7dc352907fc980b868725387e985650e463aa88e7a5e504ae565234621d","guid":"bfdfe7dc352907fc980b868725387e9810355226ec15c2e556f25e62769fe0bf"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d5db2297cf3e649d29f50bdaed5ba04c","guid":"bfdfe7dc352907fc980b868725387e9869037f5c03526b4668fa6a35c653fbfd"},{"fileReference":"bfdfe7dc352907fc980b868725387e984a298505b96a98d10e522b4edf221ed6","guid":"bfdfe7dc352907fc980b868725387e98e375d728d614faa8db719c9f8e3e60cf"},{"fileReference":"bfdfe7dc352907fc980b868725387e988dfecf325d31fb2d9aff16796c653942","guid":"bfdfe7dc352907fc980b868725387e9841538c29f03c2bb78b0dc1a88384bf0d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f406a955a7d842430e2e924eca1f2640","guid":"bfdfe7dc352907fc980b868725387e982b25827c1628e31a7d1713444881795a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bb059cd18cd13115fe7d4b764e70af41","guid":"bfdfe7dc352907fc980b868725387e98aec828b3d84b0e7bb4f5a8d3960a8a45"},{"fileReference":"bfdfe7dc352907fc980b868725387e9869dc6e47e0a6966ada08fb3d58f5e210","guid":"bfdfe7dc352907fc980b868725387e98b293c1bedc2213b7c8cd09757a36a5c9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c0c5fe40ae00e565f4197361e56fec0b","guid":"bfdfe7dc352907fc980b868725387e98c14f113501c010f338f16a8533339fce"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b26cf0e43da862e45d59c66508b01271","guid":"bfdfe7dc352907fc980b868725387e98be10f5be466931df3d5acab238312eb6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98747bfd17f9aa097d0efe403170b79354","guid":"bfdfe7dc352907fc980b868725387e9859c478c77a6f179bc082e80fbcd433f5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98834ab9620e06639a5ff56bf792d9c5db","guid":"bfdfe7dc352907fc980b868725387e98137ab8933ca8ee9fabe0e3cc3938bf69"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d8d289f2f9bf72c003ddd77b0878f2b6","guid":"bfdfe7dc352907fc980b868725387e98b8875c162aa528d44442711655775f38"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f10397478c14950ef9599fdf2d3e642c","guid":"bfdfe7dc352907fc980b868725387e98dc95cbe2de798e45e09532393f59d7f8"},{"fileReference":"bfdfe7dc352907fc980b868725387e984e4f4fa3681d3885991f826c7d0626b3","guid":"bfdfe7dc352907fc980b868725387e98e018cf18d2cd8a356da7c99b29203a50"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852ea9a7b923c00deb23d6be14aa04c11","guid":"bfdfe7dc352907fc980b868725387e9855114a2423959c6d7f7602b2d22b0edd"},{"fileReference":"bfdfe7dc352907fc980b868725387e980471c1d2185273ed57ceb2cc5af91fd6","guid":"bfdfe7dc352907fc980b868725387e985df11c3e6c62ce0568f769d7a9d11c37"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f7f99a49e05d9d483849b82a5b042ab3","guid":"bfdfe7dc352907fc980b868725387e98d75b7c679ff82073888e6e8658d6b4c7"},{"fileReference":"bfdfe7dc352907fc980b868725387e984b7089654a8476c04781946130828ff9","guid":"bfdfe7dc352907fc980b868725387e981b9e683b0875edbfad1d1887f8be7a12"},{"fileReference":"bfdfe7dc352907fc980b868725387e985d13ff13c510386d418cd069fb618f57","guid":"bfdfe7dc352907fc980b868725387e9880bfac654c613c28c08699fdc38edf53"},{"fileReference":"bfdfe7dc352907fc980b868725387e9860e788c01b59d8c5e34377d048e9571f","guid":"bfdfe7dc352907fc980b868725387e98d212dd21c39eed55f72d719fd31ac0c7"},{"fileReference":"bfdfe7dc352907fc980b868725387e9855d28a290f00d95e42828c0cce199a5e","guid":"bfdfe7dc352907fc980b868725387e9867c38619ea1682e963ff11764cfb0633"},{"fileReference":"bfdfe7dc352907fc980b868725387e9863b72be988c7f3f4f77f32a07cc998d6","guid":"bfdfe7dc352907fc980b868725387e98d9f7c1d122c3410663e2bd911d541769"},{"fileReference":"bfdfe7dc352907fc980b868725387e9844d2b74824c486de8efcfb8c9f84924c","guid":"bfdfe7dc352907fc980b868725387e9880a7bd9041da81bb7bcfda3356b6dead"},{"fileReference":"bfdfe7dc352907fc980b868725387e98719fe830048a2ba1365eecb6632f72d2","guid":"bfdfe7dc352907fc980b868725387e98b10a9c767029ac9f595d15626709980e"},{"fileReference":"bfdfe7dc352907fc980b868725387e981bc7f28ea1e64999404ca4dd21dd0ea1","guid":"bfdfe7dc352907fc980b868725387e9881f6541ca05b7f79045d78ee9d333751"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dfbbcf08b73d4a041622c799a84cf364","guid":"bfdfe7dc352907fc980b868725387e982ed83f56908d85ea806d1cb905184570"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ae767345b9752815dba9af0829f647b1","guid":"bfdfe7dc352907fc980b868725387e983ac5001b04ecd375fc2385271fbc5f06"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806cce955c392c1f7a9e154850367e456","guid":"bfdfe7dc352907fc980b868725387e9899eb8965d1c6878b572c95348d79d507"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b9b1eb7b36a3fff41786ab9d54bf826d","guid":"bfdfe7dc352907fc980b868725387e98eb784dd34289004d207c0b21f9ba8fd7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98069027db4086db498c5c3aee779f8ca8","guid":"bfdfe7dc352907fc980b868725387e9837c21ca550aa6783170f1e4f825c7145"},{"fileReference":"bfdfe7dc352907fc980b868725387e981fea20a8743f49d4fd4d140bb89eda56","guid":"bfdfe7dc352907fc980b868725387e980657f8d21ca6a08606f7b393e4157770"},{"fileReference":"bfdfe7dc352907fc980b868725387e9844a657a5657e6fb389d0de83a143a4c2","guid":"bfdfe7dc352907fc980b868725387e984838444d96b988329fba9a184dd937f9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fbaa3d86f6d124a450b9f0491119ef2b","guid":"bfdfe7dc352907fc980b868725387e982f07db0c04000c73bdd48c225e7fefd1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98abf7565fee3fc13cae4656dee1d87232","guid":"bfdfe7dc352907fc980b868725387e98a8adb4c43d05a78e8118eedcbc80e382"},{"fileReference":"bfdfe7dc352907fc980b868725387e982710250b86c363cad4a9df0dc1f552e3","guid":"bfdfe7dc352907fc980b868725387e98d85fb05fea1de189215946ca7e73089a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98621647717ebb98ed5215a2363787ec60","guid":"bfdfe7dc352907fc980b868725387e986d6780885cc71cb7b1ef447a919ad79f"},{"fileReference":"bfdfe7dc352907fc980b868725387e9887eb43b7b5c4665c64c0e5d668c0db4a","guid":"bfdfe7dc352907fc980b868725387e98e2deb9e9c67acb54cc409929877df0e0"},{"fileReference":"bfdfe7dc352907fc980b868725387e989534023b43aec676374fa28f504ebd7b","guid":"bfdfe7dc352907fc980b868725387e98aed27b90c7d17d0c66bf157ed1b4e3c8"},{"fileReference":"bfdfe7dc352907fc980b868725387e981d20a98d8d6380a1cc4bfbc035d066f5","guid":"bfdfe7dc352907fc980b868725387e98c5ae436a3ec71388ba5c6f7b51963e53"},{"fileReference":"bfdfe7dc352907fc980b868725387e983982f2b3dd103ab5403130fd0d68cf72","guid":"bfdfe7dc352907fc980b868725387e9844bc15b9c17f01683ccf07e988377115"},{"fileReference":"bfdfe7dc352907fc980b868725387e984cc282790fe0653502d68810ce203862","guid":"bfdfe7dc352907fc980b868725387e98950d1d6f193127e8e40e67e5c02684d0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e2da331444b1f53e6dba6cb80e4bd821","guid":"bfdfe7dc352907fc980b868725387e98a5763e03b24ba60a2a744352ff95792e"},{"fileReference":"bfdfe7dc352907fc980b868725387e989efe2e2a211875271837aebcde4612e9","guid":"bfdfe7dc352907fc980b868725387e981dc0f3ecdf98d33f6bd0547c5ba7059b"},{"fileReference":"bfdfe7dc352907fc980b868725387e9890e258ab83427e9b3af28df6cbba4069","guid":"bfdfe7dc352907fc980b868725387e98128e2f23dbdef32488ed057967dda452"},{"fileReference":"bfdfe7dc352907fc980b868725387e9857980f4cd36be429374abd8731e09dc2","guid":"bfdfe7dc352907fc980b868725387e98cb80b33aacb172d028a447e43287dd99"},{"fileReference":"bfdfe7dc352907fc980b868725387e9842ed090caa16221d40b2deb5c1fc39a7","guid":"bfdfe7dc352907fc980b868725387e98d52815d3ee867fcb3ad71469359df3ae"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e98566614e5a7eaa2d269e0707a52718","guid":"bfdfe7dc352907fc980b868725387e980c8de91ca0b7220175e02a8717488cea"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bfc950ffeb67bb663f272c5ed9fedbd4","guid":"bfdfe7dc352907fc980b868725387e9857981d5ee15a81ff2ad219d70a4cacfd"},{"fileReference":"bfdfe7dc352907fc980b868725387e980e5fb7ae060697ed6919bcf3cedb0f75","guid":"bfdfe7dc352907fc980b868725387e98f074b4794e80d18504d2ac4ec8973aba"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b4267b665e65b3b2e7bfe1594a1d1f5a","guid":"bfdfe7dc352907fc980b868725387e98fc8d362fc9937a90f24c02cf2f06d5de"},{"fileReference":"bfdfe7dc352907fc980b868725387e986cc1b3357462deb86550440d1f70a61b","guid":"bfdfe7dc352907fc980b868725387e988c9fa9c9424a0158e1aa055ef98abce3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d17a8f03b477f37a765a58084e0e5269","guid":"bfdfe7dc352907fc980b868725387e988f4fb2511ecac4dbce0895ffb3e33073"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bee3b1251aecfd29166ec8b8a4b18b24","guid":"bfdfe7dc352907fc980b868725387e980c3d2a4bd21ddaf89b5496cd9ca714db"},{"fileReference":"bfdfe7dc352907fc980b868725387e9875781607f587883e67ef5fc29d71563b","guid":"bfdfe7dc352907fc980b868725387e98c434064303213b1941104add35057ee0"},{"fileReference":"bfdfe7dc352907fc980b868725387e989757f793fe76ee3d65074635004dbb48","guid":"bfdfe7dc352907fc980b868725387e98d34586ebd10a830179faf2b7579cab78"},{"fileReference":"bfdfe7dc352907fc980b868725387e98572304b8a4293ef6e15f1b6935aa3de6","guid":"bfdfe7dc352907fc980b868725387e98209f73bebac10cc83a92abb142fac939"},{"fileReference":"bfdfe7dc352907fc980b868725387e98666272423879d06e6542d05efdedb720","guid":"bfdfe7dc352907fc980b868725387e98d7ff1bf68c562adf433157767bdc2d12"},{"fileReference":"bfdfe7dc352907fc980b868725387e98102c5f8ca0d2ebc5a06ccb97589db0cf","guid":"bfdfe7dc352907fc980b868725387e987b93d6e1c11d5976960190a9de79c981"},{"fileReference":"bfdfe7dc352907fc980b868725387e9875b69c0c8d62ef6ae2f4d5ccb2a50140","guid":"bfdfe7dc352907fc980b868725387e98e029b66de800d1432fd656a37eca56e1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ca7c8108003627e6f3faac826b461b2b","guid":"bfdfe7dc352907fc980b868725387e9829de73e8947834ce226654711b56dd16"},{"fileReference":"bfdfe7dc352907fc980b868725387e981f8eac5b6857c6f90839ca30a2c3e6c4","guid":"bfdfe7dc352907fc980b868725387e988f7903eadd15a608fb4a9701b6e8e14d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a374d7222e915426b2f8ab3ba4d65ee5","guid":"bfdfe7dc352907fc980b868725387e98948074dbee062f2ac5e1b8655d61da3a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ba30b785bf30ceb46a9118f6019d819b","guid":"bfdfe7dc352907fc980b868725387e9850c0fcd0ff61a1cc91377263edb2a774"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a235f0b77bf950d99dcce74d380bcd75","guid":"bfdfe7dc352907fc980b868725387e984d571fd7a377727b6ad9eda8eb9fd292"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f5f54f4445a2c9e87da1cea25995185a","guid":"bfdfe7dc352907fc980b868725387e98c3a63b2fbadf993aa2ea493f2ad09544"},{"fileReference":"bfdfe7dc352907fc980b868725387e989bb0668960c84bff388737525f9b3a81","guid":"bfdfe7dc352907fc980b868725387e98540a3747079ca6f004d996060b4cb213"},{"fileReference":"bfdfe7dc352907fc980b868725387e986a7af298a7219b614606ae7ff2d749ae","guid":"bfdfe7dc352907fc980b868725387e98a07278050dcd5c4bb66fcf842bbd2c59"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bb1dadfa78eacc3f622bcccdd537b399","guid":"bfdfe7dc352907fc980b868725387e985e65d69e9a35b7e4eecae6411c05d988"},{"fileReference":"bfdfe7dc352907fc980b868725387e98475bcd8f86ab153834b49971ed619ff5","guid":"bfdfe7dc352907fc980b868725387e98255884e31f8582299c265f2678f63e11"},{"fileReference":"bfdfe7dc352907fc980b868725387e984e9998b48de1e3e79cde488b19940ce2","guid":"bfdfe7dc352907fc980b868725387e987f3c8e57401e3d78726e674973e56791"},{"fileReference":"bfdfe7dc352907fc980b868725387e981e6263bb40c09d9f8dc13f069ceae880","guid":"bfdfe7dc352907fc980b868725387e98d5402093b2b404381fa424b7e44f6416"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d5276ff3ae57c9a7f98db3bccebc2370","guid":"bfdfe7dc352907fc980b868725387e98f44e8e8e639b4a36d2e2589e7f6d09b8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e3a47805b413680ebb0c06709b493b25","guid":"bfdfe7dc352907fc980b868725387e986d59b31ddd293e848d0195c9d82d9c35"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d104dd38e64d1362119c6d0e6e6c53a2","guid":"bfdfe7dc352907fc980b868725387e9818a8d345b243661a4fad38b27025877a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9870ce2670d34fda92a4f9f6fab2cb3f05","guid":"bfdfe7dc352907fc980b868725387e98fcd38fcf5f68f99ec27763741129d04d"},{"fileReference":"bfdfe7dc352907fc980b868725387e986ea08be4fd634924346f78693900e71c","guid":"bfdfe7dc352907fc980b868725387e98636ad24054faf5fe010805a09bd28f07"},{"fileReference":"bfdfe7dc352907fc980b868725387e9803ec352f1d5e430050d78853042b369f","guid":"bfdfe7dc352907fc980b868725387e983b6513c4a450010cafdcfe1cfd932c6e"},{"fileReference":"bfdfe7dc352907fc980b868725387e986e2c14a76174e5c401d360834cbcd241","guid":"bfdfe7dc352907fc980b868725387e9855032b7330d4546888bc4f057b790a2b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dc039d8f859c4d7a942b4a6efffb5c50","guid":"bfdfe7dc352907fc980b868725387e9856d26ef9d369e7c255bcb8ee4efe5e6a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806bf6fed24708c67d77335a5235a6cc1","guid":"bfdfe7dc352907fc980b868725387e98eebb994d268fb79e4d27cdde6850c07b"},{"fileReference":"bfdfe7dc352907fc980b868725387e984b3cebe055de35d309e97aecaa0a5a1b","guid":"bfdfe7dc352907fc980b868725387e98b41ea75f645aa1edbb67ce4e7aa57406"},{"fileReference":"bfdfe7dc352907fc980b868725387e986e0bef915cd1d6699aab05207038a96f","guid":"bfdfe7dc352907fc980b868725387e985937601f49aeda389ac579d178ed0052"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e701c1cb6f65239a251e4768e01df45e","guid":"bfdfe7dc352907fc980b868725387e98c36f2b1d46880e5b00462301e3d6fd22"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e413e4e9aa35c4a57f446f64d1d7dbad","guid":"bfdfe7dc352907fc980b868725387e9825bb35b2760144ab3e780b89a8a87da5"},{"fileReference":"bfdfe7dc352907fc980b868725387e986632cf764cf74da0f8d3dbcbba1c5634","guid":"bfdfe7dc352907fc980b868725387e9858350754d1584a351dee2fa4c1585cd6"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a785903ce725c51dc299f8f3d264a23","guid":"bfdfe7dc352907fc980b868725387e989dd2a4953f67a2a10242d78605df06d9"}],"guid":"bfdfe7dc352907fc980b868725387e987908b8f7896408c187f152da1b51c070","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9806a92d9c576668cee9d5913728916992"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e4170aa7f984f5a13b58a3c42c24b3e6","guid":"bfdfe7dc352907fc980b868725387e9875a1d5d4696253ce89b23de3bd3c6ac6"},{"fileReference":"bfdfe7dc352907fc980b868725387e9820c167798bdb228b4ab52bb2aa7eb24b","guid":"bfdfe7dc352907fc980b868725387e98c8469cac88bbe238ade8f54e247c9e15"}],"guid":"bfdfe7dc352907fc980b868725387e9822ffa72130b46984a7a466dd9c1eea77","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9897dd3956ab5a86d4602cc57fdb8a0bbd","targetReference":"bfdfe7dc352907fc980b868725387e98205354208adeebae46380f8f82956de4"}],"guid":"bfdfe7dc352907fc980b868725387e980ef2362b2d99c33629654d25ce1a17eb","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e981f0a8508efd61386103314ddbb82a530","name":"FirebaseAppCheckInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98205354208adeebae46380f8f82956de4","name":"FirebaseAuth-FirebaseAuth_Privacy"},{"guid":"bfdfe7dc352907fc980b868725387e988e935c81efc4686179f554b8fe37864a","name":"FirebaseAuthInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore"},{"guid":"bfdfe7dc352907fc980b868725387e982fcb5e27d041e48b96b3ab14ce32d5f2","name":"FirebaseCoreExtension"},{"guid":"bfdfe7dc352907fc980b868725387e98dd3a6a519ed4181bf31ea6bc1f18ebc5","name":"GTMSessionFetcher"},{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"},{"guid":"bfdfe7dc352907fc980b868725387e98da29652de71b686743df2bd56decf7ef","name":"RecaptchaInterop"}],"guid":"bfdfe7dc352907fc980b868725387e98b762d5de103fb6cfc7506aa6be1d4f33","name":"FirebaseAuth","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e985cd3a5a71d9e860191e64012c6d205c4","name":"FirebaseAuth.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b58e1096693d1b2f665847f3d6ed644-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b58e1096693d1b2f665847f3d6ed644-json new file mode 100644 index 00000000..a55176fa --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b58e1096693d1b2f665847f3d6ed644-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98421994bc5dd043094766f7b84b26a0c6","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseAppCheckInterop","PRODUCT_NAME":"FirebaseAppCheckInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e986f58c6649fe25a50f60c4963db91c363","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b37eb9d9e658784e2a78517cf0f13af6","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop.modulemap","PRODUCT_MODULE_NAME":"FirebaseAppCheckInterop","PRODUCT_NAME":"FirebaseAppCheckInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987b692890a649bae1a579bc7e819a8108","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b37eb9d9e658784e2a78517cf0f13af6","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheckInterop/FirebaseAppCheckInterop.modulemap","PRODUCT_MODULE_NAME":"FirebaseAppCheckInterop","PRODUCT_NAME":"FirebaseAppCheckInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981b4369d08b74582aee651e45141ded31","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98a7311458b4843df9e67745481ba7c0e5","guid":"bfdfe7dc352907fc980b868725387e9828e277c9497b2f20895ff53be68a0f33","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9829de89cb8f108e22ea823c6be6f50bb8","guid":"bfdfe7dc352907fc980b868725387e98844f13aa6f5e1386f61d5696e7b8984d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9844c414003af70893691ff86752a3f856","guid":"bfdfe7dc352907fc980b868725387e98a34d867ee41b3a876589657d837461b6","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985a1fa15e8a7202370ebafaea17bc9527","guid":"bfdfe7dc352907fc980b868725387e98999c06e70f73d8521f2d4ca7b7f131e8","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98b735d5869615c19ff960db77f1aaa00c","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c0c7690085e912d942bf2e237c7d1c7b","guid":"bfdfe7dc352907fc980b868725387e98e4605ad5dcb3e021f9ea7dfa1319e233"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a30bb5a8768c4121de0072fc14d52a0","guid":"bfdfe7dc352907fc980b868725387e98b09b55376e91c7e3090fec6579a02e28"}],"guid":"bfdfe7dc352907fc980b868725387e9820141e6459734f9feb4931b58768af04","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98afc620bdc83204c63fc012552c2beb39"}],"guid":"bfdfe7dc352907fc980b868725387e98fd137d0784f18399947b71f2309b299b","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9825da9d9e3f725ae476705bc78735502c","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e981f0a8508efd61386103314ddbb82a530","name":"FirebaseAppCheckInterop","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e982cdb0c7c817307e018cfb4299b646a42","name":"FirebaseAppCheckInterop.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b5c502676ea77f04ab6ea7a2e8956d9-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b5c502676ea77f04ab6ea7a2e8956d9-json new file mode 100644 index 00000000..3c105ee0 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0b5c502676ea77f04ab6ea7a2e8956d9-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98237671cfe20903d6f94682d7135ab52a","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/path_provider_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"path_provider_foundation","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/ResourceBundle-path_provider_foundation_privacy-path_provider_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"path_provider_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98c220b717effe1cdd465a205ee95d349c","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e0c5fa0e8218bd665f72f14cbfc898f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/path_provider_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"path_provider_foundation","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/ResourceBundle-path_provider_foundation_privacy-path_provider_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"path_provider_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9860a98cac683156b89579461b12d9c3f0","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e0c5fa0e8218bd665f72f14cbfc898f","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/path_provider_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"path_provider_foundation","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/ResourceBundle-path_provider_foundation_privacy-path_provider_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"path_provider_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9845045c47908a01a7620293e9eb5b8581","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9826bc948ab5c020662629313ee4c44ba0","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98248860b0d15cedbfaa9a198de6fddec1","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9874c74ec17bfbd10a54d1903d5290b3df","guid":"bfdfe7dc352907fc980b868725387e983753c0c4f160bd4ebab92de93f3e694d"}],"guid":"bfdfe7dc352907fc980b868725387e98c20ebbb494d2a8d56a1306d22e48544f","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e987ea64ee8d53085bf9edd1a57aaf8cbb5","name":"path_provider_foundation-path_provider_foundation_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e986e649604f74c414a7c2dbe5ef4cc4e75","name":"path_provider_foundation_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=110600b415fe8fc7dd4ca8c0f3c4e215-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=110600b415fe8fc7dd4ca8c0f3c4e215-json new file mode 100644 index 00000000..c6cb6059 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=110600b415fe8fc7dd4ca8c0f3c4e215-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b94f751a83e7e0f1d4b42f2b77a60509","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseCoreInternal","PRODUCT_NAME":"FirebaseCoreInternal","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98dac1faaa464be3f8c188e3c2753b5629","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d9147eb705ef7701ac589855737d9572","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap","PRODUCT_MODULE_NAME":"FirebaseCoreInternal","PRODUCT_NAME":"FirebaseCoreInternal","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ae7c409a52a05bbaf5e0899cdeb43a37","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d9147eb705ef7701ac589855737d9572","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreInternal/FirebaseCoreInternal.modulemap","PRODUCT_MODULE_NAME":"FirebaseCoreInternal","PRODUCT_NAME":"FirebaseCoreInternal","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987e49c5c2e0d0e3660e656c636534d89e","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f58230de926dbcf32485d1422b47f24e","guid":"bfdfe7dc352907fc980b868725387e9865ffd85b7f0ec30c195efd65c0ed4864","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e989ee74b6cb3e783bde9b3e9aa17c4b030","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98593f6dae4d99a30c132d62107a81aa3d","guid":"bfdfe7dc352907fc980b868725387e98f1ea80bb63200a55cee504571102b105"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a54c9801248b47f1be63245cbf224d35","guid":"bfdfe7dc352907fc980b868725387e98fb9046c505d67b720f5c045edfd1baa6"},{"fileReference":"bfdfe7dc352907fc980b868725387e980896766df14a9046b4bc17a9df2f2c95","guid":"bfdfe7dc352907fc980b868725387e98f2618bb7ecbe230b56dc041dad8ea9eb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c4923971f83aa387b26c7b1cbb3461a3","guid":"bfdfe7dc352907fc980b868725387e98cb1d6dbc80be517122aab0cb0b28ea1a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b11e742c4a53da542ea1cf321d4e26d0","guid":"bfdfe7dc352907fc980b868725387e9870b56cb875b24c9659feec087e5d2611"},{"fileReference":"bfdfe7dc352907fc980b868725387e982094f37cc1ad3624de7ad36386c6f411","guid":"bfdfe7dc352907fc980b868725387e98465b883b5b87788e23fa539cacbfb5b1"},{"fileReference":"bfdfe7dc352907fc980b868725387e989c3eb4c9df3e35b9bec6678a11018e5d","guid":"bfdfe7dc352907fc980b868725387e980d4f2c99df729b33e0d59a3de295cc9b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a4e413da7fd7f4faf80ef89285732c22","guid":"bfdfe7dc352907fc980b868725387e9848104916b5ef754223d604646af44d24"},{"fileReference":"bfdfe7dc352907fc980b868725387e988bf2e7afd647207a48e69cf948defc3b","guid":"bfdfe7dc352907fc980b868725387e98d06e31f92447fac27241fcf0d3680a06"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c954661eb8509838d8fb450920a2f8e0","guid":"bfdfe7dc352907fc980b868725387e98f7f03bf9bfb1a22b232b397c960315e6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f311c41c00ccd9d7c5b428bac6ece171","guid":"bfdfe7dc352907fc980b868725387e98ecc0ff87552d047b0f63420d1fea5327"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b98bef66718986a1b7d33bc52200004f","guid":"bfdfe7dc352907fc980b868725387e98504f0fac6dafb533e98a0e3525c1b686"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f6fd1de5036398d6723d5839a7b109e2","guid":"bfdfe7dc352907fc980b868725387e98b584f86dea2cc420940b8a969cf67229"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ce5e4868163131e336f7e6d43faeef31","guid":"bfdfe7dc352907fc980b868725387e9874a73f512a7ec185dd66b710dafb55b6"}],"guid":"bfdfe7dc352907fc980b868725387e9881092ad92129aab1f82c398bb12c2bbd","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98a339ba772c8b2c8441aea3db8f7b1f38"}],"guid":"bfdfe7dc352907fc980b868725387e98c6658247b73c5623dfc421ba205fbf85","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98630c123717965a20217d70ab52a6ac91","targetReference":"bfdfe7dc352907fc980b868725387e98e5b592b076e092ab7ac9d9b5c85edc6f"}],"guid":"bfdfe7dc352907fc980b868725387e98dc70ed4bbc47154bf942cc9ca90a860b","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98e5b592b076e092ab7ac9d9b5c85edc6f","name":"FirebaseCoreInternal-FirebaseCoreInternal_Privacy"},{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"}],"guid":"bfdfe7dc352907fc980b868725387e98020791fd2e7b7ddc8fb2658339c42e16","name":"FirebaseCoreInternal","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e983d86e87924acfad2934921ce7ad9fbea","name":"FirebaseCoreInternal.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1140ca82d597cd38dc60054d3a158f68-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1140ca82d597cd38dc60054d3a158f68-json new file mode 100644 index 00000000..09e5918b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1140ca82d597cd38dc60054d3a158f68-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98dcbcbc7a5e77c993122880547c8ba2bb","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"13.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","ONLY_ACTIVE_ARCH":"NO","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2"},"guid":"bfdfe7dc352907fc980b868725387e980bc977b873df9b0e01b3c822e5c77429","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982275ed66a3f7f3088878aa0c9e2d181a","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"13.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e98b75274b69084014a6a5ac37ea7a9d4bc","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982275ed66a3f7f3088878aa0c9e2d181a","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"13.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e988b8e6347e534cb57e9bb1b22dc47b716","name":"Release"}],"buildPhases":[],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Release","provisioningStyle":0}],"type":"aggregate"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=14b6e6d9e2eda3680623b9cb266fb1b3-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=14b6e6d9e2eda3680623b9cb266fb1b3-json new file mode 100644 index 00000000..f8c50633 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=14b6e6d9e2eda3680623b9cb266fb1b3-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98089a265d15a8f52f9e25ea32540ea5cd","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/package_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"package_info_plus","INFOPLIST_FILE":"Target Support Files/package_info_plus/ResourceBundle-package_info_plus_privacy-package_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"package_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98086fbffdd1042f07c4960ae59c08c889","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9811034d0cd45341ec5fddd8ae14b45098","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/package_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"package_info_plus","INFOPLIST_FILE":"Target Support Files/package_info_plus/ResourceBundle-package_info_plus_privacy-package_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"package_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98fb69f0822e220d5db24cd93d3b9ece6a","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9811034d0cd45341ec5fddd8ae14b45098","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/package_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"package_info_plus","INFOPLIST_FILE":"Target Support Files/package_info_plus/ResourceBundle-package_info_plus_privacy-package_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"package_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98a86b22695c7b114b0b5d3acbd271ad72","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e980036fb056e70f26b992370f8a0635a97","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e984d5bd123c512ee74d0cc1c57914e14ec","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98acc94a90b20547c25ffbe2fd16f0028a","guid":"bfdfe7dc352907fc980b868725387e98d2483853a91fcc73342f348b5323c524"}],"guid":"bfdfe7dc352907fc980b868725387e98ad78d1650baee242af866560206ed06e","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e987b6c2f882d164ef4f3c76673562685a1","name":"package_info_plus-package_info_plus_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e982a9852aa81a16cf5578d0e8c78b5679a","name":"package_info_plus_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1a4fe29d3cb9f9220793e4797839ee1f-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1a4fe29d3cb9f9220793e4797839ee1f-json new file mode 100644 index 00000000..29acb733 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1a4fe29d3cb9f9220793e4797839ee1f-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98de35fcdac3f67fe0119b4d27e7b7c6d4","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/share_plus/share_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/share_plus/share_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/share_plus/share_plus.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"share_plus","PRODUCT_NAME":"share_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98fa50e2fc76f3c7e46550ec7ffc7bb01c","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d3219dc3abe23add073ba57e4e5929db","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/share_plus/share_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/share_plus/share_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/share_plus/share_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"share_plus","PRODUCT_NAME":"share_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98e553b9382cc24bd5b1414348a7055016","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d3219dc3abe23add073ba57e4e5929db","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/share_plus/share_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/share_plus/share_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/share_plus/share_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"share_plus","PRODUCT_NAME":"share_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9806962fb3610a587387aa54c43210d4b3","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e986c6ddc4ee2f3ea412c1028067a0fee4c","guid":"bfdfe7dc352907fc980b868725387e980f8f3deae531c7d612b13ade317f163f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983a3ff60a16fd5c441672e7e40ef2e624","guid":"bfdfe7dc352907fc980b868725387e982ea795dc0be844d6be5410e75e86c1c3","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98865ac88938aac084ee38b49d0be68c79","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98119c9eb9886f3635874ecb6a94a2f0d4","guid":"bfdfe7dc352907fc980b868725387e98b14be1c2661bdd1d98ad268062b02ea9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ac3d4b3149126b081d5bc50806117e1a","guid":"bfdfe7dc352907fc980b868725387e981dd4d47921a1bb9bb51aeffb52b2667c"}],"guid":"bfdfe7dc352907fc980b868725387e984e1dbd6e430296b13520d2f888421896","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e985b8ff78a3ba34afe55fbbcea034c09f0"}],"guid":"bfdfe7dc352907fc980b868725387e98cb9a2b042b08bd6c2e561afd4c78e4d4","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98831b06cee1c8abfe0f9885d5d85abea1","targetReference":"bfdfe7dc352907fc980b868725387e98de00f90750e7753637464fe34137709d"}],"guid":"bfdfe7dc352907fc980b868725387e984f4190b0e881c91b258e089514665437","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98de00f90750e7753637464fe34137709d","name":"share_plus-share_plus_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98848ff9cf74c635f5324731538a1c853f","name":"share_plus","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98ae2d3cb0c689d7eba802899edfe718f3","name":"share_plus.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1abbdfc13b53a75a94289fd5712275b6-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1abbdfc13b53a75a94289fd5712275b6-json new file mode 100644 index 00000000..24fc0852 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1abbdfc13b53a75a94289fd5712275b6-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986b056fb7813eab8b622dbbdb4b6201da","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/url_launcher_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"url_launcher_ios","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/ResourceBundle-url_launcher_ios_privacy-url_launcher_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"url_launcher_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9849f55a8954fd158d2bb7eeb077a7f738","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982e8b062cb2e7d8455d114188a1500a94","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/url_launcher_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"url_launcher_ios","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/ResourceBundle-url_launcher_ios_privacy-url_launcher_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"url_launcher_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98ee5361fd881ec2d400015f1265b2e272","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982e8b062cb2e7d8455d114188a1500a94","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/url_launcher_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"url_launcher_ios","INFOPLIST_FILE":"Target Support Files/url_launcher_ios/ResourceBundle-url_launcher_ios_privacy-url_launcher_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"url_launcher_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e981c7d4994c0064d3ceceb2e8ad26c5de1","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9856533e12f3c8cd22a7146d3d1e75a783","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e989d450ecd61cde185e930f37e7e523c50","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e980ee24ebd45c579186ae60d129b553bed","guid":"bfdfe7dc352907fc980b868725387e98283621da68b66680271886dd63420519"}],"guid":"bfdfe7dc352907fc980b868725387e9835d5ecdaa2416776646536fdd7ec6057","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9891b3b8cc56823cdea4b418e009a423b2","name":"url_launcher_ios-url_launcher_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9827df8da513ac7d6928fc311b53a7155d","name":"url_launcher_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1e4d2a3be90cd0a545f0c49cf9dce02c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1e4d2a3be90cd0a545f0c49cf9dce02c-json new file mode 100644 index 00000000..a2b07623 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1e4d2a3be90cd0a545f0c49cf9dce02c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9826aabbf6d6b2201c6400dd7fc8a0967f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/local_auth_darwin/local_auth_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"local_auth_darwin","PRODUCT_NAME":"local_auth_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a9d9e5af04f6997b3fed9529b7465757","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9835c7588ceebde0ed281cc6f972ef1ccc","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/local_auth_darwin/local_auth_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"local_auth_darwin","PRODUCT_NAME":"local_auth_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e985413d84bcf1d662f2a1bc6ff76cf92f5","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9835c7588ceebde0ed281cc6f972ef1ccc","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/local_auth_darwin/local_auth_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/local_auth_darwin/local_auth_darwin.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"local_auth_darwin","PRODUCT_NAME":"local_auth_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b236353cceac3de794f882fb06e1890a","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98ad898343d17a563826d8df8267c2a015","guid":"bfdfe7dc352907fc980b868725387e98378840bdd29d8ab2e9515a5a33e3359e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9851693e394b4c9a3739669bc6f2853f65","guid":"bfdfe7dc352907fc980b868725387e982681518474e7ceaee45243b339404e77","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9842b9afd398f7b12fdbd878a1e1fdb5cb","guid":"bfdfe7dc352907fc980b868725387e981f3e5000744e84ff1719ae1a1aeb6957","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98448a4b5517b9d1847c69072fe92810da","guid":"bfdfe7dc352907fc980b868725387e980a10425b06a35799dc132e929ee90a4e","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98805180487dba141f5f3620a47c45b0bb","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98ae1aa1da940b2cf3059d58fa5aeb575e","guid":"bfdfe7dc352907fc980b868725387e98db62623edd41b2f6b0559f0c3afac6f2"},{"fileReference":"bfdfe7dc352907fc980b868725387e9824eab6a2af2aa1812cce719f02ee9fd4","guid":"bfdfe7dc352907fc980b868725387e988ecda68313198b3caab96c9ef9c68f44"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cd73448a566c5be29cdf42df00abfae5","guid":"bfdfe7dc352907fc980b868725387e989aca1fccf2b74fcf76219b3929f09707"}],"guid":"bfdfe7dc352907fc980b868725387e989c6628aab1cde4657b2f146bc4c6303f","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98fd4e00a44784a0623be8b2c18091c770"}],"guid":"bfdfe7dc352907fc980b868725387e989173cd7bbe3b01d3250270f3d874515a","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98611297d6be2a6072de2d7b739398c253","targetReference":"bfdfe7dc352907fc980b868725387e98afb8e8e2ed6a0ef9cb1d99282c22f170"}],"guid":"bfdfe7dc352907fc980b868725387e9866ce9dbd023864a453f7ba57656310c5","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98afb8e8e2ed6a0ef9cb1d99282c22f170","name":"local_auth_darwin-local_auth_darwin_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e988cbaddc02f6ec7fadc6b543cd6534960","name":"local_auth_darwin","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98a8b2f505b57b50e12043e6087151fc22","name":"local_auth_darwin.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1f36083119fed8be641437f19af66acc-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1f36083119fed8be641437f19af66acc-json new file mode 100644 index 00000000..f322850a --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1f36083119fed8be641437f19af66acc-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9870bacfaf6cde3d89a76fe4e932cc6788","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/PromisesObjC/PromisesObjC-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/PromisesObjC/PromisesObjC.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FBLPromises","PRODUCT_NAME":"FBLPromises","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c52132de3cb297c3dd282c53e4d704df","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9889d254ad5933689bf555dbc41d2fcf23","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/PromisesObjC/PromisesObjC-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/PromisesObjC/PromisesObjC.modulemap","PRODUCT_MODULE_NAME":"FBLPromises","PRODUCT_NAME":"FBLPromises","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e988459df85d865c11ed777040e666b8dff","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9889d254ad5933689bf555dbc41d2fcf23","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/PromisesObjC/PromisesObjC-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/PromisesObjC/PromisesObjC.modulemap","PRODUCT_MODULE_NAME":"FBLPromises","PRODUCT_NAME":"FBLPromises","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9856899bd0f44cb948cf9d8abe49416cd3","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9833df98e018adc77b9ee56cdc07aacd3f","guid":"bfdfe7dc352907fc980b868725387e982fd935af4bbc067393e903fee29653ea","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9865be438db2f61c5160b40adf875e6b14","guid":"bfdfe7dc352907fc980b868725387e98219a09b0e0ab077bc25a3912f86db88d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ec2937fc269337ef369568770a9974f6","guid":"bfdfe7dc352907fc980b868725387e98f23c0e0891c8fc92cf41fee59f1451a7","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986d7afd8b9ef329e8b8092b4b4d73ca33","guid":"bfdfe7dc352907fc980b868725387e98cd781db61ef2d5193461ba9af1998940","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d96fd933472cfe31b39378ea674cb4ef","guid":"bfdfe7dc352907fc980b868725387e98d6ad8670e9e917d1c93259384d8595d3","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984258d000b808182a55ed359ba4e63953","guid":"bfdfe7dc352907fc980b868725387e981402b21e00ba4c1a4024ee13fdceeb36","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988131c2b568eaafe86a12b2ad83d7db48","guid":"bfdfe7dc352907fc980b868725387e988e759eb726648fe94edb2839399d9a7a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984bf3ce587970ab6f7feb6f67744292b5","guid":"bfdfe7dc352907fc980b868725387e98ec4a078a9dd813c289e14a18b684b1e3","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c73fcebb94e4884285929eea119100a0","guid":"bfdfe7dc352907fc980b868725387e983f5457c93445cbc63a19b15aea5773b4","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ce3820605a66e6df7ad360709285dcaa","guid":"bfdfe7dc352907fc980b868725387e980ccc717db762fafbee7a87f7b5616419","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983f1026a051b69c332802557f54f5f15b","guid":"bfdfe7dc352907fc980b868725387e98a71595b7cf5e4a86dba9a76f79920127","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cf41e5e95c462c3dc24471acd8e6551e","guid":"bfdfe7dc352907fc980b868725387e98b86282800552f32a144aac896551a95f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9876bb9188aba89de9ffca92bd18712f1a","guid":"bfdfe7dc352907fc980b868725387e987e3b2dfebe6d8bf41757d59f0c8f03da","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a8c1c5b1e81fee43b5a34049e1ebbef2","guid":"bfdfe7dc352907fc980b868725387e980f53d1083a1c54c5c11d6483d5ae7c39","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fb74040e3b4703dc724128dc4259fe39","guid":"bfdfe7dc352907fc980b868725387e98fcd7f434257987d6444ced307010c9d9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98859f6f736e1f8d98f41892e3f0b95c17","guid":"bfdfe7dc352907fc980b868725387e988972d09ae0f73373fab951d04c2c5428","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980d24fc5ca57e8742be1a4aa5fca26a6c","guid":"bfdfe7dc352907fc980b868725387e98426a7455793eb985657dfeb453ad88d6","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984901e26a9bf94289c40945076a433f5b","guid":"bfdfe7dc352907fc980b868725387e98c452c515df5668ee3a8ea7391a83a878","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9845b5945be755a7e7bb5daae3aa99c2dc","guid":"bfdfe7dc352907fc980b868725387e98cd1de55dc04ab671792b6d915bec622d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986eee35874291a8ab220e7a802313658a","guid":"bfdfe7dc352907fc980b868725387e987e028664752f5388c0825e1c08bf83fb","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b8523b9773a8337dad012c738c7729d0","guid":"bfdfe7dc352907fc980b868725387e98d4f0bc0407cf81373daaf261248deca0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b32e4e3946291ecb96c31535ac7e701c","guid":"bfdfe7dc352907fc980b868725387e98d699dac783f8cc275b24659a553c145c","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e986c5f0044c766429735416b05a5aa5c20","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c5db8499ea7419409c1cfaef6255d1d3","guid":"bfdfe7dc352907fc980b868725387e980578427a9713e088ea73be3142402163"},{"fileReference":"bfdfe7dc352907fc980b868725387e98777d27b0a850f634f1b15c4202c2a016","guid":"bfdfe7dc352907fc980b868725387e98ee16f346ae8c0af318d77d24263285dc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ffaf0c786ee256fbae57c03e63ee964b","guid":"bfdfe7dc352907fc980b868725387e98383a83f166780ed19242aa1361919896"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d2abfa3a17fc90c3c9f15d3fe7b22740","guid":"bfdfe7dc352907fc980b868725387e98617f6b7ea9a2cc5900fa248993cb5f6f"},{"fileReference":"bfdfe7dc352907fc980b868725387e981ed65769418714c2f278ad25bd9f7a36","guid":"bfdfe7dc352907fc980b868725387e98f952f96693e51b0e96ddbb03a926712f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cb71e8d54abeffaf6876d55d161f8006","guid":"bfdfe7dc352907fc980b868725387e98767307e84981f94c8260062fdbcac9d2"},{"fileReference":"bfdfe7dc352907fc980b868725387e984a5efdb875e93d5ef617a439c38360ce","guid":"bfdfe7dc352907fc980b868725387e9895fb09ffafe524a88ed0c70679db0714"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b26e3f35080a2f116c44cf27fa7211e6","guid":"bfdfe7dc352907fc980b868725387e98940e6a5b2ac76719a9c33f268f069f8d"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c4e1d65136512ca7286df227a07f5ab","guid":"bfdfe7dc352907fc980b868725387e981e698b8f25483dbb1dee360a06d00e1f"},{"fileReference":"bfdfe7dc352907fc980b868725387e984fce25a60148febae2186288f08b436e","guid":"bfdfe7dc352907fc980b868725387e984b8363e38c187f413cb07b88f665246f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bbda8e0bcbecd512009527784f343c26","guid":"bfdfe7dc352907fc980b868725387e981330930e21797bf1f197cfd0ca5acec5"},{"fileReference":"bfdfe7dc352907fc980b868725387e986bc4b82de6a07b4b56186b6d599cee80","guid":"bfdfe7dc352907fc980b868725387e98dc9685ec8b578ec8660c41b0b17101e2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b132b82c791d131185c0584a12d86eec","guid":"bfdfe7dc352907fc980b868725387e98d87ff2ee52abfbc02b1b58abc102f7b4"},{"fileReference":"bfdfe7dc352907fc980b868725387e983e0d7c9928fe1a8aedc0d9f70af2000e","guid":"bfdfe7dc352907fc980b868725387e98149347ff91740a502dbc151119cb3298"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ade208b2779864b1dc5eccaf8a2e3787","guid":"bfdfe7dc352907fc980b868725387e98c246a31f88d476eec619d5eac8718d1d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ecaad0c1ae197eeb9134fb47589e7311","guid":"bfdfe7dc352907fc980b868725387e98bd1ebc9ad4aece0ef3c72ee9554031c0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b5d435fc4bd55488b943552a9c620acb","guid":"bfdfe7dc352907fc980b868725387e983def7557da69d248f2b6902ac6848507"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cfcaeda41cd8a5573825d9903c2fb4ed","guid":"bfdfe7dc352907fc980b868725387e98d3a81484db924bfbdeda79c5ad4febc6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98aa1ef7de5583853025e4a24a30edc99b","guid":"bfdfe7dc352907fc980b868725387e98055696bbfc738331d99c70f801b36a20"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f0de8f3e81d724b92d50c2f87e9f8c47","guid":"bfdfe7dc352907fc980b868725387e98a8395bf7139bf939aa8435ecb8bd6612"}],"guid":"bfdfe7dc352907fc980b868725387e9866d18f195fe409f6d14b5c552b4957e6","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98cc291911c4b070c80cf04f1024c997c1"}],"guid":"bfdfe7dc352907fc980b868725387e9834e5349b38ec7d3fb7602731abb8c94d","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98ec6d85c13ca9619bead8f044fd96b771","targetReference":"bfdfe7dc352907fc980b868725387e98ad53226b339581a6725de188f2c8f823"}],"guid":"bfdfe7dc352907fc980b868725387e9809836315fb3cf74db81f5b6198deb73e","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98ad53226b339581a6725de188f2c8f823","name":"PromisesObjC-FBLPromises_Privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98f10882e1684b8a3dfdec597bc0a47af3","name":"PromisesObjC","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e981c795e45f8d875aac88217c6a2a95faa","name":"FBLPromises.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=2044c736a22918f3a12ecb44d3e0c006-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=2044c736a22918f3a12ecb44d3e0c006-json new file mode 100644 index 00000000..8722b3da --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=2044c736a22918f3a12ecb44d3e0c006-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9862b76e562a43dac8471f624a5cd9d3f8","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_saver/file_saver-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_saver/file_saver-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_saver/file_saver.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_saver","PRODUCT_NAME":"file_saver","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98492b6ad4db49e05eec51596ae3a00810","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98344086c33f6b20ad518611d4b42807b0","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_saver/file_saver-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_saver/file_saver-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_saver/file_saver.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_saver","PRODUCT_NAME":"file_saver","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981a50b674f911d01a3990e73095ee06c2","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98344086c33f6b20ad518611d4b42807b0","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_saver/file_saver-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_saver/file_saver-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_saver/file_saver.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_saver","PRODUCT_NAME":"file_saver","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9840704f1d9bf02a7f441a6e4a7830088b","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e988f5f13c3729537a5e4850a3184ef1504","guid":"bfdfe7dc352907fc980b868725387e988b5b7453914051440a28a5359d31fe11","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ff33475189cdb687ddb89ac3219b5661","guid":"bfdfe7dc352907fc980b868725387e98acca2eff23e1dd8dac4ba80328517a61","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e989d614e1f9f0ee716701ace7b32961eb8","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98dc2b0e58e1746182ef03bafc59d5834f","guid":"bfdfe7dc352907fc980b868725387e980b62b55d5d5d98a99e02a082545b16d6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e9b49b292faafa97f299b4d375bb94e8","guid":"bfdfe7dc352907fc980b868725387e98571eb92c860282871bbdd81052e34f6f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ddd81e0874cadf29b2be4336e4173aaf","guid":"bfdfe7dc352907fc980b868725387e9856c9298350136ce86238d872d1bf9424"},{"fileReference":"bfdfe7dc352907fc980b868725387e986d800696c536df7c30346254f4e8cf2a","guid":"bfdfe7dc352907fc980b868725387e9885324ae1411aed1a23274eac76cbbb31"}],"guid":"bfdfe7dc352907fc980b868725387e983252b0ab426cbff85a631a370c4e9528","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9812cc13a21a478e20f317efb5b09f2b1f"}],"guid":"bfdfe7dc352907fc980b868725387e980839fe57c9d10d0556679a7f22b30bb5","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e986eb54603a6d1c7607512c4b86d24d1ab","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"}],"guid":"bfdfe7dc352907fc980b868725387e9875e40ebaf7773ac78830d9822a5265df","name":"file_saver","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98072cdc8518935da0cbb0d45a363618b7","name":"file_saver.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=211721151cd848f04aa31d195dc75f4a-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=211721151cd848f04aa31d195dc75f4a-json new file mode 100644 index 00000000..fbf90bc4 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=211721151cd848f04aa31d195dc75f4a-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e983daf253e7f620ff0705af75496c7b612","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/record_ios/record_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/record_ios/record_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/record_ios/record_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"record_ios","PRODUCT_NAME":"record_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9848bee89e61a6b7ee9af321127dce4ab8","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985629505f5ce763e2c6637f93384c9362","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/record_ios/record_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/record_ios/record_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/record_ios/record_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"record_ios","PRODUCT_NAME":"record_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98edfcdb9f1b96adddd852196f39dc47ec","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985629505f5ce763e2c6637f93384c9362","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/record_ios/record_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/record_ios/record_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/record_ios/record_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"record_ios","PRODUCT_NAME":"record_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e985151e74c4b3300cd4a3c01714d83b72b","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e980c4abcf4c655f36e0d31f147be4ed645","guid":"bfdfe7dc352907fc980b868725387e9835d4f538095c7e2a61d6432700d1b798","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98af64c8b8323fc3e7e84445d2d428f32c","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d529b9317f808bc4a0526a0decb58f08","guid":"bfdfe7dc352907fc980b868725387e98662802b9892964a639cd53dad3c90bb0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98255804e028753f5b8536b2b911ccb620","guid":"bfdfe7dc352907fc980b868725387e9839387038e87c9e1ee3935d9c7199509d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d73a5e56d5e68038cb1377eaa90fae0d","guid":"bfdfe7dc352907fc980b868725387e987d8c48b08525c2b89f0d673771ac0c38"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f53359071b6f1be5f1da4cef27596689","guid":"bfdfe7dc352907fc980b868725387e98d3e29d7662601efc1e65f69115e6ed54"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b298ec0b59e4cce28ccc0be3e7f0e5e7","guid":"bfdfe7dc352907fc980b868725387e98dd3040e7f93d66ea392641159360bfcd"},{"fileReference":"bfdfe7dc352907fc980b868725387e982241e0e04227dc7964af065d6a2bbc3c","guid":"bfdfe7dc352907fc980b868725387e9822803b3af9f03688a299039cfed66143"},{"fileReference":"bfdfe7dc352907fc980b868725387e983a371912ff4d411448f255abead2ed59","guid":"bfdfe7dc352907fc980b868725387e98449028c9016410bbd8edc5d09da56fd3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b47ae3223bc0ccc52b53627d750e2de0","guid":"bfdfe7dc352907fc980b868725387e981cc98556d2c27a66e809a2ad1059d4f1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a41a7891113627a2fa24db24ce22900a","guid":"bfdfe7dc352907fc980b868725387e98638d52ced7cda11658d94fee920a2ebd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98298a93bc02eef963b4228ac4db4f6bb8","guid":"bfdfe7dc352907fc980b868725387e986c1d9ca1926b4531b491645942b367a2"}],"guid":"bfdfe7dc352907fc980b868725387e985710b7bd82b0d097b7823f915ab8f0d9","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98479aea524a81062d670b5dee2fdbfebb"}],"guid":"bfdfe7dc352907fc980b868725387e98a23abfaae0751718e7cfc0e3a3b7f301","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98f31adba43dfc75e2b339a25193054eba","targetReference":"bfdfe7dc352907fc980b868725387e982a2ee81fc4f9376a4b6bb6d6bb502a00"}],"guid":"bfdfe7dc352907fc980b868725387e985665529af6526bb8b109c2a01d6cbd37","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e982a2ee81fc4f9376a4b6bb6d6bb502a00","name":"record_ios-record_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98ff12fc6cf192a2fce22083281b19ee98","name":"record_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e985df8a39fd4e336288f27764d3eab62c6","name":"record_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=218c90a1920c10390be2408439f5191f-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=218c90a1920c10390be2408439f5191f-json new file mode 100644 index 00000000..36b72273 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=218c90a1920c10390be2408439f5191f-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9837b4eae1f2290b03d7d4aabded8138b2","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKImagePickerController","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKImagePickerController","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/ResourceBundle-DKImagePickerController-DKImagePickerController-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f141ae074eb97c98f7000a55ca8db7fe","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c17784c5efe37bcec77e0c17b5660c20","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKImagePickerController","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKImagePickerController","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/ResourceBundle-DKImagePickerController-DKImagePickerController-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e987b14cda5589001bc96d9ddc688308937","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c17784c5efe37bcec77e0c17b5660c20","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKImagePickerController","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKImagePickerController","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/ResourceBundle-DKImagePickerController-DKImagePickerController-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e989007cac290be025fe4eb8afb36353c0f","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98adcbbbb25f96fadc78573cc295e21fc1","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ebf21b0238d856f9dbebe1192ca9b322","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98992e20e5c86d6ccae38bdf84a625f178","guid":"bfdfe7dc352907fc980b868725387e986be49ee2393e8f17ed7a1ef2344b7069"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fc42f53bf0b263eb43dfba42d468c1ee","guid":"bfdfe7dc352907fc980b868725387e98d814d8acfb5c1d4e1f8e6fc2ec224e8d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c0e0c44805bf91b9ddacc8f5c5de5887","guid":"bfdfe7dc352907fc980b868725387e981225d5fa641a725a1b260a2471b9a62c"},{"fileReference":"bfdfe7dc352907fc980b868725387e985b7ec0450262a9573a0cb306273bc343","guid":"bfdfe7dc352907fc980b868725387e981acb72f3c01b533689f8ee66bb728738"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a0d3580855f196150587aeedde49d8ee","guid":"bfdfe7dc352907fc980b868725387e98958d32ad41dfbf048d0cc441c9067798"},{"fileReference":"bfdfe7dc352907fc980b868725387e988591a2b29b958ca4ab9f3147bafa7a8a","guid":"bfdfe7dc352907fc980b868725387e986b89f7619ace5a2565e2af7f4f05bced"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d68c0474e2f03eb8c7fccab1413bcc77","guid":"bfdfe7dc352907fc980b868725387e988e73ee650992513a6d86fa5431ee29aa"},{"fileReference":"bfdfe7dc352907fc980b868725387e98418e94a9d7a67843e706121817b95d23","guid":"bfdfe7dc352907fc980b868725387e9866e0a68572317dd225c4b4745e7ab666"},{"fileReference":"bfdfe7dc352907fc980b868725387e9844ff420afcb298679dede65a45ffceb5","guid":"bfdfe7dc352907fc980b868725387e98ab3c41d23d906395f505a093e37143e2"},{"fileReference":"bfdfe7dc352907fc980b868725387e987692caa5c901fbd366ce9848d0c1274c","guid":"bfdfe7dc352907fc980b868725387e98fd8c02c4eca38e6f9c34212f583ebc14"},{"fileReference":"bfdfe7dc352907fc980b868725387e9865b6e35f95ede252c917f53224dfc704","guid":"bfdfe7dc352907fc980b868725387e980712cc445e9d1438446dbd691a1d4124"},{"fileReference":"bfdfe7dc352907fc980b868725387e983f2cd8e2aab8a62e70cd896c9a4fea53","guid":"bfdfe7dc352907fc980b868725387e98dfb44109008ea134516786e3d26e5da5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ca220a32ab2fe66aa595eba98989e624","guid":"bfdfe7dc352907fc980b868725387e98d823890d751c30beb9305b0a7441ed83"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c97c449e1eb67deb67ddecb8dcb88dc6","guid":"bfdfe7dc352907fc980b868725387e98a27e73d7871cb70e17a22ca44f7d4409"},{"fileReference":"bfdfe7dc352907fc980b868725387e988a7e09ab3fb0bccf3d6a0840f20edb02","guid":"bfdfe7dc352907fc980b868725387e98a7d5f490e936c244268c5a7833153cf4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98360580afc3ea1e4816652b09373a6cd3","guid":"bfdfe7dc352907fc980b868725387e98d2fab9356e93aa0b836bf95ab406631b"},{"fileReference":"bfdfe7dc352907fc980b868725387e985edb9444e98b58b1ebe6043fbb03795f","guid":"bfdfe7dc352907fc980b868725387e9874092bff49846a108c58f0631fffc4c1"},{"fileReference":"bfdfe7dc352907fc980b868725387e9882faf104037eae2f0a55bac80109a69f","guid":"bfdfe7dc352907fc980b868725387e98508de0ed4f2eb064b9f5febcec5b1cb8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98aa7d745938a0d9db3a2c382f9c57b33b","guid":"bfdfe7dc352907fc980b868725387e98bcf0b1f9088bb59d5f06c5a559612a8e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98693b26471f52ca7316a1d3e0c7dc0a7f","guid":"bfdfe7dc352907fc980b868725387e98173f5f0c6dca979ea0f0a933d68a8b21"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e7d19f0ec38ff637cbd1084684e63ad4","guid":"bfdfe7dc352907fc980b868725387e988aa5ef492259df6c1fa8e286fbf33f33"},{"fileReference":"bfdfe7dc352907fc980b868725387e9822323136a1b52bdd7900e18b364dee99","guid":"bfdfe7dc352907fc980b868725387e981db7820a3dce011213359a4df93f2380"}],"guid":"bfdfe7dc352907fc980b868725387e98cde9d488469e9fd6cee32e690de21d9e","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9898fccba7a2febdedb43dddbf2e949fc3","name":"DKImagePickerController-DKImagePickerController","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98ab5e1f747dfe477b655528b07584898d","name":"DKImagePickerController.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=25067fd2852a0fd76a8f9f479b2d4630-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=25067fd2852a0fd76a8f9f479b2d4630-json new file mode 100644 index 00000000..8aaa02c3 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=25067fd2852a0fd76a8f9f479b2d4630-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98cca55d6c772db4d637cf770c880e5bab","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/geolocator_apple/geolocator_apple-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/geolocator_apple/geolocator_apple-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/geolocator_apple/geolocator_apple.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"geolocator_apple","PRODUCT_NAME":"geolocator_apple","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e984936d7cb8feef48513f6131e211caece","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98563a39b273a0c88e1e2a4a289bb4eff2","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/geolocator_apple/geolocator_apple-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/geolocator_apple/geolocator_apple-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/geolocator_apple/geolocator_apple.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"geolocator_apple","PRODUCT_NAME":"geolocator_apple","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98beaaf634ac9c45a28ea8b53ae8cea921","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98563a39b273a0c88e1e2a4a289bb4eff2","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/geolocator_apple/geolocator_apple-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/geolocator_apple/geolocator_apple-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/geolocator_apple/geolocator_apple.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"geolocator_apple","PRODUCT_NAME":"geolocator_apple","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9879f34f1e012c285b844492b857411475","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98ae7e46b06e0aeb71210643f8094d1b27","guid":"bfdfe7dc352907fc980b868725387e987f28047e02a7d34a46f8ada17b829c9a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9894545c5eb4d21f54d2b3ad4447240a56","guid":"bfdfe7dc352907fc980b868725387e98f6c67c4679e7f7927d29cc6777b4854d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b8a07e04f908cc8061e28409eec78500","guid":"bfdfe7dc352907fc980b868725387e98fcb7e61931146dcd711e99248d6ccb4a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985d7e5bf3eb3e1529ebbb131e40709a84","guid":"bfdfe7dc352907fc980b868725387e9895fe4b33f65c965da7dc45a450744ad5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a3cc027245753495848a1caefc6d9f4","guid":"bfdfe7dc352907fc980b868725387e9881f94adb811a31f238513440b73eb9ce","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9817d4eb1b3c3ac1e9ddcfc14974bec284","guid":"bfdfe7dc352907fc980b868725387e98d2993dc352971d9dec3337f6492eedd2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986f7ca76bd9fb989518a0786f66daa730","guid":"bfdfe7dc352907fc980b868725387e987744d4bc1141e8c3af7814a94ab5d191","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e8c93c09dbe016d2a985868756c3daf2","guid":"bfdfe7dc352907fc980b868725387e98d44ce0ad517ce468c11abe8a1a7ee842","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983f42416849bce11b33d814523ade52b1","guid":"bfdfe7dc352907fc980b868725387e986dfc835f86ba61de853986e0c332c9bb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d79d9d7f2df01bec5fd1e10cbe9b2f76","guid":"bfdfe7dc352907fc980b868725387e98832bcfeadec19c9672e7d13bba695944","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981fc28c232ec55d2d1c2305e98d7bd92a","guid":"bfdfe7dc352907fc980b868725387e987522b569e1888c59443fabbfd9eec3d9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d33e281aa21213bf9ee3ca2d26a8cb52","guid":"bfdfe7dc352907fc980b868725387e9826df2a365ab1701d04b81b250e704469","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981f6af95e734f0e05952c002243f2cb28","guid":"bfdfe7dc352907fc980b868725387e98683700ed014e2584117d9919dc247bfe","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98892d93e77cafda119e30c32988406d93","guid":"bfdfe7dc352907fc980b868725387e98a95b46a3d3c80a8cb5734bbb7717809c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981700891532905651a54cc9a07dd2c6b3","guid":"bfdfe7dc352907fc980b868725387e98c814b053e6b465d54fefe875995c908b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98184bfb0fe7b895691bee4935d2b5d50f","guid":"bfdfe7dc352907fc980b868725387e980e4020bf220b21c849a1247a598ef500","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e2f51025ce37ba6eff3a96efa381b796","guid":"bfdfe7dc352907fc980b868725387e9867e1d59733a195924e43c7221ab3b507","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9859ab3ec029f964cc4041f98492a33760","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98394614911d329fd59c3c1e287c4f7ac2","guid":"bfdfe7dc352907fc980b868725387e9836a664f9634f39c09eb263d32eb33de8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98acbd88adba80f77ca7a9d08f07fa7223","guid":"bfdfe7dc352907fc980b868725387e981012013b7c46227b76d2a26c3973c5f4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e067790bbee9fb9376d0c77605d73661","guid":"bfdfe7dc352907fc980b868725387e986adce0f63de9503184a2571c68ae8037"},{"fileReference":"bfdfe7dc352907fc980b868725387e9825eb273bb3a088732d81eeb1c19af553","guid":"bfdfe7dc352907fc980b868725387e98c97111306fd51e26ac236698d182d1fb"},{"fileReference":"bfdfe7dc352907fc980b868725387e9820b9343c256beee0a1c63afec1a67796","guid":"bfdfe7dc352907fc980b868725387e98d9f834483786fc0c92f7593bcd6dd83c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ecf8248839ba4e6f17d3532feb14821b","guid":"bfdfe7dc352907fc980b868725387e98c97bce089e46629de083eac4838dd800"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a8a273d3c64641ffd71fe5f8c04b4132","guid":"bfdfe7dc352907fc980b868725387e985817ad63c8e4f8db81700ac14cc618cc"},{"fileReference":"bfdfe7dc352907fc980b868725387e982ea9c75e15c2f0e5172d62007ca22170","guid":"bfdfe7dc352907fc980b868725387e986e494a42d2c0843cec709c09ffdc69a4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98230a202d71e90bc984b72ad2f09fb2f4","guid":"bfdfe7dc352907fc980b868725387e9805c8314d750be278604bc8677fcf4420"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c64b3141b3e00a1e02e21e19f1e7eaab","guid":"bfdfe7dc352907fc980b868725387e988270e34481adcde5ab4b6a9daa89a011"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c15f7293e9ecd2b1063ce877015924a","guid":"bfdfe7dc352907fc980b868725387e98615ad6c8a17ee1f04050629a5a2a260a"},{"fileReference":"bfdfe7dc352907fc980b868725387e989c2cb05698df9b731b1c1c1e59a898de","guid":"bfdfe7dc352907fc980b868725387e98fd9db82003eb1b08fd6976b7ba6920aa"},{"fileReference":"bfdfe7dc352907fc980b868725387e982631bb95675558dfb73b76bfc58028b0","guid":"bfdfe7dc352907fc980b868725387e9836872f22a07d006d803b66800b0fd898"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d01f765a57f90a102cc78be24a15233c","guid":"bfdfe7dc352907fc980b868725387e985cf4803afdb0ccdba56bf5e79afdbebc"}],"guid":"bfdfe7dc352907fc980b868725387e989d91e5abbad637a65716b7fef9466ccd","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9847d3b3fdbf8c6c03a84819a79f7ae5aa"}],"guid":"bfdfe7dc352907fc980b868725387e988ec00323e57392a3c283b014e048e33b","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98c4b351c20ac090098b0dcaf5fd3c18e2","targetReference":"bfdfe7dc352907fc980b868725387e98e1aba8ff8dc833f2269ce0a7182533b3"}],"guid":"bfdfe7dc352907fc980b868725387e98053f546dc39b1661db608be4eb007f0a","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98e1aba8ff8dc833f2269ce0a7182533b3","name":"geolocator_apple-geolocator_apple_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e9821d372cc1e7c7587a12aeda843619e39","name":"geolocator_apple","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e986ff8f87e011522b1b6328c84d9533927","name":"geolocator_apple.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=35adaf1be68b319de0505ded2815bc62-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=35adaf1be68b319de0505ded2815bc62-json new file mode 100644 index 00000000..83c84d66 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=35adaf1be68b319de0505ded2815bc62-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b94f751a83e7e0f1d4b42f2b77a60509","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreInternal","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreInternal","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FirebaseCoreInternal_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98cc5302f00fadf35f3450306558c9fa7b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d9147eb705ef7701ac589855737d9572","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreInternal","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreInternal","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCoreInternal_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e983b5603d8db01d45f55bf49d921492c6d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d9147eb705ef7701ac589855737d9572","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreInternal","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreInternal","INFOPLIST_FILE":"Target Support Files/FirebaseCoreInternal/ResourceBundle-FirebaseCoreInternal_Privacy-FirebaseCoreInternal-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCoreInternal_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98cb85d7840e96bb3c6ada3c7d619feb0c","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ea0c95b0ea17f26701bbea8182aa2ad4","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98f508327e914011483a2f664b1da0e143","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e985dedb4877ad3d0affcc4a716189451c7","guid":"bfdfe7dc352907fc980b868725387e98736a76b1f641b349fd98f7b196e1120d"}],"guid":"bfdfe7dc352907fc980b868725387e98d31fb31447fd3669e8ec2ee0a7181156","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98e5b592b076e092ab7ac9d9b5c85edc6f","name":"FirebaseCoreInternal-FirebaseCoreInternal_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98c4db3ee10fd3aea38cd0fd6d5693c776","name":"FirebaseCoreInternal_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=376189dccaae382545d5e718c59412f6-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=376189dccaae382545d5e718c59412f6-json new file mode 100644 index 00000000..ac08c7bc --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=376189dccaae382545d5e718c59412f6-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9875a911280513a51a1fcc833a02e1e86d","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/sqflite_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"sqflite_darwin","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/ResourceBundle-sqflite_darwin_privacy-sqflite_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"sqflite_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e987c571a44107819654ec3c87e60d3d00a","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b2e50aea12e109eb95c45970b36f8a43","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/sqflite_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"sqflite_darwin","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/ResourceBundle-sqflite_darwin_privacy-sqflite_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"sqflite_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98db4f055816091cf5b613d1859af7847a","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b2e50aea12e109eb95c45970b36f8a43","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/sqflite_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"sqflite_darwin","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/ResourceBundle-sqflite_darwin_privacy-sqflite_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"sqflite_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98cec1eface6e261de2935ced07b31ae21","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e980631f74da17b751c083b070fee808b75","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98e800c60291ba81fc3a0ae26af24eb2e2","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9853ec5b69fdc2191f1ca7a8b03970be07","guid":"bfdfe7dc352907fc980b868725387e984d6623b0cd11fced8626890b1e0d21e1"}],"guid":"bfdfe7dc352907fc980b868725387e98803d267b2494aa83d5f2151d32c7bfb5","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9883134bb5f399cb37a1eb075d4fea30d8","name":"sqflite_darwin-sqflite_darwin_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9849c1d4b1200fcbf6f387f94121c7d0bf","name":"sqflite_darwin_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3a7fbdb39c618b52ee7b40baa1e884b1-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3a7fbdb39c618b52ee7b40baa1e884b1-json new file mode 100644 index 00000000..53a4eca5 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3a7fbdb39c618b52ee7b40baa1e884b1-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981ea619c6c09d50e42998ac2381b017c9","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"shared_preferences_foundation","PRODUCT_NAME":"shared_preferences_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e986f83bf1d86816a7afe713389f3b0794c","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988abaddbc7dac244a9dd3a827969bb097","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"shared_preferences_foundation","PRODUCT_NAME":"shared_preferences_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c6ce66678a98cae8c935e06602a448e0","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988abaddbc7dac244a9dd3a827969bb097","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/shared_preferences_foundation/shared_preferences_foundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"shared_preferences_foundation","PRODUCT_NAME":"shared_preferences_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980f59bc0c0df185b08d92e2afa6f35dda","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d9c07036facadf4c2fe7142051423416","guid":"bfdfe7dc352907fc980b868725387e98e82259888cd400660e6ae15b115eb233","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9845bc282ec8aa7540f3a569c2631d21d5","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d7fd3cf0401e3393c461b2ae7c1591c7","guid":"bfdfe7dc352907fc980b868725387e9849904c696af5deb4aefd6d8ffebf2ea6"},{"fileReference":"bfdfe7dc352907fc980b868725387e9857a0115412b61e72a46155af7b48b848","guid":"bfdfe7dc352907fc980b868725387e98489a95f2019f3ec6e0acd5ba6de8991a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f19bf67647b9b4da54e0115f35b62be4","guid":"bfdfe7dc352907fc980b868725387e98d8eb7cdafa52e52bc1601de019c778e6"}],"guid":"bfdfe7dc352907fc980b868725387e98f14b5d6b6d6b0c465e2f1e0eaa6bc1cd","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98475ba5d87573359032e9b06fd466a003"}],"guid":"bfdfe7dc352907fc980b868725387e9859badffc37928e123e98be61f8d11d71","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9872e4e537a8c9a8da179493daa4c54b77","targetReference":"bfdfe7dc352907fc980b868725387e98e0be3b0d5ad56f1985578b1f97431765"}],"guid":"bfdfe7dc352907fc980b868725387e9876fd72010a5b056ae41fa1936cd39334","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98e0be3b0d5ad56f1985578b1f97431765","name":"shared_preferences_foundation-shared_preferences_foundation_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e9828cab1f188854e0a973e6ff6905c5ffe","name":"shared_preferences_foundation","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9815af7ba71ce93f789a463577fc360420","name":"shared_preferences_foundation.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3af0402199bd31e72f681872a46f8b81-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3af0402199bd31e72f681872a46f8b81-json new file mode 100644 index 00000000..8dbc5d96 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3af0402199bd31e72f681872a46f8b81-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984313c60e6f9802ff746f03392a8606c6","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/gma_mediation_meta/gma_mediation_meta-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"gma_mediation_meta","PRODUCT_NAME":"gma_mediation_meta","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9842208ee147f2ba7dc0a8200c0a23e1aa","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98a3553afa0a155f1b7d0b159f832c1bdf","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/gma_mediation_meta/gma_mediation_meta-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"gma_mediation_meta","PRODUCT_NAME":"gma_mediation_meta","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98582ee09ed0a1a1fb05b8c6c1eefa4bd7","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98a3553afa0a155f1b7d0b159f832c1bdf","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/gma_mediation_meta/gma_mediation_meta-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/gma_mediation_meta/gma_mediation_meta.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"gma_mediation_meta","PRODUCT_NAME":"gma_mediation_meta","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980066747e0314e58d6523583389a782c5","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f8de3b0000f893d550dd9f3b81ebc5cf","guid":"bfdfe7dc352907fc980b868725387e988239cc2cfc83ba8b654a69c1b5933ffa","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98c4ff86b7c04b021fbfcd01ef4043f680","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e984dfc7910e2cd9fac3233404165834daa","guid":"bfdfe7dc352907fc980b868725387e984fa93fe538d6b99ceab11e20fbc6c572"},{"fileReference":"bfdfe7dc352907fc980b868725387e98de6a43df899eca99ef9a76eb3ad60a9b","guid":"bfdfe7dc352907fc980b868725387e989fed02c35c69741c7b23872edfd83b41"}],"guid":"bfdfe7dc352907fc980b868725387e98b1688df9c765b513cb34ececb01eadcd","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e986245627ecb3baa4ad9e7d5f4e4253544"}],"guid":"bfdfe7dc352907fc980b868725387e981969ae65eddb8bcd25ef7d9a0ee87e91","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98d0d9631745bce04e3789df4fa10ad3e6","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98bbd9e0ed4cdc41b93625c3661dbcaa81","name":"GoogleMobileAdsMediationFacebook"}],"guid":"bfdfe7dc352907fc980b868725387e98ec9201ffba3c82781a28590604d34ce4","name":"gma_mediation_meta","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e983de8b30d452f72d63bc2bb3d5c645196","name":"gma_mediation_meta.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=46e4fdabe3969081354e9e5e60b64b4b-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=46e4fdabe3969081354e9e5e60b64b4b-json new file mode 100644 index 00000000..b6faabb2 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=46e4fdabe3969081354e9e5e60b64b4b-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980fcd71e29c5847bc1bc9583f1118e75f","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUserMessagingPlatform","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUserMessagingPlatform","INFOPLIST_FILE":"Target Support Files/GoogleUserMessagingPlatform/ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"UserMessagingPlatformResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98d8070005d25b539f0e0a08a3311fb447","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985c479bbc4c266fbeb3d57a3c706051fb","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUserMessagingPlatform","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUserMessagingPlatform","INFOPLIST_FILE":"Target Support Files/GoogleUserMessagingPlatform/ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"UserMessagingPlatformResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98de1c9bc2c4cb036a6000e8397c013520","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985c479bbc4c266fbeb3d57a3c706051fb","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUserMessagingPlatform","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUserMessagingPlatform","INFOPLIST_FILE":"Target Support Files/GoogleUserMessagingPlatform/ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"UserMessagingPlatformResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e989301e5dd95ab8eb6d43cc5307d22ae22","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98633b38489199a343af49f929aaaec88b","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98128c5f626f7af94716c0325c73d1a081","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98640b59ad05d12383de1650adc4f4bc54","guid":"bfdfe7dc352907fc980b868725387e98abd9043e61bdb6cddbf7370d96d96d80"}],"guid":"bfdfe7dc352907fc980b868725387e98d62135faa461c3a6c987b0c06852423d","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e984a8eac8d5b6bc897e9823b3668d5ca68","name":"GoogleUserMessagingPlatform-UserMessagingPlatformResources","productReference":{"guid":"bfdfe7dc352907fc980b868725387e985ea2fcc0a122cfbfb93ccb4e59e732f5","name":"UserMessagingPlatformResources.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4b924fd5a51dd455efd4e7fe9f2f3ae9-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4b924fd5a51dd455efd4e7fe9f2f3ae9-json new file mode 100644 index 00000000..3c7b9988 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4b924fd5a51dd455efd4e7fe9f2f3ae9-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eef3be20c160fe75bf8789e71fe75d9a","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"Google_Mobile_Ads_SDK","PRODUCT_NAME":"Google_Mobile_Ads_SDK","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.3","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9895d39f6438c3c760697d14f74070c007","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988ad1fd18441580496a4b9e0a44f0cae8","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK.modulemap","PRODUCT_MODULE_NAME":"Google_Mobile_Ads_SDK","PRODUCT_NAME":"Google_Mobile_Ads_SDK","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.3","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a0f595b99ebfd9b3b377a474553a7fb0","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988ad1fd18441580496a4b9e0a44f0cae8","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK.modulemap","PRODUCT_MODULE_NAME":"Google_Mobile_Ads_SDK","PRODUCT_NAME":"Google_Mobile_Ads_SDK","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.3","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ec66ebd7e509a5ae351eb735f67c1dd6","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e982d361e23934d13045cda7e58f8f9e857","guid":"bfdfe7dc352907fc980b868725387e98bfd6bc07c0feb5d200d030c68246ccb2","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98e90dbc6f14ab6fddfb7cfb52650e6baa","type":"com.apple.buildphase.headers"},{"alwaysOutOfDate":"false","alwaysRunForInstallHdrs":"false","buildFiles":[],"emitEnvironment":"false","guid":"bfdfe7dc352907fc980b868725387e982b44c516936750ab33740e0f34b79301","inputFileListPaths":["${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks-input-files.xcfilelist"],"inputFilePaths":[],"name":"[CP] Copy XCFrameworks","originalObjectID":"54A5A3E554ECD3D0840D599053497866","outputFileListPaths":["${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks-output-files.xcfilelist"],"outputFilePaths":[],"sandboxingOverride":"basedOnBuildSetting","scriptContents":"\"${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks.sh\"\n","shellPath":"/bin/sh","type":"com.apple.buildphase.shell-script"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e980db896d121df87c41c7bb87c65b3946e","guid":"bfdfe7dc352907fc980b868725387e983582f984cc7f56a94c9f1b106157b2ce"},{"fileReference":"bfdfe7dc352907fc980b868725387e989b5a6d6941a300be315e89d9de2d68d7","guid":"bfdfe7dc352907fc980b868725387e981787c00319fbc008e76bd51212dfb8fa"}],"guid":"bfdfe7dc352907fc980b868725387e9874306a37930eb5d34d19474424a49911","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e988639c726c13cba5a0d9f3090f852ba0c"}],"guid":"bfdfe7dc352907fc980b868725387e98d84cd42926dca469b94512f76bd2ac43","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98c4624bd3f1c88f6e9a26ba57dff561e9","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98468089666b04a941512e80a0cc9cf153","name":"Google-Mobile-Ads-SDK-GoogleMobileAdsResources"},{"guid":"bfdfe7dc352907fc980b868725387e98c777611770584bd7c20ebf80e3d30200","name":"GoogleUserMessagingPlatform"}],"guid":"bfdfe7dc352907fc980b868725387e98cd53d937e824fad9f4527eeeb684cb40","name":"Google-Mobile-Ads-SDK","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9818a94369b493dd5e2142e633eac417e6","name":"Google_Mobile_Ads_SDK.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cabd0c48a00d7a4ed741cb699f1cc8e-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cabd0c48a00d7a4ed741cb699f1cc8e-json new file mode 100644 index 00000000..b5940291 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cabd0c48a00d7a4ed741cb699f1cc8e-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e7f2a28e7b8ddc8b338bf3b440155a56","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","ONLY_ACTIVE_ARCH":"NO","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2"},"guid":"bfdfe7dc352907fc980b868725387e98a3d5f5bdf8bd74b2e38d03fee57874a9","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984c35e946ddb98e62c2ccb9cc1055f1ac","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e981a104acc4450feed5fa9a6e9bbde99e6","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984c35e946ddb98e62c2ccb9cc1055f1ac","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e982cd019beee53251f78381aed3ac00408","name":"Release"}],"buildPhases":[],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98b762d5de103fb6cfc7506aa6be1d4f33","name":"FirebaseAuth"},{"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore"}],"guid":"bfdfe7dc352907fc980b868725387e98d57b8bce60a0f11113f4cff532db68d3","name":"Firebase","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Release","provisioningStyle":0}],"type":"aggregate"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cc1f6e212912d53710de3aa08e4aa3c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cc1f6e212912d53710de3aa08e4aa3c-json new file mode 100644 index 00000000..685d750c --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4cc1f6e212912d53710de3aa08e4aa3c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98237671cfe20903d6f94682d7135ab52a","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/path_provider_foundation/path_provider_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"path_provider_foundation","PRODUCT_NAME":"path_provider_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ab88586633079f928287f370e8b6f07b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e0c5fa0e8218bd665f72f14cbfc898f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/path_provider_foundation/path_provider_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"path_provider_foundation","PRODUCT_NAME":"path_provider_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9880f884b2537bd891ed54ff6e3ab7d0ee","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e0c5fa0e8218bd665f72f14cbfc898f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/path_provider_foundation/path_provider_foundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/path_provider_foundation/path_provider_foundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"path_provider_foundation","PRODUCT_NAME":"path_provider_foundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9858b9d941e76db42d349048c14af0e16e","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b67bc92c615d1dba3ac53bf7b30bdb94","guid":"bfdfe7dc352907fc980b868725387e98e40234757d04478dc54a213f59e845fa","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98450b40315711083d32b0ed949174ff28","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9803bb7f63530cdb500ba84b0a1a44af44","guid":"bfdfe7dc352907fc980b868725387e984a6cdfb5d6c5b7f2a63f81831458165e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9854c6536298ac986565a978d13cd2d6f9","guid":"bfdfe7dc352907fc980b868725387e986dfc1b5ca512f6383be32a7124385963"},{"fileReference":"bfdfe7dc352907fc980b868725387e9840d362b89ea106c24e2dbcd47a7474bd","guid":"bfdfe7dc352907fc980b868725387e98ef705c119ac1f3b015cda82f10194a36"}],"guid":"bfdfe7dc352907fc980b868725387e98f5d455158bacea210fd45e1a8f3245fc","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9829f34398048903731961241124ac546e"}],"guid":"bfdfe7dc352907fc980b868725387e987ebedde198dc993f3ca38aec4ed08768","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98234997a2811e55e2dfc23faf0b9d3093","targetReference":"bfdfe7dc352907fc980b868725387e987ea64ee8d53085bf9edd1a57aaf8cbb5"}],"guid":"bfdfe7dc352907fc980b868725387e98ac45f7d09c5ae0c1d8f7eb8e8ff004ab","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e987ea64ee8d53085bf9edd1a57aaf8cbb5","name":"path_provider_foundation-path_provider_foundation_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e9830037b09fee48cfce1f8562d753688c8","name":"path_provider_foundation","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98177b75fe6f519d73b22b382cca137f1c","name":"path_provider_foundation.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4d623afd122ecb9d6d730809785df91d-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4d623afd122ecb9d6d730809785df91d-json new file mode 100644 index 00000000..dde5b011 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4d623afd122ecb9d6d730809785df91d-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9899a3c545d51db50c0cf261030b824669","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/quick_actions_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"quick_actions_ios","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/ResourceBundle-quick_actions_ios_privacy-quick_actions_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"quick_actions_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9825f24fdafd16dee2367a8f077c551266","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98968b3bc9ee9e49b2679f77b1c2b31c1d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/quick_actions_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"quick_actions_ios","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/ResourceBundle-quick_actions_ios_privacy-quick_actions_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"quick_actions_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e989d71b68699197c2964ed952c52317108","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98968b3bc9ee9e49b2679f77b1c2b31c1d","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/quick_actions_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"quick_actions_ios","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/ResourceBundle-quick_actions_ios_privacy-quick_actions_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"quick_actions_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f408d434fdaa491912a43eb5fc0b7c51","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9860b5503cafc0f3e0ee5f39486fce21f2","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e984ce69b5bc5a78311dbe7681fc5cde81c","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9897ece101e217083edce53455b9b44d62","guid":"bfdfe7dc352907fc980b868725387e98f22ae4dbfb03af3d8271ecc228f2d865"}],"guid":"bfdfe7dc352907fc980b868725387e98ef759b8c8c0563068bd54b8899291c01","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e980e0d42b02f67da84628f3c3fd30ed4e0","name":"quick_actions_ios-quick_actions_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9821b5524199a1a9b5cefe276f98c67dc8","name":"quick_actions_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5248d9ba098cf8d77d31b3cf7f8b5a69-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5248d9ba098cf8d77d31b3cf7f8b5a69-json new file mode 100644 index 00000000..fb8c7cea --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5248d9ba098cf8d77d31b3cf7f8b5a69-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980fcd71e29c5847bc1bc9583f1118e75f","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","ONLY_ACTIVE_ARCH":"NO","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2"},"guid":"bfdfe7dc352907fc980b868725387e9849b0a8fef29b1e33f3642957f3e0b890","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985c479bbc4c266fbeb3d57a3c706051fb","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e98c07bc701f6dc8f95d2ddc7d82b98c075","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985c479bbc4c266fbeb3d57a3c706051fb","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e98533b424307a06a0ca8c8daaf5b4a850a","name":"Release"}],"buildPhases":[{"alwaysOutOfDate":"false","alwaysRunForInstallHdrs":"false","buildFiles":[],"emitEnvironment":"false","guid":"bfdfe7dc352907fc980b868725387e987714768b2802b303372f44281b00b3c8","inputFileListPaths":["${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks-input-files.xcfilelist"],"inputFilePaths":[],"name":"[CP] Copy XCFrameworks","originalObjectID":"B5375E1D4AF75C11071DABBF1B769DF2","outputFileListPaths":["${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks-output-files.xcfilelist"],"outputFilePaths":[],"sandboxingOverride":"basedOnBuildSetting","scriptContents":"\"${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks.sh\"\n","shellPath":"/bin/sh","type":"com.apple.buildphase.shell-script"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e984a8eac8d5b6bc897e9823b3668d5ca68","name":"GoogleUserMessagingPlatform-UserMessagingPlatformResources"}],"guid":"bfdfe7dc352907fc980b868725387e98c777611770584bd7c20ebf80e3d30200","name":"GoogleUserMessagingPlatform","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Release","provisioningStyle":0}],"type":"aggregate"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=525a617ce5cf51a2c10a01508fbe4adf-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=525a617ce5cf51a2c10a01508fbe4adf-json new file mode 100644 index 00000000..11b839f6 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=525a617ce5cf51a2c10a01508fbe4adf-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b022d73df32750d90180fee080a0f7d1","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_core/firebase_core-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_core/firebase_core-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_core/firebase_core.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_core","PRODUCT_NAME":"firebase_core","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9882783658549e0905d9247e7644e480db","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9808ccd97494fd54f1603a316a163aab94","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_core/firebase_core-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_core/firebase_core-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_core/firebase_core.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_core","PRODUCT_NAME":"firebase_core","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98271ce67a4d92e5b1c9e2841d40ba0c38","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9808ccd97494fd54f1603a316a163aab94","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_core/firebase_core-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_core/firebase_core-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_core/firebase_core.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_core","PRODUCT_NAME":"firebase_core","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9841f2bb4249a81b3e0485186c7095bfad","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e987dfea0c140a7a0ea66e66dcf646b175b","guid":"bfdfe7dc352907fc980b868725387e9834601f58eb6ecb12dc46f0d4f5c03b22","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b775542e692f38065f43634092d616ce","guid":"bfdfe7dc352907fc980b868725387e9846c9e9a1471448d65fe1be58e14cf6e8","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b2eb7b9f5e3786b97a3a72dd22421a5e","guid":"bfdfe7dc352907fc980b868725387e985d388c5dd9014ce65beecebbb06c6cfe","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f772990796156a555335464dc3c777ca","guid":"bfdfe7dc352907fc980b868725387e981b7e8b90295818a55ff4adacb18d7cda","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f3bd2cacbaac9079f1396cb3fa6d0e27","guid":"bfdfe7dc352907fc980b868725387e987749bea8c90a0f2da3ebbeed6c84dd52","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9867153d6814ea6c8bee7037d6d146ce78","guid":"bfdfe7dc352907fc980b868725387e98a36b67d912b208aeec470d4e5f484b8a","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9882038e1635bc07d4e30bd4023a6b61ae","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98601b2da428ba75eb289e1c54c7e54ac2","guid":"bfdfe7dc352907fc980b868725387e98bd2b07ac01f48df7e4690488ad174302"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a993adacba3286d6cf47f3ca504b1406","guid":"bfdfe7dc352907fc980b868725387e98941c79f3dab14c7ce61254f0bf7a8224"},{"fileReference":"bfdfe7dc352907fc980b868725387e9807da482b8ec6e4d8948d658c8bdf02e5","guid":"bfdfe7dc352907fc980b868725387e9827c702ca91652a44628c6062c81d922e"},{"fileReference":"bfdfe7dc352907fc980b868725387e989977ba840e207e56a3bdbda80a4d8615","guid":"bfdfe7dc352907fc980b868725387e984d3785c0518cff1d26e769d5fc17a303"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f5cce0e89494288c3baf0f38b30e399f","guid":"bfdfe7dc352907fc980b868725387e984ce69ee8307cb628883258ea8858fb7d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9878e159148fb5c54711d45b5262f445b4","guid":"bfdfe7dc352907fc980b868725387e985ea14b413bc4cf843e5c11a9377768cf"}],"guid":"bfdfe7dc352907fc980b868725387e980222076457cd73b4b2516b590ca4e5e9","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98f530986a656c334332b1858f373235a0"}],"guid":"bfdfe7dc352907fc980b868725387e9845b8853a6c66f43b65b5fb0a7975fd55","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e982da293737faed3f5bf7ed42c243d105d","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98d57b8bce60a0f11113f4cff532db68d3","name":"Firebase"},{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"}],"guid":"bfdfe7dc352907fc980b868725387e987f74324bfc5c78140e34d510e26e00c1","name":"firebase_core","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98a32fdd082239c9fc7912ba5b473ab170","name":"firebase_core.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5319ba36858c0aa8d085cf090833a92c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5319ba36858c0aa8d085cf090833a92c-json new file mode 100644 index 00000000..acaa96d9 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5319ba36858c0aa8d085cf090833a92c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98dcc81be3bb552d5ea4561a1ae5bb7340","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseAppCheck","PRODUCT_NAME":"FirebaseAppCheck","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9838c4fec4b71725e09cbf9662270d290b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9858ca2cea4d0cfb89402980161e9a9cd8","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck.modulemap","PRODUCT_MODULE_NAME":"FirebaseAppCheck","PRODUCT_NAME":"FirebaseAppCheck","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980c35b2a87e8e6dcf6e77ce5b5ee26166","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9858ca2cea4d0cfb89402980161e9a9cd8","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAppCheck/FirebaseAppCheck.modulemap","PRODUCT_MODULE_NAME":"FirebaseAppCheck","PRODUCT_NAME":"FirebaseAppCheck","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9837c7adcccd7fd6a1a2ada6643df6078f","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98cc62704582d6538d2c8174cc4716bd01","guid":"bfdfe7dc352907fc980b868725387e9871d91a42be601b71d307300b8355ee1f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fbd90d23a9844d554e6c9a88b7a47396","guid":"bfdfe7dc352907fc980b868725387e983b665e94a4cfaa5b6a0aca002e7e59fb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983bc0545c109603b43fe7a712a18dd4ed","guid":"bfdfe7dc352907fc980b868725387e9806e4e0f07e830dcf1c064d4fde7372c0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980969a6e00d9b9e9eadd3837e5f867ec2","guid":"bfdfe7dc352907fc980b868725387e98396b98354e97c6b1358117f08a4e306a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9876546db88afa14aa0230a40315a8e9cb","guid":"bfdfe7dc352907fc980b868725387e987ac25a11fa40f178db5d50bff061db77","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986055f501457bc6efb35bf3aa8c3a44a4","guid":"bfdfe7dc352907fc980b868725387e98f3b1973278086302771042df4e00ea41","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98868da319a13b4790783057bfbc4a8856","guid":"bfdfe7dc352907fc980b868725387e98756f5b397ad053077de8f46d7da8fab2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983250e0568fe4851d28a49a6f1cda2099","guid":"bfdfe7dc352907fc980b868725387e98b1c7b574f15f7fc9aa11534e7d2b7562","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98af65f253db51a8a01b417fbacaee2077","guid":"bfdfe7dc352907fc980b868725387e9834540f115b38beb81f79aaec362acee4"},{"fileReference":"bfdfe7dc352907fc980b868725387e982b2d142e274ac25a0561c078b47b5010","guid":"bfdfe7dc352907fc980b868725387e987738e43885705e2ca3d3f952a852d1e9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98355bf2abe13f0f83f9f3bb625c809df7","guid":"bfdfe7dc352907fc980b868725387e98039ec9cf2443d2dfcaa6bfd00745a082","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980d7be89019113857f905dea093b1ce52","guid":"bfdfe7dc352907fc980b868725387e980b651aa249a332add6784e1a51326269","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f01ba42cf03b5479cb00e8e2f1e498f0","guid":"bfdfe7dc352907fc980b868725387e988badb0d31d2706b6e4f9747d22135a0f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d719dfabd618a96b66dbf19219ed765b","guid":"bfdfe7dc352907fc980b868725387e983155fd9f6a3b8bca94c3c79ab7d6f172","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d668922bc499462306878885b18a5df3","guid":"bfdfe7dc352907fc980b868725387e98900d260dc13755009dc5e9a87b094ce7"},{"fileReference":"bfdfe7dc352907fc980b868725387e9876df4e8ca94b5e724a4e852778743c1e","guid":"bfdfe7dc352907fc980b868725387e9828b6a38764c56d071ba48fdbb255f533"},{"fileReference":"bfdfe7dc352907fc980b868725387e986ae26e21f215969b335fcf089dce8a46","guid":"bfdfe7dc352907fc980b868725387e98f05d93bb93fdddbb0e4e7929359c57b7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b169de74071925d7b12305e13c960697","guid":"bfdfe7dc352907fc980b868725387e983a4581eb617a5ad7d83892d698d594b6"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d03e6a9e16ca15419865ec53d554960","guid":"bfdfe7dc352907fc980b868725387e9849ccab35060d3b04350d5b2ec96a6be4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98955d9460628f5b5da0340d52b3be53ca","guid":"bfdfe7dc352907fc980b868725387e98ee4dfe3e5170a4d901e0ea6c5751579f"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d929aa8b59449447362db17859560b7","guid":"bfdfe7dc352907fc980b868725387e9885d6d8d78881bf3885d75b32e70b1277"},{"fileReference":"bfdfe7dc352907fc980b868725387e981059d7aa812d14711b030e28c61bcb6e","guid":"bfdfe7dc352907fc980b868725387e98764cfede42317a5d2c6a5172733c7e97","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c74baa67d92d7c59a439c5411d5e8e6b","guid":"bfdfe7dc352907fc980b868725387e98ce2868d00d05d2d2211051232eb2df1f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988d83ba06705aee54c5af980140a6c893","guid":"bfdfe7dc352907fc980b868725387e98cd6526b0c21c31085bd5878a26ea1a52","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9804717059d9181565ee5576a9e39236df","guid":"bfdfe7dc352907fc980b868725387e9889255affc0e671e70bb08e4e4f3f6e7c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fd3fc54900e75a3cfcce7c2bb219927b","guid":"bfdfe7dc352907fc980b868725387e9815dca42c43fccc27a7b13ec4db07705a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852e8ed178d953a6776178ef48ee2814d","guid":"bfdfe7dc352907fc980b868725387e9879c2596fd3a27cc64d264f803ac04a3d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9816e853290c59ddfa95048f95507f1212","guid":"bfdfe7dc352907fc980b868725387e98f42c7113b7322f4073dcac9b6e96d7d1"},{"fileReference":"bfdfe7dc352907fc980b868725387e989213e7824c44f61ef818503291e680e0","guid":"bfdfe7dc352907fc980b868725387e9812f35353a4585fb67a3e91a122e4961f"},{"fileReference":"bfdfe7dc352907fc980b868725387e982afb2c662f2c43daeead1d89b85cc4be","guid":"bfdfe7dc352907fc980b868725387e98ede8ff609a807a6a6f7f3501653a1530"},{"fileReference":"bfdfe7dc352907fc980b868725387e9889e260595c9bb6055f19e49c4ac1de2a","guid":"bfdfe7dc352907fc980b868725387e981f72ce5bfe0f0920fcf3a20705e8519e"}],"guid":"bfdfe7dc352907fc980b868725387e989a8bdd7db64c936feeb9fdccde76a124","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e985a9877f895a7208fca1225e9aac58deb","guid":"bfdfe7dc352907fc980b868725387e98f2d8328aa3716bcf58165cb6aabdd9eb"},{"fileReference":"bfdfe7dc352907fc980b868725387e984f7216d9ae43747c39f20e03ebed994a","guid":"bfdfe7dc352907fc980b868725387e980a6842fc579249ca27117522fcb32520"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e5c73c8c1278df91bc0ad8f58764b0ca","guid":"bfdfe7dc352907fc980b868725387e98c5bcc8cfdebaa2ea4c37d0e8cf801bb7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d015c60cb1e8278e460e203665420af4","guid":"bfdfe7dc352907fc980b868725387e980d69a15c5090c41cfe80991e6b959490"},{"fileReference":"bfdfe7dc352907fc980b868725387e984db12fbce05cdb1e7d06a4628004dfee","guid":"bfdfe7dc352907fc980b868725387e987c40da3cb9a8bee11591bb9fcfbf9747"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bac4d0c002f00c3c0aadb1f86bea4db4","guid":"bfdfe7dc352907fc980b868725387e981e211ce9b5a82c38a89df7432af5ae11"},{"fileReference":"bfdfe7dc352907fc980b868725387e9879f6b6f0297ecaf4f94f56f86cbecd39","guid":"bfdfe7dc352907fc980b868725387e983e0ead0ddd47065d3ee3316a6a456558"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a467dc7f67b13c6f382fc0476ecf3578","guid":"bfdfe7dc352907fc980b868725387e98a10b53c251fead24e2bc80ffabaca7e3"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c010400b28cbe56f5bc69ec4f46feac","guid":"bfdfe7dc352907fc980b868725387e98908b25b6de0d398e2db2ab88c7de1b95"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e83b31792a4a77b69618b6c4e11a7b1e","guid":"bfdfe7dc352907fc980b868725387e981532a1ac14391b4b492680fe682b0957"},{"fileReference":"bfdfe7dc352907fc980b868725387e9814f775d5813351265e9acad2e605cec6","guid":"bfdfe7dc352907fc980b868725387e9818ac9bb25ea11222d5e6d5d5016eeec6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ee9616d51dbd0978b6b1160bde75c0fe","guid":"bfdfe7dc352907fc980b868725387e98aace04b8dc34a35748654fa1fa5d33a2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e48ac13f4b49e42bf03aa112e4b5d6e7","guid":"bfdfe7dc352907fc980b868725387e980435a41cdea476bf7b11f4bfcd411ec4"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852fe7745f4b2772e6cd3cba24e695be8","guid":"bfdfe7dc352907fc980b868725387e984695a5858a5c3c95172aebe1fe52346f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b99858e5d1ba7051c08bda553f5cbabe","guid":"bfdfe7dc352907fc980b868725387e98fad322e08034ceb08d597725afeba077"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c97cf347ee33ebdbcaaf450c07f28d2e","guid":"bfdfe7dc352907fc980b868725387e98b739033624abbc444cdbd9c09bdf3e92"},{"fileReference":"bfdfe7dc352907fc980b868725387e9809a30ce0fe1dd3695686a996a065f387","guid":"bfdfe7dc352907fc980b868725387e9840a011651d32a8a7d65ff37efb37da99"},{"fileReference":"bfdfe7dc352907fc980b868725387e985c461ab6a7e9879b6fa6169adaab3d61","guid":"bfdfe7dc352907fc980b868725387e98a2eb62cb148ada087de53721959663a9"}],"guid":"bfdfe7dc352907fc980b868725387e980f6ad4bb86e2126a469e3678db6ab533","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e989ad225b4241890eee92fd5876f740106"}],"guid":"bfdfe7dc352907fc980b868725387e980c126ec4e291ef8d9fbbbb38989292f4","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9808b47889de662cd4865776eda02c0c2b","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98cd8162b601eb6c17e4d86eec112a388c","name":"AppCheckCore"},{"guid":"bfdfe7dc352907fc980b868725387e981f0a8508efd61386103314ddbb82a530","name":"FirebaseAppCheckInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore"},{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"}],"guid":"bfdfe7dc352907fc980b868725387e98ecaebc2b66f6675fbaa388164aa6c8dd","name":"FirebaseAppCheck","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9857de7acecfe5aa305e96dd28add8de37","name":"FirebaseAppCheck.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=558846d52469eb6457f7fa805fbcac19-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=558846d52469eb6457f7fa805fbcac19-json new file mode 100644 index 00000000..5d28f5d2 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=558846d52469eb6457f7fa805fbcac19-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98144cd18850e477837c238075d5256ffe","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c25f9cc441a3059ef0126c5aaf98288e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981b663a2c82f0220040296818ba53477e","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980fd5a17e9008e6edce2b18476f20143d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98965b92d39d30a7872295adc2841cd1b1","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c75d8d376d8cc3f3dfe5b11f8b019fbc","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98e5e8bcdff29e5f8321be18f7989b4bc7","guid":"bfdfe7dc352907fc980b868725387e98ca9af5e2c54f437f9ebb0c203883ccae","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e986e6b8bd91d07f2fb082ccd84c7dcacb1","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98022654f1ff78dd844d694dba2439dab2","guid":"bfdfe7dc352907fc980b868725387e9881f185e1672aa83b98d6e30b47f8f468"}],"guid":"bfdfe7dc352907fc980b868725387e98de09b1176c796343f1f9bcd422c73402","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98e7ac2b91ee49764a75561cf994247683"}],"guid":"bfdfe7dc352907fc980b868725387e983bb5c38e7891bdb262f8e050f7d97030","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e987fddc24c35656402341de288e0688015","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98312b4bc59bbbe2c06c205bf4da6737f5","name":"Pods-Runner"}],"guid":"bfdfe7dc352907fc980b868725387e98483832d3c820398e9d40e1a6904b03fe","name":"Pods-RunnerTests","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e984f9f39caeddf64cc331db2b69d62aa63","name":"Pods_RunnerTests.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=55e76bc78bd49d51860d689a4f5e9c62-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=55e76bc78bd49d51860d689a4f5e9c62-json new file mode 100644 index 00000000..f92ea15a --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=55e76bc78bd49d51860d689a4f5e9c62-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984615091c333da42672bfd26263153e2c","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/flutter_native_splash","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"flutter_native_splash","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/ResourceBundle-flutter_native_splash_privacy-flutter_native_splash-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"flutter_native_splash_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9860da4fbfcabe1e33365f0cf663020529","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eccf4b0b561ffd1dcb573fa88f797247","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/flutter_native_splash","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"flutter_native_splash","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/ResourceBundle-flutter_native_splash_privacy-flutter_native_splash-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"flutter_native_splash_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e986f07137accd1dd82ae0ad0cefa3da6ce","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eccf4b0b561ffd1dcb573fa88f797247","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/flutter_native_splash","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"flutter_native_splash","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/ResourceBundle-flutter_native_splash_privacy-flutter_native_splash-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"flutter_native_splash_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98dd79e1c50585767db93c82ffe1c549bc","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98a37d43881289b10f7faf1b2357e7cb09","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9829803983f6294853f20f8230464279ca","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98fe3a5ec7d39edfd3a806d5f27e4564cd","guid":"bfdfe7dc352907fc980b868725387e98f684de83241336c666b424da119ad07a"}],"guid":"bfdfe7dc352907fc980b868725387e9824fa8ba8f370ad90caa2d574be5d4562","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9861233620df33996cccf430ed75b4a999","name":"flutter_native_splash-flutter_native_splash_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98640e376f8759837464f22e16bcf9542e","name":"flutter_native_splash_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5815137460cbcfbe6d2f7a5b54b4ca09-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5815137460cbcfbe6d2f7a5b54b4ca09-json new file mode 100644 index 00000000..8d0024cd --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5815137460cbcfbe6d2f7a5b54b4ca09-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9895b607e38dd439202402e1eb97e7bfe3","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_auth/firebase_auth-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_auth/firebase_auth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_auth/firebase_auth.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_auth","PRODUCT_NAME":"firebase_auth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e986ffa22517f22fd1628a2ac5260461665","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987f882ba03ab88d6bb0c7d3cbdee44856","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_auth/firebase_auth-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_auth/firebase_auth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_auth/firebase_auth.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_auth","PRODUCT_NAME":"firebase_auth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987b8d45e58dea39fe7d08353e02a0dd00","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987f882ba03ab88d6bb0c7d3cbdee44856","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_auth/firebase_auth-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_auth/firebase_auth-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_auth/firebase_auth.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_auth","PRODUCT_NAME":"firebase_auth","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98edda9841fffc7bfd37a16a25e8033f6c","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f0e96d34aebeddb83a8166ed2181b114","guid":"bfdfe7dc352907fc980b868725387e980264b5003559128064c2d431c7a1d5d2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983fadff5bdce928842849d4dcd99e8422","guid":"bfdfe7dc352907fc980b868725387e985d1e77a9e0f21d15d95d15d10c36a7ac","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c3935a7024d5af57e2ec647f59ad2f2d","guid":"bfdfe7dc352907fc980b868725387e98cbe6b1da8d292457b0a06923224aa7dd","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9827bee845e2266de322863f00bfdc2a26","guid":"bfdfe7dc352907fc980b868725387e98bc55dd443ff9df6818152546d4b6fa52","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a49b0809685262c84b0c7c8e57a010be","guid":"bfdfe7dc352907fc980b868725387e982efe64056275ae26b61290455ce42a1b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983b118aa12a63ca9f9945efeaf253ff7b","guid":"bfdfe7dc352907fc980b868725387e98e02f7506a83b26f4293ee303c4dbc43f","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e5b528b032881616d1c665dec13dafa8","guid":"bfdfe7dc352907fc980b868725387e98a0a8593f87d972ef6f48ed937fef744c","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e982864d491b842dd5124ecf14b972d65b6","guid":"bfdfe7dc352907fc980b868725387e9877d27052a9618edfae7508f85bac96af","headerVisibility":"private"}],"guid":"bfdfe7dc352907fc980b868725387e988f67ebbfe9a44a955f668d3a5eb4c0bb","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f9755ae3b2d4cab1fb3158b533f2c9d1","guid":"bfdfe7dc352907fc980b868725387e98ecb41fbfb930c36ae115d09d3f3d730e"},{"fileReference":"bfdfe7dc352907fc980b868725387e985f541d6ffe1082b2902e65204c08509d","guid":"bfdfe7dc352907fc980b868725387e98b795a98d2e97081bd5295e3b4039deef"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eb223ecb002d14c77278863d78c4c318","guid":"bfdfe7dc352907fc980b868725387e981691306068dfc16ee4f918f9cfb49a7d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9810eacf503f471242fc9c2cd78a82403c","guid":"bfdfe7dc352907fc980b868725387e9833d5a142ad9df6cf3e604e4deb1bcf04"},{"fileReference":"bfdfe7dc352907fc980b868725387e982532bb5826be388841ede9effca1df18","guid":"bfdfe7dc352907fc980b868725387e98849e466755639a30943fd9b3df64d9ea"},{"fileReference":"bfdfe7dc352907fc980b868725387e988936fde4a4450628a9e214e0ddf0d394","guid":"bfdfe7dc352907fc980b868725387e986dd29eeff5f19c0d819a889c21d7e7fa"},{"fileReference":"bfdfe7dc352907fc980b868725387e98347fb9c4a5c7c79fec72e40d077e4345","guid":"bfdfe7dc352907fc980b868725387e9811fb68a52c38697eb33ce80d8ac39fe7"}],"guid":"bfdfe7dc352907fc980b868725387e98d0a3957f9e1e76017912b92f0fab46b9","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98daa3520e3d9f06a110e8f01981af6f59"}],"guid":"bfdfe7dc352907fc980b868725387e98ce97f70f77fd0c53336335476b6c74ce","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98021c1a71a666361c883fecc3ff1b4e14","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98d57b8bce60a0f11113f4cff532db68d3","name":"Firebase"},{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e987f74324bfc5c78140e34d510e26e00c1","name":"firebase_core"}],"guid":"bfdfe7dc352907fc980b868725387e983788d8769c821650606514be955fca93","name":"firebase_auth","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e984496a3f7661d89567ff8250961054e8f","name":"firebase_auth.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5b871dc0aeb742795842305fce24cf10-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5b871dc0aeb742795842305fce24cf10-json new file mode 100644 index 00000000..9750b1d8 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5b871dc0aeb742795842305fce24cf10-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98be516318204b40d33cd2aae70dc8508d","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/image_picker_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"image_picker_ios","INFOPLIST_FILE":"Target Support Files/image_picker_ios/ResourceBundle-image_picker_ios_privacy-image_picker_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"image_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98fe184685e7621bee1606ce85917b9b85","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988b179e3ba3eb0643314ef47fd544fc52","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/image_picker_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"image_picker_ios","INFOPLIST_FILE":"Target Support Files/image_picker_ios/ResourceBundle-image_picker_ios_privacy-image_picker_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"image_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e980e4526c50a4031936bde394eea80eeea","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988b179e3ba3eb0643314ef47fd544fc52","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/image_picker_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"image_picker_ios","INFOPLIST_FILE":"Target Support Files/image_picker_ios/ResourceBundle-image_picker_ios_privacy-image_picker_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"image_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98c53111fcdd62cde610c426b59c6fff48","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98177bb54c0b7e90531c0998c1a64e6640","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98a28d1f7835b4ffdc546d78cd1abcaa73","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e981c0fc8adcffe31e3d3685bd10445f9cd","guid":"bfdfe7dc352907fc980b868725387e9841b0f8ddcf424810ba75263f93b7b475"}],"guid":"bfdfe7dc352907fc980b868725387e98939f77574fa9675a93079ac8069ec10e","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98082dc85da1fc941e5234c7cc1f11b27d","name":"image_picker_ios-image_picker_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98cba567c8a049008de84f093e54e3191c","name":"image_picker_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5bd0bad9e37ac0efe7eb7e9b6a040622-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5bd0bad9e37ac0efe7eb7e9b6a040622-json new file mode 100644 index 00000000..d89c810b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=5bd0bad9e37ac0efe7eb7e9b6a040622-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c5ea3636852338c982e52209ddd197d0","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/device_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"device_info_plus","INFOPLIST_FILE":"Target Support Files/device_info_plus/ResourceBundle-device_info_plus_privacy-device_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"device_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e982904bb5a1a6cb0ed3f02b0f6d901644e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c321042b295c1853a19a7fc9918a7454","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/device_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"device_info_plus","INFOPLIST_FILE":"Target Support Files/device_info_plus/ResourceBundle-device_info_plus_privacy-device_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"device_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e984596d2a2fc6523e915885973c572d8a0","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c321042b295c1853a19a7fc9918a7454","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/device_info_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"device_info_plus","INFOPLIST_FILE":"Target Support Files/device_info_plus/ResourceBundle-device_info_plus_privacy-device_info_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"device_info_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98207a2fbc6c3dec47ad9df0cd8f6ea36f","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98f08c76ed4246bfded15b12d7fa9b32a3","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98b485edd366b672ff4d81a5c7087c98e0","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c10991a7301e313966d8722e62961e70","guid":"bfdfe7dc352907fc980b868725387e9806b678c693bf89dc1ed60fcbbdd4c059"}],"guid":"bfdfe7dc352907fc980b868725387e98289669258e6c850a58e363fc4c5889d5","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98583f48d08e567205bb589ccf43c23e63","name":"device_info_plus-device_info_plus_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98796fe11972476d5a3ffbbf6850b4991c","name":"device_info_plus_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=61f30aa6dfaff3adeef504cd04583578-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=61f30aa6dfaff3adeef504cd04583578-json new file mode 100644 index 00000000..52a0e76b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=61f30aa6dfaff3adeef504cd04583578-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9899a3c545d51db50c0cf261030b824669","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/quick_actions_ios/quick_actions_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"quick_actions_ios","PRODUCT_NAME":"quick_actions_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98acfdc8cee73d6ddf7ec37d429e7f55b1","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98968b3bc9ee9e49b2679f77b1c2b31c1d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/quick_actions_ios/quick_actions_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"quick_actions_ios","PRODUCT_NAME":"quick_actions_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a750796f7c7942168c3e5bdf0be0cf63","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98968b3bc9ee9e49b2679f77b1c2b31c1d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/quick_actions_ios/quick_actions_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/quick_actions_ios/quick_actions_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"quick_actions_ios","PRODUCT_NAME":"quick_actions_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9817fe2af4d90d8c3c858f4d1cf8fff876","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98da1a1802428a351085dc1c5dc1b95b0e","guid":"bfdfe7dc352907fc980b868725387e986197130f55596953d24a82ff0fd7953e","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98f08756e83b172ee067bf0780b590348d","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98e0db4c45eaeb1548f9f07595cdd1ca45","guid":"bfdfe7dc352907fc980b868725387e98508014754d169ddaeaef802bfeb19d2b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dac7ee7a1bbc4495acb5a734dbbf08a0","guid":"bfdfe7dc352907fc980b868725387e98dec5ad258fb22b144f74259297632fd4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98775d552104d6921b0e48e28110e132e4","guid":"bfdfe7dc352907fc980b868725387e98a1ac291c4f3e44de99d6167ae512addc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a6e06b4bf97089fc1190fe51ed103c37","guid":"bfdfe7dc352907fc980b868725387e983cbdaeed8fa320797f798a16df769441"}],"guid":"bfdfe7dc352907fc980b868725387e9818465b2ba502c04f1534d97df9e34078","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9858de0802fd1ee497f3600e1d76560125"}],"guid":"bfdfe7dc352907fc980b868725387e98e8750693a968a29e0dae5514917f209d","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e980d7dd864d5fd71579d6bbf547028ddb7","targetReference":"bfdfe7dc352907fc980b868725387e980e0d42b02f67da84628f3c3fd30ed4e0"}],"guid":"bfdfe7dc352907fc980b868725387e984cc8312ad282bea996f89b03ebb9e54b","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e980e0d42b02f67da84628f3c3fd30ed4e0","name":"quick_actions_ios-quick_actions_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e986a7f857d9699ce0307f844d6d31566d3","name":"quick_actions_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e984bdb4c1ab53354bc3b2bb59c59fb1dee","name":"quick_actions_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6a019aebe92f33ef6d2d1a27354a274c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6a019aebe92f33ef6d2d1a27354a274c-json new file mode 100644 index 00000000..aff82f0d --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6a019aebe92f33ef6d2d1a27354a274c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9870bacfaf6cde3d89a76fe4e932cc6788","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesObjC","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBLPromises","INFOPLIST_FILE":"Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FBLPromises_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9882ebcc116e276dd1ad989affb5d3ef7d","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9889d254ad5933689bf555dbc41d2fcf23","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesObjC","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBLPromises","INFOPLIST_FILE":"Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"FBLPromises_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98a64357190e6edd0c5e9f3bc22405e92b","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9889d254ad5933689bf555dbc41d2fcf23","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/PromisesObjC","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBLPromises","INFOPLIST_FILE":"Target Support Files/PromisesObjC/ResourceBundle-FBLPromises_Privacy-PromisesObjC-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"FBLPromises_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98ca432576fa85e32767419ce24b77c0b5","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e982e1918b7fa2b325146a97b034178e3e4","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98350677b5e933aa74a8e8a098f02cd745","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e988bb932e6bd0db8acade7ecd6b9275b8e","guid":"bfdfe7dc352907fc980b868725387e985285bd47a6b213d36b9324a2d71708fe"}],"guid":"bfdfe7dc352907fc980b868725387e98c859ec5b9321d011b44b2c81b6796274","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98ad53226b339581a6725de188f2c8f823","name":"PromisesObjC-FBLPromises_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9867729fb6a85d4c069a179d51db31501d","name":"FBLPromises_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6fb30a1c5b3e857d561640581873eb18-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6fb30a1c5b3e857d561640581873eb18-json new file mode 100644 index 00000000..be242c11 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6fb30a1c5b3e857d561640581873eb18-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981144f00ce89ffa4e0260914a9ffec527","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/mobile_scanner","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"mobile_scanner","INFOPLIST_FILE":"Target Support Files/mobile_scanner/ResourceBundle-mobile_scanner_privacy-mobile_scanner-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"mobile_scanner_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e987ca6d15dacb2edbffa5dfaba36c8868b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98227c1f919eedf604acd47c56a9ef7ec4","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/mobile_scanner","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"mobile_scanner","INFOPLIST_FILE":"Target Support Files/mobile_scanner/ResourceBundle-mobile_scanner_privacy-mobile_scanner-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"mobile_scanner_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98586a1fcadf5af13071122fe7ac9ac4c1","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98227c1f919eedf604acd47c56a9ef7ec4","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/mobile_scanner","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"mobile_scanner","INFOPLIST_FILE":"Target Support Files/mobile_scanner/ResourceBundle-mobile_scanner_privacy-mobile_scanner-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"mobile_scanner_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f5cfd45e056c288fb2742720c62bd5fb","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e985491ef18201883ef45ef3b9623bd22f4","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e984b2e91b156503ca4a3e6ffac1fa4543a","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9824acc442c11de2383c5d3273c1b19a5c","guid":"bfdfe7dc352907fc980b868725387e98b7681edcde5c8b9f962bdc2bda94cb21"}],"guid":"bfdfe7dc352907fc980b868725387e9830dba8368ebf33ceb8a49e7244f6fea7","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98e39aae0c91f0bdebfb6ac42304942a79","name":"mobile_scanner-mobile_scanner_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9810e5c44ed7d683e2ac7edeced31dad48","name":"mobile_scanner_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=754922e16fd2edb654ed183d0b9ffc4e-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=754922e16fd2edb654ed183d0b9ffc4e-json new file mode 100644 index 00000000..49e30564 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=754922e16fd2edb654ed183d0b9ffc4e-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98284ffc1eae91e8f4cf71938bb6a26644","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKPhotoGallery/DKPhotoGallery-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"DKPhotoGallery","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e984fd6bf126523546705e45c4b13b53426","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986051e77661008cd9b8c42c9db89a8f91","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKPhotoGallery/DKPhotoGallery-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery.modulemap","PRODUCT_MODULE_NAME":"DKPhotoGallery","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98bf41a5be85b93608223ddc3a12714907","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986051e77661008cd9b8c42c9db89a8f91","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKPhotoGallery/DKPhotoGallery-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKPhotoGallery/DKPhotoGallery.modulemap","PRODUCT_MODULE_NAME":"DKPhotoGallery","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981525d6ed0a0c85267c380434fa96d27e","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e983e0ca2b7d01325e2be94eb703cc8834c","guid":"bfdfe7dc352907fc980b868725387e98254a304f0731e11cd0b343a2e31c86e6","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98709232bd94ed46c6c4b58658236d688a","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98eb71b1871db14bddb34f3b6dc48f5d95","guid":"bfdfe7dc352907fc980b868725387e98f5c96206d6338c4051d09964c3cf3573"},{"fileReference":"bfdfe7dc352907fc980b868725387e983ba539f64005bde8f3a4c989c13457f6","guid":"bfdfe7dc352907fc980b868725387e986b5aa154a8d2690ce44988e33482854f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dfa1e27846c545f78585767f808c0290","guid":"bfdfe7dc352907fc980b868725387e98c68fe379778449f0e16a1d133a264b26"},{"fileReference":"bfdfe7dc352907fc980b868725387e98925864836a0b949ba0125aac269b941d","guid":"bfdfe7dc352907fc980b868725387e98045cb616019948d44191e02a240f9d20"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eb4d56e39dcd3c8f709fb6323e177298","guid":"bfdfe7dc352907fc980b868725387e987a953dce127f9840d8a2cc412860d83b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed6773dc19e610851f0ce6e641b9b3b5","guid":"bfdfe7dc352907fc980b868725387e98f89269599fe4f19e606eb4070445e7b2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df24cc6698371aecc8afd7cf313cac20","guid":"bfdfe7dc352907fc980b868725387e98da6500675b040e6775d540a5bab5b572"},{"fileReference":"bfdfe7dc352907fc980b868725387e987ad73074b99776b1116f9c2856ac5552","guid":"bfdfe7dc352907fc980b868725387e9897bae1dd898b05af1463d3ecdcecda41"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d0cc75a3c72b5f298ace8a3bf41f9195","guid":"bfdfe7dc352907fc980b868725387e989d2f32864c657dc26cf10d670249fc3d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9828fefd0d3317647420ee3f37c82ec4a2","guid":"bfdfe7dc352907fc980b868725387e989fe1d7170122f47051812ad8c6ae3792"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e4d9272c60986ce5118264cb92283548","guid":"bfdfe7dc352907fc980b868725387e98fd32b6f93e55ad512c42cb46ac4b8872"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cb2b24e4cd6fc396c5a1d3e43868d95f","guid":"bfdfe7dc352907fc980b868725387e986da18817b4c71943d2f5c337ff100c33"},{"fileReference":"bfdfe7dc352907fc980b868725387e9843f4159faf9603bb660cb95efdf095b3","guid":"bfdfe7dc352907fc980b868725387e98492d33fafbc9f57438c4e02e2ec12609"},{"fileReference":"bfdfe7dc352907fc980b868725387e98932cc722dd747e8adbcbd5e18fd5fb02","guid":"bfdfe7dc352907fc980b868725387e98f8bad23065486a2dbda0de79b44eec75"},{"fileReference":"bfdfe7dc352907fc980b868725387e9828fa2d719018a25fe1fb3c6ebb4ff951","guid":"bfdfe7dc352907fc980b868725387e9814d586ebcc0539670dfd5cd996c94e82"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f64f20afd463bd999a742dc203b790bd","guid":"bfdfe7dc352907fc980b868725387e986346068c5a447a992edad6b75316c457"},{"fileReference":"bfdfe7dc352907fc980b868725387e98358107a82ec5ef5b395911951930fb60","guid":"bfdfe7dc352907fc980b868725387e98fef1c2ef12d6b0bded24819fc7c58472"},{"fileReference":"bfdfe7dc352907fc980b868725387e983e59331f8189f5e055881857d7ab4a95","guid":"bfdfe7dc352907fc980b868725387e98bab5ddbc05356a069f4e470f8aea8b87"},{"fileReference":"bfdfe7dc352907fc980b868725387e9827f7ef5f3ea80d79b40d7a4ac9588235","guid":"bfdfe7dc352907fc980b868725387e9863ca86f5b503ceb7a5d87db111cc8f04"},{"fileReference":"bfdfe7dc352907fc980b868725387e9894ebedd554142c9762ffe051143f601a","guid":"bfdfe7dc352907fc980b868725387e983ce7d35149cc5facd0473b4712cbce3f"},{"fileReference":"bfdfe7dc352907fc980b868725387e9824f019a6799511e6df48ed4fa1051373","guid":"bfdfe7dc352907fc980b868725387e98b5497ac3958c22a65eb3c86f1daf3fe0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b77caf2d5e3738f780e1b59e29eabe0d","guid":"bfdfe7dc352907fc980b868725387e98477ed162930cec3b912fe544897ef035"},{"fileReference":"bfdfe7dc352907fc980b868725387e9857c00b0d4565e7a6a12ffd669506d74d","guid":"bfdfe7dc352907fc980b868725387e9841d0ed0efea975401d3aa5d9f530fbd8"},{"fileReference":"bfdfe7dc352907fc980b868725387e9817c7f07dc865de8893a20abc3a232f83","guid":"bfdfe7dc352907fc980b868725387e98cc18f173b7113016f909093cbc63bb7c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bd8325023686436108c1116ee7b5d7bd","guid":"bfdfe7dc352907fc980b868725387e9843453298d4b03bcad3fd4528b637e570"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fef5a0935c29cb454c05b9981615539b","guid":"bfdfe7dc352907fc980b868725387e9848c45ef7d2c19e76feb9865d577cb26a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98941a4bd773c66feec3ba05f2f39973b3","guid":"bfdfe7dc352907fc980b868725387e987bca317c79609fa305f2dc1e4cff2575"}],"guid":"bfdfe7dc352907fc980b868725387e985c13f2a4c25a19bba6101babaa9a3d78","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d6bdeaa5b175cb64de0845531dd3a07a","guid":"bfdfe7dc352907fc980b868725387e98c7eb66961acafb59eeb4d5a894b9fd14"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f85abfcd8b98daa4c08612ae63641e69","guid":"bfdfe7dc352907fc980b868725387e983046d4487d4cc63c3334c3401796094a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98a20d7047c4deac86c262af51bb186b9a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fc74d0fed09821b42c8c83fca08fddb2","guid":"bfdfe7dc352907fc980b868725387e98b1f0cd87cbcf90ebbbc03aa9fe580f15"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f2f44ab0d0f0ce315b53d31757eb8db6","guid":"bfdfe7dc352907fc980b868725387e98b0c99aca0a4ba07d16552dce7e0a54e5"}],"guid":"bfdfe7dc352907fc980b868725387e984237cf79a5e3b2c3c7fca87430ca3d79","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e984cefd7a780b84a7e881deeedb07b972f","targetReference":"bfdfe7dc352907fc980b868725387e98d3f65728b12dd217475d1283ee417937"}],"guid":"bfdfe7dc352907fc980b868725387e98fafe09780663380b2b1c80d8ed698c4f","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98d3f65728b12dd217475d1283ee417937","name":"DKPhotoGallery-DKPhotoGallery"},{"guid":"bfdfe7dc352907fc980b868725387e98c46180aea4e87057640961e6db37df0d","name":"SDWebImage"},{"guid":"bfdfe7dc352907fc980b868725387e9872eabefc63c14dfe52fb0c95ad90294e","name":"SwiftyGif"}],"guid":"bfdfe7dc352907fc980b868725387e989d0a1858a86fd6e6731ed20f88a1e515","name":"DKPhotoGallery","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e986e90c628ccd44af657bee5ff4af2f692","name":"DKPhotoGallery.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=76c81320e671cd52e5aa73c6af313230-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=76c81320e671cd52e5aa73c6af313230-json new file mode 100644 index 00000000..3db9f338 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=76c81320e671cd52e5aa73c6af313230-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e82dd82aa81c61839879590f112b6e6d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseAuthInterop","PRODUCT_NAME":"FirebaseAuthInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e988e78bf6e1454790ad3bd16d1b518e416","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981506eb316e3225b6c1cb84ca6348d18b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop.modulemap","PRODUCT_MODULE_NAME":"FirebaseAuthInterop","PRODUCT_NAME":"FirebaseAuthInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e988b946df69e4bdc33893dcb75ee5f8d14","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981506eb316e3225b6c1cb84ca6348d18b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseAuthInterop/FirebaseAuthInterop.modulemap","PRODUCT_MODULE_NAME":"FirebaseAuthInterop","PRODUCT_NAME":"FirebaseAuthInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9877422654943191a245992fa9a4b2231c","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c1695f36a2224a2b1d7774e6d77eee60","guid":"bfdfe7dc352907fc980b868725387e98edcd65abd7ddb2fe99bb5a5e1f193eaa","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b2956b9f464800c9411916e4fbb27729","guid":"bfdfe7dc352907fc980b868725387e9814cc125ce9f97f3e7d283e741a8dfac2","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98bfcd54bbc5c233c64cac055827da59cb","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e985df5bc504ec3263f252a622a8dde0a2c","guid":"bfdfe7dc352907fc980b868725387e98d1cbcc26dc1085cbeb87b4a20df3035e"},{"fileReference":"bfdfe7dc352907fc980b868725387e989fcb859732612135cbcb3779e0ded359","guid":"bfdfe7dc352907fc980b868725387e9826584bd9c0309291f44cc573a711d6ac"}],"guid":"bfdfe7dc352907fc980b868725387e980ae1ebc5a01f5d4de3e3fa4d87b1039b","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9827a93cd0d450b6fd2c612ac23ec5306d"}],"guid":"bfdfe7dc352907fc980b868725387e9817a9666a9a48ad1066eb299a4eb4bbf8","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98eba1f1dccfb9faec6cb1f1617e6d5356","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e988e935c81efc4686179f554b8fe37864a","name":"FirebaseAuthInterop","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98d45aaf0c2408f87c98fda98709cee1e1","name":"FirebaseAuthInterop.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7aa8351d9b24919942e9946725aa9a4e-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7aa8351d9b24919942e9946725aa9a4e-json new file mode 100644 index 00000000..ffae708f --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7aa8351d9b24919942e9946725aa9a4e-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bbdee8c1686e5d6c3f4956eedcdb3dac","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseAuth","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseAuth","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/ResourceBundle-FirebaseAuth_Privacy-FirebaseAuth-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FirebaseAuth_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98a14bfd822970e627264b2c4710e53f92","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9824122a566c18888ab83e78b3078e6f80","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseAuth","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseAuth","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/ResourceBundle-FirebaseAuth_Privacy-FirebaseAuth-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseAuth_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e982d04abd2177b79716ef450658cf051e4","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9824122a566c18888ab83e78b3078e6f80","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseAuth","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseAuth","INFOPLIST_FILE":"Target Support Files/FirebaseAuth/ResourceBundle-FirebaseAuth_Privacy-FirebaseAuth-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseAuth_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f90e3c8130f9fc37aade41073aede449","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9829107bc009e2e275a01cbdf55e52b1f4","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e987db8c92d8826979e8ed77d200b8293f9","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e983b9007b1d0935aee2ec307ea04061f0e","guid":"bfdfe7dc352907fc980b868725387e98b0b2221c18cfddd4899a12e6ad61f990"}],"guid":"bfdfe7dc352907fc980b868725387e982e8fd7abebd050f9528a84ecd19ef3ed","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98205354208adeebae46380f8f82956de4","name":"FirebaseAuth-FirebaseAuth_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9870db214ed2dafc4df91a7caff7044acf","name":"FirebaseAuth_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7b3186407410bb111b40b5143ff956ed-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7b3186407410bb111b40b5143ff956ed-json new file mode 100644 index 00000000..1b289dee --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7b3186407410bb111b40b5143ff956ed-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9858f3b516df641443530da1bc57fe9cb2","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SwiftyGif/SwiftyGif-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SwiftyGif/SwiftyGif-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SwiftyGif/SwiftyGif.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"SwiftyGif","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e983f3111e043ea26aa3178412b70517277","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ee297b6d0e4054f62dc3e42830b40034","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SwiftyGif/SwiftyGif-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SwiftyGif/SwiftyGif-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SwiftyGif/SwiftyGif.modulemap","PRODUCT_MODULE_NAME":"SwiftyGif","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98627c449aba205ad63a83e23ad4ef185f","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ee297b6d0e4054f62dc3e42830b40034","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SwiftyGif/SwiftyGif-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SwiftyGif/SwiftyGif-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SwiftyGif/SwiftyGif.modulemap","PRODUCT_MODULE_NAME":"SwiftyGif","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a47389569eb28721728af443ffa36eed","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98289a02129447d57ed9106425e09cb6a0","guid":"bfdfe7dc352907fc980b868725387e989b9f46d8beacddaab23bd9fa751bb635","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98720d63afa192c3198e49d0e658ad9559","guid":"bfdfe7dc352907fc980b868725387e980711b42e827d9408219256054495b663","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e984796310a5317db7ef36beaf9b5c29ea1","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98e40e39827e8180631013036cb2dfa2fa","guid":"bfdfe7dc352907fc980b868725387e988308d65fcc5e4e958401a8e6d8f8c90f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98319254f7e2beed7375a445c04910195a","guid":"bfdfe7dc352907fc980b868725387e981349c2a0e0d700d9622a8b64a33f2376"},{"fileReference":"bfdfe7dc352907fc980b868725387e98721903f80f4a8564791b330bfd01951f","guid":"bfdfe7dc352907fc980b868725387e985e8862810d6c1e2ad10cf663d8c38acc"},{"fileReference":"bfdfe7dc352907fc980b868725387e9887989963270204aae9475498243cfbd6","guid":"bfdfe7dc352907fc980b868725387e9859ddb80f1a7aeb6ac1b335b6f225e02e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ae29cbc96bfd2ba4fc42c1226f69b713","guid":"bfdfe7dc352907fc980b868725387e98d306c993c91c82994b15316db15d60be"},{"fileReference":"bfdfe7dc352907fc980b868725387e989b199724c96ff32700c5818e07f19a57","guid":"bfdfe7dc352907fc980b868725387e9895a30c2f9b82e52f4f040e01df5af362"},{"fileReference":"bfdfe7dc352907fc980b868725387e986d3515962c56f64e5bce62c72d467b1e","guid":"bfdfe7dc352907fc980b868725387e9857f9f3b715a2466faf714bebadf16ed1"}],"guid":"bfdfe7dc352907fc980b868725387e988b147d7eb8deeb283f405b46fb70a2d4","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9827a4938aeab00986eb99224e4238cff5"}],"guid":"bfdfe7dc352907fc980b868725387e982a93fbdcc586c06b58346e84f2cae7cb","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e980a2bb69532b6306fbb030179b8829f78","targetReference":"bfdfe7dc352907fc980b868725387e98f5cd644fc2aeb8654450a2168f52697c"}],"guid":"bfdfe7dc352907fc980b868725387e989216f0c1db333a0a85c11ef4e2ae154d","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98f5cd644fc2aeb8654450a2168f52697c","name":"SwiftyGif-SwiftyGif"}],"guid":"bfdfe7dc352907fc980b868725387e9872eabefc63c14dfe52fb0c95ad90294e","name":"SwiftyGif","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98290968646de0d07c6f6e2ed9e146ea78","name":"SwiftyGif.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7c10b1b705eef3cc27b008fa5df200ca-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7c10b1b705eef3cc27b008fa5df200ca-json new file mode 100644 index 00000000..785fb3a1 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7c10b1b705eef3cc27b008fa5df200ca-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98cb16e8074f48ba05a2dfeb081f5bd1cb","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCore/FirebaseCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCore/FirebaseCore.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseCore","PRODUCT_NAME":"FirebaseCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98adb9a804873f32b918931070a9c021a4","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9823bbf62c346537eed6e067e233fe0af3","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCore/FirebaseCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCore/FirebaseCore.modulemap","PRODUCT_MODULE_NAME":"FirebaseCore","PRODUCT_NAME":"FirebaseCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e986a27c2e3213c7ba4326eba04521f6949","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9823bbf62c346537eed6e067e233fe0af3","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCore/FirebaseCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCore/FirebaseCore.modulemap","PRODUCT_MODULE_NAME":"FirebaseCore","PRODUCT_NAME":"FirebaseCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9839deda820083d79cb0f34721f6e1479e","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98230955bf7f5b9e02cf80179f183ff7ce","guid":"bfdfe7dc352907fc980b868725387e980a5e9d3a7e8a318535f6b96541f3ef86"},{"fileReference":"bfdfe7dc352907fc980b868725387e981514e798aa63a0fd8e89ee17343dd566","guid":"bfdfe7dc352907fc980b868725387e98e9120ab602c2030955c26ab594c027a2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9815996f070a281d153a577e9dbcf3058d","guid":"bfdfe7dc352907fc980b868725387e9886e9da47164ce7dd0c76682671e81a87"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806c0b950b861c21b9963990ab43a4b89","guid":"bfdfe7dc352907fc980b868725387e988f2cf38e4ff6c633e65869314c8da0e3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b0744a7edc366118f880568d6132edfd","guid":"bfdfe7dc352907fc980b868725387e982bcd0904ef5ee32b36bb671a7e236f35"},{"fileReference":"bfdfe7dc352907fc980b868725387e989fee6d5e33b87739a2dab9f66760c17e","guid":"bfdfe7dc352907fc980b868725387e98b68792158dc073d58771ebf5bc7dd60b"},{"fileReference":"bfdfe7dc352907fc980b868725387e984403d97edc979cc08bfdbddd3f49003b","guid":"bfdfe7dc352907fc980b868725387e986fa5e4d81c4968082bf08cc76e47d73e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9803a1d9e7c7406ae5b4488a23e5256418","guid":"bfdfe7dc352907fc980b868725387e98b65c7c42b2da9ec77f202e2fe2fc68fd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cd384f769ff6a416ad0a47b308b7244f","guid":"bfdfe7dc352907fc980b868725387e985f979a76b7e626f8c64978b61666ebc2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9877aeed262da4294e7eba3e108465f228","guid":"bfdfe7dc352907fc980b868725387e989a461fe7d601c8c9fdff04007b593ded"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d768dfd7daa1bdb257ad2abc4e232fcd","guid":"bfdfe7dc352907fc980b868725387e984355e071039d0cd0629ba39ff728405b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98529e5f7bfff87cdbf13185e395700843","guid":"bfdfe7dc352907fc980b868725387e98d7b5769714255382e7311d6184fbd87e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fc76eb1628ab5a054f098490b4100f6d","guid":"bfdfe7dc352907fc980b868725387e981d4abcc64aa7c299df633f0a3c49aeef"},{"fileReference":"bfdfe7dc352907fc980b868725387e98800f413ba9d90bb10e7bab1cc8fbcfdb","guid":"bfdfe7dc352907fc980b868725387e983dab6922156c6445ab2cd6e6af27d715"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e2cf47785d0cb1b51d5ea1a97360174c","guid":"bfdfe7dc352907fc980b868725387e9815ae93f9a0c37b6a04f569b15bde9780"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a02d8ba298cf0862bbfc342c7074e5c7","guid":"bfdfe7dc352907fc980b868725387e9866844fddcbbc213133f8c373147e9057"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a71e555b3b552897cbcd1316677dcec1","guid":"bfdfe7dc352907fc980b868725387e9887c2f3648714ecdb338460112a9dae44"},{"fileReference":"bfdfe7dc352907fc980b868725387e988b4329a5d76b29e87e729d9cd7ad93a1","guid":"bfdfe7dc352907fc980b868725387e980b3975b47dbede3460270116abcb0b9d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986ff10679afde8d4204e7c212e534130a","guid":"bfdfe7dc352907fc980b868725387e9881116547f84d95a211d0f5ec42c9f182","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989385cc843d99d2d634e9732484488b3f","guid":"bfdfe7dc352907fc980b868725387e9892d4656bcfb1809ce1e1fa26435c891c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d8d49f4b04a791b6f8b72a3cca1ee103","guid":"bfdfe7dc352907fc980b868725387e98a1af0bdb4c05cc4407359a1dd8964bac","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df0b9329b13401877770c564af2684fe","guid":"bfdfe7dc352907fc980b868725387e986dcfc58e302d9ad86d3a454263de87c4"},{"fileReference":"bfdfe7dc352907fc980b868725387e9881f4b7fbf5d308524566967a15d09dd2","guid":"bfdfe7dc352907fc980b868725387e98d536a2be531de6b5598532ecccfa1fd0","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98b942c37e63188b6762eafc92f5e8a248","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98ef90badd06be31069855a74a45016d0c","guid":"bfdfe7dc352907fc980b868725387e98c893b5a970679e394189542ba2cdd959"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed3eb3365ff3413002b88f88bb14f070","guid":"bfdfe7dc352907fc980b868725387e98bce9cb6471eea7a0867a9ea1b0cedded"},{"fileReference":"bfdfe7dc352907fc980b868725387e983928e1bb746c4dce582f3973204c6c1b","guid":"bfdfe7dc352907fc980b868725387e9830210ac41298b4fd0aa63ab86c3566ae"},{"fileReference":"bfdfe7dc352907fc980b868725387e988ed37762246bec784742e59fb1ae1dd0","guid":"bfdfe7dc352907fc980b868725387e98afb10dd8abefc4b3a99181d57a59397c"},{"fileReference":"bfdfe7dc352907fc980b868725387e9819eb20fe822d32fe59693bb1af07e918","guid":"bfdfe7dc352907fc980b868725387e9859ccf16b93a3eb9240e78ef58fede6b3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b679246350869a9d1e1a3c06b9d5ac2f","guid":"bfdfe7dc352907fc980b868725387e98b7a4dcd48e321156aaf9a063a35ed91a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b27bfcc87c6667390e6665cf5ed38907","guid":"bfdfe7dc352907fc980b868725387e98127ea78b073e30e1cc3849651f9cbbb8"},{"fileReference":"bfdfe7dc352907fc980b868725387e988860c8b4c7c5a5dae715e8cfb65d591d","guid":"bfdfe7dc352907fc980b868725387e980f6add2dc3dc9ca29aef8f21d1d36419"},{"fileReference":"bfdfe7dc352907fc980b868725387e98775c657f07790427fa1301264717a9fe","guid":"bfdfe7dc352907fc980b868725387e98369779d03515b71b4e7ee2034a7f720d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98981d973aa283cf55e0471a3517765b33","guid":"bfdfe7dc352907fc980b868725387e982341ee40e5e7992d19c5c9014c90bd90"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c004405cc6612ddabb4037b1f909c521","guid":"bfdfe7dc352907fc980b868725387e9882e89c21be85d604d79a1137e6fea805"},{"fileReference":"bfdfe7dc352907fc980b868725387e9892656d0ae210c7efada3c7523ed4ae30","guid":"bfdfe7dc352907fc980b868725387e98fbf03a4f43926c45bf2db681d05df4d5"},{"fileReference":"bfdfe7dc352907fc980b868725387e981811e086c8b8e9b086cc158fbccd9d11","guid":"bfdfe7dc352907fc980b868725387e9895edbd674a0232a482e803cbf22cb328"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fad9bf08165943a9291593d38681f1a9","guid":"bfdfe7dc352907fc980b868725387e98afe1be4dcf4d2d5d2d186cfc545f6a12"}],"guid":"bfdfe7dc352907fc980b868725387e98d55db32e4b311fcd071bfa27f7418373","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e980490b9c7c8e60e025c2f7660628079be"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f2f44ab0d0f0ce315b53d31757eb8db6","guid":"bfdfe7dc352907fc980b868725387e98e5e59c5657f75c0a4185d7fe6602b72b"}],"guid":"bfdfe7dc352907fc980b868725387e9832b44f6b04e6c3a2ee78dc526ae378d3","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9802a5617521cbb1c5fb68f702b53128c8","targetReference":"bfdfe7dc352907fc980b868725387e98678fb6500ea02c78520816441717cc14"}],"guid":"bfdfe7dc352907fc980b868725387e9873f028001a1e9a6ea9c379b9a7ecac18","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98678fb6500ea02c78520816441717cc14","name":"FirebaseCore-FirebaseCore_Privacy"},{"guid":"bfdfe7dc352907fc980b868725387e98020791fd2e7b7ddc8fb2658339c42e16","name":"FirebaseCoreInternal"},{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"}],"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e988ae261e418baab0fdd0a48d117fe7fa2","name":"FirebaseCore.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7dc9dce1405849bf477070cc9de38aed-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7dc9dce1405849bf477070cc9de38aed-json new file mode 100644 index 00000000..704e8a32 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7dc9dce1405849bf477070cc9de38aed-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ae2b6e690d9c19a64378428b59f82e0b","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","ONLY_ACTIVE_ARCH":"NO","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2"},"guid":"bfdfe7dc352907fc980b868725387e9853420f14dcd3baca88f8c1d2c878a21e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bf594d3cbb3ba4c66c475a7d56edf012","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e98fe7939ea7314b719a07f2aa5cd2b3f29","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bf594d3cbb3ba4c66c475a7d56edf012","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e985a4bc39331b3d5f41286a148126691b0","name":"Release"}],"buildPhases":[{"alwaysOutOfDate":"false","alwaysRunForInstallHdrs":"false","buildFiles":[],"emitEnvironment":"false","guid":"bfdfe7dc352907fc980b868725387e98d1df1c8cb84b2ce4f3bda8fbd272b60c","inputFileListPaths":["${PODS_ROOT}/Target Support Files/FBAudienceNetwork/FBAudienceNetwork-xcframeworks-input-files.xcfilelist"],"inputFilePaths":[],"name":"[CP] Copy XCFrameworks","originalObjectID":"67E2A87AFF1FE8DC89D4ADAE34ECB1D3","outputFileListPaths":["${PODS_ROOT}/Target Support Files/FBAudienceNetwork/FBAudienceNetwork-xcframeworks-output-files.xcfilelist"],"outputFilePaths":[],"sandboxingOverride":"basedOnBuildSetting","scriptContents":"\"${PODS_ROOT}/Target Support Files/FBAudienceNetwork/FBAudienceNetwork-xcframeworks.sh\"\n","shellPath":"/bin/sh","type":"com.apple.buildphase.shell-script"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e988a4e25c3b6648d4c88499e02f77b811a","name":"FBAudienceNetwork-FBAudienceNetwork"}],"guid":"bfdfe7dc352907fc980b868725387e98c16926158ef45fa2ac81bd3203fcd49e","name":"FBAudienceNetwork","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Release","provisioningStyle":0}],"type":"aggregate"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8078b8651d861575cd929af1542b7261-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8078b8651d861575cd929af1542b7261-json new file mode 100644 index 00000000..3462043b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8078b8651d861575cd929af1542b7261-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98478e27dfe1d9ad49d28fafd65b85bf34","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GTMSessionFetcher","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GTMSessionFetcher","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/ResourceBundle-GTMSessionFetcher_Core_Privacy-GTMSessionFetcher-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"GTMSessionFetcher_Core_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98d135475422ea3f2893be75f00ba182cc","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980d155ae95de828a9ae777ff4d23d3419","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GTMSessionFetcher","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GTMSessionFetcher","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/ResourceBundle-GTMSessionFetcher_Core_Privacy-GTMSessionFetcher-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"GTMSessionFetcher_Core_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9860736abcff98db5f6b23666aa9dd6f67","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980d155ae95de828a9ae777ff4d23d3419","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GTMSessionFetcher","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GTMSessionFetcher","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/ResourceBundle-GTMSessionFetcher_Core_Privacy-GTMSessionFetcher-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"GTMSessionFetcher_Core_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98b6d338774a9da5f2e8bb1222feb32ce8","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e983c76c9f47a19a00b393bb2129a5e29f1","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ae858fe9482d27c2265431c1481c1825","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98159e7e7e4b98dfa70678e12155a8ed77","guid":"bfdfe7dc352907fc980b868725387e98b5bc51d377c8ea34ecda3d6aef50db1f"}],"guid":"bfdfe7dc352907fc980b868725387e9861c8e5e5c7b3e6c2ad1bdccf88c1da14","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9801af34ddea6be97d757786022edb34b1","name":"GTMSessionFetcher-GTMSessionFetcher_Core_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e984eb2bec9e96ca1b7af92c0697fc4108d","name":"GTMSessionFetcher_Core_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8d133a19301914cd8e6a4b60878e87a2-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8d133a19301914cd8e6a4b60878e87a2-json new file mode 100644 index 00000000..8c788560 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8d133a19301914cd8e6a4b60878e87a2-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98853911a66086d603dff7e7f648c6248b","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SDWebImage/SDWebImage-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SDWebImage/SDWebImage-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SDWebImage/SDWebImage.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"SDWebImage","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9804ab009110722b2b905053f7534d5b27","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98924a369cb6c964ba34275d7ca3bc2dda","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SDWebImage/SDWebImage-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SDWebImage/SDWebImage-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SDWebImage/SDWebImage.modulemap","PRODUCT_MODULE_NAME":"SDWebImage","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9850945e18525a3e598d9724f3a764903b","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98924a369cb6c964ba34275d7ca3bc2dda","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/SDWebImage/SDWebImage-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/SDWebImage/SDWebImage-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/SDWebImage/SDWebImage.modulemap","PRODUCT_MODULE_NAME":"SDWebImage","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a2b2e17c2efa1ef1a3aad2d39ddc8c14","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d5777166096230085837e5a6300319ad","guid":"bfdfe7dc352907fc980b868725387e98be9d7442fabca0c5610c0e19f86557d8","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e988cb0cdc02aa29fb804ef97672630b130","guid":"bfdfe7dc352907fc980b868725387e9806822004988a9d94cdf5a031c3425eff","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c822fa9c81a63d01137ef8b8fb09fb10","guid":"bfdfe7dc352907fc980b868725387e9805483cca822ae5c51d8ecad7e0c6ee8e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bef996f30e7cd8f81a41b150807d2a9d","guid":"bfdfe7dc352907fc980b868725387e981cce13f27d92cb91bd22a8865967993e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984094c7d883e6e69778784d589b0e06ff","guid":"bfdfe7dc352907fc980b868725387e98dc8bf6e5b244b736902e5d7fdcb3fe46","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983a316a9a3c0d0918d8038d51d1ce2a7b","guid":"bfdfe7dc352907fc980b868725387e98f60172e0fc601f0759de2e4483ad4c2f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981d5092826a9dbc8d0808fdcaa23aeb53","guid":"bfdfe7dc352907fc980b868725387e98de8d41f98f23e938e10d164952b69161","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e04128ff9b1a8ec5bb663090da8e9106","guid":"bfdfe7dc352907fc980b868725387e9891da59dfc2bae9f1127526dede51aef7","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983d94e2a4234b8e8df332860ab5c28460","guid":"bfdfe7dc352907fc980b868725387e9876af0a8c3f791f81730d69311ecf4ac2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981ee2ea2c0f3451ad81e4cd37571a9217","guid":"bfdfe7dc352907fc980b868725387e987122e1eb2469403d73d6e6fdf9334bd7","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c36ed33a6b70955a1fe117c31119455","guid":"bfdfe7dc352907fc980b868725387e98df09c2f87106b2f16d240eaa625dd401","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98705e37d167e6aa4fe5e7a89434983b0b","guid":"bfdfe7dc352907fc980b868725387e989e62241bc5594eb88a2fc802878c4c8e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ad42019143a452170ac8f0ccbe351bec","guid":"bfdfe7dc352907fc980b868725387e98dfe3b8184bcd5ea582b7612cc39cab16","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98855529e142431b9ff21b7623dc2343aa","guid":"bfdfe7dc352907fc980b868725387e98c38562671af29e34109b636e4c2bc8c2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d9d549ee09361b3182ffb3a7cb2c4f16","guid":"bfdfe7dc352907fc980b868725387e98f9c7a1b2f9800346014d927b510690a2","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e9831d5facff92bfe7ff1b1f885cc66a0ef","guid":"bfdfe7dc352907fc980b868725387e98c017bf1f77ac811959d719e5355fe22f","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b10e1dc2d838c45be2daa77f2da23187","guid":"bfdfe7dc352907fc980b868725387e9884623cc67a02a4442ca230549e12677c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ccbf3bd085b02b578987707f8792f7b3","guid":"bfdfe7dc352907fc980b868725387e9874254a68205e6ae0940472b5f4cc1f1f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e987c0adab35058c318538f4dc83454ce4e","guid":"bfdfe7dc352907fc980b868725387e9874be0ea45a0fef5220b10df35f5a4e16","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e987a842fd7d0d8113b0e4b745df45548eb","guid":"bfdfe7dc352907fc980b868725387e981a5aa3dffda15cfd122f3603c0f97605","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98590daa9c16ed56ce3ab6dd2cc5e71b02","guid":"bfdfe7dc352907fc980b868725387e98a0e073cc5665e6a7e421d1843981e83c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e0f1d1916f1c2c74d3580b1a8beadbc9","guid":"bfdfe7dc352907fc980b868725387e98af44b2f9052fb0d1dfc37b269ca0fa77","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f9e678ebe42d48ec13e555aada3bc3d9","guid":"bfdfe7dc352907fc980b868725387e980b0eda782fee2d98b4b81a23fbe7efa3","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988da911fe8274c9c625d56ca791baefb0","guid":"bfdfe7dc352907fc980b868725387e98c3fb1f4808021579665b4874f84a68db","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98523fb53a069b36128e18dd0e59218348","guid":"bfdfe7dc352907fc980b868725387e985b4c86a9f12a1d3c662250b6957b4b27","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e9838cb0d098103b3b9e86956ad87b22b2d","guid":"bfdfe7dc352907fc980b868725387e98e9aa5ae1c792bfb6263364607e397da8","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e088deb5da5e6541c7b77e9a11ea92c4","guid":"bfdfe7dc352907fc980b868725387e98cc56f5b1a61aa6f4ef114c1176dd56b7","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c0a8f0a8b8deec84cfa655fb07cfa5ee","guid":"bfdfe7dc352907fc980b868725387e98066db1e3aec6fa53f2a129cf2c1c59ca","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d86fa74c86e4b192ae203192c4ecbf7","guid":"bfdfe7dc352907fc980b868725387e98b96a0a2277207c5da89fbd278c1097c9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98be1b86c55734f717d0ca31fec781de9d","guid":"bfdfe7dc352907fc980b868725387e985b66920edfbc14563b18ec5a84aeb6ad","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852dc3cd416a8f2168164e78857457a58","guid":"bfdfe7dc352907fc980b868725387e98ff9bd9e364901a2d70fe987eec778b55","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a7717b19769aeb6b9ee109e003eaf3c5","guid":"bfdfe7dc352907fc980b868725387e98fcee8ffe2f419640bb36348b96bdb2eb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b054f24c9d53f55652ce125ed0820b32","guid":"bfdfe7dc352907fc980b868725387e9846a78de9204357d2f4575bd674172a16","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9876f5fe642db8bd371f16f87ea2265fdd","guid":"bfdfe7dc352907fc980b868725387e98460c93cd92bf02885c25b97f1382dce0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98736d5194c32aab23367381e19d3ce3fd","guid":"bfdfe7dc352907fc980b868725387e986efac4fc90f2f5e5c5ccd60f96ce4f42","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e27502a34cf0d8b4655a10b7a907244d","guid":"bfdfe7dc352907fc980b868725387e98f418b61136bdb1cc3303b2d099c7a44f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b5bfcc15d82c4bdb3694c0a573f3a82c","guid":"bfdfe7dc352907fc980b868725387e98087569cf16207aeedc8a7f7377c3af4e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9854d83c03faf3ccae2f85ebc06d3edfd7","guid":"bfdfe7dc352907fc980b868725387e9860237b0e354ca5142f37cfa7a8b5a86d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9818cbd8a1594265b40676b393a478ca19","guid":"bfdfe7dc352907fc980b868725387e988a46edc810b5a4662db5081a9c0ee458","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988ce6991ade90f9118664f77be651e9e7","guid":"bfdfe7dc352907fc980b868725387e98de781a9874aa41c31af5fca3fc7bb5fa","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98615e5afab5c4b60f4f54bf4a24d5d7f4","guid":"bfdfe7dc352907fc980b868725387e982d7d60860edde1f1ac6d45d7407bac10","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a1e40288f11809e02afe6d0add4ed3bc","guid":"bfdfe7dc352907fc980b868725387e98904324030717a3677b3dd7c2e1faf9fc","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f3090cb74fc1105440000f3b094dac06","guid":"bfdfe7dc352907fc980b868725387e98c820e21223e4828e57e7815e3523f022","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a45a60f2cf9e6b4362fdb5d961d3730","guid":"bfdfe7dc352907fc980b868725387e9894e7a3d8a5335fc427ab13717a194aff","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988e30be8bf3d4fd0d6c23a4784a17b51a","guid":"bfdfe7dc352907fc980b868725387e98b7a01124350b9ea34738e95b4ce8af70","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98645f30d4b737a9944563bf1acbd19e86","guid":"bfdfe7dc352907fc980b868725387e98eb06d9479a51925ce47c68daaf2957ed","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d6c2872630ef832dce2de99d07b9a55","guid":"bfdfe7dc352907fc980b868725387e980fd12822e9d1e0877948cf7799b966b9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98843243bab3fa1f3d33a82459406db798","guid":"bfdfe7dc352907fc980b868725387e98585b124df1cc1f4051b35d6daa470f3c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b3d9d1eff24b478076662e7793cc0f81","guid":"bfdfe7dc352907fc980b868725387e981db3c8f9bed6bda92ae00cb39db6a867","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852467a5c652bd848d515dcaabfba92be","guid":"bfdfe7dc352907fc980b868725387e986e4769e06b3e857ae5f48a0f60e9c06f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981c37503503856f7bb1bf94b84df33811","guid":"bfdfe7dc352907fc980b868725387e98b534fb3d206dc29359ee937ef0727d6a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98566b09412f1c142b2d2182d03c2a7c53","guid":"bfdfe7dc352907fc980b868725387e986df8602d589635ca94a013b1042a734f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ba6dde7dbf6bb8b5d90dd818665d1c99","guid":"bfdfe7dc352907fc980b868725387e9852f31a3f0ebcfc2f0539717219b7715c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d2287b1d56a60c6eccdf938b9aa947fd","guid":"bfdfe7dc352907fc980b868725387e983ea4b17ddea76c4cc7aae96b6c45393b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985db8e4d10c219b6975cdd62ddf92d0aa","guid":"bfdfe7dc352907fc980b868725387e98bf8c1603289ef53ae2aedee48261bea5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a20f21b83c952074caf5d18873e86258","guid":"bfdfe7dc352907fc980b868725387e982af44a49e3bae506655b33344ffee8f4","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980db9b1158e6646728005aa55be435f85","guid":"bfdfe7dc352907fc980b868725387e98054b65a43291bbaacf303162bbfd92fa","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d48abcca92cf18856278d322cd682f4c","guid":"bfdfe7dc352907fc980b868725387e98f26c041e8dade3c16e1175f056b1c15f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983f4f10857c92a9d96bc0bf380825345b","guid":"bfdfe7dc352907fc980b868725387e98077988835ec4ef25e7c8abd8f60bcdbb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9826c93ac59a6de6260adf7777d48a8e6b","guid":"bfdfe7dc352907fc980b868725387e98d47ce03e9cb07222aa390d49199f55d0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985628e9529c81661cd2bf059df123f941","guid":"bfdfe7dc352907fc980b868725387e98fc88a27c1d4ed8c2fb3abcce664279d7","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985c307f6e0adf9012f1be72c3d0497a21","guid":"bfdfe7dc352907fc980b868725387e9852ac4f788d7a93a51c0fd6dab80ea1a2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984b1e3ffd1fb39dc94affca31b4e27b9e","guid":"bfdfe7dc352907fc980b868725387e98f55afdf13acbb6ed2cab2dff9cebb426","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e988fc042ecdc017c735af204f8c0612394","guid":"bfdfe7dc352907fc980b868725387e98e51b44847f216e4a23d48736d09eec70","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d80e8bd3db060dde5d194ccc462db4de","guid":"bfdfe7dc352907fc980b868725387e988db215393f4d62131be648eb5f6213a5","headerVisibility":"private"},{"fileReference":"bfdfe7dc352907fc980b868725387e982c7dbddc604a244196428b8fc46f5cac","guid":"bfdfe7dc352907fc980b868725387e98f21a3590fa1c973df60ca6d8b8e71349","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984f21f0eb8f4805c253e862eb24369362","guid":"bfdfe7dc352907fc980b868725387e985363939cb1a02bee382b1eab43991cf7","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a364326f3629a82d35fe5e5601a7cfec","guid":"bfdfe7dc352907fc980b868725387e984badd00e17696ccbed4916f8623042e2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eab3c5f10863c41bce28b75442dcfb0f","guid":"bfdfe7dc352907fc980b868725387e980cc1ca988b39c7115e433dd7df35260b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988fe87f3480a506b882b7262afada35a2","guid":"bfdfe7dc352907fc980b868725387e98adfb02854714d6960be634572daef4ab","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d5f4296b72582a649e28a8d376925930","guid":"bfdfe7dc352907fc980b868725387e986da2af838e0c76932d26585940fd54b1","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98350b1090302f51cfb21e01d8415c7609","guid":"bfdfe7dc352907fc980b868725387e983ab1302293aa92f5e8660eae6502eed5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98099e64b0490c5209324be8367cf59b67","guid":"bfdfe7dc352907fc980b868725387e98b6ffb9afbc5ddff61acce0e33451fc1f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9853d9196d0b2578d8a09ef594daec2b10","guid":"bfdfe7dc352907fc980b868725387e9855b2e6bd42faa7e8be3cf3841fc6988a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98358c67ecbf86e16ee420fdc0f60209d6","guid":"bfdfe7dc352907fc980b868725387e98b075456f68b6677b57e3871f89b5e1f9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98338ff7df5b388b8cb6dc581ce584707b","guid":"bfdfe7dc352907fc980b868725387e985a16a27a1864896c01440e8503c648c3","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980f510685009abf4916684cac897048e9","guid":"bfdfe7dc352907fc980b868725387e98299615dd7fa3f5b6f91988e8d55df07f","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e985f8a059a79682c22f22bb94620c51efe","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e981927866bac5164139b4906c697c2ae1a","guid":"bfdfe7dc352907fc980b868725387e986916d2e11955e41f9d6bad4f4ac4d34f"},{"fileReference":"bfdfe7dc352907fc980b868725387e9879873ec62bf39c031f9405690a0f73c5","guid":"bfdfe7dc352907fc980b868725387e9883edc7385647da19cb842395bc6294e9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ee02f559016795b3a0d12920773904b0","guid":"bfdfe7dc352907fc980b868725387e988d125b3474ea3fa48ebaacd4b9aea72d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98054e5d375da8f4d58909b03284d2ffb5","guid":"bfdfe7dc352907fc980b868725387e9859c2b85e26aebbe1ce7d7ae5e2e524c7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e057edb06a9fb0ee234d2501e566c13c","guid":"bfdfe7dc352907fc980b868725387e98a64ea57d7c2c14526c605f86367674ac"},{"fileReference":"bfdfe7dc352907fc980b868725387e9864350921c8a3eb6e2717b3957fc629b0","guid":"bfdfe7dc352907fc980b868725387e98e5e42db04d1a74fd72168484d7fcd740"},{"fileReference":"bfdfe7dc352907fc980b868725387e985042bb443803b56b9c76461c6b782096","guid":"bfdfe7dc352907fc980b868725387e987a4c3e14d7e2e22018819db5667f8667"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d6b7c5fd8f27324b1d4b9b72d5246584","guid":"bfdfe7dc352907fc980b868725387e98786fa38fcd8028e45f4c518b6ef077ea"},{"fileReference":"bfdfe7dc352907fc980b868725387e9869d5460295efbc7dc43c12e14196373a","guid":"bfdfe7dc352907fc980b868725387e98d193abd26ca6f5fb0c0bf076b813df46"},{"fileReference":"bfdfe7dc352907fc980b868725387e98162b8fefd8d643427787492f1c51da3d","guid":"bfdfe7dc352907fc980b868725387e98747f3e0e165ef143fdb0215d27db29a5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ee7eac77a5571e1e9e215e3c5a54cd59","guid":"bfdfe7dc352907fc980b868725387e984a63b2811cda9db2e49cfd6c6a419eab"},{"fileReference":"bfdfe7dc352907fc980b868725387e988427fc8c610fd8f3e1bb219ece805796","guid":"bfdfe7dc352907fc980b868725387e98805dd9dbae97a21b7a27b957f9315ded"},{"fileReference":"bfdfe7dc352907fc980b868725387e98265fb41c11ac01db9fe94aa464810666","guid":"bfdfe7dc352907fc980b868725387e9824855676dc6a11a3d4913a3618724d6b"},{"fileReference":"bfdfe7dc352907fc980b868725387e985212637a8a891d9412516918621e1a39","guid":"bfdfe7dc352907fc980b868725387e98d86448a595c3e96977dbdc30fe2cbcaa"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e26d3f5025495b220ddd4f6207f4587b","guid":"bfdfe7dc352907fc980b868725387e987ca43090dc8ea6eb949cda741bc04b77"},{"fileReference":"bfdfe7dc352907fc980b868725387e987aeb1677aa3f05f1761f846718835c50","guid":"bfdfe7dc352907fc980b868725387e9813cd1b8be12783c5362e7c21b9b3dbd0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f959b628d5b8052a17713834ad57fb09","guid":"bfdfe7dc352907fc980b868725387e981e2f1e86843b302ea0d4f2737975831d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806ad195b6f8d839ae85aaad6a082e134","guid":"bfdfe7dc352907fc980b868725387e98ecae11baac81de35569689faf861acf0"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d87c15323f45612fa9da3bf7eb1f67c","guid":"bfdfe7dc352907fc980b868725387e98512e6a8ce11bf005cf404a9cc75bef1e"},{"fileReference":"bfdfe7dc352907fc980b868725387e980aaa2ce18060018d8582b15deb60717e","guid":"bfdfe7dc352907fc980b868725387e98186dab1ceb0cab230efb378477e3bef1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df178355066c42ee41917de773f15445","guid":"bfdfe7dc352907fc980b868725387e987034af3c386dd466a0bf11b21bfb8ce1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98591862058e662b5f63b1e4a002b7c7c5","guid":"bfdfe7dc352907fc980b868725387e98ff8690bf005f30f02b4ed1b96ee15323"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f83f5f89240fd2c759541ca77d087f0c","guid":"bfdfe7dc352907fc980b868725387e9837ba1bdae2ef6a133d2289a1d548034e"},{"fileReference":"bfdfe7dc352907fc980b868725387e989af56a45d24d5431edf6bad850b00d11","guid":"bfdfe7dc352907fc980b868725387e98ede90d70412bd7e9c08a286d1a412f02"},{"fileReference":"bfdfe7dc352907fc980b868725387e986bac22c527310784f1c006e87f3294ce","guid":"bfdfe7dc352907fc980b868725387e984090828cfe8f007ed30b6c219eb371f5"},{"fileReference":"bfdfe7dc352907fc980b868725387e981c2992260f8b3902274cb45c5378a77c","guid":"bfdfe7dc352907fc980b868725387e98481823de9baefb241b80e94b5b534181"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e34fca7fb9515751e5b65daa60892205","guid":"bfdfe7dc352907fc980b868725387e984755b29e1ab7d0e06551b1118e41b162"},{"fileReference":"bfdfe7dc352907fc980b868725387e982943aac92a9cbecd2cbbb9c61b214642","guid":"bfdfe7dc352907fc980b868725387e9842f696bfe4322f5cc5a7f27b409bd157"},{"fileReference":"bfdfe7dc352907fc980b868725387e981af493bf2a6d92e228891b304a7c2b30","guid":"bfdfe7dc352907fc980b868725387e98ad778e981ef8cca89e7cd842950581b0"},{"fileReference":"bfdfe7dc352907fc980b868725387e9889a07bab11e055a44d47d0a84563e088","guid":"bfdfe7dc352907fc980b868725387e98578e82f7545167f78f6ebe61c85d0bde"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a1d2c3a622ecffffe17ef46139139ca8","guid":"bfdfe7dc352907fc980b868725387e98f27537f8f6870ac73ee33ac3eb07ace5"},{"fileReference":"bfdfe7dc352907fc980b868725387e984d09367fa07320c0ed18d8d09ef5757c","guid":"bfdfe7dc352907fc980b868725387e981084672785f169996eccfbe06a47501e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98616683757c0e1501dd6570169bfd41ac","guid":"bfdfe7dc352907fc980b868725387e98fd609d65c809bc7b69cd618b4a267e2c"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c25500f4df2d88e68f29160fa6d1d5a","guid":"bfdfe7dc352907fc980b868725387e98c61718eebeb0af586e28cfd878a30d49"},{"fileReference":"bfdfe7dc352907fc980b868725387e986a6bcd435124a56335e622830e53d4c3","guid":"bfdfe7dc352907fc980b868725387e9805d3af4d75e3e878acf84323fd9a3de7"},{"fileReference":"bfdfe7dc352907fc980b868725387e988f7a31d9a7fba991cd82fb921f090297","guid":"bfdfe7dc352907fc980b868725387e985dbc5d7268ab1beec0cdf54449463d09"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bbe9461acf5722bf63f491f75f987246","guid":"bfdfe7dc352907fc980b868725387e984d62d64fd66552677a95a43a3110a782"},{"fileReference":"bfdfe7dc352907fc980b868725387e980cd5a67e18edfb65db64920ac80317e1","guid":"bfdfe7dc352907fc980b868725387e9840d1d45c039e6a0997e73acdf8116811"},{"fileReference":"bfdfe7dc352907fc980b868725387e98665db2580b70e0265552837a06ece510","guid":"bfdfe7dc352907fc980b868725387e98334b8e80d80747046f2fc391e5ea9355"},{"fileReference":"bfdfe7dc352907fc980b868725387e9803d55e2bb08b712edefa8542b0d821f2","guid":"bfdfe7dc352907fc980b868725387e983714b8079494b3f5de6865925d4b829c"},{"fileReference":"bfdfe7dc352907fc980b868725387e988f335221864e0c7abd228aa513d49083","guid":"bfdfe7dc352907fc980b868725387e98633fcb70323a2b33b006376610ba6836"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b007c1bd88b3b03c3720e4d4ec6ce72d","guid":"bfdfe7dc352907fc980b868725387e98b849347f845e6c86bdec15f76e8e7d13"},{"fileReference":"bfdfe7dc352907fc980b868725387e984d3a38375b819f97a2e590d76e3d68be","guid":"bfdfe7dc352907fc980b868725387e98fd78a2ef4a36e9c9acda3c32683256b3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed97a12539b70fccd51dec37544af27e","guid":"bfdfe7dc352907fc980b868725387e98f3ab17ff4a576766707cb8a1f5f37809"},{"fileReference":"bfdfe7dc352907fc980b868725387e988dd995935f6b4bed79a6300837319a14","guid":"bfdfe7dc352907fc980b868725387e98282b8470981ef733954f95dc52507dfb"},{"fileReference":"bfdfe7dc352907fc980b868725387e985c56464dbc24f4b98cd30d9927bd9b20","guid":"bfdfe7dc352907fc980b868725387e984ffaf7c01acbc5d87a5ee765c2df70b5"},{"fileReference":"bfdfe7dc352907fc980b868725387e9870310f2e959bc3a5eff9174c850cbe6e","guid":"bfdfe7dc352907fc980b868725387e985109bbe68a7f2b64a9658b3b1b7eec2b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98376eb6b21e867b2936731a0373f7aa37","guid":"bfdfe7dc352907fc980b868725387e98b4903ef8aab6ee5d2013a62dd68cd9e2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b463364ff9c18b81a6609b062a5130db","guid":"bfdfe7dc352907fc980b868725387e98dae8da49ee66225cec8f78b90bb90e08"},{"fileReference":"bfdfe7dc352907fc980b868725387e988d11b2e1b05020946624f2f29892aa00","guid":"bfdfe7dc352907fc980b868725387e9860cc5b62aa842becbf29536a0e0e5ddc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b7defa3347432052375b438e2e2a471d","guid":"bfdfe7dc352907fc980b868725387e98537bc38de94e86ea3eafe19bfd748385"},{"fileReference":"bfdfe7dc352907fc980b868725387e987e7eb9b69db6e27a15c85f9fac88c21b","guid":"bfdfe7dc352907fc980b868725387e98d171e9a43c9ad72ccf75147b91fef59f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e94d1578f99b30508d8845d701648ecd","guid":"bfdfe7dc352907fc980b868725387e98179b240c7711b0f517df07147048aa70"},{"fileReference":"bfdfe7dc352907fc980b868725387e9812938caf7996c6d80dbf9271d3a6f958","guid":"bfdfe7dc352907fc980b868725387e9887a5a0c6d677d35a77b0063e1e8b376d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f3d32e8ce6d42e2d053519de5c184f67","guid":"bfdfe7dc352907fc980b868725387e98c1d9c5ff2afc41420943cc5dab781b88"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c5d01b3d56827bfde5187df4ae8ae6f7","guid":"bfdfe7dc352907fc980b868725387e98802e776da498f4fa7311d48fe843398a"},{"fileReference":"bfdfe7dc352907fc980b868725387e980bace14250c740b8f01102fed49a6f3f","guid":"bfdfe7dc352907fc980b868725387e98c21d248fccb0f11f2d9e541ae61496ee"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bd63cec024b8004a2cfea6c1f3c3a16d","guid":"bfdfe7dc352907fc980b868725387e98d5bfc081c61d2b9bbd081fecbb540f9a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f249276cf2cb89b2af74b98fc236dc19","guid":"bfdfe7dc352907fc980b868725387e98a05f02e6a460453a5e366130f5b7e817"},{"fileReference":"bfdfe7dc352907fc980b868725387e98741d531661b69bd4c010ad24b33cb126","guid":"bfdfe7dc352907fc980b868725387e9859a2d4a9bea3dcb9a4049d90b162ddfb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fad610585409b4155dfb77dfb11aaff8","guid":"bfdfe7dc352907fc980b868725387e984cb33669d0fc2f1151941641f49adf1d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b8c9eb74f63ffa618a81f634e2d0e973","guid":"bfdfe7dc352907fc980b868725387e98a250ec6ed2cd0c0620b4ed10e319cbea"},{"fileReference":"bfdfe7dc352907fc980b868725387e9810aa22726b627e7bbff26562ab33a902","guid":"bfdfe7dc352907fc980b868725387e98ec7bc7911ce51ee4a74d5a9d79e4b81d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b6a6fe4795e9ccd8158ae4c0af0f8c8c","guid":"bfdfe7dc352907fc980b868725387e98c1348845b34fd1ccfb27a623c0925d6c"},{"fileReference":"bfdfe7dc352907fc980b868725387e987bc99a6470d3a1db520bcbccc094ac70","guid":"bfdfe7dc352907fc980b868725387e9817c4f59b351dc085bada6d1090a7bc1d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9857856e03e3b248fde2b403cff7be0c2d","guid":"bfdfe7dc352907fc980b868725387e981653f76ca28d11c081272170f278244b"},{"fileReference":"bfdfe7dc352907fc980b868725387e9858b4d3f93823a7a844e9af48e325ea6b","guid":"bfdfe7dc352907fc980b868725387e9847b84a17fa22432785c8cfeff56d77ff"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f1cdf8141b4e6f72ce96cfc4e114ac93","guid":"bfdfe7dc352907fc980b868725387e98a30c157ebe1e2c286a049b647e73d12d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9820c91663ac328caa6a772dc1aec7f895","guid":"bfdfe7dc352907fc980b868725387e98471e007b019b75823f218dd072af8122"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c40558907257758691a97ebe7d32550e","guid":"bfdfe7dc352907fc980b868725387e9879cb994437901dc58b69df9e2edbe461"},{"fileReference":"bfdfe7dc352907fc980b868725387e988613cca076d4233fbc8f533d7bf66208","guid":"bfdfe7dc352907fc980b868725387e98294c4ee66a770ac5b789fa21d668ef9b"},{"fileReference":"bfdfe7dc352907fc980b868725387e988bfe961a333b087f09acd251c89287f8","guid":"bfdfe7dc352907fc980b868725387e98e05ccb8902dabfc7b53aca6f5feeb0f4"},{"fileReference":"bfdfe7dc352907fc980b868725387e987e9e853cad7160fab37152132380f5fa","guid":"bfdfe7dc352907fc980b868725387e98b48d5ab40647a5926154fc9d16501b75"}],"guid":"bfdfe7dc352907fc980b868725387e98521823472574b05b8a3113867ad0de75","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e980bef1b6724982795f70512f70c223133"},{"fileReference":"bfdfe7dc352907fc980b868725387e982680e93f57d9a3d8e73bd93b7e3e0f36","guid":"bfdfe7dc352907fc980b868725387e98188335ffc04885b6f4f913da8f654d80"}],"guid":"bfdfe7dc352907fc980b868725387e98dd5edf74ef26b6152a6221e71924088d","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98ff60c0ecd70eb6e2d3c850b3b15ef431","targetReference":"bfdfe7dc352907fc980b868725387e9826e2628dc041aabe2d77e75ccb1dc95b"}],"guid":"bfdfe7dc352907fc980b868725387e98b874019f1f0b32af2334d21070667d27","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e9826e2628dc041aabe2d77e75ccb1dc95b","name":"SDWebImage-SDWebImage"}],"guid":"bfdfe7dc352907fc980b868725387e98c46180aea4e87057640961e6db37df0d","name":"SDWebImage","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98880bd43228ac3a23ccb630571006ecd9","name":"SDWebImage.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=98c62b097118c3a71fbcc1ac381d0554-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=98c62b097118c3a71fbcc1ac381d0554-json new file mode 100644 index 00000000..3ad6be28 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=98c62b097118c3a71fbcc1ac381d0554-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e8f5202bf6c2927877bbede594254bac","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreExtension","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreExtension","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FirebaseCoreExtension_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9804aab7798c2569699b967adcd034ffe7","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986a53acd8d9569d0c22497ed69917f900","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreExtension","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreExtension","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCoreExtension_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f0fbb6af706c4937a9ca2f9ce650ab9e","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986a53acd8d9569d0c22497ed69917f900","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseCoreExtension","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FirebaseCoreExtension","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/ResourceBundle-FirebaseCoreExtension_Privacy-FirebaseCoreExtension-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"15.0","PRODUCT_NAME":"FirebaseCoreExtension_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9814f84f30e8594a9183e1cdf5147d537e","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e989ea3c1c7558f7911245d82f6428108f7","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ad882a80f21c1574859d5acd7f84c850","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98adf015b8b23a4183c14442061cb3cae9","guid":"bfdfe7dc352907fc980b868725387e981bbb7fabc1bd01c01460062904a1a61c"}],"guid":"bfdfe7dc352907fc980b868725387e983d4c24a29d73e7e411f18e4971109818","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98c04ead258c2ba3f656422d1784107881","name":"FirebaseCoreExtension-FirebaseCoreExtension_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e988df9a93510eab8c6f1cb7471d90295f7","name":"FirebaseCoreExtension_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a067526aa1156f18ea027d11109a29d4-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a067526aa1156f18ea027d11109a29d4-json new file mode 100644 index 00000000..1c0a9b63 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a067526aa1156f18ea027d11109a29d4-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988dc0dcaabffa36a9e85d057769df808d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/google_mobile_ads/google_mobile_ads-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"google_mobile_ads","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98f60f21207bdf48370aadaa7a5944056e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987e81c25c7cd2ea8e1b445f8bd4d6b142","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/google_mobile_ads/google_mobile_ads-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"google_mobile_ads","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ca83b02fd91b34a498c4c1d10d117548","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987e81c25c7cd2ea8e1b445f8bd4d6b142","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/google_mobile_ads/google_mobile_ads-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/google_mobile_ads/google_mobile_ads.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"google_mobile_ads","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98d212063812730634d67c1838935e42c2","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e984240dfeec000ca8d0ac4a90a031aaf0a","guid":"bfdfe7dc352907fc980b868725387e98fc3902591610fa8822f0952c44c23f1c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9890fd4326c9f214196bd5a0490007afcd","guid":"bfdfe7dc352907fc980b868725387e9807f209f9c64cb7b32ca06eaaba47c866","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e984d482976b92aa362238438f33e1d3847","guid":"bfdfe7dc352907fc980b868725387e98f5ea5c464c7a684d53e95f4da462ac34","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9835c6106e9c677e5754054f0a9010d0fb","guid":"bfdfe7dc352907fc980b868725387e988a64f85748721529c8eb1e4cfa6c20e1","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981f6abf8441aeddf38e2ee5b6e097cc8f","guid":"bfdfe7dc352907fc980b868725387e9815505fdc4ca0eafa4100498d2941a176","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989cc1f81c38bb9851f4050d8234e27827","guid":"bfdfe7dc352907fc980b868725387e98fb5e81d7cbe6ab1fdb387a41eae62b74","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b3f9c06c5fdf0e42530f281cca9fc44f","guid":"bfdfe7dc352907fc980b868725387e9885decc54404980d6c525e77bf65fe873","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c6a0457f533d1b1ca15ab8a5364ef37b","guid":"bfdfe7dc352907fc980b868725387e9817ddcb7b3c12a1eb9d89a5987d5a55c5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9864b4634ab3a98b02e906a6583e29134f","guid":"bfdfe7dc352907fc980b868725387e9864d5ee22ae45b1d9c3b93e03407c955d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985ef5b1cd5b86a3e538a197c1ab9a9812","guid":"bfdfe7dc352907fc980b868725387e98ca59e34ce3e886935bdd2072ff528b56","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d65e11739777d0c59cb6a89a4b9c2e57","guid":"bfdfe7dc352907fc980b868725387e9843b7cb1689bb36b536d4ba3242d513d2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9881de238705aaccdfd3c39ad39d8a29c1","guid":"bfdfe7dc352907fc980b868725387e9842eff5ae9b47f7f3bf180fb0811eda4a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9885218f34df8f4718b80b621799778241","guid":"bfdfe7dc352907fc980b868725387e98b766a8777b3597b0a6631df2c3e49433","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ae8af11166b7347d9e0d43f78afdb3c0","guid":"bfdfe7dc352907fc980b868725387e98edd82d4594170ffe44735267e3a9b49b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9832d9b8c3de108888f7fc0fad5d829a47","guid":"bfdfe7dc352907fc980b868725387e98e1c347924c03a72d30b98fcb5c2b5a48","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98809c667f0a0b2817398014a088224434","guid":"bfdfe7dc352907fc980b868725387e9879fad702e858c9d255ce4e8b9f4693c6","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9816ecde728aa88cc29920a74c71a2d3db","guid":"bfdfe7dc352907fc980b868725387e98af243acd6a89584103cbd8c7d7e4675c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ef6f527da899ce3d0d655df4fdba772c","guid":"bfdfe7dc352907fc980b868725387e989f459d5eb8aed64c82172737f80d33c2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988b4c2f093c31a9f200c8f45161df3c2a","guid":"bfdfe7dc352907fc980b868725387e9829ce672bdd912bb92a5b49532c33d0cf","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e987a51e4f40d97cb9adc27b2e42cc25b62","guid":"bfdfe7dc352907fc980b868725387e98f4c5fcae42d97349e67a9ccb65447633","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9864317c934a174460acab2d786935fa3a","guid":"bfdfe7dc352907fc980b868725387e980e7f02171e5d41504b15837490e1ed45","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fd894f45ca741629b38f8f4692bca46a","guid":"bfdfe7dc352907fc980b868725387e98e48dc8c919394b5e1d784da833f87967","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b98042b15a1b65a5f73b8fcdf63acd94","guid":"bfdfe7dc352907fc980b868725387e98aacaef33e940fbd51a0c7b0e82ca2360","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989f6df57e9714d47de1bef126b3e8e39b","guid":"bfdfe7dc352907fc980b868725387e98a13e606cbbfd39a170e763f81b8c82b0","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e985da9e827eef44a73ab95aff9462753c7","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f5aab5940ee683a0f59b1e8870b802dc","guid":"bfdfe7dc352907fc980b868725387e98fcdfb9a416fcb39e0703fd8f8353166a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806b9260a8591ca252226b8bacbb7c485","guid":"bfdfe7dc352907fc980b868725387e9863549f145557ef47cae8c38144d2d0ff"},{"fileReference":"bfdfe7dc352907fc980b868725387e981c6389e12e9d4a39af9fc2b794895960","guid":"bfdfe7dc352907fc980b868725387e9836f9aa8313b7dc0da597b6bba4715b54"},{"fileReference":"bfdfe7dc352907fc980b868725387e986b6b176839f0b199c05b9bfda1b0289a","guid":"bfdfe7dc352907fc980b868725387e9889634419cf13bf11f5a0962de58c2e7e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e42ceda20f7996f4f1db9cb68f5f0e82","guid":"bfdfe7dc352907fc980b868725387e98b03a8074c560b4e6d87f39b4ce8a1388"},{"fileReference":"bfdfe7dc352907fc980b868725387e98220dcc23917995a27d0f53057040c555","guid":"bfdfe7dc352907fc980b868725387e9852d9aa72fc505723d0d1a998280f43d8"},{"fileReference":"bfdfe7dc352907fc980b868725387e981d5d659ea3fece667574bfd04ef72e19","guid":"bfdfe7dc352907fc980b868725387e98703ec30c0f6dc44546d36faf52f19a53"},{"fileReference":"bfdfe7dc352907fc980b868725387e986b796972877c18df3d6f5af3cab27e5c","guid":"bfdfe7dc352907fc980b868725387e98c0a427cd67ba5676bb8d7be7bcdbbf25"},{"fileReference":"bfdfe7dc352907fc980b868725387e988d7783f13036a505334aa6f36adb89c1","guid":"bfdfe7dc352907fc980b868725387e98e6d8341d3faae82be8e4fa5ce1e8e33e"},{"fileReference":"bfdfe7dc352907fc980b868725387e983ac31ec6480613fd151e1b624e682774","guid":"bfdfe7dc352907fc980b868725387e988317fab1628f437d63db45ecb4a066d8"},{"fileReference":"bfdfe7dc352907fc980b868725387e982281f17e05329e9e471231e98f942168","guid":"bfdfe7dc352907fc980b868725387e98b90a390daffb6b05d6e7b1b7c4ea7e7d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98147317a5801ba72c5dde82a8e257712f","guid":"bfdfe7dc352907fc980b868725387e9853895820dca86d44e54fa26282d4ff84"},{"fileReference":"bfdfe7dc352907fc980b868725387e98760f6bc37adfc3ac8632fa54f20c218f","guid":"bfdfe7dc352907fc980b868725387e9860c4ef284b6c1adfec9622391b781ad3"},{"fileReference":"bfdfe7dc352907fc980b868725387e9815cfebf454d95d6d62ffbab198236c6c","guid":"bfdfe7dc352907fc980b868725387e98ea7bc478420d17681a494a8d8f3f65db"},{"fileReference":"bfdfe7dc352907fc980b868725387e98048f3e8812e4b1dbde8a2d474f511920","guid":"bfdfe7dc352907fc980b868725387e983df14ef77635bd83b3fd1debb9136c51"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e0475a3f5954ad23ef9e699046810e3b","guid":"bfdfe7dc352907fc980b868725387e98855019121a75246ee32dc26615ea17e3"},{"fileReference":"bfdfe7dc352907fc980b868725387e985ae4ef538e0272a808791bf1392f7c73","guid":"bfdfe7dc352907fc980b868725387e98cdd8508a934a9e834d5a29f64c865988"},{"fileReference":"bfdfe7dc352907fc980b868725387e981bf4bcbaf79a603383c23645090bc955","guid":"bfdfe7dc352907fc980b868725387e98d67b8d6e3b8ffe5c3335096e12a5d549"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bb573db16d21ecd76a77b185c52f7253","guid":"bfdfe7dc352907fc980b868725387e988333ba14f3a1fcae6d60e2b422e436a9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e50cbcfd7237202c92423678a691838b","guid":"bfdfe7dc352907fc980b868725387e98da07a2d5bba557b3acc9dc679e97aa6b"},{"fileReference":"bfdfe7dc352907fc980b868725387e987e0d2c8d0bc0abdac28d339bd37fbf90","guid":"bfdfe7dc352907fc980b868725387e98de00129e3270ecf6ff3b9a1449b10c5c"}],"guid":"bfdfe7dc352907fc980b868725387e98ef387155c7be58dd1abcd21a411a4e6e","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98c961a969fb41a7bdab90c538b30528fd"}],"guid":"bfdfe7dc352907fc980b868725387e9817c34e700eb0a17b1be9eca81b57986b","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e984da9032ff76790acb4b37e742746ef15","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98cd53d937e824fad9f4527eeeb684cb40","name":"Google-Mobile-Ads-SDK"},{"guid":"bfdfe7dc352907fc980b868725387e9804037656a8578d8e730f9d99c54e40e2","name":"google_mobile_ads-google_mobile_ads"},{"guid":"bfdfe7dc352907fc980b868725387e988efdc4dd0ac29b43123295eca853f4ed","name":"webview_flutter_wkwebview"}],"guid":"bfdfe7dc352907fc980b868725387e9811f9347c979613c5502173cd5b43060d","name":"google_mobile_ads","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98b1f16b2926bf8e21151b2cb149aa6540","name":"google_mobile_ads.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a1626071b7e4461b7a78f87d063ecc17-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a1626071b7e4461b7a78f87d063ecc17-json new file mode 100644 index 00000000..5c1b4d25 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a1626071b7e4461b7a78f87d063ecc17-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98be516318204b40d33cd2aae70dc8508d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/image_picker_ios/image_picker_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/image_picker_ios/image_picker_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/image_picker_ios/image_picker_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"image_picker_ios","PRODUCT_NAME":"image_picker_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9864dece58fe8898e7f0b46391fe2d091f","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988b179e3ba3eb0643314ef47fd544fc52","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/image_picker_ios/image_picker_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/image_picker_ios/image_picker_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/image_picker_ios/image_picker_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"image_picker_ios","PRODUCT_NAME":"image_picker_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981b08ec94c515cc2b895c3ae9b4c03834","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988b179e3ba3eb0643314ef47fd544fc52","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/image_picker_ios/image_picker_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/image_picker_ios/image_picker_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/image_picker_ios/image_picker_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"image_picker_ios","PRODUCT_NAME":"image_picker_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982b03ce4519745554a82e5cffe58f25e2","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98455184b1ebf4d6916746f5fbc500d738","guid":"bfdfe7dc352907fc980b868725387e98b6791fb8e76ffddc1e11f5185e6ba9d9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c324ea36454852a92ca5c1e7c63badd3","guid":"bfdfe7dc352907fc980b868725387e982744c0d0f0a36505d1c15c23d6935447","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9874d33145b4eb026db783767a8627f331","guid":"bfdfe7dc352907fc980b868725387e9852492bcf209a038e7a16b3ac8411c283","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989aa410188bb1b807675bd70c43b501ec","guid":"bfdfe7dc352907fc980b868725387e987a1e9c44d52440ca1f5e324cd3b19909","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bb38f172fc4f9f4727a3dedcca07fc48","guid":"bfdfe7dc352907fc980b868725387e98f8f8c2601b0779c699d2dac5bd278ac1","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ee2e909a182ee943c5a04d5112d38a65","guid":"bfdfe7dc352907fc980b868725387e98db97cd107876494aea98961b286c86c1","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e987912c452cf5c073488f6736d535565ca","guid":"bfdfe7dc352907fc980b868725387e98221b63a32b3332c8e7b2aaf405a29507","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9866acc8882d2e86af3542c91447a63240","guid":"bfdfe7dc352907fc980b868725387e9861e5543a107bb7225169297ccd2207c5","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e987c543487347cac13b6462fae62598e7f","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98566106fb34bacfb516ebf07d57920aa6","guid":"bfdfe7dc352907fc980b868725387e980e85bc855779f80744931a46e8bb9083"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f8dc4d6581fb8f5b5c907ac0b21fbb8c","guid":"bfdfe7dc352907fc980b868725387e98c3e5c8ae8b4830c962871e88641350bc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98247c332c7d249620a850bd09f2121a84","guid":"bfdfe7dc352907fc980b868725387e98c053e736621f9e5f8a4ad65a0f016f28"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d989ee30069916d663cfe91d1c5986fe","guid":"bfdfe7dc352907fc980b868725387e9812f4be99a5a001879dcf3624e793e714"},{"fileReference":"bfdfe7dc352907fc980b868725387e9851702874b3473204d01c1a11a3c97351","guid":"bfdfe7dc352907fc980b868725387e98c8131c01c4a3f0decb5349a83ef7df1c"},{"fileReference":"bfdfe7dc352907fc980b868725387e981b14112e34d16a8429f88ce19e8279b2","guid":"bfdfe7dc352907fc980b868725387e98e0ab939fbafbd88342244f2b4a6d7f2e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9822975da8370cfc43e8dbd1e7dc4f64f1","guid":"bfdfe7dc352907fc980b868725387e98d36dcd652bf15a28b5d5cb5df79be25e"}],"guid":"bfdfe7dc352907fc980b868725387e98ce67561b68c83c2e24888c94da999914","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98cf1fddec899afc6c9825c5eb5ec44493"}],"guid":"bfdfe7dc352907fc980b868725387e98434353ef3b38c3699582ee30b73fe6a8","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9872ef11792920b3966776ea469c5092df","targetReference":"bfdfe7dc352907fc980b868725387e98082dc85da1fc941e5234c7cc1f11b27d"}],"guid":"bfdfe7dc352907fc980b868725387e9811e9e8a5f23273fd9234f4740a75ccb9","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98082dc85da1fc941e5234c7cc1f11b27d","name":"image_picker_ios-image_picker_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e981f000f066404b97b12e9c4ca84d38d0f","name":"image_picker_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e988e06e8c3685b7c12032d8059f412f4cb","name":"image_picker_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a6be57b3049abd7b9f2b4e20f4ba91af-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a6be57b3049abd7b9f2b4e20f4ba91af-json new file mode 100644 index 00000000..78dae6f9 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a6be57b3049abd7b9f2b4e20f4ba91af-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d8979ec56d38d5f43a66a4cc2fbcb401","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/webview_flutter_wkwebview","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"webview_flutter_wkwebview","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/ResourceBundle-webview_flutter_wkwebview_privacy-webview_flutter_wkwebview-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"webview_flutter_wkwebview_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98bada7907d535f3a8b4ff5ea15a0eccf0","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984206827662d5208f461a0eccfc0e621b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/webview_flutter_wkwebview","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"webview_flutter_wkwebview","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/ResourceBundle-webview_flutter_wkwebview_privacy-webview_flutter_wkwebview-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"webview_flutter_wkwebview_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e989442ce00206aca38985ec9f9cca4ebaa","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984206827662d5208f461a0eccfc0e621b","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/webview_flutter_wkwebview","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"webview_flutter_wkwebview","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/ResourceBundle-webview_flutter_wkwebview_privacy-webview_flutter_wkwebview-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"webview_flutter_wkwebview_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e980e63dd39c72da64ac849e5fa7a32455e","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98b71e13813068a8f42815fa6985ca3a16","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e980ce4cc1aa52fa13fc3aaa64b1179c020","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9835179e6884138d623d1c2669625be172","guid":"bfdfe7dc352907fc980b868725387e983cb9e9258cb37dd196c17b38d2026ca5"}],"guid":"bfdfe7dc352907fc980b868725387e98dd58b73e0338cd55ce259842a1ab5fe4","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e987c93e943aa0a38b5f6684beaf6b4a3a1","name":"webview_flutter_wkwebview-webview_flutter_wkwebview_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98a0c2ea56ea4c64a4495566659e5fdb93","name":"webview_flutter_wkwebview_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a771b9f79fd75fad08749ef861b3bddf-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a771b9f79fd75fad08749ef861b3bddf-json new file mode 100644 index 00000000..5b1c8378 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a771b9f79fd75fad08749ef861b3bddf-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e6a79d9461f52673e9cd16e5e9ce12b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_picker/file_picker-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_picker/file_picker-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_picker/file_picker.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_picker","PRODUCT_NAME":"file_picker","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b3839b441583705f02a5120c8d8aa8af","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9855ea28d68c6105425b28b0dc67fbf53b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_picker/file_picker-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_picker/file_picker-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_picker/file_picker.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_picker","PRODUCT_NAME":"file_picker","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98bf7c85eda27e5e9e0261324bd88a67cb","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9855ea28d68c6105425b28b0dc67fbf53b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_picker/file_picker-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_picker/file_picker-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/file_picker/file_picker.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_picker","PRODUCT_NAME":"file_picker","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9892027ea2a6fa425b67809870c0e18fdf","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98194a7baf55c88f6759045c696de2d397","guid":"bfdfe7dc352907fc980b868725387e98c3154b28584fbc56128e7bc90d1ad537","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f2597b2bfcfbe350f782de7028884db9","guid":"bfdfe7dc352907fc980b868725387e982745fee4238df0ba4c30f405f9ceb311","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9848c85bbc8fed7f463b54a8a831976dcb","guid":"bfdfe7dc352907fc980b868725387e98d775035456af40c8df68042b9f67214a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980bb97ec29a5da2b10289db8377230b28","guid":"bfdfe7dc352907fc980b868725387e98072eac5d00c04d5afed78f580a9379ca","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9815da8454f786c30d7b23218e31792c1f","guid":"bfdfe7dc352907fc980b868725387e98f879c2bd74c858de2624663875100089","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9874a8e10d0d4d6a8e4d51cadd3de25a1f","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d5f93b22efc88a714a54d4c0f0e25b81","guid":"bfdfe7dc352907fc980b868725387e98a1de3a054407d1c738e24f5374fa74a5"},{"fileReference":"bfdfe7dc352907fc980b868725387e981339c3a7ce270306613c6cbf72ac67cd","guid":"bfdfe7dc352907fc980b868725387e98b4f77a39ccf0813bbd85099167af4311"},{"fileReference":"bfdfe7dc352907fc980b868725387e9801fd6a14089a47c1e1b32718bdf22178","guid":"bfdfe7dc352907fc980b868725387e98f868ffd01ce81b1910bd85586fa30587"},{"fileReference":"bfdfe7dc352907fc980b868725387e986778635029f602b4f750099540bf2fc6","guid":"bfdfe7dc352907fc980b868725387e98c7bef4a161d4b5e2d85fd85daa44e661"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bfd42a1232cd7e5dc79651040aca6fa8","guid":"bfdfe7dc352907fc980b868725387e98b789e4f458ffb91b232ec4825ba9a8af"}],"guid":"bfdfe7dc352907fc980b868725387e9833a0422bc02947bdd25cd49f9b0b26c7","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e986cf52231b3e99539039502256cc80d97"}],"guid":"bfdfe7dc352907fc980b868725387e98a0e062b1c169ee922cd5cc09aef279dd","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98a9270cf577ade730d8197570f3744af9","targetReference":"bfdfe7dc352907fc980b868725387e985452a642045cac0ef7c37f93da2d994e"}],"guid":"bfdfe7dc352907fc980b868725387e98300e823ab028234f8b351b783dfd9d7a","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e985fd5cdb9993b1816141f0c012ffa62bd","name":"DKImagePickerController"},{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e985452a642045cac0ef7c37f93da2d994e","name":"file_picker-file_picker_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98bf75f71a2aa7fdc38a7d7d70e6c200c1","name":"file_picker","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e981da9957ede39da2a81727560e62463b0","name":"file_picker.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=aa56745ff0f6a68146d6117b991ff12e-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=aa56745ff0f6a68146d6117b991ff12e-json new file mode 100644 index 00000000..dd032665 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=aa56745ff0f6a68146d6117b991ff12e-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98478e27dfe1d9ad49d28fafd65b85bf34","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"GTMSessionFetcher","PRODUCT_NAME":"GTMSessionFetcher","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b550d9cbb5a5b1883a64aca754ed9a28","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980d155ae95de828a9ae777ff4d23d3419","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap","PRODUCT_MODULE_NAME":"GTMSessionFetcher","PRODUCT_NAME":"GTMSessionFetcher","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980724459bcc96ad9ae15e006d971276b5","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980d155ae95de828a9ae777ff4d23d3419","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap","PRODUCT_MODULE_NAME":"GTMSessionFetcher","PRODUCT_NAME":"GTMSessionFetcher","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a8848bea8636652191740ffcbabf2880","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98eb4aaedbcf9860120c58f6d4d062f032","guid":"bfdfe7dc352907fc980b868725387e988563942b64807f4e8b4f03ddc85d2d57","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983987a537a915850cc63a9531255da27c","guid":"bfdfe7dc352907fc980b868725387e98611d73e0353201771b302ffa48bac290","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dfa923d33e197f2f10f071abff2371ff","guid":"bfdfe7dc352907fc980b868725387e98734c9257f56678921b39462bd212351b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d312b9b5d7afb9da1592f829033a3206","guid":"bfdfe7dc352907fc980b868725387e98397650ca1ecab34f0d3e04f58b22aebd","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e983d4c09b113cf1215cd28e8d9ac61a23f","guid":"bfdfe7dc352907fc980b868725387e98cd40dc3db8bb82b3155de60d17499d4a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9885235b209117c45670e8a7e932ed032d","guid":"bfdfe7dc352907fc980b868725387e986009430d38dfc9178aa961543af2a36d","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98efce177caf6f851e7498eaa2d39fa5b2","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98cc293d93ed0348775d80402fa066a035","guid":"bfdfe7dc352907fc980b868725387e9846e72a20e759e4a1f8d30b3565d478ab"},{"fileReference":"bfdfe7dc352907fc980b868725387e98043df5bc2e7d05caf248348a4d634e19","guid":"bfdfe7dc352907fc980b868725387e981a3249d92689bbcb292bf0c163124dd6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e555f92b94394e98b028c2f2173f7a28","guid":"bfdfe7dc352907fc980b868725387e98da8980140af446b24328e775a18d88d5"},{"fileReference":"bfdfe7dc352907fc980b868725387e983b71212203a0dad88a8868b08a6dbc06","guid":"bfdfe7dc352907fc980b868725387e98c10cb1ca0893a79fbc28c8a8f9b74f6c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f0441880a424196f2e774e387ed25a77","guid":"bfdfe7dc352907fc980b868725387e989a231f8fc2d1019fe4641fcc3321eb46"}],"guid":"bfdfe7dc352907fc980b868725387e98dc057af249a902b110f3a08f3e0d11f2","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9867dd418f34545a9d0e00cd3dd1ed8856"},{"fileReference":"bfdfe7dc352907fc980b868725387e9820c167798bdb228b4ab52bb2aa7eb24b","guid":"bfdfe7dc352907fc980b868725387e98eba6d5a9331fc07032c864b0569cadd6"}],"guid":"bfdfe7dc352907fc980b868725387e98d1bc46a72df41ab8ad7c27d649c7eec3","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e984d676f5872d9f5405805a0c5f9b58829","targetReference":"bfdfe7dc352907fc980b868725387e9801af34ddea6be97d757786022edb34b1"}],"guid":"bfdfe7dc352907fc980b868725387e98240bda713eaa26eb6174af89993368f9","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e9801af34ddea6be97d757786022edb34b1","name":"GTMSessionFetcher-GTMSessionFetcher_Core_Privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98dd3a6a519ed4181bf31ea6bc1f18ebc5","name":"GTMSessionFetcher","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98f65e88472d384b1ba0888326befb3a8e","name":"GTMSessionFetcher.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ab724a4a507acc9a546958f9aaaa80fd-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ab724a4a507acc9a546958f9aaaa80fd-json new file mode 100644 index 00000000..1641b96e --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ab724a4a507acc9a546958f9aaaa80fd-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98089a265d15a8f52f9e25ea32540ea5cd","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/package_info_plus/package_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/package_info_plus/package_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/package_info_plus/package_info_plus.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"package_info_plus","PRODUCT_NAME":"package_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9897051622773a9cd7d8fae6ba3be0988b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9811034d0cd45341ec5fddd8ae14b45098","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/package_info_plus/package_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/package_info_plus/package_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/package_info_plus/package_info_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"package_info_plus","PRODUCT_NAME":"package_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98937974f840ad34ce898c3a62a0a52a8d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9811034d0cd45341ec5fddd8ae14b45098","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/package_info_plus/package_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/package_info_plus/package_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/package_info_plus/package_info_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"package_info_plus","PRODUCT_NAME":"package_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98f7c4cdd694f93dd8f9baf8a7be82dba5","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9863bbc9af63b79ccfc69082c52a621490","guid":"bfdfe7dc352907fc980b868725387e988d7afa72893fb24fe059f2d1654db428","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9833f3c33eca65f1240c201c729d3fbde7","guid":"bfdfe7dc352907fc980b868725387e984a3cde720e889627fced5106f157da46","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9882bf16bb6e470ae110c9ab32e9a6916b","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98fc1d853ed7c38ec64399121ac6e96d53","guid":"bfdfe7dc352907fc980b868725387e98b36210ea7ea6f2dc56f34a75a5f98870"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c0d03884f20c6bbb2234aee407c81ed1","guid":"bfdfe7dc352907fc980b868725387e98807c0f13ab38bf78a255422ace44851d"}],"guid":"bfdfe7dc352907fc980b868725387e9802e6907f47df982f511318ee6421866b","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98f9972619f6373dcc7a588e3720ff6b1d"}],"guid":"bfdfe7dc352907fc980b868725387e9853f06540a2b47e2bce34c4f52b96b9b7","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98d3f2eef9a97764f5506e64926c3bef1a","targetReference":"bfdfe7dc352907fc980b868725387e987b6c2f882d164ef4f3c76673562685a1"}],"guid":"bfdfe7dc352907fc980b868725387e981ef7df0f5e6435e5f909151e5c6d893c","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e987b6c2f882d164ef4f3c76673562685a1","name":"package_info_plus-package_info_plus_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98a5ae7244e41cc249cf7186dbb9962ecb","name":"package_info_plus","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98d9c4afca85b28d898f3002d0bb74c874","name":"package_info_plus.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b02384d9efc0e497521a0ba9096939bd-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b02384d9efc0e497521a0ba9096939bd-json new file mode 100644 index 00000000..fc2aa7ba --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b02384d9efc0e497521a0ba9096939bd-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9875a911280513a51a1fcc833a02e1e86d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/sqflite_darwin/sqflite_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"sqflite_darwin","PRODUCT_NAME":"sqflite_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ee49f65d26d8a0c930cc03d16e0ffcc8","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b2e50aea12e109eb95c45970b36f8a43","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/sqflite_darwin/sqflite_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"sqflite_darwin","PRODUCT_NAME":"sqflite_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987d3fcd01a34fff9e18dec0764bcc371e","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b2e50aea12e109eb95c45970b36f8a43","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/sqflite_darwin/sqflite_darwin-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/sqflite_darwin/sqflite_darwin.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"sqflite_darwin","PRODUCT_NAME":"sqflite_darwin","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e984def481d54810d0de6d3335b228b2a5d","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e983e7d9fa60b774739ab0d6568bf07a351","guid":"bfdfe7dc352907fc980b868725387e98f74bfe561cdc142d140be02f934f1dd5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9879477fd65084cc006d19101f02256fe0","guid":"bfdfe7dc352907fc980b868725387e98128d41c6be7fab5e0c350afb32404ee9"},{"fileReference":"bfdfe7dc352907fc980b868725387e980e35fc805e7942676dde7f6a6cceca96","guid":"bfdfe7dc352907fc980b868725387e98996eaada1ef569420cabc129d90e2da5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98592da7f3a49d3059663aa71a58cd0a4a","guid":"bfdfe7dc352907fc980b868725387e987840c2aacd1ce55599623d2fd8219817"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ac0abeeeb91ccc5902df814d398020ae","guid":"bfdfe7dc352907fc980b868725387e9843bbc6c7e6cfcb0b409324fd055d0733"},{"fileReference":"bfdfe7dc352907fc980b868725387e980c6eff3a04d8f600b147b66f518c810b","guid":"bfdfe7dc352907fc980b868725387e9808d4ef82ccec1924430403b3fad24e14"},{"fileReference":"bfdfe7dc352907fc980b868725387e9812a82c89a68ff3aa4668003694edb150","guid":"bfdfe7dc352907fc980b868725387e9848d7f4c6b424b5eb3bda0e21cd2f4b1a"},{"fileReference":"bfdfe7dc352907fc980b868725387e987a187bee2cf8e65d0c11cbf842b8d0a7","guid":"bfdfe7dc352907fc980b868725387e98fe5a8d4fd311a1de8df3b173d547fb02"},{"fileReference":"bfdfe7dc352907fc980b868725387e985d2f0271270070876a34fb6538811993","guid":"bfdfe7dc352907fc980b868725387e98d7926028771abe4490aea6eb057df0a7"},{"fileReference":"bfdfe7dc352907fc980b868725387e985e37b28cf8fbbaa7f69a2cadcd43d21c","guid":"bfdfe7dc352907fc980b868725387e98ba15d3216bf17a3026096f27b47b2084"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d68895a313533798394d82163692c629","guid":"bfdfe7dc352907fc980b868725387e9866e8ad8c42705df73de9d3ea6a45d657","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988b79e3ba836e166f4d2c19a363e77ef6","guid":"bfdfe7dc352907fc980b868725387e986ed45bb24536a4f4c65921c87272200d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c9475c24e421f8b84743f5f595dcf902","guid":"bfdfe7dc352907fc980b868725387e9839c167ada258f3fc19ab5c4d03331d93"},{"fileReference":"bfdfe7dc352907fc980b868725387e985cac4af7f944cc0b3df8c11a0e43e286","guid":"bfdfe7dc352907fc980b868725387e9812641da7dad587b2e5c4f906d00a4d67","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98cc465b98567e5be1dff8b7284a07e4e3","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e982eb21757b507687455f8acb8e01017e3","guid":"bfdfe7dc352907fc980b868725387e985adaa6c4e40f33315ac0cec984200988"},{"fileReference":"bfdfe7dc352907fc980b868725387e9830c704358e50b5466ffb0fa7d6c2e209","guid":"bfdfe7dc352907fc980b868725387e98b66bc2a5e8397ad7553c7550ed81a8b3"},{"fileReference":"bfdfe7dc352907fc980b868725387e982ce4fd3b13126d36c4c105bebc0d9fd1","guid":"bfdfe7dc352907fc980b868725387e984dfb7eb30a2be401cd610bfeffd4e000"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c6a0774da49442d88e4fb061e345fcbf","guid":"bfdfe7dc352907fc980b868725387e98f121c456012e84e3920b1e569a862cc8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98018efb908ca6e0716b824fc860f61c9b","guid":"bfdfe7dc352907fc980b868725387e981a3796db56db3bbb0b570434bd6eaebc"},{"fileReference":"bfdfe7dc352907fc980b868725387e9853e6f394a4d03f7b423702095b9e1482","guid":"bfdfe7dc352907fc980b868725387e986949c0ee9f19296b1da4b9965340e04f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c8dd825ce814e57bbe46ce1cda93d700","guid":"bfdfe7dc352907fc980b868725387e988dfb0b3f564c83890326c01342984f36"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f0b4b8929472bef1ea1691b2d60d35bb","guid":"bfdfe7dc352907fc980b868725387e983c190223341c96acab486a2921e070db"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e7fb17279cf291b6e4e53390f27f299e","guid":"bfdfe7dc352907fc980b868725387e9868a5700dd6e3280ea41f8cb79e1d012a"}],"guid":"bfdfe7dc352907fc980b868725387e9837c2f0a37c50e959478519168227e455","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e982f461d51c284a55b8f869fc9092ae5dc"}],"guid":"bfdfe7dc352907fc980b868725387e98dd47f73652ff7b522b7942f6a87afd23","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98d17544c34b81de618417de5f9c91b4ec","targetReference":"bfdfe7dc352907fc980b868725387e9883134bb5f399cb37a1eb075d4fea30d8"}],"guid":"bfdfe7dc352907fc980b868725387e98e60a652c76bfee084293e97b00176921","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e9883134bb5f399cb37a1eb075d4fea30d8","name":"sqflite_darwin-sqflite_darwin_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e981304d3d2169071b3ca365b19f5340b7c","name":"sqflite_darwin","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98dbbec3eebed26c79cc653713be723aba","name":"sqflite_darwin.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b77db6430f49f02a32943c46bd03734b-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b77db6430f49f02a32943c46bd03734b-json new file mode 100644 index 00000000..d89e2b5f --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b77db6430f49f02a32943c46bd03734b-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98de35fcdac3f67fe0119b4d27e7b7c6d4","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/share_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"share_plus","INFOPLIST_FILE":"Target Support Files/share_plus/ResourceBundle-share_plus_privacy-share_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"share_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98e5a3d2d567b139959df75218c71b66fd","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d3219dc3abe23add073ba57e4e5929db","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/share_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"share_plus","INFOPLIST_FILE":"Target Support Files/share_plus/ResourceBundle-share_plus_privacy-share_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"share_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e986d4684892a6fdb9c01a08656828b5ab4","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d3219dc3abe23add073ba57e4e5929db","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/share_plus","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"share_plus","INFOPLIST_FILE":"Target Support Files/share_plus/ResourceBundle-share_plus_privacy-share_plus-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"share_plus_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98faa8faccc0ce834a2f40454a96ae0f16","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98f228107ed7261ebdcf699369e1ff469b","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9831f10af7cac106e78a3f4ac65215ce6c","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98599bbd5b1a4bdbf5bed39a964d34f18c","guid":"bfdfe7dc352907fc980b868725387e9841c969f816d52d2934fec436e4bcc8ad"}],"guid":"bfdfe7dc352907fc980b868725387e9838153627aa97afe0a969918517cff7fc","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98de00f90750e7753637464fe34137709d","name":"share_plus-share_plus_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e987f86a96a3ca03f6247aa68a7b2c0bfd0","name":"share_plus_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bca7282312c3cbd6420517c0b06b2299-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bca7282312c3cbd6420517c0b06b2299-json new file mode 100644 index 00000000..b8afac45 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bca7282312c3cbd6420517c0b06b2299-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e980e6a79d9461f52673e9cd16e5e9ce12b","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_picker","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_picker","INFOPLIST_FILE":"Target Support Files/file_picker/ResourceBundle-file_picker_ios_privacy-file_picker-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"file_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98e7e78ac96f79fef2cdccc6cc993884eb","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9855ea28d68c6105425b28b0dc67fbf53b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_picker","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_picker","INFOPLIST_FILE":"Target Support Files/file_picker/ResourceBundle-file_picker_ios_privacy-file_picker-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"file_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98030df92af3ffb7185e5f144aaca5e69d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9855ea28d68c6105425b28b0dc67fbf53b","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_picker","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_picker","INFOPLIST_FILE":"Target Support Files/file_picker/ResourceBundle-file_picker_ios_privacy-file_picker-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"file_picker_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98a14345481287e8e98db95bfecc704979","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98b1fa9f9f46dd0e1ce069cb3a890829f1","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9819ce6287b1cc301d39929c98d63e4509","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b551b0a25b90abd62be165059ca67d67","guid":"bfdfe7dc352907fc980b868725387e98c89ed2b7d867d492dce9accf965b0a06"}],"guid":"bfdfe7dc352907fc980b868725387e988e8f9fb9411ed3d8661c320a247fd84e","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e985452a642045cac0ef7c37f93da2d994e","name":"file_picker-file_picker_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e985ae769d0b989789f9e90cfb215ac5a2e","name":"file_picker_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bec8a7e752ab7d5daa41943969c542ce-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bec8a7e752ab7d5daa41943969c542ce-json new file mode 100644 index 00000000..d6fa787b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bec8a7e752ab7d5daa41943969c542ce-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981ccda656ca076caea1e69514af198f0f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"GoogleUtilities","PRODUCT_NAME":"GoogleUtilities","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98793392d0b2a0b5d47aa3f042e39e70ae","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984a59f58d9dc78fdedc9a249bdac259e0","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities.modulemap","PRODUCT_MODULE_NAME":"GoogleUtilities","PRODUCT_NAME":"GoogleUtilities","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9865b9fba70050dac6138d14ba73a94446","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984a59f58d9dc78fdedc9a249bdac259e0","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/GoogleUtilities/GoogleUtilities.modulemap","PRODUCT_MODULE_NAME":"GoogleUtilities","PRODUCT_NAME":"GoogleUtilities","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98519621d5de4a46cb8b7b01ccba5eacb9","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98845f39c98795e88b4a4937d3cf6cf467","guid":"bfdfe7dc352907fc980b868725387e98c0262c52c9f15ef9b1cc1cf21b27b91c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c29046bbab936122dbb0c2cfc14ba72d","guid":"bfdfe7dc352907fc980b868725387e985fa36fcbbe638b46a9f4e712443948b4","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eab1d503d7f2282f98d6d9a02d7ec14d","guid":"bfdfe7dc352907fc980b868725387e981d941a5de8bead97782cad810830a5a9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d2f8185c0a44a500020d910dc85efd9a","guid":"bfdfe7dc352907fc980b868725387e9830090dec5db655b35732530148a40c7b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980cb51518c389a1e74d47410a29888c54","guid":"bfdfe7dc352907fc980b868725387e982356d4b36aed609ad10f91702457d2d2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985108977873122d0fd57cf870ac976fae","guid":"bfdfe7dc352907fc980b868725387e988cc9ac141aeb4adbaae609c44b9a4fe6","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9852edbfb572efb173287d7f90327aaf76","guid":"bfdfe7dc352907fc980b868725387e98bd963f63c09db904c898ba55d88dc71d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98618f336933ff6de3d4b3c21ed135498e","guid":"bfdfe7dc352907fc980b868725387e980021e82b1497257aa0218fd3c8f86e17","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98475fd4618ac5ac675f5ed1b8f6b6716f","guid":"bfdfe7dc352907fc980b868725387e98a3c778a2514863bfcb2200fbf5100c9e"},{"fileReference":"bfdfe7dc352907fc980b868725387e981958c32a9380d192ba5d6d582d804a04","guid":"bfdfe7dc352907fc980b868725387e98958acf964d2ae7e3caee0b8c451b09e2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98873946fb03e9b9792f4f2c868cb04157","guid":"bfdfe7dc352907fc980b868725387e98b343a1a932677bfa2d18cb1a0b144e68","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b539eaa0485467aec39f108decf7ce35","guid":"bfdfe7dc352907fc980b868725387e9801eeb14b9dd6704e7b6066d9c8d61296","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f596251d1ba47fb590a11c4fedd4bad6","guid":"bfdfe7dc352907fc980b868725387e9846adbe422c2bde237a26674cdee17b78","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed0c4266fd7527af26b4180205338e03","guid":"bfdfe7dc352907fc980b868725387e98d2f912486e901ca4584510e98f725ace","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988a9a3e02046e4440587c711dad22de63","guid":"bfdfe7dc352907fc980b868725387e98d327704c98281573a8ec6d9f45cd28e1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98676e9831ef9ffb5a827c77d203afd919","guid":"bfdfe7dc352907fc980b868725387e98d5b724d922712a9f76e08f61fb9fc70a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98436c7dd83d7131340adf9904ee2a22d7","guid":"bfdfe7dc352907fc980b868725387e98206fab94717a61cfafb039ff58d35a0c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e8161f35d2f39b644227bef4985f0d59","guid":"bfdfe7dc352907fc980b868725387e984f0c21ccd5e36ab7f241e3e752a500d5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e22f64f75d44ed26f0063f98c220931a","guid":"bfdfe7dc352907fc980b868725387e98d02fb7f9dfd74d0dec91d6fd11390716","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c794a9f352278aabf8d2fa9bcf1b4ee3","guid":"bfdfe7dc352907fc980b868725387e988d2bd0cc39ccea78c5be517ca9aa42f5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c2d21cc3ccea47a9793788238de5094","guid":"bfdfe7dc352907fc980b868725387e981abe0c3f1cd919f7bd4e32b734e6bbbb"},{"fileReference":"bfdfe7dc352907fc980b868725387e987937768805e8acc718e8e50513d69cbd","guid":"bfdfe7dc352907fc980b868725387e98feba0120075400ed3b201e8a30659f68"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ade842c0931397013938f333262dace9","guid":"bfdfe7dc352907fc980b868725387e98b05dbd36b34edd4e1be09d01b2284cdc","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e988abc52683367496919aa598227a1331f","guid":"bfdfe7dc352907fc980b868725387e983596e2b4984780a693f2792b1b5a7f18"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c5a84dc841d16549464a86e97f593c03","guid":"bfdfe7dc352907fc980b868725387e98b90568286da862f16e2f88320a146302","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985c18bce96838a531d4d7946d6ee3e86f","guid":"bfdfe7dc352907fc980b868725387e980dd4450c821da3e2ad3d478e338edb04"}],"guid":"bfdfe7dc352907fc980b868725387e98a415572b1562595f0c46e5b5cf8592bd","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d975ca315b4242d5baed303cb7aab051","guid":"bfdfe7dc352907fc980b868725387e98a4e7a20628e3d8b892e2b48e14f91028"},{"fileReference":"bfdfe7dc352907fc980b868725387e9836a90af84591e983274e6666393b3a2e","guid":"bfdfe7dc352907fc980b868725387e98ee00a6c9a0a56d9de69a03305b6e1921"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c27f8b93b1c490fbac91a853d0924367","guid":"bfdfe7dc352907fc980b868725387e9862c73f036c4c9fdbb78c54f564e9215d"},{"fileReference":"bfdfe7dc352907fc980b868725387e9804c38c80ac78ea91dfede61e8a02a9f4","guid":"bfdfe7dc352907fc980b868725387e9886b3f0d7704f9a75be922ea3657120f9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e76ed7edc7a31347233120173cdb2e3a","guid":"bfdfe7dc352907fc980b868725387e985c49d2645e456f63d33f45596d887b24"},{"fileReference":"bfdfe7dc352907fc980b868725387e984a49ba4137eac58897391a09f550b916","guid":"bfdfe7dc352907fc980b868725387e98eb3975180c5f303377eaa8dcb3c5e4b9"},{"fileReference":"bfdfe7dc352907fc980b868725387e983e9921832e287ee04048d221e1bee849","guid":"bfdfe7dc352907fc980b868725387e98e09616b72f88ba692ee8f54bc10ea5f2"},{"fileReference":"bfdfe7dc352907fc980b868725387e987128275d56f53442e3921be1a6970593","guid":"bfdfe7dc352907fc980b868725387e981dfcf72b4e28b55038f17a958454cd59"},{"fileReference":"bfdfe7dc352907fc980b868725387e985b8cba972f211425405a63011c53445a","guid":"bfdfe7dc352907fc980b868725387e980effb268955087e7db669e1da6146955"},{"fileReference":"bfdfe7dc352907fc980b868725387e98089b73b727d89e627dc2d8e0e82dc186","guid":"bfdfe7dc352907fc980b868725387e982db3d27f87f50556ca44b543574d7b21"},{"fileReference":"bfdfe7dc352907fc980b868725387e9823abfe0467d22e8134a5c86c0381cf91","guid":"bfdfe7dc352907fc980b868725387e98e6a3c5ca501d74d506859ab16548b704"},{"fileReference":"bfdfe7dc352907fc980b868725387e9817e6f355fc27ce11ca9eca96e7177a5a","guid":"bfdfe7dc352907fc980b868725387e9832f2896fe76316470f82abcc257092b7"},{"fileReference":"bfdfe7dc352907fc980b868725387e986a169b3bbe51ae95f696d081d0a7c6eb","guid":"bfdfe7dc352907fc980b868725387e9875ad916c74e8c7cdcd6bb32d8b717aad"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bb8b15be2869f96e89cb90c94f936c88","guid":"bfdfe7dc352907fc980b868725387e989a97cc9235d7af64c66d6b89dfc849f1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ab52ae4e38d39e8507fe9603aa99a926","guid":"bfdfe7dc352907fc980b868725387e986765d5ed97e290f49fbf5472819df038"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c93ef45b447d11d19620fa2627f46021","guid":"bfdfe7dc352907fc980b868725387e987fc888c7b9d41ccda5cc7e0bc571494f"}],"guid":"bfdfe7dc352907fc980b868725387e98baa793ef163ae38add98dde80ec0f028","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e989cc92cbf6cfd341c97b42afe5ef3ae15"},{"fileReference":"bfdfe7dc352907fc980b868725387e9820c167798bdb228b4ab52bb2aa7eb24b","guid":"bfdfe7dc352907fc980b868725387e984219e8ad2796683567b161d56d0542fc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e0217d662efb0603efc52f1254a3c7a8","guid":"bfdfe7dc352907fc980b868725387e98494756648d148dfd85a540d5dfa40c0b"}],"guid":"bfdfe7dc352907fc980b868725387e9888e6a5479802250bf82d036ca17f7195","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98fa55bb6ad9a1e437351d0ec8ac00da47","targetReference":"bfdfe7dc352907fc980b868725387e981a9fac6eb9c80f8eed49fda0531af6a4"}],"guid":"bfdfe7dc352907fc980b868725387e9807086d74acbea69d70cf2d58f1edcc28","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e981a9fac6eb9c80f8eed49fda0531af6a4","name":"GoogleUtilities-GoogleUtilities_Privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98ca49ca851f2777b997a3e74ccb860358","name":"GoogleUtilities.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c1be6d82376acb043052cbc000a547ae-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c1be6d82376acb043052cbc000a547ae-json new file mode 100644 index 00000000..18e5871b --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c1be6d82376acb043052cbc000a547ae-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982b66b547d250357cf91d1817df7cb423","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_selector_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_selector_ios","INFOPLIST_FILE":"Target Support Files/file_selector_ios/ResourceBundle-file_selector_ios_privacy-file_selector_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"file_selector_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98eba1323e3dd271e674c3ba6f2a782347","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f68cdcb857b34033c4bd7d63083cfeef","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_selector_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_selector_ios","INFOPLIST_FILE":"Target Support Files/file_selector_ios/ResourceBundle-file_selector_ios_privacy-file_selector_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"file_selector_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98fdbc6e81278bdd854b5da56b6983cac8","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f68cdcb857b34033c4bd7d63083cfeef","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/file_selector_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"file_selector_ios","INFOPLIST_FILE":"Target Support Files/file_selector_ios/ResourceBundle-file_selector_ios_privacy-file_selector_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"file_selector_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e986442f840b2209922c85f4e1df1016096","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9873c1f4137498928a8efc00e6d59a0cd2","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98f1ee2d7e135b464c46b9d2c75d8df4ce","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9829fbee1379c76a8f9639197078562c42","guid":"bfdfe7dc352907fc980b868725387e98582312471fe04e4750555118964d8479"}],"guid":"bfdfe7dc352907fc980b868725387e9895fd39c9cc061b537d91a78419bbb412","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9865c7202c1fc33b2af510b64e6d532fb2","name":"file_selector_ios-file_selector_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98eea7ddd1978d7c6c4a7d366f56242af7","name":"file_selector_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c369ca2358afe46d56e9c4f067675637-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c369ca2358afe46d56e9c4f067675637-json new file mode 100644 index 00000000..099db5b5 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c369ca2358afe46d56e9c4f067675637-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98d8979ec56d38d5f43a66a4cc2fbcb401","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"webview_flutter_wkwebview","PRODUCT_NAME":"webview_flutter_wkwebview","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981ff4ee6b2d87a9b32a1fe29a8421b0e6","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984206827662d5208f461a0eccfc0e621b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"webview_flutter_wkwebview","PRODUCT_NAME":"webview_flutter_wkwebview","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b244d36e17c524559c280c5efd5caedf","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984206827662d5208f461a0eccfc0e621b","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/webview_flutter_wkwebview/webview_flutter_wkwebview.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"webview_flutter_wkwebview","PRODUCT_NAME":"webview_flutter_wkwebview","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98e47e65136b50e077c8953dbf59006fc4","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98be6867ee97e573510941c1420420ae39","guid":"bfdfe7dc352907fc980b868725387e98e0a1b1bbd80a1d9ab7e3e2b4fcedc873","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9879a9cedcfbca7cfcd9ba78e739bf32b6","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e986ae0ecde56284e1c58ce266e014e4407","guid":"bfdfe7dc352907fc980b868725387e9804497387339cafa9cc0710798da9ab64"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ffad4f1ea24597bdb838ed18709ce0bc","guid":"bfdfe7dc352907fc980b868725387e9843ac0921cd4dffc47af17967f5b9c6ce"},{"fileReference":"bfdfe7dc352907fc980b868725387e986cf40d51c23844c27b2d3847574a999b","guid":"bfdfe7dc352907fc980b868725387e98d890a6ca4f2c764e0fca35bc611a04f4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ccb07914d3f2ac2700b37e1af527dcb6","guid":"bfdfe7dc352907fc980b868725387e98814241f3358abc9857a079a41bf1b6e7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c274a9bb2f458649df20b73def238a31","guid":"bfdfe7dc352907fc980b868725387e98dbbae3640a8353a0e9a293c659d45397"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b087fab6a6147e88ea8188b98eb479b2","guid":"bfdfe7dc352907fc980b868725387e9833be444c57cc0be316f626b45c704949"},{"fileReference":"bfdfe7dc352907fc980b868725387e983f800f06f13b5c13b4116ae2800ebd62","guid":"bfdfe7dc352907fc980b868725387e9821369c9e099718006da852370f44fbfd"},{"fileReference":"bfdfe7dc352907fc980b868725387e9858a1908524c1677a38ba9bec48112f5d","guid":"bfdfe7dc352907fc980b868725387e98d72cc48cc1d54e0688fca37b330a2e1d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98936d1a39e1338c5cff1f46f1bdcbd970","guid":"bfdfe7dc352907fc980b868725387e987583e6f4a703ae590962a4382dfc5fb0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b7c272896c5e5a1f7466f96e730ef7f7","guid":"bfdfe7dc352907fc980b868725387e985c17fc1fb796a67ef777f60e1717153d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c92dad67cbc17d9bb7df16017787161e","guid":"bfdfe7dc352907fc980b868725387e987e9b17b47846c4b2a6277c4abbd35061"},{"fileReference":"bfdfe7dc352907fc980b868725387e989c9816f986731e3e1d1441ad2f76dc0e","guid":"bfdfe7dc352907fc980b868725387e98007dc0ddb0e127b1a5671d0008a272f3"},{"fileReference":"bfdfe7dc352907fc980b868725387e9880ed52f43c3c027879cb9c6fa4a7ad00","guid":"bfdfe7dc352907fc980b868725387e98755ada3e2b64bb977e99bf43b9026bdf"},{"fileReference":"bfdfe7dc352907fc980b868725387e98978f7d76a4c8e6fe24dc8571670abd23","guid":"bfdfe7dc352907fc980b868725387e981f8977c1d4425fc583ccc5400ae5d18c"},{"fileReference":"bfdfe7dc352907fc980b868725387e986681d4e22fff219fca4ec770df70c9e1","guid":"bfdfe7dc352907fc980b868725387e98350d85f6b218fefc56e5c4fbe12c79ba"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d4eec0353bf3d879db362a265046b0e7","guid":"bfdfe7dc352907fc980b868725387e98a98a965bbbe16ed249af77c3b5ab3401"},{"fileReference":"bfdfe7dc352907fc980b868725387e980d2fd3010d16903a103f41c3d714b7e9","guid":"bfdfe7dc352907fc980b868725387e98c4cb265a1860102b4c54c2f462f29ac4"},{"fileReference":"bfdfe7dc352907fc980b868725387e988a05d69eb8d96765483690bed6c8821a","guid":"bfdfe7dc352907fc980b868725387e98b0598cc906ed0036c8b88aa60059401b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98758323be30595585a4e9d22cb3236be5","guid":"bfdfe7dc352907fc980b868725387e989e8b0793dc1d5c92ae425907dac008bf"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b4d68270040b8330c48a9bfda2ee1f78","guid":"bfdfe7dc352907fc980b868725387e9869ea031087413fd4090b2b02ba609845"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e3f1b198c65452c6f005bd694e225209","guid":"bfdfe7dc352907fc980b868725387e981414040a2834de2dbd9637ac4f1cfa08"},{"fileReference":"bfdfe7dc352907fc980b868725387e983ea44e48c15b67058eab146e81a72a1b","guid":"bfdfe7dc352907fc980b868725387e986c0d146f8cfba8a7f0d0c55d64870918"},{"fileReference":"bfdfe7dc352907fc980b868725387e9847e082023cbf1f0ad654c010c16055b9","guid":"bfdfe7dc352907fc980b868725387e98b938c7f743065b74bb9ca1dc7477d29b"},{"fileReference":"bfdfe7dc352907fc980b868725387e9888e40043e949782763c5e735d32e3a70","guid":"bfdfe7dc352907fc980b868725387e9858a580b83d292a930544934f57a5718c"},{"fileReference":"bfdfe7dc352907fc980b868725387e9881237e59a4bd058f54f8676a7cd5b107","guid":"bfdfe7dc352907fc980b868725387e98b92c9489cd59260396946a41ba58fafd"},{"fileReference":"bfdfe7dc352907fc980b868725387e985a450fed3b83a420034fb96375aeaa79","guid":"bfdfe7dc352907fc980b868725387e988a4f4239ede72ab7e8922905b5aa2e58"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f452d1e497caac321e297e891b43bdb8","guid":"bfdfe7dc352907fc980b868725387e98cc382c3acf3dd29c9f32dc46bee90b52"},{"fileReference":"bfdfe7dc352907fc980b868725387e9813ac29d09ae3837e5525c4b1de95e553","guid":"bfdfe7dc352907fc980b868725387e982b87084c9a83b96bf37c4927bd9678c8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fb109f357f6fb05d543e2466bcb69c4d","guid":"bfdfe7dc352907fc980b868725387e9847d5a54a6dae7c8f2308ac848fa3b054"},{"fileReference":"bfdfe7dc352907fc980b868725387e98823c5c55a09222a1e95e42f7723b1e09","guid":"bfdfe7dc352907fc980b868725387e9884c71385d871476ef7cffdf9fbbe2e22"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d37a1bf89227943cc5f9bf8dedaec4de","guid":"bfdfe7dc352907fc980b868725387e98d39e285a97235c21ed8fb578a8217419"},{"fileReference":"bfdfe7dc352907fc980b868725387e9809ccb0b60ddd3aa24d201b1fbbf78872","guid":"bfdfe7dc352907fc980b868725387e9821a546435ddb540d19676b751b14b9fc"},{"fileReference":"bfdfe7dc352907fc980b868725387e985e9a33b760a4323436cf8a2ac5237f2c","guid":"bfdfe7dc352907fc980b868725387e980f1cb66fba3ef968844a70a896340de4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98507cc65c36bbdd5e0f5f59644120aa86","guid":"bfdfe7dc352907fc980b868725387e98281cd180c02d9272bc18f2a08984bf02"},{"fileReference":"bfdfe7dc352907fc980b868725387e985144a306910625f395b522423bd48599","guid":"bfdfe7dc352907fc980b868725387e98f7bced146748f847485cd1f302b2f0a8"},{"fileReference":"bfdfe7dc352907fc980b868725387e983eb7aeab09594d1843bdb8ee61e437b3","guid":"bfdfe7dc352907fc980b868725387e98b79d76c44769f57337a5cd1a455fa902"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d5f967adad441e2ff1ad91ba479d4fcd","guid":"bfdfe7dc352907fc980b868725387e98f1bb703c89e6ca91a4e2a0d3959b07c6"},{"fileReference":"bfdfe7dc352907fc980b868725387e987d4bd25f4b769d8f640b3dd0b8ae5a1c","guid":"bfdfe7dc352907fc980b868725387e98e309e19dc03b36bd23901e28ae223d12"},{"fileReference":"bfdfe7dc352907fc980b868725387e9859611e05685d6f3b5c95a6eec6a330ea","guid":"bfdfe7dc352907fc980b868725387e98857d8feaed8a37a106927cef8fc88ebc"},{"fileReference":"bfdfe7dc352907fc980b868725387e986201e1488ad29294b96f9cba25c0615c","guid":"bfdfe7dc352907fc980b868725387e9865ef2fd4b4dac4d75c4ce457bd7b29da"},{"fileReference":"bfdfe7dc352907fc980b868725387e9861f6692e45bf40cd6897b227a33ace1d","guid":"bfdfe7dc352907fc980b868725387e9876a7199f6857234bd7f8a09a196d6a55"},{"fileReference":"bfdfe7dc352907fc980b868725387e98639301e9eea43149be010207d55747c9","guid":"bfdfe7dc352907fc980b868725387e98e7610a3878889873b335f8473a930955"},{"fileReference":"bfdfe7dc352907fc980b868725387e98494f5fc7ec16230a398c9f181fa0e807","guid":"bfdfe7dc352907fc980b868725387e98a4a20ab870fa902d9dabc0fd394cca80"}],"guid":"bfdfe7dc352907fc980b868725387e98d4e227abc1c57dee11b04c0677be8616","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98a7ed74afb34752809424c1b2ac24db77"}],"guid":"bfdfe7dc352907fc980b868725387e9866a573d4e48c5bbeb13b62681d9717c9","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e987c92de85c218b74dbd9157bc9f7aed23","targetReference":"bfdfe7dc352907fc980b868725387e987c93e943aa0a38b5f6684beaf6b4a3a1"}],"guid":"bfdfe7dc352907fc980b868725387e984f679f16df53a306ffce2a9c05640f8a","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e987c93e943aa0a38b5f6684beaf6b4a3a1","name":"webview_flutter_wkwebview-webview_flutter_wkwebview_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e988efdc4dd0ac29b43123295eca853f4ed","name":"webview_flutter_wkwebview","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e980823710353e0487822d6da09bf8d6254","name":"webview_flutter_wkwebview.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c57ff86689b99a8853e2ae591b9ac8c6-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c57ff86689b99a8853e2ae591b9ac8c6-json new file mode 100644 index 00000000..4e5303ca --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c57ff86689b99a8853e2ae591b9ac8c6-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98853911a66086d603dff7e7f648c6248b","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SDWebImage","INFOPLIST_FILE":"Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e987218912d294645b3b061e54e6c882221","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98924a369cb6c964ba34275d7ca3bc2dda","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SDWebImage","INFOPLIST_FILE":"Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98b213cdb98f11db9ecabdd1455560e3fa","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98924a369cb6c964ba34275d7ca3bc2dda","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SDWebImage","INFOPLIST_FILE":"Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"SDWebImage","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98b6c6260be17345855bd089cbb61b41f4","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9832f8c2b10ec49e95a69b9f72be30b01b","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98854260f87d35c4ac72c21ca3148ffe52","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f00a9964af8b3d1e72008eb9a3395135","guid":"bfdfe7dc352907fc980b868725387e988bd3504482fe41a43249d3c6d8d5b4a3"}],"guid":"bfdfe7dc352907fc980b868725387e983443094cc631a439428563c47a920aa9","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9826e2628dc041aabe2d77e75ccb1dc95b","name":"SDWebImage-SDWebImage","productReference":{"guid":"bfdfe7dc352907fc980b868725387e986798c379d76b6055dc2d719d4bd63a69","name":"SDWebImage.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c5e74116acf786c1a12c0ae36c3b648b-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c5e74116acf786c1a12c0ae36c3b648b-json new file mode 100644 index 00000000..e0488bc0 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c5e74116acf786c1a12c0ae36c3b648b-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bcd767e09eacb2538a5dd8f4781036cb","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/screen_brightness_ios/screen_brightness_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"screen_brightness_ios","PRODUCT_NAME":"screen_brightness_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a2af83387b7f3af699711d80a904da92","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e478cdbb3210aa9b19b78eddddb7437c","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/screen_brightness_ios/screen_brightness_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"screen_brightness_ios","PRODUCT_NAME":"screen_brightness_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98df48769a0fc5dc7cafbde54a79e119b8","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e478cdbb3210aa9b19b78eddddb7437c","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/screen_brightness_ios/screen_brightness_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/screen_brightness_ios/screen_brightness_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"screen_brightness_ios","PRODUCT_NAME":"screen_brightness_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e989fefe900bb2130e1e726407ba4e2e561","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e987ab43a0db493d8c4b0f8700a9bfc1b25","guid":"bfdfe7dc352907fc980b868725387e98d6c1da118da235177a9397058e862c48","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98517a14fedf6aa01968b8a59f4d7f5262","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98cf5aede3c3831b4f8bb98fbaee4e8fbb","guid":"bfdfe7dc352907fc980b868725387e9871dc3b6d091b7ca1e83d8da47ff66fa2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d17b81a48ac298f16189bcd229ac4ecc","guid":"bfdfe7dc352907fc980b868725387e9809abfeeb7eb19d943e849561924b830c"},{"fileReference":"bfdfe7dc352907fc980b868725387e988e75d6c80cb6aa025440d7188964cd4c","guid":"bfdfe7dc352907fc980b868725387e98712e1e09d35effc38f167fb5b3c3c932"},{"fileReference":"bfdfe7dc352907fc980b868725387e982068862e6717c819c4fbc09fb536b24a","guid":"bfdfe7dc352907fc980b868725387e98518ec4d404496f3c73d93ec41b9ab6ba"}],"guid":"bfdfe7dc352907fc980b868725387e98eb5b89b7940e57fc9e4c6e0b580085c5","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98ded547427679d36d2213c27860bb1ca1"}],"guid":"bfdfe7dc352907fc980b868725387e98a56bbbbc075976e8dcfb497aa10844ff","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e988d81158616dbbb23e539b8849635a386","targetReference":"bfdfe7dc352907fc980b868725387e98e778028627b75b5d409ed7c4767eb6e1"}],"guid":"bfdfe7dc352907fc980b868725387e98bee5b610c5d575db1acc7bab68c103b6","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98e778028627b75b5d409ed7c4767eb6e1","name":"screen_brightness_ios-screen_brightness_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e980c3d3b60e3a8ded9747b35c2abc6c55a","name":"screen_brightness_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98068fa378c761628650c0ac4b495bd4f4","name":"screen_brightness_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c7e279690d57f8e9617670c2dd8215da-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c7e279690d57f8e9617670c2dd8215da-json new file mode 100644 index 00000000..68478a06 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c7e279690d57f8e9617670c2dd8215da-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c744f4c75270e1fd52589ff556e2583a","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/printing/printing-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/printing/printing-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/printing/printing.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"printing","PRODUCT_NAME":"printing","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e989180cbb294342c37c56fef1b2a496a3e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9848711414c4cdd6db7086eae6ec63ab7b","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/printing/printing-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/printing/printing-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/printing/printing.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"printing","PRODUCT_NAME":"printing","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982f826a4dc5d774d621798c14630037db","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9848711414c4cdd6db7086eae6ec63ab7b","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/printing/printing-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/printing/printing-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/printing/printing.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"printing","PRODUCT_NAME":"printing","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98afa791a1e715b561d31327b1e18fa2fa","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98bd71f2ad20b6a88b723ff05b2d7e23ad","guid":"bfdfe7dc352907fc980b868725387e98c5232107b13054f10b2125348c3b89be","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98f8c7b0feb00d4a0d796038a589dcbff4","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e983df66a6182a9ad3e5e664af1554596bb","guid":"bfdfe7dc352907fc980b868725387e989998bbcd9cfe43fdb81f921bbd512cd0"},{"fileReference":"bfdfe7dc352907fc980b868725387e986c7db250b8f3f408d66f6e7a19972379","guid":"bfdfe7dc352907fc980b868725387e986d0f5149546efd2bae23df8631a6d086"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f47fd36e52148ce929fdb4b957af7e73","guid":"bfdfe7dc352907fc980b868725387e982a196f855aa1f83323a5de96d3fa205b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98176d3062b5d63f50555ac516d1a7b762","guid":"bfdfe7dc352907fc980b868725387e98e7cce645e1a486b20be6ea77f4446896"},{"fileReference":"bfdfe7dc352907fc980b868725387e98151367d82561314a10d2c18601c9b287","guid":"bfdfe7dc352907fc980b868725387e98138beb7de231d45c702665b1097b614e"}],"guid":"bfdfe7dc352907fc980b868725387e98762120b03e967ca976ed83bb9ff49e9e","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e986aa8e5e3dd58adad6e672f929ff69a9d"}],"guid":"bfdfe7dc352907fc980b868725387e988677d1d09f996e86d984b8e885573392","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e988e57b82a9a8cfa20eca24bd310928f38","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"}],"guid":"bfdfe7dc352907fc980b868725387e9868b3737835b98c013ea1e742f994ae22","name":"printing","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e983541805154b8a0a140f969f779b5ca3a","name":"printing.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c832b6797055a73fc2a937f2ace5a80c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c832b6797055a73fc2a937f2ace5a80c-json new file mode 100644 index 00000000..62ef455a --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c832b6797055a73fc2a937f2ace5a80c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9850cc7fc2d23136fb4fac488d6c47df20","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-Runner/Pods-Runner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-Runner/Pods-Runner.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98cc17ac4a853e48900fef73bc45c77506","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98dc1a21852c7a085c7dd8f65cf0fa9907","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-Runner/Pods-Runner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-Runner/Pods-Runner.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987d8f9a1b84227cfbdc591476163d8a88","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f17abf55d75f35efcaf45a1185b085b6","buildSettings":{"ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","INFOPLIST_FILE":"Target Support Files/Pods-Runner/Pods-Runner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.5.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/Pods-Runner/Pods-Runner.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","OTHER_LIBTOOLFLAGS":"","PODS_ROOT":"$(SRCROOT)","PRODUCT_BUNDLE_IDENTIFIER":"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}","PRODUCT_NAME":"$(TARGET_NAME:c99extidentifier)","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98de61797bc95845f506a94d8a3f0d074e","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e980ec6fbca7264a6936f2adfc48dd7f5bc","guid":"bfdfe7dc352907fc980b868725387e987f252fe794679d3a8adfaf2c33f51316","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98c8faf61c8ceeabc5b5e6b6c279f1a223","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98fed0970e703d355c9aff813f280aafdc","guid":"bfdfe7dc352907fc980b868725387e9850e904616f5713acdb9ce4319e4bb0be"}],"guid":"bfdfe7dc352907fc980b868725387e98ba7b3484a09e2c1ce7f1b8e52bde6bd9","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e987ce943584c3ffff55d9320cd1190a5e6"}],"guid":"bfdfe7dc352907fc980b868725387e9813731d23b33ca055aa03dd2874ce97ab","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e985166ce798dfc9a0dff05a4e2cde56403","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98cd8162b601eb6c17e4d86eec112a388c","name":"AppCheckCore"},{"guid":"bfdfe7dc352907fc980b868725387e985fd5cdb9993b1816141f0c012ffa62bd","name":"DKImagePickerController"},{"guid":"bfdfe7dc352907fc980b868725387e989d0a1858a86fd6e6731ed20f88a1e515","name":"DKPhotoGallery"},{"guid":"bfdfe7dc352907fc980b868725387e98c16926158ef45fa2ac81bd3203fcd49e","name":"FBAudienceNetwork"},{"guid":"bfdfe7dc352907fc980b868725387e98d57b8bce60a0f11113f4cff532db68d3","name":"Firebase"},{"guid":"bfdfe7dc352907fc980b868725387e98ecaebc2b66f6675fbaa388164aa6c8dd","name":"FirebaseAppCheck"},{"guid":"bfdfe7dc352907fc980b868725387e981f0a8508efd61386103314ddbb82a530","name":"FirebaseAppCheckInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98b762d5de103fb6cfc7506aa6be1d4f33","name":"FirebaseAuth"},{"guid":"bfdfe7dc352907fc980b868725387e988e935c81efc4686179f554b8fe37864a","name":"FirebaseAuthInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore"},{"guid":"bfdfe7dc352907fc980b868725387e982fcb5e27d041e48b96b3ab14ce32d5f2","name":"FirebaseCoreExtension"},{"guid":"bfdfe7dc352907fc980b868725387e98020791fd2e7b7ddc8fb2658339c42e16","name":"FirebaseCoreInternal"},{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98dd3a6a519ed4181bf31ea6bc1f18ebc5","name":"GTMSessionFetcher"},{"guid":"bfdfe7dc352907fc980b868725387e98cd53d937e824fad9f4527eeeb684cb40","name":"Google-Mobile-Ads-SDK"},{"guid":"bfdfe7dc352907fc980b868725387e98bbd9e0ed4cdc41b93625c3661dbcaa81","name":"GoogleMobileAdsMediationFacebook"},{"guid":"bfdfe7dc352907fc980b868725387e98c777611770584bd7c20ebf80e3d30200","name":"GoogleUserMessagingPlatform"},{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"},{"guid":"bfdfe7dc352907fc980b868725387e98f10882e1684b8a3dfdec597bc0a47af3","name":"PromisesObjC"},{"guid":"bfdfe7dc352907fc980b868725387e98da29652de71b686743df2bd56decf7ef","name":"RecaptchaInterop"},{"guid":"bfdfe7dc352907fc980b868725387e98c46180aea4e87057640961e6db37df0d","name":"SDWebImage"},{"guid":"bfdfe7dc352907fc980b868725387e9872eabefc63c14dfe52fb0c95ad90294e","name":"SwiftyGif"},{"guid":"bfdfe7dc352907fc980b868725387e98c7dd3f56f799b35458f81928cf1cb47b","name":"app_settings"},{"guid":"bfdfe7dc352907fc980b868725387e98f08a09402d437c098acddc7bcf497e64","name":"camera_avfoundation"},{"guid":"bfdfe7dc352907fc980b868725387e98d41ce0bf2141365ff0288286787936d9","name":"device_info_plus"},{"guid":"bfdfe7dc352907fc980b868725387e98bf75f71a2aa7fdc38a7d7d70e6c200c1","name":"file_picker"},{"guid":"bfdfe7dc352907fc980b868725387e9875e40ebaf7773ac78830d9822a5265df","name":"file_saver"},{"guid":"bfdfe7dc352907fc980b868725387e984c83246bc20987a37ea775a535d55cc9","name":"file_selector_ios"},{"guid":"bfdfe7dc352907fc980b868725387e98213dce80d6344a36faf6079e42d20067","name":"firebase_app_check"},{"guid":"bfdfe7dc352907fc980b868725387e983788d8769c821650606514be955fca93","name":"firebase_auth"},{"guid":"bfdfe7dc352907fc980b868725387e987f74324bfc5c78140e34d510e26e00c1","name":"firebase_core"},{"guid":"bfdfe7dc352907fc980b868725387e98cfaa9701b1371f15b99c4f66ff385fb3","name":"fl_downloader"},{"guid":"bfdfe7dc352907fc980b868725387e9822a19f6c224a402387a233be75a6e268","name":"flutter_native_splash"},{"guid":"bfdfe7dc352907fc980b868725387e98b342d8d6d2a8c1bb89705e2a22345264","name":"flutter_tts"},{"guid":"bfdfe7dc352907fc980b868725387e9821d372cc1e7c7587a12aeda843619e39","name":"geolocator_apple"},{"guid":"bfdfe7dc352907fc980b868725387e98ec9201ffba3c82781a28590604d34ce4","name":"gma_mediation_meta"},{"guid":"bfdfe7dc352907fc980b868725387e9811f9347c979613c5502173cd5b43060d","name":"google_mobile_ads"},{"guid":"bfdfe7dc352907fc980b868725387e981f000f066404b97b12e9c4ca84d38d0f","name":"image_picker_ios"},{"guid":"bfdfe7dc352907fc980b868725387e988cbaddc02f6ec7fadc6b543cd6534960","name":"local_auth_darwin"},{"guid":"bfdfe7dc352907fc980b868725387e98b54f2bdfc3ce691d3ad04972a364d2a5","name":"mobile_scanner"},{"guid":"bfdfe7dc352907fc980b868725387e98a5ae7244e41cc249cf7186dbb9962ecb","name":"package_info_plus"},{"guid":"bfdfe7dc352907fc980b868725387e9830037b09fee48cfce1f8562d753688c8","name":"path_provider_foundation"},{"guid":"bfdfe7dc352907fc980b868725387e9868b3737835b98c013ea1e742f994ae22","name":"printing"},{"guid":"bfdfe7dc352907fc980b868725387e986a7f857d9699ce0307f844d6d31566d3","name":"quick_actions_ios"},{"guid":"bfdfe7dc352907fc980b868725387e98ff12fc6cf192a2fce22083281b19ee98","name":"record_ios"},{"guid":"bfdfe7dc352907fc980b868725387e980c3d3b60e3a8ded9747b35c2abc6c55a","name":"screen_brightness_ios"},{"guid":"bfdfe7dc352907fc980b868725387e98848ff9cf74c635f5324731538a1c853f","name":"share_plus"},{"guid":"bfdfe7dc352907fc980b868725387e9828cab1f188854e0a973e6ff6905c5ffe","name":"shared_preferences_foundation"},{"guid":"bfdfe7dc352907fc980b868725387e981304d3d2169071b3ca365b19f5340b7c","name":"sqflite_darwin"},{"guid":"bfdfe7dc352907fc980b868725387e9869b9058bfc96f2a6a75b4b5dd4df3117","name":"syncfusion_flutter_pdfviewer"},{"guid":"bfdfe7dc352907fc980b868725387e98903e66fa03d6d27edaa18126a82c20fd","name":"url_launcher_ios"},{"guid":"bfdfe7dc352907fc980b868725387e988efdc4dd0ac29b43123295eca853f4ed","name":"webview_flutter_wkwebview"}],"guid":"bfdfe7dc352907fc980b868725387e98312b4bc59bbbe2c06c205bf4da6737f5","name":"Pods-Runner","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98699846e06e93b50cafdb00290784c775","name":"Pods_Runner.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cbb1eb454f498b998b145ed6dace7d98-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cbb1eb454f498b998b145ed6dace7d98-json new file mode 100644 index 00000000..5ca30f17 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cbb1eb454f498b998b145ed6dace7d98-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e983535bec86897f82e29e35c2a37087d79","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/camera_avfoundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"camera_avfoundation","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/ResourceBundle-camera_avfoundation_privacy-camera_avfoundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"camera_avfoundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e983eb5b47f46c85c0de877a296628c3f1e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e989ea7a1b7622f37728c5db7b6902fabc9","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/camera_avfoundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"camera_avfoundation","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/ResourceBundle-camera_avfoundation_privacy-camera_avfoundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"camera_avfoundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e981f9b7500d4a6aa1a9968638a39f51879","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e989ea7a1b7622f37728c5db7b6902fabc9","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/camera_avfoundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"camera_avfoundation","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/ResourceBundle-camera_avfoundation_privacy-camera_avfoundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"camera_avfoundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98de8a7c14b69ef452eba8aa2276e33ff1","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e987b426121b7548413d88986dc83300f8c","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e989c52abe5cb58976985aa045a25733adb","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e982f6dd2634fb467a93787bdea5788bf12","guid":"bfdfe7dc352907fc980b868725387e98c53113c2881ba9ebc2dbd234f782b734"}],"guid":"bfdfe7dc352907fc980b868725387e987c700ecbb719f85f1a935ddff0540717","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98b9038e7e871b75150c57ed973218b158","name":"camera_avfoundation-camera_avfoundation_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98a8d4c68aa344dd716b8838fcfafaf16f","name":"camera_avfoundation_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc4efb059f8f4ef111f94e7221f71ad1-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc4efb059f8f4ef111f94e7221f71ad1-json new file mode 100644 index 00000000..079de28a --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc4efb059f8f4ef111f94e7221f71ad1-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bcd767e09eacb2538a5dd8f4781036cb","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/screen_brightness_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"screen_brightness_ios","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/ResourceBundle-screen_brightness_ios_privacy-screen_brightness_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"screen_brightness_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e985723a52fca48de9f7b73c801bd073223","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e478cdbb3210aa9b19b78eddddb7437c","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/screen_brightness_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"screen_brightness_ios","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/ResourceBundle-screen_brightness_ios_privacy-screen_brightness_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"screen_brightness_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98983416a16fd32fdb65b2fa2ead8aceff","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e478cdbb3210aa9b19b78eddddb7437c","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/screen_brightness_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"screen_brightness_ios","INFOPLIST_FILE":"Target Support Files/screen_brightness_ios/ResourceBundle-screen_brightness_ios_privacy-screen_brightness_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"screen_brightness_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98b607cd4376423ba1e0f3f7d51dc7eec5","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e989e565c9e0abe20769ebd3c57fb43ab87","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98a074c1e178dad9a1a5a6f0a30f1925b5","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b567af24496618e3e6787600e87a49bf","guid":"bfdfe7dc352907fc980b868725387e98f5ec6a16ef0ec31fa90e90ec55c533fb"}],"guid":"bfdfe7dc352907fc980b868725387e98c096b214d31386355ce33c7becf542f0","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98e778028627b75b5d409ed7c4767eb6e1","name":"screen_brightness_ios-screen_brightness_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e980618668f1945e57ca1ef133e5e4cd0fa","name":"screen_brightness_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc9ef9cfbfe34cf5230700b7d8fcc951-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc9ef9cfbfe34cf5230700b7d8fcc951-json new file mode 100644 index 00000000..cdc22416 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cc9ef9cfbfe34cf5230700b7d8fcc951-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ae2b6e690d9c19a64378428b59f82e0b","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FBAudienceNetwork","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBAudienceNetwork","INFOPLIST_FILE":"Target Support Files/FBAudienceNetwork/ResourceBundle-FBAudienceNetwork-FBAudienceNetwork-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"FBAudienceNetwork","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98dde23b97725dd241725862953973d5e2","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bf594d3cbb3ba4c66c475a7d56edf012","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FBAudienceNetwork","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBAudienceNetwork","INFOPLIST_FILE":"Target Support Files/FBAudienceNetwork/ResourceBundle-FBAudienceNetwork-FBAudienceNetwork-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"FBAudienceNetwork","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98dddf221c40151c14a2c635254cbfa43d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bf594d3cbb3ba4c66c475a7d56edf012","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FBAudienceNetwork","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"FBAudienceNetwork","INFOPLIST_FILE":"Target Support Files/FBAudienceNetwork/ResourceBundle-FBAudienceNetwork-FBAudienceNetwork-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"FBAudienceNetwork","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9802da13b531fa227d301691556eb8e71a","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98e43c2dc576b2b1dff115fe00e995ad34","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98e4f3b36443e3681be38cef5963954b6d","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9800817c14be55ffe583e047275a4b3cda","guid":"bfdfe7dc352907fc980b868725387e98cf1e790998556aaef8584105749282bd"}],"guid":"bfdfe7dc352907fc980b868725387e988b2b0dd93c751ed80e081fc01d0cfe60","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e988a4e25c3b6648d4c88499e02f77b811a","name":"FBAudienceNetwork-FBAudienceNetwork","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9809cddfc82cd5ea2ec210b80200def916","name":"FBAudienceNetwork.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cccb0eb2cb0393abaa5f1f05d755160e-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cccb0eb2cb0393abaa5f1f05d755160e-json new file mode 100644 index 00000000..d21782b2 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cccb0eb2cb0393abaa5f1f05d755160e-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988dc0dcaabffa36a9e85d057769df808d","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/google_mobile_ads","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"google_mobile_ads","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/ResourceBundle-google_mobile_ads-google_mobile_ads-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e986c911657d6ac059feda98c12db51010e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987e81c25c7cd2ea8e1b445f8bd4d6b142","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/google_mobile_ads","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"google_mobile_ads","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/ResourceBundle-google_mobile_ads-google_mobile_ads-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e981ef12a0a1c6fd0e6c6aec00900a484b2","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e987e81c25c7cd2ea8e1b445f8bd4d6b142","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/google_mobile_ads","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"google_mobile_ads","INFOPLIST_FILE":"Target Support Files/google_mobile_ads/ResourceBundle-google_mobile_ads-google_mobile_ads-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"google_mobile_ads","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e982b2034e654edde92840ada339a8cddae","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e980ed54f5352662a0124c0119f9db0abda","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9881976eb1fa9e0a491341ad5560f9a2c6","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e982d53de7511db5a956fe99a4cfd6a3fc6","guid":"bfdfe7dc352907fc980b868725387e9894e33589982c634a6f477a4d790d1caf"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fb4a1331e3e12b4a42dc22a871d90dbc","guid":"bfdfe7dc352907fc980b868725387e9830805bb02df8d52a0b3e9d7391ab2884"},{"fileReference":"bfdfe7dc352907fc980b868725387e983b2fa426a77c6733b0fe8cfa17eaaa44","guid":"bfdfe7dc352907fc980b868725387e98085b71502c539a264c6d03cc6b68fdaa"}],"guid":"bfdfe7dc352907fc980b868725387e98e41180d575b58451a1687e098db94663","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e9804037656a8578d8e730f9d99c54e40e2","name":"google_mobile_ads-google_mobile_ads","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98bfcaaabe96491183229cf5e8736513d4","name":"google_mobile_ads.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cf214d336cf673b4a25ba8952e58ad2f-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cf214d336cf673b4a25ba8952e58ad2f-json new file mode 100644 index 00000000..d40c8633 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cf214d336cf673b4a25ba8952e58ad2f-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98b8e89d3c9864142bc7587bc7895448f7","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_tts/flutter_tts-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_tts/flutter_tts-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/flutter_tts/flutter_tts.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_tts","PRODUCT_NAME":"flutter_tts","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987c21dec9912de8dd48c2961102a548da","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98111c994b75369b574157edb8fabcd0dc","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_tts/flutter_tts-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_tts/flutter_tts-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/flutter_tts/flutter_tts.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_tts","PRODUCT_NAME":"flutter_tts","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e980c53d9195ad8c7b478ee93c3e371d243","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98111c994b75369b574157edb8fabcd0dc","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_tts/flutter_tts-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_tts/flutter_tts-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/flutter_tts/flutter_tts.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_tts","PRODUCT_NAME":"flutter_tts","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"4.2","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98580e5289bd35cea1ad82b295518eeca5","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9825cfe228bef73c17089a941802e513b1","guid":"bfdfe7dc352907fc980b868725387e98aa4a9e8e8bbf670e2186afb9344708d9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df53373bea73f458559a5c4b8e8a4d93","guid":"bfdfe7dc352907fc980b868725387e984fe29b4a3467f9a27602703ddea30611","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9814445869fbeae769a49c8e54c2b20845","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98273545ef5ac201300b0bb57c4690f008","guid":"bfdfe7dc352907fc980b868725387e988b58ae42c4344a0957add32c30def327"},{"fileReference":"bfdfe7dc352907fc980b868725387e988f4f0b636ec4f957216c6e152d4e6b99","guid":"bfdfe7dc352907fc980b868725387e9855247ceee2656d809bc03a95fb73d03c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98497ea7215b16a92c8bf53dd577da1a03","guid":"bfdfe7dc352907fc980b868725387e984764ca785930289888f450b49955aa21"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b11e2a9ab729e7e8322eb0a54ccd2fb5","guid":"bfdfe7dc352907fc980b868725387e98cc55721341fbdd8f8618883eae3422bd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bfeb1e815de07bb393e068cd889f2c82","guid":"bfdfe7dc352907fc980b868725387e983aec172ab0af09596fddeb87d9ea754b"},{"fileReference":"bfdfe7dc352907fc980b868725387e989645eb0ac136e2e344e1b31f8f5743b7","guid":"bfdfe7dc352907fc980b868725387e984e6204af82101e190cdeca07c73d2841"}],"guid":"bfdfe7dc352907fc980b868725387e98680422fb5b2b688026c70eaeae5b6c83","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98fa7e636c2fe620d708188f11c6211032"}],"guid":"bfdfe7dc352907fc980b868725387e98146323fd34b1855743f3e2d7257195f2","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9811a51cddc529c93c2490d8bdbf4abac5","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"}],"guid":"bfdfe7dc352907fc980b868725387e98b342d8d6d2a8c1bb89705e2a22345264","name":"flutter_tts","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98ed8855c6c2348477429e791b76577a29","name":"flutter_tts.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d014b307105d5d21e3d383fba60d7745-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d014b307105d5d21e3d383fba60d7745-json new file mode 100644 index 00000000..39d826e3 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d014b307105d5d21e3d383fba60d7745-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e8f5202bf6c2927877bbede594254bac","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"FirebaseCoreExtension","PRODUCT_NAME":"FirebaseCoreExtension","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98d7d5560296933c11495f1b9d11cd96b8","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986a53acd8d9569d0c22497ed69917f900","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap","PRODUCT_MODULE_NAME":"FirebaseCoreExtension","PRODUCT_NAME":"FirebaseCoreExtension","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9849ebef47a96a617098daadb98777ee5b","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986a53acd8d9569d0c22497ed69917f900","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/FirebaseCoreExtension/FirebaseCoreExtension.modulemap","PRODUCT_MODULE_NAME":"FirebaseCoreExtension","PRODUCT_NAME":"FirebaseCoreExtension","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.9","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98afcc28efd14c04d85527eff3f30d6c30","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e980e9aa4b7906b3dcf65a309a2ebea54da","guid":"bfdfe7dc352907fc980b868725387e9814e3c34bd5815835972bdff811822f6b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a4ef9427196371e4dc2731c21e69d49f","guid":"bfdfe7dc352907fc980b868725387e98a60be59bffa07302eabd51261ea4af9a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9809785dc11744809391b61338a4ffac7b","guid":"bfdfe7dc352907fc980b868725387e987f84684122f41339c53680afc7b733fa","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9862c85af582e57841e77b952dde7fa94c","guid":"bfdfe7dc352907fc980b868725387e98fcca368266dbcbe7b865e931d91de4f5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ddc20f433ccc0f56de9a35da32254a03","guid":"bfdfe7dc352907fc980b868725387e98276181fd4d562612cf9016425b498c7d","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed46d3d90ff2fcfaef63e49a4aef56da","guid":"bfdfe7dc352907fc980b868725387e988cb1eb93ffcd82ef6996e6c1317e087e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9865742a13f039fe40a602469ea5f2c5a4","guid":"bfdfe7dc352907fc980b868725387e988f69cd36a38ac0679fe7837ea106f281","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98355f9a272a7cc11736b4566ee8b3947d","guid":"bfdfe7dc352907fc980b868725387e98e08bee2d9d4f0245dbc88ad45427f0e2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f21af28e616ee0d4ff04c7a6421f4400","guid":"bfdfe7dc352907fc980b868725387e98a5c749b84e8d3c2926f5a48b1af8ee1a","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98f3daf0106f316a7cd58f1be2cce95475","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e983addcf97f99326db0f50c64ef67acf87","guid":"bfdfe7dc352907fc980b868725387e98cb512a9a98c5d9916c3e269aa3c900f3"},{"fileReference":"bfdfe7dc352907fc980b868725387e988de8032ed3bcd43a2fa9cb6a98756979","guid":"bfdfe7dc352907fc980b868725387e989f18abf1675f5d8ecb93bf9782e03684"}],"guid":"bfdfe7dc352907fc980b868725387e9850d59ee46a73fe123ccc500d948c6892","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e989d6c63b4845c3d140507e25d719b2b3c"}],"guid":"bfdfe7dc352907fc980b868725387e986151f6ce33582729b1cb033c4952f378","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98a090c75adb6b9a2c5ab87c39b490c3cd","targetReference":"bfdfe7dc352907fc980b868725387e98c04ead258c2ba3f656422d1784107881"}],"guid":"bfdfe7dc352907fc980b868725387e984ef42a6e5935f83d2a808f2a201eb147","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98a408a4c1f668e62161cdeba76f57d50c","name":"FirebaseCore"},{"guid":"bfdfe7dc352907fc980b868725387e98c04ead258c2ba3f656422d1784107881","name":"FirebaseCoreExtension-FirebaseCoreExtension_Privacy"}],"guid":"bfdfe7dc352907fc980b868725387e982fcb5e27d041e48b96b3ab14ce32d5f2","name":"FirebaseCoreExtension","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98311e6292af5af43c801705cd189cc184","name":"FirebaseCoreExtension.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d1efbd94e043870162f1a431e0d81426-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d1efbd94e043870162f1a431e0d81426-json new file mode 100644 index 00000000..964642fe --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d1efbd94e043870162f1a431e0d81426-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eef3be20c160fe75bf8789e71fe75d9a","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Google-Mobile-Ads-SDK","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"Google_Mobile_Ads_SDK","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"GoogleMobileAdsResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98543aedfb2a113f779397a112d1969849","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988ad1fd18441580496a4b9e0a44f0cae8","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Google-Mobile-Ads-SDK","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"Google_Mobile_Ads_SDK","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"GoogleMobileAdsResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98f65e87fd0fed71f9730423420a296aba","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988ad1fd18441580496a4b9e0a44f0cae8","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Google-Mobile-Ads-SDK","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"Google_Mobile_Ads_SDK","INFOPLIST_FILE":"Target Support Files/Google-Mobile-Ads-SDK/ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"GoogleMobileAdsResources","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98c649bfda7d075fcc93fa3f398f4a5eab","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98f3925c17b7ecee1483b16deaa934334d","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98a4da7e96df183882a2b6247cdb8680fb","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9848de9a416078da1867623b75fba91210","guid":"bfdfe7dc352907fc980b868725387e98a6befa8e692964e73338cfe4ff6624aa"}],"guid":"bfdfe7dc352907fc980b868725387e98959f895b3e56aa34e86e358d41306fb1","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98468089666b04a941512e80a0cc9cf153","name":"Google-Mobile-Ads-SDK-GoogleMobileAdsResources","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98d1290e807753728a1c85832ecdf321af","name":"GoogleMobileAdsResources.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d204a2d23a6add831c951cc6c525c071-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d204a2d23a6add831c951cc6c525c071-json new file mode 100644 index 00000000..23a91f86 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d204a2d23a6add831c951cc6c525c071-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981ccda656ca076caea1e69514af198f0f","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUtilities","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUtilities","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"GoogleUtilities_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9844ce9a11001e6b1022a30e252440d4b7","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984a59f58d9dc78fdedc9a249bdac259e0","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUtilities","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUtilities","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"GoogleUtilities_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e982897b6622e539dc70aad26f9fbabcec9","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984a59f58d9dc78fdedc9a249bdac259e0","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUtilities","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"GoogleUtilities","INFOPLIST_FILE":"Target Support Files/GoogleUtilities/ResourceBundle-GoogleUtilities_Privacy-GoogleUtilities-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"GoogleUtilities_Privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98b76e3b7d45b03be6c82463330e06d2d4","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98a05287c2a85bed2ebcbba8432f66c3bc","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e982dfd74f90d537b87be9453ae905cbe0f","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e985d3def67c82fae95425ab472ba727077","guid":"bfdfe7dc352907fc980b868725387e98b03e09af0870a6b60d95b5d023148f82"}],"guid":"bfdfe7dc352907fc980b868725387e9897d7aecd1a21b5e60fbbb71cecae5075","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e981a9fac6eb9c80f8eed49fda0531af6a4","name":"GoogleUtilities-GoogleUtilities_Privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e981f1852a7971aaa5e479d216071487d3a","name":"GoogleUtilities_Privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d360bbd5e759c5936a6004b5766066e3-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d360bbd5e759c5936a6004b5766066e3-json new file mode 100644 index 00000000..904abff2 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d360bbd5e759c5936a6004b5766066e3-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e09431f2c48fb9c271b2728be33c6101","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"syncfusion_flutter_pdfviewer","PRODUCT_NAME":"syncfusion_flutter_pdfviewer","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98e92f8760229b7c40169ecc5dd466efe2","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98029debb13536e6240d86d056b253ac21","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"syncfusion_flutter_pdfviewer","PRODUCT_NAME":"syncfusion_flutter_pdfviewer","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e983729e97f504caf068ca6520a04738b64","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98029debb13536e6240d86d056b253ac21","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/syncfusion_flutter_pdfviewer/syncfusion_flutter_pdfviewer.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"syncfusion_flutter_pdfviewer","PRODUCT_NAME":"syncfusion_flutter_pdfviewer","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982e2319c198381b7baabaf4fe9102ad09","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d31e2d30267b93d0385170731adefbb0","guid":"bfdfe7dc352907fc980b868725387e987ecc2f248a1b83d7047d9c7702aa300a","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98986e9aa32f7516e12f353d00ee31c9c2","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98532284d033f3de271a1fd34a6aa57476","guid":"bfdfe7dc352907fc980b868725387e98aa71677cadb913a7d3d768a57a1c4eeb"},{"fileReference":"bfdfe7dc352907fc980b868725387e9853502a1c45cb54adc332a8b75ff6be4e","guid":"bfdfe7dc352907fc980b868725387e98e39b0e36dfb6cca4d1ba1ac694c46953"}],"guid":"bfdfe7dc352907fc980b868725387e98e91ced1e5e7578937e8ac0579096b99e","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e985c86e1e1ed48253b696ddf1ae2d943b6"}],"guid":"bfdfe7dc352907fc980b868725387e984c87df8814132b0cd79561e17b239f7d","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ca5b4323584e2043d9709fdfb75e4e12","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"}],"guid":"bfdfe7dc352907fc980b868725387e9869b9058bfc96f2a6a75b4b5dd4df3117","name":"syncfusion_flutter_pdfviewer","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e988d881935b77e0a6a63d6fed20bc032b1","name":"syncfusion_flutter_pdfviewer.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d560c2e797b744ca35425688afeb9717-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d560c2e797b744ca35425688afeb9717-json new file mode 100644 index 00000000..6f8519cd --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d560c2e797b744ca35425688afeb9717-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98cca55d6c772db4d637cf770c880e5bab","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/geolocator_apple","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"geolocator_apple","INFOPLIST_FILE":"Target Support Files/geolocator_apple/ResourceBundle-geolocator_apple_privacy-geolocator_apple-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"geolocator_apple_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98803aea759e07ea4eddf8d986c4c89b65","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98563a39b273a0c88e1e2a4a289bb4eff2","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/geolocator_apple","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"geolocator_apple","INFOPLIST_FILE":"Target Support Files/geolocator_apple/ResourceBundle-geolocator_apple_privacy-geolocator_apple-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","PRODUCT_NAME":"geolocator_apple_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98560e1ba7a5e42f80a90f70c60180f82c","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98563a39b273a0c88e1e2a4a289bb4eff2","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/geolocator_apple","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"geolocator_apple","INFOPLIST_FILE":"Target Support Files/geolocator_apple/ResourceBundle-geolocator_apple_privacy-geolocator_apple-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","PRODUCT_NAME":"geolocator_apple_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9875e787c92418669546bc9678b26d4929","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98cd585c1c1c68fdee3b86cf64c28d1bd9","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98eafc0b13c8cff64cb7eb7cb8f7aef5f6","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98a5e5404fb09ecfe1c9c3cd85e3ab5448","guid":"bfdfe7dc352907fc980b868725387e985150e661237d7724afdfd4eb9a7d30eb"}],"guid":"bfdfe7dc352907fc980b868725387e98be1f3cef15a360878635f9921178c3bf","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98e1aba8ff8dc833f2269ce0a7182533b3","name":"geolocator_apple-geolocator_apple_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e980ae07e1806c3af2f5550d2e89780c766","name":"geolocator_apple_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d5f04c64bab0734f1ab47fd9bcf15bc4-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d5f04c64bab0734f1ab47fd9bcf15bc4-json new file mode 100644 index 00000000..89db2292 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d5f04c64bab0734f1ab47fd9bcf15bc4-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981144f00ce89ffa4e0260914a9ffec527","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/mobile_scanner/mobile_scanner-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/mobile_scanner/mobile_scanner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/mobile_scanner/mobile_scanner.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"mobile_scanner","PRODUCT_NAME":"mobile_scanner","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98cdfd765d89c800c39981a3166f6eb58e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98227c1f919eedf604acd47c56a9ef7ec4","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/mobile_scanner/mobile_scanner-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/mobile_scanner/mobile_scanner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/mobile_scanner/mobile_scanner.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"mobile_scanner","PRODUCT_NAME":"mobile_scanner","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98db33fe3671dba70a9981816dcb538f2f","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98227c1f919eedf604acd47c56a9ef7ec4","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/mobile_scanner/mobile_scanner-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/mobile_scanner/mobile_scanner-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/mobile_scanner/mobile_scanner.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"mobile_scanner","PRODUCT_NAME":"mobile_scanner","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9846ccb4b1c121a7dfeb02643174c4b6cc","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98be2efddfa0659e6c19ce1a5acc94ec6d","guid":"bfdfe7dc352907fc980b868725387e986bf686767dad5a23092e77ca0a446a9d","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e987864d6534a1cfe750375a1690e0d41ee","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98883be13daebbdfdcf10e362bc3ef4ebb","guid":"bfdfe7dc352907fc980b868725387e98a70ef071f3f451428660d11962ea82d4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e4be4892db4744593107b72e6b06cf75","guid":"bfdfe7dc352907fc980b868725387e9863ed24d99240b448ebd91bae41774c7b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cbd2a7736d3f622183620d97dabb51d6","guid":"bfdfe7dc352907fc980b868725387e985987309b98717b9c8713bae689a87a13"},{"fileReference":"bfdfe7dc352907fc980b868725387e982f3d32c7820c33deaf24eed4a2774a69","guid":"bfdfe7dc352907fc980b868725387e98be016dbb72e105cfc4902c58c1e8eacb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c373041b232771156d382a714478862a","guid":"bfdfe7dc352907fc980b868725387e98ce2a238b52d44e33fd88454a634cde8e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98168d2dc9c91bbc22b520b7c63b90d589","guid":"bfdfe7dc352907fc980b868725387e9829ebdf92672015add48e807e88a7ee9b"}],"guid":"bfdfe7dc352907fc980b868725387e981316f83063c35be8314794975de5fdd3","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e980475a39ebe52eb7b3754e111eac95569"}],"guid":"bfdfe7dc352907fc980b868725387e98946d19d6a5b186917c91965a818b56d7","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e986c07d430f969c2c80c9bde510147b89f","targetReference":"bfdfe7dc352907fc980b868725387e98e39aae0c91f0bdebfb6ac42304942a79"}],"guid":"bfdfe7dc352907fc980b868725387e981b10a6a7b436fc7f8c97b0f686f8a8c5","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98e39aae0c91f0bdebfb6ac42304942a79","name":"mobile_scanner-mobile_scanner_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98b54f2bdfc3ce691d3ad04972a364d2a5","name":"mobile_scanner","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9819d278982b4910681a163531507644fe","name":"mobile_scanner.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d67c7fe50f94aa30e853cef078cfecc9-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d67c7fe50f94aa30e853cef078cfecc9-json new file mode 100644 index 00000000..ce544d1f --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d67c7fe50f94aa30e853cef078cfecc9-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9826aabbf6d6b2201c6400dd7fc8a0967f","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/local_auth_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"local_auth_darwin","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/ResourceBundle-local_auth_darwin_privacy-local_auth_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"local_auth_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9821167a4cd0084e2aff71487ad47adb6e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9835c7588ceebde0ed281cc6f972ef1ccc","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/local_auth_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"local_auth_darwin","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/ResourceBundle-local_auth_darwin_privacy-local_auth_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"local_auth_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98fcd58e589d13ee873a59c5574d309686","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9835c7588ceebde0ed281cc6f972ef1ccc","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/local_auth_darwin","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"local_auth_darwin","INFOPLIST_FILE":"Target Support Files/local_auth_darwin/ResourceBundle-local_auth_darwin_privacy-local_auth_darwin-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"local_auth_darwin_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9869f1896b0a3d90b12b1fbfa70e956785","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98924acef17ca8c3362146d5df11002941","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9855620e7b64d5cd7cf1a09dddd9ea32ad","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e988634a8b747b6724232b5af5f382a225c","guid":"bfdfe7dc352907fc980b868725387e98993630a4e34675696479e6e917ca45c7"}],"guid":"bfdfe7dc352907fc980b868725387e984dbc3d8396ea7babbdbe62191a1dad8a","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98afb8e8e2ed6a0ef9cb1d99282c22f170","name":"local_auth_darwin-local_auth_darwin_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9899e37153e5b26774a3fd38635d02a847","name":"local_auth_darwin_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d6e43cdf0cbce99338da86c88c7a9b38-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d6e43cdf0cbce99338da86c88c7a9b38-json new file mode 100644 index 00000000..e8bb7a9f --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d6e43cdf0cbce99338da86c88c7a9b38-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98284ffc1eae91e8f4cf71938bb6a26644","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKPhotoGallery","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKPhotoGallery","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/ResourceBundle-DKPhotoGallery-DKPhotoGallery-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9863d709d85955662eec26f230fb1a0156","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986051e77661008cd9b8c42c9db89a8f91","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKPhotoGallery","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKPhotoGallery","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/ResourceBundle-DKPhotoGallery-DKPhotoGallery-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e985360f3c81b6bc650f3d49f6d1754981b","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e986051e77661008cd9b8c42c9db89a8f91","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DKPhotoGallery","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"DKPhotoGallery","INFOPLIST_FILE":"Target Support Files/DKPhotoGallery/ResourceBundle-DKPhotoGallery-DKPhotoGallery-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"DKPhotoGallery","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98abe21851be7f38d4bb7f9d3e74c78ab2","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98c722650b97524f652cb60639ce3e52c9","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9844830a8106b17c97462f17d37e937150","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9803baa2fc67f8d76b2b108bf635be93dc","guid":"bfdfe7dc352907fc980b868725387e98077c18fd825071b5517de595c447b6b2"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a3b28f4eed66179cc3316238b0b3ee7","guid":"bfdfe7dc352907fc980b868725387e98924a9936d45ac8728bedefa3385ebf7b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98812489e746316b8b3716cadbcf8878f0","guid":"bfdfe7dc352907fc980b868725387e98980d2ae065915cef447e5eb3952dfcbc"},{"fileReference":"bfdfe7dc352907fc980b868725387e988c57c65d211d763f44ecd815974cdf8f","guid":"bfdfe7dc352907fc980b868725387e9837a850c83dc077bdbe1c2f5bbd492236"},{"fileReference":"bfdfe7dc352907fc980b868725387e98af5703700ee022e99305baf3e4656a2c","guid":"bfdfe7dc352907fc980b868725387e98a63f1bbe973de8ba31cac4f606f9613a"}],"guid":"bfdfe7dc352907fc980b868725387e9847dc59d7e12614b1f4c048158b210d96","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98d3f65728b12dd217475d1283ee417937","name":"DKPhotoGallery-DKPhotoGallery","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9845db4417944723d8b91f4a6c67e94d3c","name":"DKPhotoGallery.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dbb0219d17436c670986b94b7945fa23-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dbb0219d17436c670986b94b7945fa23-json new file mode 100644 index 00000000..0754a499 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dbb0219d17436c670986b94b7945fa23-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984615091c333da42672bfd26263153e2c","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_native_splash/flutter_native_splash-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_native_splash","PRODUCT_NAME":"flutter_native_splash","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98542d46a1c227dffcd81ba310fa86fe75","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eccf4b0b561ffd1dcb573fa88f797247","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_native_splash/flutter_native_splash-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_native_splash","PRODUCT_NAME":"flutter_native_splash","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9823f4254e0770592b8f46fb4fbb025206","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98eccf4b0b561ffd1dcb573fa88f797247","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/flutter_native_splash/flutter_native_splash-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/flutter_native_splash/flutter_native_splash.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"flutter_native_splash","PRODUCT_NAME":"flutter_native_splash","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98f07bc7dbdbe34af75a03f9c11cf11c50","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c086e8c7ed209047f486aa181b9d15d3","guid":"bfdfe7dc352907fc980b868725387e98ae83221afb93616a2b42114c6693e756","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f50f5cea49c7a2be171197f72c2cb1ad","guid":"bfdfe7dc352907fc980b868725387e9841077393e2a0ff8edfeb119426569035","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e985ed144159bcebbb64c754bdbdaa159a2","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c166ee5988b20398d317d310c58eb4b1","guid":"bfdfe7dc352907fc980b868725387e9834623d0f10c2ebfd5dcdcd7163d68abd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed4c5781f08ac474801af38d03dae69c","guid":"bfdfe7dc352907fc980b868725387e98356c380165f16742a800b27751b12dce"}],"guid":"bfdfe7dc352907fc980b868725387e98bf343bcb5da439175c7ff2a128f7a39c","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9893a4ed39f6f94e150fa3721525891095"}],"guid":"bfdfe7dc352907fc980b868725387e9880eaa46668f967ac50f6577cb9b26348","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e9831795ef1e63d65d4fa054e4bc1dd66a5","targetReference":"bfdfe7dc352907fc980b868725387e9861233620df33996cccf430ed75b4a999"}],"guid":"bfdfe7dc352907fc980b868725387e987745cc5b5a4b3b50ae3fbbec4c2f9f2d","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e9861233620df33996cccf430ed75b4a999","name":"flutter_native_splash-flutter_native_splash_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e9822a19f6c224a402387a233be75a6e268","name":"flutter_native_splash","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98c62d527a87861e4e9c2265bba2aed9bb","name":"flutter_native_splash.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ddbefab0336a5b7a75af7835b2eb8ae3-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ddbefab0336a5b7a75af7835b2eb8ae3-json new file mode 100644 index 00000000..9b449a99 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ddbefab0336a5b7a75af7835b2eb8ae3-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c5ea3636852338c982e52209ddd197d0","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/device_info_plus/device_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/device_info_plus/device_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/device_info_plus/device_info_plus.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"device_info_plus","PRODUCT_NAME":"device_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9816a8336f082ec9a3669234f3df3ef306","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c321042b295c1853a19a7fc9918a7454","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/device_info_plus/device_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/device_info_plus/device_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/device_info_plus/device_info_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"device_info_plus","PRODUCT_NAME":"device_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98da658f6e11c8f9a5b0898bfe9485a0c1","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c321042b295c1853a19a7fc9918a7454","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/device_info_plus/device_info_plus-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/device_info_plus/device_info_plus-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/device_info_plus/device_info_plus.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"device_info_plus","PRODUCT_NAME":"device_info_plus","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c8a212801b2d5d63b36bf1f67475af99","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9835406ea787e507a99238a6afb0ce83bf","guid":"bfdfe7dc352907fc980b868725387e98e22287c8a8e4e993d61ec55644f61c22","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bd45822b13e3ce1eed9c6622596d0bb0","guid":"bfdfe7dc352907fc980b868725387e987f21151cf9c1c415a4660d42766a0194","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c2d16edfd8321a1d2a6421b3cbc221c7","guid":"bfdfe7dc352907fc980b868725387e98c28ac01c14bf242ff799731ddfee2d48","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9840d98c3753b2d39f106825c4fdf513ae","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9807f6b982d3ceb175b963a37c743705ca","guid":"bfdfe7dc352907fc980b868725387e98453d8b54a590feea4df4d6cb1f93d63d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a14950a917a0df000272111b3af00e58","guid":"bfdfe7dc352907fc980b868725387e985371a20400ba6d5877eaa27a28092ddb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f1edbc3ed8b2196eaa0d7f969ebdde47","guid":"bfdfe7dc352907fc980b868725387e988c13d8ad191e7451e598b02aa34ee7b3"}],"guid":"bfdfe7dc352907fc980b868725387e985bdcfdad3c1bf6d3fac02e0e2d77829f","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98b8f30e51613d62290c400ac5362c0882"}],"guid":"bfdfe7dc352907fc980b868725387e981367a14a577154ba59aeeab53f667469","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98c53380dbd9f7caae5cbdb4ca2b1391f5","targetReference":"bfdfe7dc352907fc980b868725387e98583f48d08e567205bb589ccf43c23e63"}],"guid":"bfdfe7dc352907fc980b868725387e984b38ce846840f6ccefd735c9e1b71a5b","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98583f48d08e567205bb589ccf43c23e63","name":"device_info_plus-device_info_plus_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98d41ce0bf2141365ff0288286787936d9","name":"device_info_plus","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9892a13085952e1452517bc40d45a802eb","name":"device_info_plus.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=de9cdf72fffe1fdedbf989540b2a67e3-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=de9cdf72fffe1fdedbf989540b2a67e3-json new file mode 100644 index 00000000..0aae7e43 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=de9cdf72fffe1fdedbf989540b2a67e3-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e9790273c34cf01756c3ac2cbd541c6d","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/app_settings","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"app_settings","INFOPLIST_FILE":"Target Support Files/app_settings/ResourceBundle-app_settings_privacy-app_settings-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"app_settings_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e988399767a3d3dd1838558c42b7460d9f1","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981916adc978ad471261fb8f5e1e97ed3a","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/app_settings","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"app_settings","INFOPLIST_FILE":"Target Support Files/app_settings/ResourceBundle-app_settings_privacy-app_settings-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","PRODUCT_NAME":"app_settings_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98ddc284e322ccf885e5d3affffcb1418f","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981916adc978ad471261fb8f5e1e97ed3a","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/app_settings","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"app_settings","INFOPLIST_FILE":"Target Support Files/app_settings/ResourceBundle-app_settings_privacy-app_settings-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"11.0","PRODUCT_NAME":"app_settings_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98ff8337412b741d81d04ac48ac07e5728","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98abfdf521994743941901da646f4d1fb0","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98ca2076c2c04db10da445aa6e73378372","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98a3dc3576e1e38afd167d6415d986fe47","guid":"bfdfe7dc352907fc980b868725387e98361ebd4004ebbba5ed5ae28397b8e9ee"}],"guid":"bfdfe7dc352907fc980b868725387e98bb0e6b4ff0d230190d958e7dfca2b78c","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98cf3ab2030ed25c0947bdaa95034b1488","name":"app_settings-app_settings_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98e37e29d3db6e76df1c3263033c15095e","name":"app_settings_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dfe05d0a1a29529d21d126a4eec3834c-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dfe05d0a1a29529d21d126a4eec3834c-json new file mode 100644 index 00000000..fa956c97 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=dfe05d0a1a29529d21d126a4eec3834c-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981ea619c6c09d50e42998ac2381b017c9","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/shared_preferences_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"shared_preferences_foundation","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/ResourceBundle-shared_preferences_foundation_privacy-shared_preferences_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"shared_preferences_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9801a7d33f842ed94eea034969d03bdc43","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988abaddbc7dac244a9dd3a827969bb097","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/shared_preferences_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"shared_preferences_foundation","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/ResourceBundle-shared_preferences_foundation_privacy-shared_preferences_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"shared_preferences_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e983ce11dbc6e5ddc5549f3ca37ef707d53","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e988abaddbc7dac244a9dd3a827969bb097","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/shared_preferences_foundation","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"shared_preferences_foundation","INFOPLIST_FILE":"Target Support Files/shared_preferences_foundation/ResourceBundle-shared_preferences_foundation_privacy-shared_preferences_foundation-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"shared_preferences_foundation_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98053a99e813142171ef05fbfd349bbfca","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e982856acfc533f1b54203f3d7825e4e141","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98514cb0dec1540eecbf00396fffae81ce","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98251f6f0c0dfa900ccd058f8d5f09e39b","guid":"bfdfe7dc352907fc980b868725387e987beae696e16cd3af4ed9013a0309dd3e"}],"guid":"bfdfe7dc352907fc980b868725387e98d6ff0b32981e31400a2921efd0321163","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98e0be3b0d5ad56f1985578b1f97431765","name":"shared_preferences_foundation-shared_preferences_foundation_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98ad625504a4c1e61077bbfd33bd1d1785","name":"shared_preferences_foundation_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e04e9400c66a280cff3815703b38f084-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e04e9400c66a280cff3815703b38f084-json new file mode 100644 index 00000000..d8244208 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e04e9400c66a280cff3815703b38f084-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e982b66b547d250357cf91d1817df7cb423","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_selector_ios/file_selector_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_selector_ios/file_selector_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/file_selector_ios/file_selector_ios.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_selector_ios","PRODUCT_NAME":"file_selector_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e984c78e1f657d786fc062232f5be7a4c97","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f68cdcb857b34033c4bd7d63083cfeef","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_selector_ios/file_selector_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_selector_ios/file_selector_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/file_selector_ios/file_selector_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_selector_ios","PRODUCT_NAME":"file_selector_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982f41bce8b433a1eb5a28e8b47bdcf7c2","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f68cdcb857b34033c4bd7d63083cfeef","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/file_selector_ios/file_selector_ios-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/file_selector_ios/file_selector_ios-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/file_selector_ios/file_selector_ios.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"file_selector_ios","PRODUCT_NAME":"file_selector_ios","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98e4b40a1b1e34033e3fe80d9f29e9a3ea","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9844d411eb7b3f7cc8e9589148720c721a","guid":"bfdfe7dc352907fc980b868725387e9807f448b26a149156d6ad7762ea029db3","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98d06e263c8c4c22bf01433b389dea226c","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c109472dcd25a3e59c31080f0ebdf811","guid":"bfdfe7dc352907fc980b868725387e980529f91d8d31f8c0ae17d526b7576bb6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f0ea88b68751cab794b769dc586bd419","guid":"bfdfe7dc352907fc980b868725387e9853e5c8fe2994ace8d62c63b32e5ba586"},{"fileReference":"bfdfe7dc352907fc980b868725387e981d83a354ff745f0961d1610ff6de246a","guid":"bfdfe7dc352907fc980b868725387e983a9f922684fca4ce0666ab6ab5de0526"},{"fileReference":"bfdfe7dc352907fc980b868725387e98179ec458b3b02e28a62624469e6b3a80","guid":"bfdfe7dc352907fc980b868725387e98a4193fad52f6bdd2c33aaf98c41b890c"}],"guid":"bfdfe7dc352907fc980b868725387e987d137a8dde5d27a87e012c2d0d25bdb5","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e987abe237170fc2f507e176beab102403a"}],"guid":"bfdfe7dc352907fc980b868725387e98bb686d736760c1aafeb2585a7df097b0","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e988868bb129e921eb7047f300ed055ff61","targetReference":"bfdfe7dc352907fc980b868725387e9865c7202c1fc33b2af510b64e6d532fb2"}],"guid":"bfdfe7dc352907fc980b868725387e981895301765af8239f23097fad7798abb","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e9865c7202c1fc33b2af510b64e6d532fb2","name":"file_selector_ios-file_selector_ios_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e984c83246bc20987a37ea775a535d55cc9","name":"file_selector_ios","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e982efdaf2d28b3a8e59a402711ff1abdd2","name":"file_selector_ios.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e48e30a0663eeb6ce1b0165ff162002a-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e48e30a0663eeb6ce1b0165ff162002a-json new file mode 100644 index 00000000..6d5cdc2c --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e48e30a0663eeb6ce1b0165ff162002a-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e983daf253e7f620ff0705af75496c7b612","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/record_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"record_ios","INFOPLIST_FILE":"Target Support Files/record_ios/ResourceBundle-record_ios_privacy-record_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"record_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e985ffdaaba1cb6e9f107cf2dfdca7edd29","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985629505f5ce763e2c6637f93384c9362","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/record_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"record_ios","INFOPLIST_FILE":"Target Support Files/record_ios/ResourceBundle-record_ios_privacy-record_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"record_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9893e658ced745883c1a5256eca0fbe4e9","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e985629505f5ce763e2c6637f93384c9362","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/record_ios","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"record_ios","INFOPLIST_FILE":"Target Support Files/record_ios/ResourceBundle-record_ios_privacy-record_ios-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"12.0","PRODUCT_NAME":"record_ios_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98d8db4589f2e390610a58c85c3f6dfda2","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9871f89e8e1848e114f018c543b999f4a1","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98665f4fffa149ee94e7a1e7a09c00af10","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98174d15dc574e8aee233cdb78708e065d","guid":"bfdfe7dc352907fc980b868725387e98018f269fbe47e05293180fefd0d51955"}],"guid":"bfdfe7dc352907fc980b868725387e98cbc501eb6814aa3920e8e785c77c133d","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e982a2ee81fc4f9376a4b6bb6d6bb502a00","name":"record_ios-record_ios_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98c34601a2dc07dcfea6b09ca49bc4da60","name":"record_ios_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb424d111b233087eeb27f0dcd5e1868-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb424d111b233087eeb27f0dcd5e1868-json new file mode 100644 index 00000000..e7a53f07 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb424d111b233087eeb27f0dcd5e1868-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e983535bec86897f82e29e35c2a37087d79","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/camera_avfoundation/camera_avfoundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"camera_avfoundation","PRODUCT_NAME":"camera_avfoundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9825a4fb8242ef8a94bbdcd828c87eb13f","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e989ea7a1b7622f37728c5db7b6902fabc9","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/camera_avfoundation/camera_avfoundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"camera_avfoundation","PRODUCT_NAME":"camera_avfoundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98414cd678aa6ff810b7bd6dd28f5f7e64","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e989ea7a1b7622f37728c5db7b6902fabc9","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/camera_avfoundation/camera_avfoundation-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","MODULEMAP_FILE":"Target Support Files/camera_avfoundation/camera_avfoundation.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"camera_avfoundation","PRODUCT_NAME":"camera_avfoundation","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ef3f94148fe7a046d728d110af328fa8","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e988a496b0b1313fdf74b9c7b937fa522af","guid":"bfdfe7dc352907fc980b868725387e98114f165fd17a1f0a141af70efd88cf74","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98571a31becba8fba4259df5e7da0ef95b","guid":"bfdfe7dc352907fc980b868725387e98cf036e804673f99e037e55d8a59f179b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bec2388e2d0f9bf3dcc989355dae261c","guid":"bfdfe7dc352907fc980b868725387e9858bba8a33f8d91e4ae427d14c8b083ae","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d376cf7afbf6b4a27ea861e42e9e18a","guid":"bfdfe7dc352907fc980b868725387e98b18a2d4b62b725a62cda3056d980d7f8","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bdcc6ea8f95ca3d31fda7ca6d0ec07bf","guid":"bfdfe7dc352907fc980b868725387e984ce0f9c6c21ff72a0b25c54b8ed237c0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98061b944840a544e7c2244b7dec0cea3c","guid":"bfdfe7dc352907fc980b868725387e989c980fb37914e9dae0069648fd2f64ea","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9884ca4421e20e7795c8f05c67c31cd7a6","guid":"bfdfe7dc352907fc980b868725387e98aa31224c2552791dc68d7e338d8ebb03","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981307d949f1eec051061c3f81e12003be","guid":"bfdfe7dc352907fc980b868725387e983f68e3a6fdbd8b8e8f6c51483152bce5","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b73d4fa19990e40f5ed65965564379bb","guid":"bfdfe7dc352907fc980b868725387e9831dc752ea4ddbf286632440e685e9589","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806d75717294b36105ee335141a42c17c","guid":"bfdfe7dc352907fc980b868725387e98472fe9d646ae69fa759469d36c341c63","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981fbc9e9c8a4aa0a1eaacee019fdbf2f4","guid":"bfdfe7dc352907fc980b868725387e98d272b0e90c4a047203f1128b42d7be42","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e989b272d09f5b565b076e8b0a8a66fb95c","guid":"bfdfe7dc352907fc980b868725387e98ca4c97be3268fa9df541782e677fbdca","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bbc3cd20c75ab4d15083fe2822084151","guid":"bfdfe7dc352907fc980b868725387e9881ac7d6cdbad7577b09ddfb248b21582","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9827732205233ea745d3d17d702bae0902","guid":"bfdfe7dc352907fc980b868725387e98a3325fd7cffce854e665cb4e365829a2","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98aa00a66f606a5894ff7b9c4193c2336d","guid":"bfdfe7dc352907fc980b868725387e982d9a9ef2da841b230fd56434ec3c38ff","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9805f59dff71b98dff44bcb35e99826611","guid":"bfdfe7dc352907fc980b868725387e98db3d5ee855a77fce514b67efa05bfb88","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f88bdf71c2ece055e64ef37dfcb946a1","guid":"bfdfe7dc352907fc980b868725387e98046b6337ca1a2931e38d87ecfb6d0aed","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b5b5f640e4853c81fca0b5da550bdcf5","guid":"bfdfe7dc352907fc980b868725387e98b78eaa35a396bf3a9b589ac2227b7834","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9841f506e6acdddbc3a5d078988dde4c22","guid":"bfdfe7dc352907fc980b868725387e9879f7b9f948cabb5d9017f96a382e735a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9877689363904fdc263f22d395bf46b7ff","guid":"bfdfe7dc352907fc980b868725387e98516323cc760e475d3acdbd312245076e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dc0df62ffc0de3ec3f484ffd1a9ef4da","guid":"bfdfe7dc352907fc980b868725387e987e8e35019550f95157af306eff0978ec","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d2795a25b9f9f995f8a6605e26802aa1","guid":"bfdfe7dc352907fc980b868725387e98341f00c35cdd3c73460126a03385b926","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c013c9fa841e7f4843f3a4bde01ca879","guid":"bfdfe7dc352907fc980b868725387e98bba1f2d66f66ee182d357b847f1b141e","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98646bcd0bc1969f167312816d9267a516","guid":"bfdfe7dc352907fc980b868725387e98833f381b225ef00cf6f51933ca63b95a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98d35201bc6359822c132fbf3930cae9a9","guid":"bfdfe7dc352907fc980b868725387e98b8d493d56e2b37563dd9d77061496e25","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df47c568f003e0086d5a88268b6eb7a7","guid":"bfdfe7dc352907fc980b868725387e987135620a5d21fb6997c197c1242898c9","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bd068a0e6483485d78dc23696eba3638","guid":"bfdfe7dc352907fc980b868725387e989282f4ceadd511a531ce04f0b0f6b313","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9809496e61d8f399d92800b33bdded072b","guid":"bfdfe7dc352907fc980b868725387e98ca34dc6ec6d59f68c72fae9469a4ca11","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e987426a7dafac1d2394f10c16127971def","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e982078aae39ae683382f05de711a185375","guid":"bfdfe7dc352907fc980b868725387e98b01673f8cc0bfd223b723bdc1c7ac67b"},{"fileReference":"bfdfe7dc352907fc980b868725387e986340a78c7da800e0528a24e97f21d303","guid":"bfdfe7dc352907fc980b868725387e981d4b62e7cda0d76579551741b4ebdd3b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f60a8d6ef410a8896e992632f5a8d7ab","guid":"bfdfe7dc352907fc980b868725387e98c0f2e45f794d36fe785483c45c11eabd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98405619e08eb70b9dac88141b45809428","guid":"bfdfe7dc352907fc980b868725387e987701428c43942c72aba5159424b045ab"},{"fileReference":"bfdfe7dc352907fc980b868725387e9831ffb27713bc35caf090dde2758982a0","guid":"bfdfe7dc352907fc980b868725387e9857290a4d90e4cd3b4d113f8e7a139169"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dcb3e4b3f551bf7e25dfd5bbe6837c44","guid":"bfdfe7dc352907fc980b868725387e98d6063cc7c2f6615de2b5a211c4157dd4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a03e14e92e8450839f90b1192ebe60f9","guid":"bfdfe7dc352907fc980b868725387e9876289c2c9d3fb085fcacd346afc0dfc0"},{"fileReference":"bfdfe7dc352907fc980b868725387e989ae78c91c7fe89bf08cd07030744a390","guid":"bfdfe7dc352907fc980b868725387e98e5f676e9893a0b508b8bcc5646ba5569"},{"fileReference":"bfdfe7dc352907fc980b868725387e987cc915a467358158a059f6a1005df343","guid":"bfdfe7dc352907fc980b868725387e982bc6848edbea6ddcf109b3a836c959d2"},{"fileReference":"bfdfe7dc352907fc980b868725387e981c411b19a591008768a1751626bec02c","guid":"bfdfe7dc352907fc980b868725387e98b356878988b98ee3276998fe25c3012c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e7037d382b9763757e10e512c62f1916","guid":"bfdfe7dc352907fc980b868725387e9854acebc0a961e3e0f7847b074493aa37"},{"fileReference":"bfdfe7dc352907fc980b868725387e98121c74ca9aaca4dbb8b55621309a9732","guid":"bfdfe7dc352907fc980b868725387e98bb399586f4a0d8d363d6cbe92b1c7bf4"},{"fileReference":"bfdfe7dc352907fc980b868725387e980bd9f3a524e2e4dba9733fa90f4aac3b","guid":"bfdfe7dc352907fc980b868725387e986d007dc46ab9126bc5c3d4076b33afe7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98903b72cc5b5c782aaff128c3205f4efe","guid":"bfdfe7dc352907fc980b868725387e9805242ec11b20e79273d9263207f6d0bf"},{"fileReference":"bfdfe7dc352907fc980b868725387e989d8f330e18415a31deb52b2bed8a2137","guid":"bfdfe7dc352907fc980b868725387e98027bacb8a5cff4d569a98a2350fdf886"},{"fileReference":"bfdfe7dc352907fc980b868725387e984824be8742f3e743f090fe6c33d6ef75","guid":"bfdfe7dc352907fc980b868725387e98c7f2c4ef1b665707d72fb9fd6b53bc1f"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ea07288fba88427eaf97221cb0a082ea","guid":"bfdfe7dc352907fc980b868725387e98f9dea6c80335e9260774267d46f32889"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c741b00c0189ecdcede99a30c61cf5ca","guid":"bfdfe7dc352907fc980b868725387e9867bc5110f96af1479073b5b678317f50"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b6418130a13953d8c503f48653d8efa3","guid":"bfdfe7dc352907fc980b868725387e988463dd92263356fac7000c6e05ba2df5"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b2170aed3422e923d0c594950dc68411","guid":"bfdfe7dc352907fc980b868725387e984efea462f57cda6e5aa0cd40f269068a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df6cdfb488e9420dcab5902c4835df8f","guid":"bfdfe7dc352907fc980b868725387e98aabf9280d3e8e8fb7822124dca08f63e"},{"fileReference":"bfdfe7dc352907fc980b868725387e982a862aae24ada2357f02abc8f69dfd4e","guid":"bfdfe7dc352907fc980b868725387e98650c54f22d832769fbc7f38a4235b38f"},{"fileReference":"bfdfe7dc352907fc980b868725387e9867161938a759dfccd8e5a78c167a3c1d","guid":"bfdfe7dc352907fc980b868725387e9810f5665434e2123de1e289381441cbd7"},{"fileReference":"bfdfe7dc352907fc980b868725387e9805a0d5448fe595b27ad6b8273406e808","guid":"bfdfe7dc352907fc980b868725387e98881615f4fc12b38e5e31d319621f3235"},{"fileReference":"bfdfe7dc352907fc980b868725387e983e9ded2512976d1035610e24a7a82a62","guid":"bfdfe7dc352907fc980b868725387e986c72171a470a82a85e40b25501efc6f9"},{"fileReference":"bfdfe7dc352907fc980b868725387e9851599d94c80ec88693114889217d19ec","guid":"bfdfe7dc352907fc980b868725387e98854e85be1e0328ea97f96705ea114756"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e5dd02315188486cffb3b793528ee079","guid":"bfdfe7dc352907fc980b868725387e98d086dac7bafb22d7dac9d5e75f4fc119"}],"guid":"bfdfe7dc352907fc980b868725387e9877363964029d8ad42a403062036a7c87","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e986833ee1301fc896ca7cc18dee79bf078"}],"guid":"bfdfe7dc352907fc980b868725387e981557d72eca0c38666dfd53933b835a06","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98e2c4e89c618ae2feca2ecdbf2be263c7","targetReference":"bfdfe7dc352907fc980b868725387e98b9038e7e871b75150c57ed973218b158"}],"guid":"bfdfe7dc352907fc980b868725387e982fd2d25df49aacaaca253cad31fd43c2","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98b9038e7e871b75150c57ed973218b158","name":"camera_avfoundation-camera_avfoundation_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98f08a09402d437c098acddc7bcf497e64","name":"camera_avfoundation","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e983903b9d6299cde09dc2b081ad04abafe","name":"camera_avfoundation.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb71d09d11dfb3cc8ccae98e4e65ea84-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb71d09d11dfb3cc8ccae98e4e65ea84-json new file mode 100644 index 00000000..77a64fa2 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=eb71d09d11dfb3cc8ccae98e4e65ea84-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f850c18f6937fd120321475e01101b34","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","ONLY_ACTIVE_ARCH":"NO","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2"},"guid":"bfdfe7dc352907fc980b868725387e988f7c95cfe7c05e7c498c4effb83b8ca9","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f12a631782f8376926b89f77c119f385","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e982781b45ebc68bec548f6cde3050d45db","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98f12a631782f8376926b89f77c119f385","buildSettings":{"ASSETCATALOG_COMPILER_APPICON_NAME":"AppIcon","ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME":"AccentColor","CLANG_ENABLE_OBJC_WEAK":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks","SDKROOT":"iphoneos","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES"},"guid":"bfdfe7dc352907fc980b868725387e985b28985a46abb62214b40b026e01f674","name":"Release"}],"buildPhases":[{"alwaysOutOfDate":"false","alwaysRunForInstallHdrs":"false","buildFiles":[],"emitEnvironment":"false","guid":"bfdfe7dc352907fc980b868725387e984e2176ef4539053c6517ce3088ac9698","inputFileListPaths":["${PODS_ROOT}/Target Support Files/GoogleMobileAdsMediationFacebook/GoogleMobileAdsMediationFacebook-xcframeworks-input-files.xcfilelist"],"inputFilePaths":[],"name":"[CP] Copy XCFrameworks","originalObjectID":"9AD31E84B8BE0888085C7057A8395CFF","outputFileListPaths":["${PODS_ROOT}/Target Support Files/GoogleMobileAdsMediationFacebook/GoogleMobileAdsMediationFacebook-xcframeworks-output-files.xcfilelist"],"outputFilePaths":[],"sandboxingOverride":"basedOnBuildSetting","scriptContents":"\"${PODS_ROOT}/Target Support Files/GoogleMobileAdsMediationFacebook/GoogleMobileAdsMediationFacebook-xcframeworks.sh\"\n","shellPath":"/bin/sh","type":"com.apple.buildphase.shell-script"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98c16926158ef45fa2ac81bd3203fcd49e","name":"FBAudienceNetwork"},{"guid":"bfdfe7dc352907fc980b868725387e98cd53d937e824fad9f4527eeeb684cb40","name":"Google-Mobile-Ads-SDK"}],"guid":"bfdfe7dc352907fc980b868725387e98bbd9e0ed4cdc41b93625c3661dbcaa81","name":"GoogleMobileAdsMediationFacebook","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"","configurationName":"Release","provisioningStyle":0}],"type":"aggregate"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ebe021611ae425ec05c93c24ce7a6607-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ebe021611ae425ec05c93c24ce7a6607-json new file mode 100644 index 00000000..1c7edb40 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ebe021611ae425ec05c93c24ce7a6607-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c25cf455db1669644df3712dd48f7fb4","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_app_check/firebase_app_check-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_app_check/firebase_app_check-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_app_check/firebase_app_check.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_app_check","PRODUCT_NAME":"firebase_app_check","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9811aa18dd7699f02a30902896801d56af","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e912e07d424cdf8e7522667434d5bd3f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_app_check/firebase_app_check-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_app_check/firebase_app_check-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_app_check/firebase_app_check.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_app_check","PRODUCT_NAME":"firebase_app_check","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e988a063649f4f054b30081157d6cfcaa4c","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e912e07d424cdf8e7522667434d5bd3f","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/firebase_app_check/firebase_app_check-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/firebase_app_check/firebase_app_check-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"15.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MACH_O_TYPE":"staticlib","MODULEMAP_FILE":"Target Support Files/firebase_app_check/firebase_app_check.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"firebase_app_check","PRODUCT_NAME":"firebase_app_check","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98c9eda022570d8bade79621c2c6ccdfbe","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98d6d26726976b2e08a5c89968805d3304","guid":"bfdfe7dc352907fc980b868725387e986429c3609fb596acb9ef85af74363599","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e987257dfc73b43963823ab3e833020d53b","guid":"bfdfe7dc352907fc980b868725387e989af0ff5eb2d6b0c5253b0de31189d720","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e6e862ae88920fd2aa08c4d49b573983","guid":"bfdfe7dc352907fc980b868725387e98d89cb77a27ba98000e028c382a5cc52b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9872317cb485910fd1580965e87f2fb858","guid":"bfdfe7dc352907fc980b868725387e98d30d35d1b5ba70d2e2898c982c4ecea3","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e980c7e27df05ae77bf0663c37468ec4d68","guid":"bfdfe7dc352907fc980b868725387e9804b03e8d77afb7cd7ab6ad315f355b9a","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98f8bd1276980959d08e50d551f643e3f6","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b3b0eb48012053daff698e8d2eecd384","guid":"bfdfe7dc352907fc980b868725387e98b560bcec930c02e36024acbe22501a4e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98157eaa509705c5a0a8cf3ea2683f01c3","guid":"bfdfe7dc352907fc980b868725387e98f7d918f7cbb66e428250c231e8b678d2"},{"fileReference":"bfdfe7dc352907fc980b868725387e9811391913961f2b0ab6847057591d15a2","guid":"bfdfe7dc352907fc980b868725387e983d702bdbceda77734fde931632e99c61"},{"fileReference":"bfdfe7dc352907fc980b868725387e988426fad311447aa6640aeb8b4fe3b1d2","guid":"bfdfe7dc352907fc980b868725387e980a04201fef45be55090d423324fcd152"},{"fileReference":"bfdfe7dc352907fc980b868725387e986cf945052e9a5cc9cf921ff7b6631624","guid":"bfdfe7dc352907fc980b868725387e98245ebf0ff7e55665e7a560111f075217"}],"guid":"bfdfe7dc352907fc980b868725387e9845deb996ecac2f34333396d059ec4e5e","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98e73f4ea779ab24f3c49aa627356a839c"}],"guid":"bfdfe7dc352907fc980b868725387e989bbfdc15c577d12bc28cd60ea06dae27","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e9875cbcb21229fc528c24a78bf6a32e9bf","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98d57b8bce60a0f11113f4cff532db68d3","name":"Firebase"},{"guid":"bfdfe7dc352907fc980b868725387e98ecaebc2b66f6675fbaa388164aa6c8dd","name":"FirebaseAppCheck"},{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e987f74324bfc5c78140e34d510e26e00c1","name":"firebase_core"}],"guid":"bfdfe7dc352907fc980b868725387e98213dce80d6344a36faf6079e42d20067","name":"firebase_app_check","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98b45c9f0525cc477a414dac35b7dfddb5","name":"firebase_app_check.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ec851e59095ec5bf084fefcd5588ef75-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ec851e59095ec5bf084fefcd5588ef75-json new file mode 100644 index 00000000..015af6a6 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ec851e59095ec5bf084fefcd5588ef75-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9820adfbf68e5990b89cefc5d0ec651cfd","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/RecaptchaInterop/RecaptchaInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"11.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"RecaptchaInterop","PRODUCT_NAME":"RecaptchaInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e982029642174afaeaf5f6d6a171228990e","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e4c67bec0da225378144113a5283f5e7","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/RecaptchaInterop/RecaptchaInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"11.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop.modulemap","PRODUCT_MODULE_NAME":"RecaptchaInterop","PRODUCT_NAME":"RecaptchaInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98ca6298affe3b2251336f81d4d31cda29","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e4c67bec0da225378144113a5283f5e7","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/RecaptchaInterop/RecaptchaInterop-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"11.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/RecaptchaInterop/RecaptchaInterop.modulemap","PRODUCT_MODULE_NAME":"RecaptchaInterop","PRODUCT_NAME":"RecaptchaInterop","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98184f30de80282b2325a9c5c50e5a4ca8","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9846288276371e5cec52e9a8a0d7bce8d6","guid":"bfdfe7dc352907fc980b868725387e985b9ef788a2f63e42989d87e2d4bd928a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9888baa60dc9fe0ff0987f46e74e092236","guid":"bfdfe7dc352907fc980b868725387e98f5e1aa42ff5659b24b8e057d94120384","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e985616a2553f97c6ad675d654cea953c03","guid":"bfdfe7dc352907fc980b868725387e9844857006c39671f0f8e35bf97e2f9f8c","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9898b4264b684c69bf23f82e2a6781718d","guid":"bfdfe7dc352907fc980b868725387e98d94d198f5505923b258d8bf7459691b0","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c54e5d70b03e206695cd4cd8927c8cc8","guid":"bfdfe7dc352907fc980b868725387e9845d58770cb5cb2ddf38c6f2018b590ba","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e9895443977c38e1be0af3feb46fe9915bd","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98f53a2b9142a2e19252d075f8af76efe2","guid":"bfdfe7dc352907fc980b868725387e985d8a68069d64fdfbac4efe7f4ed68dec"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eaaffa60434f1c632748d87268193d14","guid":"bfdfe7dc352907fc980b868725387e980dffea18c5e488dd570ae3e6af4ec6ee"}],"guid":"bfdfe7dc352907fc980b868725387e981c11a08274f8e5b3329c63cb2e7c62f9","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e986b5a3a20dc5941822d7ad4dca8f05ec5"}],"guid":"bfdfe7dc352907fc980b868725387e98b9a9049f06ad3c296a3207e49fcff82c","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e988d47cc2208426e3b9186cf19fde1addb","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98da29652de71b686743df2bd56decf7ef","name":"RecaptchaInterop","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e988c2a56cd963a48a63ab689fe60f47236","name":"RecaptchaInterop.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f3bbe05679242975dafb6d8e69ca7557-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f3bbe05679242975dafb6d8e69ca7557-json new file mode 100644 index 00000000..4a2254fe --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f3bbe05679242975dafb6d8e69ca7557-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984e4a588da55ed3c53fbd1e10e58fd1c6","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/fl_downloader","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"fl_downloader","INFOPLIST_FILE":"Target Support Files/fl_downloader/ResourceBundle-fl_downloader_privacy-fl_downloader-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"fl_downloader_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e981d747fe2f1d7335ed7d95e8f047a6545","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c91d9e268657e7dd6c060d3e603cc2b1","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/fl_downloader","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"fl_downloader","INFOPLIST_FILE":"Target Support Files/fl_downloader/ResourceBundle-fl_downloader_privacy-fl_downloader-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"fl_downloader_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98c68b47ec61c5cde3fadfea8837611f8e","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c91d9e268657e7dd6c060d3e603cc2b1","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/fl_downloader","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"fl_downloader","INFOPLIST_FILE":"Target Support Files/fl_downloader/ResourceBundle-fl_downloader_privacy-fl_downloader-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"fl_downloader_privacy","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9829bfc4b15e8bff2687d3072f648c807f","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98105b212d6bda99b4525303daa6279240","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98b38bb11290a0f3cb4344a95bb29dc03e","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9831fe485b45a69a8422a609fface14279","guid":"bfdfe7dc352907fc980b868725387e98c78b6e00db5873683b83629ebf8b0578"}],"guid":"bfdfe7dc352907fc980b868725387e98f211d7ac8c20ab3b210377b8f3ef8a71","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98abdd64503b5f23b8e73dd13a311548b1","name":"fl_downloader-fl_downloader_privacy","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98e14c0052b63c62c18c33ff7e46988a66","name":"fl_downloader_privacy.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f8fcc6d355b2806d43f663daae6a06d4-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f8fcc6d355b2806d43f663daae6a06d4-json new file mode 100644 index 00000000..3b8047e0 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f8fcc6d355b2806d43f663daae6a06d4-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e989ea1b5ad8cedbe34b515d7efe8552fea","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/AppCheckCore/AppCheckCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/AppCheckCore/AppCheckCore.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"AppCheckCore","PRODUCT_NAME":"AppCheckCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.5","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98e7a99df6e6a4873f55b3ad33955c73d7","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bc298d5906127a42ca6675d4cbce0891","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/AppCheckCore/AppCheckCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/AppCheckCore/AppCheckCore.modulemap","PRODUCT_MODULE_NAME":"AppCheckCore","PRODUCT_NAME":"AppCheckCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98961e7c9baafe5b4e26a5c59132394731","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98bc298d5906127a42ca6675d4cbce0891","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/AppCheckCore/AppCheckCore-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"12.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/AppCheckCore/AppCheckCore.modulemap","PRODUCT_MODULE_NAME":"AppCheckCore","PRODUCT_NAME":"AppCheckCore","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98a5e2f4ec47caf1c35a822cf8398efdf7","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98014d81339f7078c553aad067e2c1e542","guid":"bfdfe7dc352907fc980b868725387e983a7f56a8bda7f4a32b582f3e3543ec6b","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e981b9edf1174753b93be76528df893f4d1","guid":"bfdfe7dc352907fc980b868725387e98eefa1fbb52d5820fb2f74287e89fa5be","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9828b098957cb273088cb9694f57f6aa9b","guid":"bfdfe7dc352907fc980b868725387e98731bf14971647468f98880f5ab2ecebd"},{"fileReference":"bfdfe7dc352907fc980b868725387e982d5afb74f6affa743e0f460b5372128c","guid":"bfdfe7dc352907fc980b868725387e985188a1987f7cf2a34653743fc646f39e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c693a9d5b43f3dd47c9a722b20606f0d","guid":"bfdfe7dc352907fc980b868725387e988f117cd19bea713411f7d886e3ee57f4"},{"fileReference":"bfdfe7dc352907fc980b868725387e9895fad991994f740ea3a0d0ae15aa1ae4","guid":"bfdfe7dc352907fc980b868725387e98f7013b8d08955f03cd9ad217b6575ec4"},{"fileReference":"bfdfe7dc352907fc980b868725387e9879746c4764bdf06155261adb67d0ecda","guid":"bfdfe7dc352907fc980b868725387e98c3717fce461d8c3c727f6ab1e1ef8dd8"},{"fileReference":"bfdfe7dc352907fc980b868725387e9858fc7456770843d79df60a4fac1e1f21","guid":"bfdfe7dc352907fc980b868725387e98971d704d92f697bb1c3431227aeca581"},{"fileReference":"bfdfe7dc352907fc980b868725387e98881b0a9e4c6413cc3a4330c7764cb89e","guid":"bfdfe7dc352907fc980b868725387e987fb0a97b5514da31c86f2442dd9c5c3f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fb187d533907cbad809ebd88436c4a78","guid":"bfdfe7dc352907fc980b868725387e98557eecafb08f3d4c91d7a27a04cbc98f"},{"fileReference":"bfdfe7dc352907fc980b868725387e987f13dc02d10ed5c4ba105bb7b6fbc4e4","guid":"bfdfe7dc352907fc980b868725387e9831a692eeee4b67a14159ea381967273a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98492f8c730664e908ffe340f7496c9f79","guid":"bfdfe7dc352907fc980b868725387e986a533507042bc1b488b8d411b4e467dd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98aea1bf88784f644740e8ef1f765d1763","guid":"bfdfe7dc352907fc980b868725387e98ae7871cec43b2a430799debd34abfca4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f0b1f732a61c77e8d848d5868deb0b62","guid":"bfdfe7dc352907fc980b868725387e9843848d640b95d66ae7b0609d40822a18","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9837bc6335678372d578e6d02db1629af0","guid":"bfdfe7dc352907fc980b868725387e985df37ff259fbebfcef0385a6ec8da199"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c61395722d06659205139c45a25e2676","guid":"bfdfe7dc352907fc980b868725387e98f8b9a4332a9d35d417da9e60a68e1e5f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98da0f4edada96d01491b50b373b8e2d17","guid":"bfdfe7dc352907fc980b868725387e987016ef18ef8e69d7bc59d3c64c1062eb"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b1e121e7f892a1088bfc28fd83c4b2dc","guid":"bfdfe7dc352907fc980b868725387e98638fdbf659b7db656daaabefeb0fa1e0"},{"fileReference":"bfdfe7dc352907fc980b868725387e9838ab10c273a7e47d831e4ac8a3a5ac4c","guid":"bfdfe7dc352907fc980b868725387e982366610e765f0b5c67b62d5d700c6ccd","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98dac18db19a745421b5c65b10b4f4d79a","guid":"bfdfe7dc352907fc980b868725387e98201a1ca6306b21611dc8f609d62d8e10"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e1dae2413b60766fd26fdafb05789b08","guid":"bfdfe7dc352907fc980b868725387e9805d1768fe792537334f391c041c31f35","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e9829d2cfb34695f3b70daac392c3ac42be","guid":"bfdfe7dc352907fc980b868725387e981ca2893936b4e0ab83db00de99e3fe4b"},{"fileReference":"bfdfe7dc352907fc980b868725387e9840d287a87e37c64d0a718e1abe22ea0b","guid":"bfdfe7dc352907fc980b868725387e98df05095938a6e6a95d183f2debb7eeca"},{"fileReference":"bfdfe7dc352907fc980b868725387e98cd2ca0d4f82d3b33ee4ad429fe8459b0","guid":"bfdfe7dc352907fc980b868725387e988f3992c3226d3fffed029e44a32d785f","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bd9686f220f85a0a984b226ac6bf56e2","guid":"bfdfe7dc352907fc980b868725387e98325b799f84feca7cce3ae0c158b3d6d7"},{"fileReference":"bfdfe7dc352907fc980b868725387e9874128677a6ece04c6192ff43793cd2a3","guid":"bfdfe7dc352907fc980b868725387e98d73be45a5c15dbc80c5e29415079a21a","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98782156c69d76c8c6493e13d013c7ce68","guid":"bfdfe7dc352907fc980b868725387e9895e853d89407c6a61308b8ed634f6c83","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986a8e8f52ce1983fc319f91887811f274","guid":"bfdfe7dc352907fc980b868725387e983f07250a53c4dcc69dfbcf67ebdc325b"},{"fileReference":"bfdfe7dc352907fc980b868725387e9829195948780728699af6ecdf82603694","guid":"bfdfe7dc352907fc980b868725387e987481fc11365e35e19c58f07f6f4b732c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98e10e47fb86648c98be3656c0ccca10e5","guid":"bfdfe7dc352907fc980b868725387e985b6c7b86e2e3ddab6f8772c5362a6fba"},{"fileReference":"bfdfe7dc352907fc980b868725387e9818e104a51a5ccc214c42f6a98edeef45","guid":"bfdfe7dc352907fc980b868725387e988919c6af1499779a90e7598a5e84fabe"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a20441f218b6e5f9df32f6fd2cd3c3a6","guid":"bfdfe7dc352907fc980b868725387e98d6d0fe9c6b6c404e0d62b0cbcd05dfdf","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ab95d45482b4f15cf9b35a49cabce56a","guid":"bfdfe7dc352907fc980b868725387e9810d41d30cf3c158f9509077744b70505"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ed76d12f5c543a6a57822cdb488c14fc","guid":"bfdfe7dc352907fc980b868725387e9865d6cb4f29a80f2f2ce4e60e0090a0bb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98835e9bec84d11ab061c8232c82eb1d7e","guid":"bfdfe7dc352907fc980b868725387e98ea323f1a49908e40b0b598e61db59b71"},{"fileReference":"bfdfe7dc352907fc980b868725387e9806f6d128aff99460ffc6c94ba1bc162c","guid":"bfdfe7dc352907fc980b868725387e9866a81d67491e84a3ef0e7b3befdbdaba"},{"fileReference":"bfdfe7dc352907fc980b868725387e980c5f74743a1066c09331ff78287d8b6a","guid":"bfdfe7dc352907fc980b868725387e98f9a04fb7607f394362f9bff3a632b600","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b18aaaf052e27db0b53d9fa8af58d2c2","guid":"bfdfe7dc352907fc980b868725387e98c1b9cbe39894801763b170085b67c5ad"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ea3377b1e0c0bdef3341745d6980d9c2","guid":"bfdfe7dc352907fc980b868725387e984e87e4b3e6b500cceaa46ede0ec13dfb","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e986d751b4b66302242538b97dc19e6cc3c","guid":"bfdfe7dc352907fc980b868725387e9804e24ee381ecd94ecdaeb870ed0114ce"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a451f8861c61957089616af539f9e48b","guid":"bfdfe7dc352907fc980b868725387e987e8729dc670ba4e8dc2e7ab782a73fb8"},{"fileReference":"bfdfe7dc352907fc980b868725387e98695cb111b5ba9a097c1007af207f49de","guid":"bfdfe7dc352907fc980b868725387e980673b86a47f0fe84859c2176137bfbd7"}],"guid":"bfdfe7dc352907fc980b868725387e98dc3f6c017f50c3291e26862a62071ad6","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98c7d21c3328d9ad46039795667d6cc430","guid":"bfdfe7dc352907fc980b868725387e981251f36c01e0bb324ca1cf7a8d9bddb0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eda68ffa8acf6341bdd6764dc69f14ea","guid":"bfdfe7dc352907fc980b868725387e98d8db050f1c7a5fd0ec0a4596c587f92c"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c82d9f039480b6a3f302f98e59983983","guid":"bfdfe7dc352907fc980b868725387e98251d465f7239177f9eb05186be427f1b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98539f97205232fdc1451a9f7c8097d9f6","guid":"bfdfe7dc352907fc980b868725387e98b9bf91278debb41b3833f220f1b435bc"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b83a24afd65346b2bf12ca652c517f99","guid":"bfdfe7dc352907fc980b868725387e98af769f021239e440439d2f37c2a8b47a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98087e9537dc37fc002b865cca978e783c","guid":"bfdfe7dc352907fc980b868725387e98f4410e2eefcc5e3073d1057d8a440acc"},{"fileReference":"bfdfe7dc352907fc980b868725387e988feba12f52eda30148e94b936a418633","guid":"bfdfe7dc352907fc980b868725387e981c659a32af5c88dd60c9e7e92e503c73"},{"fileReference":"bfdfe7dc352907fc980b868725387e98577f1fe42e5dc5c2e7e55299acf301aa","guid":"bfdfe7dc352907fc980b868725387e98385e9f712da19f3fdeab81bd33335d87"},{"fileReference":"bfdfe7dc352907fc980b868725387e98358267319aee2a1f6097c2d48c844228","guid":"bfdfe7dc352907fc980b868725387e98a44cf29d16204615eb6acc6a177ed90d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98ca28cb9281f2e84ed045a06550b0e564","guid":"bfdfe7dc352907fc980b868725387e981759ea69ef13d9431585b07246de10e5"},{"fileReference":"bfdfe7dc352907fc980b868725387e985813b18e8935c4f95e05bcd74f837249","guid":"bfdfe7dc352907fc980b868725387e98c7a014a0f2696eb65fdde5d95ff8a377"},{"fileReference":"bfdfe7dc352907fc980b868725387e9827ca8bd13e7ceee923e143162527ddf4","guid":"bfdfe7dc352907fc980b868725387e987d3c88b047f31c79453e480da1cee745"},{"fileReference":"bfdfe7dc352907fc980b868725387e984e54641bd8600d981f2b8ae39a870e00","guid":"bfdfe7dc352907fc980b868725387e98754dd466afb74dc55b83de8dbd18dd4e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98174dfe48f0936468875402ed704dabc2","guid":"bfdfe7dc352907fc980b868725387e98d346057307b65a0c4cb63b7ce2cfbc65"},{"fileReference":"bfdfe7dc352907fc980b868725387e9829007e4ebcafeb1e46a41c025d1c75c6","guid":"bfdfe7dc352907fc980b868725387e9831a5a7cf4456b84e8b2fb59d15681b76"},{"fileReference":"bfdfe7dc352907fc980b868725387e984be13140013cec049e7b151fd1988622","guid":"bfdfe7dc352907fc980b868725387e98630b01bae14ac405faf80a562b3c32b2"},{"fileReference":"bfdfe7dc352907fc980b868725387e9808d0d0571ccc4b7e15d946a45268ab43","guid":"bfdfe7dc352907fc980b868725387e98c9f34912719e77ba96475461238e0e02"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f3de26ba5b5c36f5aeffb5c06f1623ec","guid":"bfdfe7dc352907fc980b868725387e984867af3440057818079d08ea0c4d6195"},{"fileReference":"bfdfe7dc352907fc980b868725387e981cf6381f55e9ecb15799f109ba22813e","guid":"bfdfe7dc352907fc980b868725387e9804dbc6bc4a995fc03805e33bbdc61583"},{"fileReference":"bfdfe7dc352907fc980b868725387e9893049ceada4e29aa457dfc968b35d04d","guid":"bfdfe7dc352907fc980b868725387e98d92cafd93ccc407f0b67993abcefdce5"},{"fileReference":"bfdfe7dc352907fc980b868725387e983ef18a79e17b5bdc30cb4f2b4274fdb9","guid":"bfdfe7dc352907fc980b868725387e9820143a2be1e220fac8de61a11087c01f"},{"fileReference":"bfdfe7dc352907fc980b868725387e982441595d23425e7fc95dc3f4a540e4da","guid":"bfdfe7dc352907fc980b868725387e98f5c29ea9255f8220e21e5404dc5a3f8e"},{"fileReference":"bfdfe7dc352907fc980b868725387e982b8462cd169d1e0749ac27072f89f63e","guid":"bfdfe7dc352907fc980b868725387e982693cc42ebb05a72e63217341d71bd9e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9828e7a28a227cdf431de4bf2858a41bbe","guid":"bfdfe7dc352907fc980b868725387e985d0530ef6188ebe958e1f0d3f3298d82"},{"fileReference":"bfdfe7dc352907fc980b868725387e987533d8eadf98de75a39414c45f84c97a","guid":"bfdfe7dc352907fc980b868725387e9829041b1e039eb006c470ff92591bf911"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f4e9b20932af00aaa09e6fad037bc675","guid":"bfdfe7dc352907fc980b868725387e98b92b9cf860855796967f283ce7415d09"},{"fileReference":"bfdfe7dc352907fc980b868725387e988d91cc71f5ce438497a6057117f8c354","guid":"bfdfe7dc352907fc980b868725387e98debe9957367259f62596ede328df84af"},{"fileReference":"bfdfe7dc352907fc980b868725387e985f834f5e6923ec908549b8f62a618c71","guid":"bfdfe7dc352907fc980b868725387e98ec8f6bff25068400792a0da62301d62a"},{"fileReference":"bfdfe7dc352907fc980b868725387e98234709d52c7321a4980d4abdb69bdab2","guid":"bfdfe7dc352907fc980b868725387e981808cef69632857ddb48af8a1b5faf76"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c749ee5587e64f95f2b09ed09f61b050","guid":"bfdfe7dc352907fc980b868725387e980f230ea024b72dbc683a1fabead8d6bf"},{"fileReference":"bfdfe7dc352907fc980b868725387e9848eaaee93b51e8f77bc9842360a966dd","guid":"bfdfe7dc352907fc980b868725387e98deca3a41ff15842151e1be841cc3fff0"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a68711618db6b4b78c1e1f9eba53a069","guid":"bfdfe7dc352907fc980b868725387e98f21ff164321f2d57d89d63e9fa8d5d8e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9827dd64bc5511da2695473b94ff768e19","guid":"bfdfe7dc352907fc980b868725387e981618ab1789cddc3783305bb624a1280e"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c0bd7a1ba78b0e4556aa605a1ba1a2e1","guid":"bfdfe7dc352907fc980b868725387e98c367e72e8bce33e83d8a76f05c126e9d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98bbce17ed01d5c32b82156eaf7a9cc458","guid":"bfdfe7dc352907fc980b868725387e98c36efdc476e07ebbd7263ace396ae758"}],"guid":"bfdfe7dc352907fc980b868725387e98053600d677a0ee3a6e8294a5f6c29926","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98a7f5c11a3ddc6c6109c703c9daffc90f"}],"guid":"bfdfe7dc352907fc980b868725387e986ef21295949b1adf438aaa172cba7c15","type":"com.apple.buildphase.frameworks"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e987799c6ff721a2f90b939c7d64edb78cc","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e98718890dfdac589615663a02d43d9af3e","name":"GoogleUtilities"},{"guid":"bfdfe7dc352907fc980b868725387e98f10882e1684b8a3dfdec597bc0a47af3","name":"PromisesObjC"}],"guid":"bfdfe7dc352907fc980b868725387e98cd8162b601eb6c17e4d86eec112a388c","name":"AppCheckCore","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C-Plus-Plus","productReference":{"guid":"bfdfe7dc352907fc980b868725387e985c8c1a45791dbc15ae7565c9ac08e62e","name":"AppCheckCore.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=fbb75b67977f7fd3136c2c9e82b06c66-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=fbb75b67977f7fd3136c2c9e82b06c66-json new file mode 100644 index 00000000..32110e53 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=fbb75b67977f7fd3136c2c9e82b06c66-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9858f3b516df641443530da1bc57fe9cb2","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftyGif","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SwiftyGif","INFOPLIST_FILE":"Target Support Files/SwiftyGif/ResourceBundle-SwiftyGif-SwiftyGif-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","ONLY_ACTIVE_ARCH":"NO","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e9806b9aaab628b0b376322c048fad9e215","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ee297b6d0e4054f62dc3e42830b40034","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftyGif","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SwiftyGif","INFOPLIST_FILE":"Target Support Files/SwiftyGif/ResourceBundle-SwiftyGif-SwiftyGif-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e986cca4cd0cfe5897bd20687cf94b99eb6","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98ee297b6d0e4054f62dc3e42830b40034","buildSettings":{"CODE_SIGNING_ALLOWED":"NO","CODE_SIGNING_IDENTITY":"-","CODE_SIGNING_REQUIRED":"NO","CONFIGURATION_BUILD_DIR":"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SwiftyGif","EXPANDED_CODE_SIGN_IDENTITY":"-","IBSC_MODULE":"SwiftyGif","INFOPLIST_FILE":"Target Support Files/SwiftyGif/ResourceBundle-SwiftyGif-SwiftyGif-Info.plist","IPHONEOS_DEPLOYMENT_TARGET":"9.0","PRODUCT_NAME":"SwiftyGif","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","TARGETED_DEVICE_FAMILY":"1,2","WRAPPER_EXTENSION":"bundle"},"guid":"bfdfe7dc352907fc980b868725387e98edbb20537df13b747231792e67230350","name":"Release"}],"buildPhases":[{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e98bf85d6781eaa8e2307ca9becfe7debd9","type":"com.apple.buildphase.sources"},{"buildFiles":[],"guid":"bfdfe7dc352907fc980b868725387e987fd9d8a6181d78ab5a9c86986248aa32","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b3294ad38a1a774f918eb06a0d82d5fc","guid":"bfdfe7dc352907fc980b868725387e9823ca68cbbab4250d50c6ef9758b67ab4"}],"guid":"bfdfe7dc352907fc980b868725387e98617f31f14f5d20f06300593fb19e3def","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[],"guid":"bfdfe7dc352907fc980b868725387e98f5cd644fc2aeb8654450a2168f52697c","name":"SwiftyGif-SwiftyGif","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9824d08d80a11ec6e34ca1c1e17eca0844","name":"SwiftyGif.bundle","type":"product"},"productTypeIdentifier":"com.apple.product-type.bundle","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":0},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":0}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff36872ab1512227359a12a6bdfb005a-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff36872ab1512227359a12a6bdfb005a-json new file mode 100644 index 00000000..3ff304b9 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff36872ab1512227359a12a6bdfb005a-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e984e4a588da55ed3c53fbd1e10e58fd1c6","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/fl_downloader/fl_downloader-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/fl_downloader/fl_downloader-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/fl_downloader/fl_downloader.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"fl_downloader","PRODUCT_NAME":"fl_downloader","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b3e9af480c11026dda651b1a259d5331","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c91d9e268657e7dd6c060d3e603cc2b1","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/fl_downloader/fl_downloader-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/fl_downloader/fl_downloader-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/fl_downloader/fl_downloader.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"fl_downloader","PRODUCT_NAME":"fl_downloader","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9811e0df8bbacae27f0a82a011919f4e9b","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c91d9e268657e7dd6c060d3e603cc2b1","buildSettings":{"CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/fl_downloader/fl_downloader-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/fl_downloader/fl_downloader-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/fl_downloader/fl_downloader.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"fl_downloader","PRODUCT_NAME":"fl_downloader","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9895ec683195519d210f0111debbce5b1c","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98e9683ad27cd35a81b03f764dc06cfad0","guid":"bfdfe7dc352907fc980b868725387e986f918640bedf880f8783ce5c84300e56","headerVisibility":"public"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a8bcf9b778aff46eca5e22cafa52131b","guid":"bfdfe7dc352907fc980b868725387e987a440fd8dbb8990c10e50c6d04775930","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e980148d04120ca1e2af555fdd146152f97","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e9841face9f91cced866f2eca4a4b6c1da2","guid":"bfdfe7dc352907fc980b868725387e9885f8bd51676cb9cdd800921899e45cf9"},{"fileReference":"bfdfe7dc352907fc980b868725387e98914c048b53a42f42ba49718548e5cd81","guid":"bfdfe7dc352907fc980b868725387e98b5db47fc9c7ba16e239cd25e0812cfc1"},{"fileReference":"bfdfe7dc352907fc980b868725387e9851df058efa51527351690153e2e7a913","guid":"bfdfe7dc352907fc980b868725387e987e5c996dc8776989987ed9646a7c33de"}],"guid":"bfdfe7dc352907fc980b868725387e987e25f6baebcb92061fa7a3fe54d30e5d","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98400c79d78219652b39963f49b82a5dd5"}],"guid":"bfdfe7dc352907fc980b868725387e98ef6187d6ee599104273156a3c19ede19","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98ca83a8acf6416e0c3bd8b6afadb8bce2","targetReference":"bfdfe7dc352907fc980b868725387e98abdd64503b5f23b8e73dd13a311548b1"}],"guid":"bfdfe7dc352907fc980b868725387e9815833bb8cff325841f5f1bc61766efa0","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98abdd64503b5f23b8e73dd13a311548b1","name":"fl_downloader-fl_downloader_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98cfaa9701b1371f15b99c4f66ff385fb3","name":"fl_downloader","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Objective-C","productReference":{"guid":"bfdfe7dc352907fc980b868725387e9803300d8065febd8b73cf4bb47635a5a9","name":"fl_downloader.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff5000f2df75d09390a7c02a18cf47cb-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff5000f2df75d09390a7c02a18cf47cb-json new file mode 100644 index 00000000..44f24899 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff5000f2df75d09390a7c02a18cf47cb-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98e9790273c34cf01756c3ac2cbd541c6d","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/app_settings/app_settings-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/app_settings/app_settings-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/app_settings/app_settings.modulemap","ONLY_ACTIVE_ARCH":"NO","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"app_settings","PRODUCT_NAME":"app_settings","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0.1","TARGETED_DEVICE_FAMILY":"1,2","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e9830d6bb49fe670aedf25696dacb5a931b","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981916adc978ad471261fb8f5e1e97ed3a","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/app_settings/app_settings-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/app_settings/app_settings-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/app_settings/app_settings.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"app_settings","PRODUCT_NAME":"app_settings","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0.1","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e986565976926f5320bfcba72107d42606d","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e981916adc978ad471261fb8f5e1e97ed3a","buildSettings":{"CLANG_ENABLE_OBJC_WEAK":"NO","CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER":"NO","CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_BITCODE":"NO","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","EXCLUDED_ARCHS[sdk=iphoneos*]":"$(inherited) armv7","EXCLUDED_ARCHS[sdk=iphonesimulator*]":"$(inherited) i386","FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\" $(inherited)","FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]":"\"/Users/yaso_meth/Git/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\" $(inherited)","GCC_PREFIX_HEADER":"Target Support Files/app_settings/app_settings-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/app_settings/app_settings-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/app_settings/app_settings.modulemap","OTHER_LDFLAGS":"$(inherited) -framework Flutter","PRODUCT_MODULE_NAME":"app_settings","PRODUCT_NAME":"app_settings","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5.0.1","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VALID_ARCHS[sdk=iphonesimulator*]":"$(ARCHS_STANDARD)","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e98b04a0b792901225c2ea31d5baa82eed5","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98fdf0be27e7b47159d9d8b87c584ea45f","guid":"bfdfe7dc352907fc980b868725387e98ba9395f2c1b607eec43204cf621f1d9c","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e98ccf8550e493f2144cf1f6ed0eff21468","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b8ecd436f5a48de64e24bcea345336fb","guid":"bfdfe7dc352907fc980b868725387e98bccb4c9cc2671489be299602d7cecd08"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f5e4ec7c8e38b008f7f7c3a9bd4a401e","guid":"bfdfe7dc352907fc980b868725387e9885691fe2efdd2cc3f1243fa80c796d16"}],"guid":"bfdfe7dc352907fc980b868725387e982b69e8d5a8dbfbb8b7206d0771ee52f1","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e98e522bc3058aaf05bd33d5dbc6762fd75"}],"guid":"bfdfe7dc352907fc980b868725387e980b74592459c3dd5d4365fc3ac6bb1e04","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e98167fba69bdf7f86529ed5b907d751eff","targetReference":"bfdfe7dc352907fc980b868725387e98cf3ab2030ed25c0947bdaa95034b1488"}],"guid":"bfdfe7dc352907fc980b868725387e986f601b731d225ae92d96971fdbfc381f","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e989da425bb6d6d5d8dbb95e4afffb82217","name":"Flutter"},{"guid":"bfdfe7dc352907fc980b868725387e98cf3ab2030ed25c0947bdaa95034b1488","name":"app_settings-app_settings_privacy"}],"guid":"bfdfe7dc352907fc980b868725387e98c7dd3f56f799b35458f81928cf1cb47b","name":"app_settings","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98d29eb572b0b4c6acbe0dc048bab4bd1d","name":"app_settings.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff93596a3d92ba01970679242c7f2f1b-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff93596a3d92ba01970679242c7f2f1b-json new file mode 100644 index 00000000..a9e2ad89 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ff93596a3d92ba01970679242c7f2f1b-json @@ -0,0 +1 @@ +{"buildConfigurations":[{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e9837b4eae1f2290b03d7d4aabded8138b2","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKImagePickerController/DKImagePickerController-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController.modulemap","ONLY_ACTIVE_ARCH":"NO","PRODUCT_MODULE_NAME":"DKImagePickerController","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e987c1a49d2eb4928f38153fbb752b43f0d","name":"Debug"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c17784c5efe37bcec77e0c17b5660c20","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKImagePickerController/DKImagePickerController-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController.modulemap","PRODUCT_MODULE_NAME":"DKImagePickerController","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e981a061109697a6fecb5c4052027830873","name":"Profile"},{"baseConfigurationFileReference":"bfdfe7dc352907fc980b868725387e98c17784c5efe37bcec77e0c17b5660c20","buildSettings":{"CODE_SIGN_IDENTITY[sdk=appletvos*]":"","CODE_SIGN_IDENTITY[sdk=iphoneos*]":"","CODE_SIGN_IDENTITY[sdk=watchos*]":"","CURRENT_PROJECT_VERSION":"1","DEFINES_MODULE":"YES","DYLIB_COMPATIBILITY_VERSION":"1","DYLIB_CURRENT_VERSION":"1","DYLIB_INSTALL_NAME_BASE":"@rpath","ENABLE_MODULE_VERIFIER":"NO","ENABLE_USER_SCRIPT_SANDBOXING":"NO","GCC_PREFIX_HEADER":"Target Support Files/DKImagePickerController/DKImagePickerController-prefix.pch","GENERATE_INFOPLIST_FILE":"NO","INFOPLIST_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController-Info.plist","INSTALL_PATH":"$(LOCAL_LIBRARY_DIR)/Frameworks","IPHONEOS_DEPLOYMENT_TARGET":"9.0","LD_RUNPATH_SEARCH_PATHS":"$(inherited) @executable_path/Frameworks @loader_path/Frameworks","MODULEMAP_FILE":"Target Support Files/DKImagePickerController/DKImagePickerController.modulemap","PRODUCT_MODULE_NAME":"DKImagePickerController","PRODUCT_NAME":"DKImagePickerController","SDKROOT":"iphoneos","SKIP_INSTALL":"YES","SWIFT_ACTIVE_COMPILATION_CONDITIONS":"$(inherited) ","SWIFT_INSTALL_OBJC_HEADER":"YES","SWIFT_VERSION":"5","TARGETED_DEVICE_FAMILY":"1,2","VALIDATE_PRODUCT":"YES","VERSIONING_SYSTEM":"apple-generic","VERSION_INFO_PREFIX":""},"guid":"bfdfe7dc352907fc980b868725387e984a2bfc0afebe00a97dd280fbd3b086c7","name":"Release"}],"buildPhases":[{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98e6b5d8425df9cc686639898d81ab29bb","guid":"bfdfe7dc352907fc980b868725387e98305321bb0f6c61d76ab6f8f834f9e1bc","headerVisibility":"public"}],"guid":"bfdfe7dc352907fc980b868725387e989c7318c71e29c5c2fa728fab937f84e4","type":"com.apple.buildphase.headers"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98335a94dbe483545144593a747bf57488","guid":"bfdfe7dc352907fc980b868725387e986b9c07eb90d1c19fb7ac9f978eac2cfd"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c856fc1f1a5df75e1f335a24f80a324c","guid":"bfdfe7dc352907fc980b868725387e9899bf2eef86ec86d3071d0464ba311bc3"},{"fileReference":"bfdfe7dc352907fc980b868725387e9883b700d4c655a66d2eb0ecd5009867cc","guid":"bfdfe7dc352907fc980b868725387e989923225760583f9044f3477d68370fb4"},{"fileReference":"bfdfe7dc352907fc980b868725387e98227220f91dfab4c4322ac4ed581b024b","guid":"bfdfe7dc352907fc980b868725387e980b8fe6bd9ce7b7f7f9b672f675ac40ea"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a7167b35e446804e288fc5f3108fd0e0","guid":"bfdfe7dc352907fc980b868725387e98c7914d6db7a604491a406b7ffd04ffdc"},{"fileReference":"bfdfe7dc352907fc980b868725387e984737ea76e0a4c76036af3b355fdec0ed","guid":"bfdfe7dc352907fc980b868725387e98eb2913c855fd2bba90610341d1005093"},{"fileReference":"bfdfe7dc352907fc980b868725387e98eba5be275263271fcd1bf32ee797809b","guid":"bfdfe7dc352907fc980b868725387e9818bf3e3f4e2e4ff6409fd3de93a3e67b"},{"fileReference":"bfdfe7dc352907fc980b868725387e98b76a64655dc550f5ebec2f9ff3200413","guid":"bfdfe7dc352907fc980b868725387e9862f3f56aa2a92efeb6d501703a17fb78"},{"fileReference":"bfdfe7dc352907fc980b868725387e980f1347790a1fae83f056fa4b808c3cd0","guid":"bfdfe7dc352907fc980b868725387e986f0a5a4d4d049699b38b834e5127e27c"},{"fileReference":"bfdfe7dc352907fc980b868725387e9876da5a8044ee25187970ba558822731d","guid":"bfdfe7dc352907fc980b868725387e98b11d52cb23817759d43df3901c9dfdcf"},{"fileReference":"bfdfe7dc352907fc980b868725387e9849e6729fc1e44edf7426ac54b962a26b","guid":"bfdfe7dc352907fc980b868725387e982e2cfaddbe60c31e36e71f4cf7b78cf2"},{"fileReference":"bfdfe7dc352907fc980b868725387e98a8ca137552a3696b8a3ae1c151998fe9","guid":"bfdfe7dc352907fc980b868725387e9880b17e68f279e7d7783a51e9bb5287b7"},{"fileReference":"bfdfe7dc352907fc980b868725387e98add192413820866011e7588ab8d50a1b","guid":"bfdfe7dc352907fc980b868725387e98edb05713e1e170990070d795fbfd9ad1"},{"fileReference":"bfdfe7dc352907fc980b868725387e98df6555ed20370a218636d2d1ef042bff","guid":"bfdfe7dc352907fc980b868725387e98571373774a6c562d2a57eeef6625aad4"},{"fileReference":"bfdfe7dc352907fc980b868725387e983c5b7868d9cf3226bd45e2f7fde341f2","guid":"bfdfe7dc352907fc980b868725387e982b8ddf46d054df8e6dd54a4248a7bf7d"},{"fileReference":"bfdfe7dc352907fc980b868725387e986747ae603292c978ec451164346bb561","guid":"bfdfe7dc352907fc980b868725387e98a0be07ca2e426e3bc60d30898d361288"},{"fileReference":"bfdfe7dc352907fc980b868725387e9873c16ebd0704c7e74ef2732a8617faf4","guid":"bfdfe7dc352907fc980b868725387e98b3f4cf0af8ed4ae02ddeeb10e435cd75"},{"fileReference":"bfdfe7dc352907fc980b868725387e98034544f799334fac9753d3c062ac4eb5","guid":"bfdfe7dc352907fc980b868725387e9812c712ccbecb48d4ce26f86166ff880e"},{"fileReference":"bfdfe7dc352907fc980b868725387e9804eba36085f83cab0f06e047a1723201","guid":"bfdfe7dc352907fc980b868725387e982a440638f7cb9965d090ab0c181da156"},{"fileReference":"bfdfe7dc352907fc980b868725387e9805cbd30dca7799b8a62e2c9aa2908321","guid":"bfdfe7dc352907fc980b868725387e9803b6b2b356410bc7bcfcc1b875c69472"},{"fileReference":"bfdfe7dc352907fc980b868725387e985f34fcdb8acab7b808291804ea4c93a4","guid":"bfdfe7dc352907fc980b868725387e98ec9c4546923a074af807de40344c27c3"},{"fileReference":"bfdfe7dc352907fc980b868725387e98c04e1fef39dccde86db40118bcaf63f7","guid":"bfdfe7dc352907fc980b868725387e985cfeda817f2be498febfcb296540639a"},{"fileReference":"bfdfe7dc352907fc980b868725387e9804fc4899b4975caa6c83b0bcabd7bdcd","guid":"bfdfe7dc352907fc980b868725387e982082b1aebfa678d630e6c739c18a5003"},{"fileReference":"bfdfe7dc352907fc980b868725387e9847c7fe098b50f268068840c428bc95bc","guid":"bfdfe7dc352907fc980b868725387e987c4d107baf407af054f8312cf0ad4178"}],"guid":"bfdfe7dc352907fc980b868725387e98239213265a3abaa90df058a8c1bb91cf","type":"com.apple.buildphase.sources"},{"buildFiles":[{"fileReference":"bfdfe7dc352907fc980b868725387e98b14af7c49882340ad551cb13b0a1e06d","guid":"bfdfe7dc352907fc980b868725387e9840e570f7d28f64055b1dab9dc749246d"},{"fileReference":"bfdfe7dc352907fc980b868725387e98fc74d0fed09821b42c8c83fca08fddb2","guid":"bfdfe7dc352907fc980b868725387e98192e2db6ac44b70d83d52bc9a34503d6"},{"fileReference":"bfdfe7dc352907fc980b868725387e98f2f44ab0d0f0ce315b53d31757eb8db6","guid":"bfdfe7dc352907fc980b868725387e98f0a88717dff9f0a44bc37f82f0d7d1f4"}],"guid":"bfdfe7dc352907fc980b868725387e98819fd04ebca59115ef049e04b7b72408","type":"com.apple.buildphase.frameworks"},{"buildFiles":[{"guid":"bfdfe7dc352907fc980b868725387e988c2f740ef6174a43ddde75c8d424f6f2","targetReference":"bfdfe7dc352907fc980b868725387e9898fccba7a2febdedb43dddbf2e949fc3"}],"guid":"bfdfe7dc352907fc980b868725387e984c4b1b52a05e595bcc1230a93d57ff06","type":"com.apple.buildphase.resources"}],"buildRules":[],"dependencies":[{"guid":"bfdfe7dc352907fc980b868725387e9898fccba7a2febdedb43dddbf2e949fc3","name":"DKImagePickerController-DKImagePickerController"},{"guid":"bfdfe7dc352907fc980b868725387e989d0a1858a86fd6e6731ed20f88a1e515","name":"DKPhotoGallery"}],"guid":"bfdfe7dc352907fc980b868725387e985fd5cdb9993b1816141f0c012ffa62bd","name":"DKImagePickerController","predominantSourceCodeLanguage":"Xcode.SourceCodeLanguage.Swift","productReference":{"guid":"bfdfe7dc352907fc980b868725387e98f752ba05adf197c3696519e901961310","name":"DKImagePickerController.framework","type":"product"},"productTypeIdentifier":"com.apple.product-type.framework","provisioningSourceData":[{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Debug","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Profile","provisioningStyle":1},{"bundleIdentifierFromInfoPlist":"${PRODUCT_BUNDLE_IDENTIFIER}","configurationName":"Release","provisioningStyle":1}],"type":"standard"} \ No newline at end of file diff --git a/mih_ui/android/build/ios/XCBuildData/PIFCache/workspace/WORKSPACE@v11_hash=(null)_subobjects=d4d37871a9d2a6dba5291c9ce70cda86-json b/mih_ui/android/build/ios/XCBuildData/PIFCache/workspace/WORKSPACE@v11_hash=(null)_subobjects=d4d37871a9d2a6dba5291c9ce70cda86-json new file mode 100644 index 00000000..c59e6bf0 --- /dev/null +++ b/mih_ui/android/build/ios/XCBuildData/PIFCache/workspace/WORKSPACE@v11_hash=(null)_subobjects=d4d37871a9d2a6dba5291c9ce70cda86-json @@ -0,0 +1 @@ +{"guid":"dc4b70c03e8043e50e38f2068887b1d4","name":"Pods","path":"/Users/yaso_meth/Git/mih_main/mih-project/mih_ui/ios/Pods/Pods.xcodeproj/project.xcworkspace","projects":["PROJECT@v11_mod=d0293ee0112d0357cf900112c05ab991_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1"]} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md new file mode 100644 index 00000000..ee988ff3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/CHANGELOG.md @@ -0,0 +1,576 @@ +## 0.4.5 + + - **FEAT**(appcheck): appcheck reCAPTCHA mobile support (gradually rolling out) ([#18261](https://github.com/firebase/flutterfire/issues/18261)). ([036a860a](https://github.com/firebase/flutterfire/commit/036a860a0e66d46b5c57eb3df3a0f9e5846ef00b)) + +## 0.4.4+2 + + - Update a dependency to the latest release. + +## 0.4.4+1 + + - Update a dependency to the latest release. + +## 0.4.4 + + - **REFACTOR**: move all packages to workspace ([#18182](https://github.com/firebase/flutterfire/issues/18182)). ([6cdfcb10](https://github.com/firebase/flutterfire/commit/6cdfcb103da7be46ccb190d7e107d8c537aa1ff8)) + - **FIX**: update core, auth and app-check logic so internal resources on method channels are properly disposed ([#18268](https://github.com/firebase/flutterfire/issues/18268)). ([a0de4ed8](https://github.com/firebase/flutterfire/commit/a0de4ed86b0dff89bb9e557f2a54f38cd2546016)) + - **FEAT**(core): Add Auth and AppCheck as App's registered service. ([#18237](https://github.com/firebase/flutterfire/issues/18237)). ([7ce191cb](https://github.com/firebase/flutterfire/commit/7ce191cbd598b299cd0ec64b45d1366914367a5d)) + +## 0.4.3 + + - **FEAT**(app_check,windows): add support for AppCheck for Windows ([#18140](https://github.com/firebase/flutterfire/issues/18140)). ([81f30325](https://github.com/firebase/flutterfire/commit/81f30325fc926fe94b630e49f56b795c781a4cbe)) + - **FEAT**: use local firebase_core instead of remote SPM dependency ([#18141](https://github.com/firebase/flutterfire/issues/18141)). ([995caf40](https://github.com/firebase/flutterfire/commit/995caf400df80c0fde7151c651ccc6c0f756e381)) + +## 0.4.2 + + - **FEAT**(messaging,web): add support for debug tokens on Web ([#18057](https://github.com/firebase/flutterfire/issues/18057)). ([b853386e](https://github.com/firebase/flutterfire/commit/b853386e987d686eab4b8fd9b8dad14eda97479c)) + - **FEAT**(ios): migrate iOS to UIScene lifecycle ([#18054](https://github.com/firebase/flutterfire/issues/18054)). ([3ffa4110](https://github.com/firebase/flutterfire/commit/3ffa411098132fd5182a84be4e7a226106bc7451)) + +## 0.4.1+5 + + - Update a dependency to the latest release. + +## 0.4.1+4 + + - Update a dependency to the latest release. + +## 0.4.1+3 + + - Update a dependency to the latest release. + +## 0.4.1+2 + + - Update a dependency to the latest release. + +## 0.4.1+1 + + - **FIX**(app_check): Deprecate androidProvider and appleProvider parameters in activate method ([#17742](https://github.com/firebase/flutterfire/issues/17742)). ([4e7f800e](https://github.com/firebase/flutterfire/commit/4e7f800e94a895c6553bd3c1595b4f06ac69bb81)) + - **FIX**(app_check): Expose AppleAppAttestProvider without importing platform interface ([#17740](https://github.com/firebase/flutterfire/issues/17740)). ([6c2355a0](https://github.com/firebase/flutterfire/commit/6c2355a05d6bba763768ce3bc09c3cc0528fa900)) + +## 0.4.1 + + - **FEAT**(app-check): Debug token support for the activate method ([#17723](https://github.com/firebase/flutterfire/issues/17723)). ([3c638264](https://github.com/firebase/flutterfire/commit/3c638264565d902ddbe4dff5bb027aef9e1c2140)) + +## 0.4.0+1 + + - **FIX**(app_check,iOS): correctly parse `forceRefresh` argument using `boolValue` ([#17627](https://github.com/firebase/flutterfire/issues/17627)). ([8c0802d0](https://github.com/firebase/flutterfire/commit/8c0802d098c970740a34e83952f56dbe9eb279fd)) + +## 0.4.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: bump iOS SDK to version 12.0.0 ([#17549](https://github.com/firebase/flutterfire/issues/17549)). ([b2619e68](https://github.com/firebase/flutterfire/commit/b2619e685fec897513483df1d7be347b64f95606)) + - **BREAKING** **FEAT**(app-check): remove deprecated functions ([#17561](https://github.com/firebase/flutterfire/issues/17561)). ([3e4302c4](https://github.com/firebase/flutterfire/commit/3e4302c4281d1d39c140ff116643d700cd3c5ace)) + - **BREAKING** **FEAT**: bump Android SDK to version 34.0.0 ([#17554](https://github.com/firebase/flutterfire/issues/17554)). ([a5bdc051](https://github.com/firebase/flutterfire/commit/a5bdc051d40ee44e39cf0b8d2a7801bc6f618b67)) + +## 0.3.2+10 + + - Update a dependency to the latest release. + +## 0.3.2+9 + + - Update a dependency to the latest release. + +## 0.3.2+8 + + - Update a dependency to the latest release. + +## 0.3.2+7 + + - Update a dependency to the latest release. + +## 0.3.2+6 + + - Update a dependency to the latest release. + +## 0.3.2+5 + + - Update a dependency to the latest release. + +## 0.3.2+4 + + - Update a dependency to the latest release. + +## 0.3.2+3 + + - Update a dependency to the latest release. + +## 0.3.2+2 + + - Update a dependency to the latest release. + +## 0.3.2+1 + + - Update a dependency to the latest release. + +## 0.3.2 + + + - **FEAT**(app-check): Swift Package Manager support ([#16810](https://github.com/firebase/flutterfire/issues/16810)). ([f2e3f396](https://github.com/firebase/flutterfire/commit/f2e3f3965e83a6bf8c52c1cd9f80509a08907a84)) + +## 0.3.1+7 + + - Update a dependency to the latest release. + +## 0.3.1+6 + + - Update a dependency to the latest release. + +## 0.3.1+5 + + - Update a dependency to the latest release. + +## 0.3.1+4 + + - Update a dependency to the latest release. + +## 0.3.1+3 + + - **FIX**(all,apple): use modular headers to import ([#13400](https://github.com/firebase/flutterfire/issues/13400)). ([d7d2d4b9](https://github.com/firebase/flutterfire/commit/d7d2d4b93e7c00226027fffde46699f3d5388a41)) + +## 0.3.1+2 + + - Update a dependency to the latest release. + +## 0.3.1+1 + + - Update a dependency to the latest release. + +## 0.3.1 + + - **FEAT**(firestore,web): expose `webExperimentalForceLongPolling`, `webExperimentalAutoDetectLongPolling` and `timeoutSeconds` on web ([#13201](https://github.com/firebase/flutterfire/issues/13201)). ([6ec2a103](https://github.com/firebase/flutterfire/commit/6ec2a103a3a325a73550bdfff4c0d524ae7e4068)) + +## 0.3.0+5 + + - **DOCS**: remove reference to flutter.io and firebase.flutter.dev ([#13152](https://github.com/firebase/flutterfire/issues/13152)). ([5f0874b9](https://github.com/firebase/flutterfire/commit/5f0874b91e28a203dd62d37d391e5760c91f5729)) + +## 0.3.0+4 + + - Update a dependency to the latest release. + +## 0.3.0+3 + + - Update a dependency to the latest release. + +## 0.3.0+2 + + - Update a dependency to the latest release. + +## 0.3.0+1 + + - **FIX**(app-check,web): fixed broken `onTokenChanged` and ensured it is properly cleaned up. Streams are also cleaned up on "hot restart" ([#12933](https://github.com/firebase/flutterfire/issues/12933)). ([093b5fef](https://github.com/firebase/flutterfire/commit/093b5fef8c3b8314835dc954ce02daacd1e077f4)) + - **FIX**(firebase_app_check,ios): Replace angles with quotes in import statement ([#12929](https://github.com/firebase/flutterfire/issues/12929)). ([f2fc902b](https://github.com/firebase/flutterfire/commit/f2fc902b9e954baf9d72bd3863a85bde402d2133)) + - **FIX**(app-check,ios): update app check to stable release ([#12924](https://github.com/firebase/flutterfire/issues/12924)). ([ced11684](https://github.com/firebase/flutterfire/commit/ced1168482c3b8e8b4746abde13649d212a503fd)) + +## 0.3.0 + +> Note: This release has breaking changes. + + - **BREAKING** **REFACTOR**: android plugins require `minSdk 21`, auth requires `minSdk 23` ahead of android BOM `>=33.0.0` ([#12873](https://github.com/firebase/flutterfire/issues/12873)). ([52accfc6](https://github.com/firebase/flutterfire/commit/52accfc6c39d6360d9c0f36efe369ede990b7362)) + - **BREAKING** **REFACTOR**: bump all iOS deployment targets to iOS 13 ahead of Firebase iOS SDK `v11` breaking change ([#12872](https://github.com/firebase/flutterfire/issues/12872)). ([de0cea2c](https://github.com/firebase/flutterfire/commit/de0cea2c3c36694a76361be784255986fac84a43)) + +## 0.2.2+7 + + - Update a dependency to the latest release. + +## 0.2.2+6 + + - Update a dependency to the latest release. + +## 0.2.2+5 + + - Update a dependency to the latest release. + +## 0.2.2+4 + + - Update a dependency to the latest release. + +## 0.2.2+3 + + - Update a dependency to the latest release. + +## 0.2.2+2 + + - Update a dependency to the latest release. + +## 0.2.2+1 + + - **FIX**(app-check,android): fix unnecessary deprecation warning ([#12578](https://github.com/firebase/flutterfire/issues/12578)). ([805ca028](https://github.com/firebase/flutterfire/commit/805ca028d20c582e93bcebbeca3105deab365edc)) + +## 0.2.2 + + - **FEAT**(android): Bump `compileSdk` version of Android plugins to latest stable (34) ([#12566](https://github.com/firebase/flutterfire/issues/12566)). ([e891fab2](https://github.com/firebase/flutterfire/commit/e891fab291e9beebc223000b133a6097e066a7fc)) + +## 0.2.1+19 + + - **REFACTOR**(app_check,web): small refactor around initialisation of FirebaseAppCheckWeb ([#12474](https://github.com/firebase/flutterfire/issues/12474)). ([83aab7f8](https://github.com/firebase/flutterfire/commit/83aab7f8f6a6dde6e71765826c0e1f9aabc110a0)) + +## 0.2.1+18 + + - Update a dependency to the latest release. + +## 0.2.1+17 + + - Update a dependency to the latest release. + +## 0.2.1+16 + + - Update a dependency to the latest release. + +## 0.2.1+15 + + - Update a dependency to the latest release. + +## 0.2.1+14 + + - Update a dependency to the latest release. + +## 0.2.1+13 + + - Update a dependency to the latest release. + +## 0.2.1+12 + + - Update a dependency to the latest release. + +## 0.2.1+11 + + - Update a dependency to the latest release. + +## 0.2.1+10 + + - Update a dependency to the latest release. + +## 0.2.1+9 + + - Update a dependency to the latest release. + +## 0.2.1+8 + + - Update a dependency to the latest release. + +## 0.2.1+7 + + - Update a dependency to the latest release. + +## 0.2.1+6 + + - Update a dependency to the latest release. + +## 0.2.1+5 + + - Update a dependency to the latest release. + +## 0.2.1+4 + + - Update a dependency to the latest release. + +## 0.2.1+3 + + - Update a dependency to the latest release. + +## 0.2.1+2 + + - Update a dependency to the latest release. + +## 0.2.1+1 + + - Update a dependency to the latest release. + +## 0.2.1 + + - **REFACTOR**(app-check,android): update linting warnings ([#11666](https://github.com/firebase/flutterfire/issues/11666)). ([fa9c8181](https://github.com/firebase/flutterfire/commit/fa9c8181156697a96b2615906b24613f28346175)) + - **FIX**(firebase_app_check): Allow non-default app for Android debug provider ([#11680](https://github.com/firebase/flutterfire/issues/11680)). ([dd20c0c7](https://github.com/firebase/flutterfire/commit/dd20c0c7413dd9c9cd4c54426afc2572f9438607)) + - **FEAT**: Full support of AGP 8 ([#11699](https://github.com/firebase/flutterfire/issues/11699)). ([bdb5b270](https://github.com/firebase/flutterfire/commit/bdb5b27084d225809883bdaa6aa5954650551927)) + - **FEAT**(app_check): Use Android dependencies from Firebase BOM ([#11671](https://github.com/firebase/flutterfire/issues/11671)). ([378fcbdc](https://github.com/firebase/flutterfire/commit/378fcbdc4909e448d47cc204147a2ecd978b4fb7)) + - **DOCS**: Updated documentation link in firebase_app_check README.md ([#11712](https://github.com/firebase/flutterfire/issues/11712)). ([dd3e56c6](https://github.com/firebase/flutterfire/commit/dd3e56c67a2ddad0a11043f00e9d80544d36355a)) + +## 0.2.0+1 + + - Update a dependency to the latest release. + +## 0.2.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**(app-check,web): support for `ReCaptchaEnterpriseProvider`. User facing API updated. ([#11573](https://github.com/firebase/flutterfire/issues/11573)). ([09825edd](https://github.com/firebase/flutterfire/commit/09825edd0e1ecd609e2046fdefda439ce4099087)) + +## 0.1.5+2 + + - Update a dependency to the latest release. + +## 0.1.5+1 + + - Update a dependency to the latest release. + +## 0.1.5 + + - **FEAT**(app-check): support for `getLimitedUseToken()` API ([#11091](https://github.com/firebase/flutterfire/issues/11091)). ([9db9326f](https://github.com/firebase/flutterfire/commit/9db9326fe503c31299c9685449150e809543974e)) + +## 0.1.4+3 + + - Update a dependency to the latest release. + +## 0.1.4+2 + + - Update a dependency to the latest release. + +## 0.1.4+1 + + - Update a dependency to the latest release. + +## 0.1.4 + + - **FEAT**: update dependency constraints to `sdk: '>=2.18.0 <4.0.0'` `flutter: '>=3.3.0'` ([#10946](https://github.com/firebase/flutterfire/issues/10946)). ([2772d10f](https://github.com/firebase/flutterfire/commit/2772d10fe510dcc28ec2d37a26b266c935699fa6)) + - **FEAT**: update libraries to be compatible with Flutter 3.10.0 ([#10944](https://github.com/firebase/flutterfire/issues/10944)). ([e1f5a5ea](https://github.com/firebase/flutterfire/commit/e1f5a5ea798c54f19d1d2f7b8f2250f8819f44b7)) + +## 0.1.3 + + - **FIX**: add support for AGP 8.0 ([#10901](https://github.com/firebase/flutterfire/issues/10901)). ([a3b96735](https://github.com/firebase/flutterfire/commit/a3b967354294c295a9be8d699a6adb7f4b1dba7f)) + - **FEAT**: upgrade to dart 3 compatible dependencies ([#10890](https://github.com/firebase/flutterfire/issues/10890)). ([4bd7e59b](https://github.com/firebase/flutterfire/commit/4bd7e59b1f2b09a2230c49830159342dd4592041)) + +## 0.1.2+3 + + - **FIX**(app-check): use correct `getAppCheckToken()` method. Print out debug token for iOS. ([#10819](https://github.com/firebase/flutterfire/issues/10819)). ([66909a9c](https://github.com/firebase/flutterfire/commit/66909a9c5b10e85f93565cbc308fdbee4ec6f607)) + +## 0.1.2+2 + + - Update a dependency to the latest release. + +## 0.1.2+1 + + - **FIX**(app-check): fix 'Semantic Issue (Xcode): `new` is unavailable' on XCode 14.3 ([#10734](https://github.com/firebase/flutterfire/issues/10734)). ([cc6d1c28](https://github.com/firebase/flutterfire/commit/cc6d1c28193d5cdaaa564729340c380b5f632982)) + +## 0.1.2 + + - **FEAT**: bump dart sdk constraint to 2.18 ([#10618](https://github.com/firebase/flutterfire/issues/10618)). ([f80948a2](https://github.com/firebase/flutterfire/commit/f80948a28b62eead358bdb900d5a0dfb97cebb33)) + +## 0.1.1+14 + + - Update a dependency to the latest release. + +## 0.1.1+13 + + - Update a dependency to the latest release. + +## 0.1.1+12 + + - Update a dependency to the latest release. + +## 0.1.1+11 + + - Update a dependency to the latest release. + +## 0.1.1+10 + + - Update a dependency to the latest release. + +## 0.1.1+9 + + - Update a dependency to the latest release. + +## 0.1.1+8 + + - Update a dependency to the latest release. + +## 0.1.1+7 + + - Update a dependency to the latest release. + +## 0.1.1+6 + + - Update a dependency to the latest release. + +## 0.1.1+5 + + - Update a dependency to the latest release. + +## 0.1.1+4 + + - Update a dependency to the latest release. + +## 0.1.1+3 + + - Update a dependency to the latest release. + +## 0.1.1+2 + + - **REFACTOR**: add `verify` to `QueryPlatform` and change internal `verifyToken` API to `verify` ([#9711](https://github.com/firebase/flutterfire/issues/9711)). ([c99a842f](https://github.com/firebase/flutterfire/commit/c99a842f3e3f5f10246e73f51530cc58c42b49a3)) + +## 0.1.1+1 + + - Update a dependency to the latest release. + +## 0.1.1 + +- Update a dependency to the latest release. + +## 0.1.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: Firebase iOS SDK version: `10.0.0` ([#9708](https://github.com/firebase/flutterfire/issues/9708)). ([9627c56a](https://github.com/firebase/flutterfire/commit/9627c56a37d657d0250b6f6b87d0fec1c31d4ba3)) + +## 0.0.9+1 + + - Update a dependency to the latest release. + +## 0.0.9 + + - **FEAT**: provide `androidDebugProvider` boolean for android debug provider & update app check example app ([#9412](https://github.com/firebase/flutterfire/issues/9412)). ([f1f26748](https://github.com/firebase/flutterfire/commit/f1f26748615c7c9d406e1d3d605e2987e1134ee7)) + +## 0.0.8 + + - **FEAT**: provide `androidDebugProvider` boolean for android debug provider & update app check example app ([#9412](https://github.com/firebase/flutterfire/issues/9412)). ([f1f26748](https://github.com/firebase/flutterfire/commit/f1f26748615c7c9d406e1d3d605e2987e1134ee7)) + +## 0.0.7+2 + + - Update a dependency to the latest release. + +## 0.0.7+1 + + - Update a dependency to the latest release. + +## 0.0.7 + + - **FEAT**: update the example app with webRecaptcha in activate button ([#9373](https://github.com/firebase/flutterfire/issues/9373)). ([1ff76c1b](https://github.com/firebase/flutterfire/commit/1ff76c1b87b623ff21c921d6a6cc2c586cf43ac3)) + - **REFACTOR**: update deprecated `Tasks.call()` to `TaskCompletionSource` API ([#9404](https://github.com/firebase/flutterfire/pull/9404)). ([837d68ea](https://github.com/firebase/flutterfire/commit/5aa9f665e70297fecb88bd0fda5445753470660f)) + +## 0.0.6+20 + + - Update a dependency to the latest release. + +## 0.0.6+19 + + - Update a dependency to the latest release. + +## 0.0.6+18 + + - Update a dependency to the latest release. + +## 0.0.6+17 + + - Update a dependency to the latest release. + +## 0.0.6+16 + + - **FIX**: bump `firebase_core_platform_interface` version to fix previous release. ([bea70ea5](https://github.com/firebase/flutterfire/commit/bea70ea5cbbb62cbfd2a7a74ae3a07cb12b3ee5a)) + +## 0.0.6+15 + + - **DOCS**: separate the first sentence of a doc comment into its own paragraph for `getToken()` (#8968). ([4d487ef7](https://github.com/firebase/flutterfire/commit/4d487ef7abdb9a8333735ced9c40438fef9912a3)) + +## 0.0.6+14 + + - **REFACTOR**: use `firebase.google.com` link for `homepage` in `pubspec.yaml` (#8727). ([41a963b3](https://github.com/firebase/flutterfire/commit/41a963b376ae4ec23e1394bc074f8feee6ae16b2)) + - **REFACTOR**: use "firebase" instead of "FirebaseExtended" as organisation in all links for this repository (#8791). ([d90b8357](https://github.com/firebase/flutterfire/commit/d90b8357db01d65e753021358668f0b129713e6b)) + - **DOCS**: point to "firebase.google" domain for hyperlinks in the usage section of `README.md` files (for the missing packages) (#8818). ([5bda8c92](https://github.com/firebase/flutterfire/commit/5bda8c92be1651a941d1285d36e885ee0b967b11)) + +## 0.0.6+13 + + - **DOCS**: use camel case style for "FlutterFire" in `README.md` (#8747). ([e2a022d7](https://github.com/firebase/flutterfire/commit/e2a022d7427817002e4114eb7434aa6e53384891)) + +## 0.0.6+12 + + - Update a dependency to the latest release. + +## 0.0.6+11 + + - Update a dependency to the latest release. + +## 0.0.6+10 + + - Update a dependency to the latest release. + +## 0.0.6+9 + + - Update a dependency to the latest release. + +## 0.0.6+8 + + - Update a dependency to the latest release. + +## 0.0.6+7 + + - **FIX**: update all Dart SDK version constraints to Dart >= 2.16.0 (#8184). ([df4a5bab](https://github.com/firebase/flutterfire/commit/df4a5bab3c029399b4f257a5dd658d302efe3908)) + +## 0.0.6+6 + + - Update a dependency to the latest release. + +## 0.0.6+5 + + - **FIX**: workaround iOS build issue when targeting platforms < iOS 11. ([c78e0b79](https://github.com/firebase/flutterfire/commit/c78e0b79bde479e78c558d3df92988c130280e81)) + +## 0.0.6+4 + + - **FIX**: bump Android `compileSdkVersion` to 31 (#7726). ([a9562bac](https://github.com/firebase/flutterfire/commit/a9562bac60ba927fb3664a47a7f7eaceb277dca6)) + +## 0.0.6+3 + + - **REFACTOR**: fix all `unnecessary_import` analyzer issues introduced with Flutter 2.8. ([7f0e82c9](https://github.com/firebase/flutterfire/commit/7f0e82c978a3f5a707dd95c7e9136a3e106ff75e)) + +## 0.0.6+2 + + - Update a dependency to the latest release. + +## 0.0.6+1 + + - Update a dependency to the latest release. + +## 0.0.6 + + - **FEAT**: add token apis and documentation (#7419). + +## 0.0.5 + +- **NEW**: Added support for multi-app via the `instanceFor()` method. +- **NEW**: Added support for getting the current App Check token via the `getToken()` method. +- **NEW**: Added support for enabling automatic token refreshing via the `setTokenAutoRefreshEnabled()` method. +- **NEW**: Added support for subscribing to token change events (as a `Stream`) via `onTokenChange`. + +## 0.0.4 + + - **REFACTOR**: migrate remaining examples & e2e tests to null-safety (#7393). + - **FEAT**: automatically inject Firebase JS SDKs (#7359). + +## 0.0.3 + + - **FEAT**: support initializing default `FirebaseApp` instances from Dart (#6549). + +## 0.0.2+4 + + - Update a dependency to the latest release. + +## 0.0.2+3 + + - Update a dependency to the latest release. + +## 0.0.2+2 + + - Update a dependency to the latest release. + +## 0.0.2+1 + + - **DOCS**: using for version `0.0.1` the same markdown headline level as the other versions have in the changelog (#6845). + +## 0.0.2 + + - **STYLE**: enable additional lint rules (#6832). + - **FEAT**: lower iOS & macOS deployment targets for relevant plugins (#6757). + +## 0.0.1+3 + + - Update a dependency to the latest release. + +## 0.0.1+2 + + - Update a dependency to the latest release. + +## 0.0.1+1 + + - Update a dependency to the latest release. + +## 0.0.1 + + - Initial release. diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/LICENSE b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/LICENSE new file mode 100644 index 00000000..88629004 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/README.md new file mode 100644 index 00000000..1d0c9574 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/README.md @@ -0,0 +1,24 @@ +# Firebase App Check for Flutter +[![pub package](https://img.shields.io/pub/v/firebase_app_check.svg)](https://pub.dev/packages/firebase_app_check) + +A Flutter plugin to use the [Firebase App Check API](https://firebase.google.com/docs/app-check/). + +To learn more about Firebase App Check, please visit the [Firebase website](https://firebase.google.com/docs/app-check) + +## Getting Started + +To get started with Firebase App Check for Flutter, please [see the documentation](https://firebase.google.com/docs/app-check/flutter/default-providers). + +## Usage + +To use this plugin, please visit the [App Check Usage documentation](https://firebase.google.com/docs/app-check/flutter/default-providers#initialize) + +## Issues and feedback + +Please file FlutterFire specific issues, bugs, or feature requests in our [issue tracker](https://github.com/firebase/flutterfire/issues/new). + +Plugin issues that are not specific to FlutterFire can be filed in the [Flutter issue tracker](https://github.com/flutter/flutter/issues/new). + +To contribute a change to this plugin, +please review our [contribution guide](https://github.com/firebase/flutterfire/blob/main/CONTRIBUTING.md) +and open a [pull request](https://github.com/firebase/flutterfire/pulls). diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/build.gradle new file mode 100644 index 00000000..cc7c342a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/build.gradle @@ -0,0 +1,94 @@ +group 'io.flutter.plugins.firebase.appcheck' +version '1.0-SNAPSHOT' + +apply plugin: 'com.android.library' +apply from: file("local-config.gradle") + +buildscript { + ext.kotlin_version = "2.0.0" + repositories { + google() + mavenCentral() + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +// AGP 9+ has built-in Kotlin support unless Flutter opts out via android.builtInKotlin=false. +def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int +def builtInKotlin = providers.gradleProperty("android.builtInKotlin") + .map { it.toBoolean() } + .orElse(agpMajor >= 9) + .get() +if (agpMajor < 9 || !builtInKotlin) { + apply plugin: 'kotlin-android' +} + +def firebaseCoreProject = findProject(':firebase_core') +if (firebaseCoreProject == null) { + throw new GradleException('Could not find the firebase_core FlutterFire plugin, have you added it as a dependency in your pubspec?') +} else if (!firebaseCoreProject.properties['FirebaseSDKVersion']) { + throw new GradleException('A newer version of the firebase_core FlutterFire plugin is required, please update your firebase_core pubspec dependency.') +} + +def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { + if (!rootProject.ext.has('FlutterFire')) return firebaseCoreProject.properties[name] + if (!rootProject.ext.get('FlutterFire')[name]) return firebaseCoreProject.properties[name] + return rootProject.ext.get('FlutterFire').get(name) +} + +android { + // Conditional for compatibility with AGP <4.2. + if (project.android.hasProperty("namespace")) { + namespace 'io.flutter.plugins.firebase.appcheck' + } + + compileSdkVersion project.ext.compileSdk + + defaultConfig { + minSdkVersion project.ext.minSdk + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility project.ext.javaVersion + targetCompatibility project.ext.javaVersion + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + buildFeatures { + buildConfig true + } + + lintOptions { + disable 'InvalidPackage' + } + + dependencies { + api firebaseCoreProject + implementation platform("com.google.firebase:firebase-bom:${getRootProjectExtOrCoreProperty("FirebaseSDKVersion", firebaseCoreProject)}") + implementation 'com.google.firebase:firebase-appcheck-debug' + implementation 'com.google.firebase:firebase-appcheck-playintegrity' + implementation 'com.google.firebase:firebase-appcheck-recaptcha' + implementation 'androidx.annotation:annotation:1.7.0' + } +} + +plugins.withId("org.jetbrains.kotlin.android") { + kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.fromTarget(project.ext.javaVersion.toString()) + } + } +} + +apply from: file("./user-agent.gradle") diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties new file mode 100644 index 00000000..d9cf55df --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle new file mode 100644 index 00000000..802b7e1d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/local-config.gradle @@ -0,0 +1,7 @@ +ext { + compileSdk=34 + minSdk=23 + targetSdk=34 + javaVersion = JavaVersion.toVersion(17) + androidGradlePluginVersion = '8.3.0' +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle new file mode 100644 index 00000000..11ac1690 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/settings.gradle @@ -0,0 +1,10 @@ +rootProject.name = 'firebase_app_check' + +apply from: file("local-config.gradle") + +pluginManagement { + plugins { + id "com.android.application" version project.ext.androidGradlePluginVersion + id "com.android.library" version project.ext.androidGradlePluginVersion + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..18867831 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt new file mode 100644 index 00000000..99aab95e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FirebaseAppCheckPlugin.kt @@ -0,0 +1,161 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import android.os.Handler +import android.os.Looper +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.TaskCompletionSource +import com.google.firebase.FirebaseApp +import com.google.firebase.appcheck.FirebaseAppCheck +import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory +import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory +import com.google.firebase.appcheck.recaptcha.RecaptchaAppCheckProviderFactory +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.EventChannel +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin +import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry + +class FirebaseAppCheckPlugin : FlutterFirebasePlugin, FlutterPlugin, FirebaseAppCheckHostApi { + + private val streamHandlers: MutableMap = HashMap() + private val eventChannels: MutableMap = HashMap() + private val mainThreadHandler = Handler(Looper.getMainLooper()) + private var messenger: BinaryMessenger? = null + + companion object { + const val METHOD_CHANNEL = "plugins.flutter.io/firebase_app_check" + const val EVENT_CHANNEL_PREFIX = "plugins.flutter.io/firebase_app_check/token/" + } + + override fun onAttachedToEngine(binding: FlutterPluginBinding) { + messenger = binding.binaryMessenger + FirebaseAppCheckHostApi.setUp(binding.binaryMessenger, this) + FlutterFirebasePluginRegistry.registerPlugin(METHOD_CHANNEL, this) + } + + override fun onDetachedFromEngine(binding: FlutterPluginBinding) { + FirebaseAppCheckHostApi.setUp(binding.binaryMessenger, null) + messenger = null + removeEventListeners() + } + + private fun getAppCheck(appName: String): FirebaseAppCheck { + val app = FirebaseApp.getInstance(appName) + return FirebaseAppCheck.getInstance(app) + } + + override fun activate( + appName: String, + androidProvider: String?, + appleProvider: String?, + debugToken: String?, + callback: (Result) -> Unit + ) { + try { + val firebaseAppCheck = getAppCheck(appName) + when (androidProvider) { + "debug" -> { + FlutterFirebaseAppRegistrar.debugToken = debugToken + firebaseAppCheck.installAppCheckProviderFactory( + DebugAppCheckProviderFactory.getInstance()) + } + "recaptcha" -> { + firebaseAppCheck.installAppCheckProviderFactory( + RecaptchaAppCheckProviderFactory.getInstance()) + } + else -> { + firebaseAppCheck.installAppCheckProviderFactory( + PlayIntegrityAppCheckProviderFactory.getInstance()) + } + } + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun getToken( + appName: String, + forceRefresh: Boolean, + callback: (Result) -> Unit + ) { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.getAppCheckToken(forceRefresh).addOnCompleteListener { task -> + if (task.isSuccessful) { + callback(Result.success(task.result?.token)) + } else { + callback(Result.failure(FlutterError("firebase_app_check", task.exception?.message, null))) + } + } + } + + override fun setTokenAutoRefreshEnabled( + appName: String, + isTokenAutoRefreshEnabled: Boolean, + callback: (Result) -> Unit + ) { + try { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled) + callback(Result.success(Unit)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun registerTokenListener(appName: String, callback: (Result) -> Unit) { + try { + val firebaseAppCheck = getAppCheck(appName) + val name = EVENT_CHANNEL_PREFIX + appName + + val handler = TokenChannelStreamHandler(firebaseAppCheck) + val channel = EventChannel(messenger, name) + channel.setStreamHandler(handler) + eventChannels[name] = channel + streamHandlers[name] = handler + + callback(Result.success(name)) + } catch (e: Exception) { + callback(Result.failure(FlutterError("unknown", e.message, null))) + } + } + + override fun getLimitedUseAppCheckToken(appName: String, callback: (Result) -> Unit) { + val firebaseAppCheck = getAppCheck(appName) + firebaseAppCheck.limitedUseAppCheckToken.addOnCompleteListener { task -> + if (task.isSuccessful) { + callback(Result.success(task.result?.token ?: "")) + } else { + callback(Result.failure(FlutterError("firebase_app_check", task.exception?.message, null))) + } + } + } + + override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task> { + val taskCompletionSource = TaskCompletionSource>() + taskCompletionSource.setResult(HashMap()) + return taskCompletionSource.task + } + + override fun didReinitializeFirebaseCore(): Task { + val taskCompletionSource = TaskCompletionSource() + removeEventListeners() + taskCompletionSource.setResult(null) + return taskCompletionSource.task + } + + private fun removeEventListeners() { + for ((name, channel) in eventChannels) { + channel.setStreamHandler(null) + } + for ((name, handler) in streamHandlers) { + handler.onCancel(null) + } + eventChannels.clear() + streamHandlers.clear() + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt new file mode 100644 index 00000000..1f1087b1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppRegistrar.kt @@ -0,0 +1,37 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import androidx.annotation.Keep +import com.google.firebase.appcheck.debug.InternalDebugSecretProvider +import com.google.firebase.components.Component +import com.google.firebase.components.ComponentRegistrar +import com.google.firebase.platforminfo.LibraryVersionComponent + +@Keep +class FlutterFirebaseAppRegistrar : ComponentRegistrar, InternalDebugSecretProvider { + + companion object { + private const val DEBUG_SECRET_NAME = "fire-app-check-debug-secret" + + @JvmStatic var debugToken: String? = null + } + + override fun getComponents(): List> { + val library = + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION) + + val debugSecretProvider = + Component.builder(InternalDebugSecretProvider::class.java) + .name(DEBUG_SECRET_NAME) + .factory { this } + .build() + + return listOf(library, debugSecretProvider) + } + + override fun getDebugSecret(): String? { + return debugToken + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt new file mode 100644 index 00000000..4cd7a39b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/GeneratedAndroidFirebaseAppCheck.g.kt @@ -0,0 +1,223 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon +@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") + +package io.flutter.plugins.firebase.appcheck + +import android.util.Log +import io.flutter.plugin.common.BasicMessageChannel +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MessageCodec +import io.flutter.plugin.common.StandardMessageCodec +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer + +private object GeneratedAndroidFirebaseAppCheckPigeonUtils { + + fun wrapResult(result: Any?): List { + return listOf(result) + } + + fun wrapError(exception: Throwable): List { + return if (exception is FlutterError) { + listOf(exception.code, exception.message, exception.details) + } else { + listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)) + } + } +} + +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class FlutterError( + val code: String, + override val message: String? = null, + val details: Any? = null +) : RuntimeException() + +private open class GeneratedAndroidFirebaseAppCheckPigeonCodec : StandardMessageCodec() { + override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { + return super.readValueOfType(type, buffer) + } + + override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { + super.writeValue(stream, value) + } +} + +/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ +interface FirebaseAppCheckHostApi { + fun activate( + appName: String, + androidProvider: String?, + appleProvider: String?, + debugToken: String?, + callback: (Result) -> Unit + ) + + fun getToken(appName: String, forceRefresh: Boolean, callback: (Result) -> Unit) + + fun setTokenAutoRefreshEnabled( + appName: String, + isTokenAutoRefreshEnabled: Boolean, + callback: (Result) -> Unit + ) + + fun registerTokenListener(appName: String, callback: (Result) -> Unit) + + fun getLimitedUseAppCheckToken(appName: String, callback: (Result) -> Unit) + + companion object { + /** The codec used by FirebaseAppCheckHostApi. */ + val codec: MessageCodec by lazy { GeneratedAndroidFirebaseAppCheckPigeonCodec() } + /** + * Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + * `binaryMessenger`. + */ + @JvmOverloads + fun setUp( + binaryMessenger: BinaryMessenger, + api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + val separatedMessageChannelSuffix = + if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val androidProviderArg = args[1] as String? + val appleProviderArg = args[2] as String? + val debugTokenArg = args[3] as String? + api.activate(appNameArg, androidProviderArg, appleProviderArg, debugTokenArg) { + result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val forceRefreshArg = args[1] as Boolean + api.getToken(appNameArg, forceRefreshArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + val isTokenAutoRefreshEnabledArg = args[1] as Boolean + api.setTokenAutoRefreshEnabled(appNameArg, isTokenAutoRefreshEnabledArg) { + result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(null)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + api.registerTokenListener(appNameArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken$separatedMessageChannelSuffix", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val appNameArg = args[0] as String + api.getLimitedUseAppCheckToken(appNameArg) { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeneratedAndroidFirebaseAppCheckPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt new file mode 100644 index 00000000..81d1b83e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/src/main/kotlin/io/flutter/plugins/firebase/appcheck/TokenChannelStreamHandler.kt @@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.firebase.appcheck + +import com.google.firebase.appcheck.FirebaseAppCheck +import io.flutter.plugin.common.EventChannel + +class TokenChannelStreamHandler(private val firebaseAppCheck: FirebaseAppCheck) : + EventChannel.StreamHandler { + + private var listener: FirebaseAppCheck.AppCheckListener? = null + + override fun onListen(arguments: Any?, events: EventChannel.EventSink) { + listener = + FirebaseAppCheck.AppCheckListener { result -> + val event = HashMap() + event["token"] = result.token + events.success(event) + } + firebaseAppCheck.addAppCheckListener(listener!!) + } + + override fun onCancel(arguments: Any?) { + listener?.let { + firebaseAppCheck.removeAppCheckListener(it) + listener = null + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle new file mode 100644 index 00000000..7b9c028a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/android/user-agent.gradle @@ -0,0 +1,22 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +String libraryVersionName = "UNKNOWN" +String libraryName = "flutter-fire-app-check" +File pubspec = new File(project.projectDir.parentFile, 'pubspec.yaml') + +if (pubspec.exists()) { + String yaml = pubspec.text + // Using \s*['|"]?([^\n|'|"]*)['|"]? to extract version number. + Matcher versionMatcher = Pattern.compile("^version:\\s*['|\"]?([^\\n|'|\"]*)['|\"]?\$", Pattern.MULTILINE).matcher(yaml) + if (versionMatcher.find()) libraryVersionName = versionMatcher.group(1).replaceAll("\\+", "-") +} + +android { + defaultConfig { + // BuildConfig.VERSION_NAME + buildConfigField 'String', 'LIBRARY_VERSION', "\"${libraryVersionName}\"" + // BuildConfig.LIBRARY_NAME + buildConfigField 'String', 'LIBRARY_NAME', "\"${libraryName}\"" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/README.md new file mode 100644 index 00000000..595e1145 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/README.md @@ -0,0 +1,8 @@ +# firebase_app_check_example + +Demonstrates how to use the firebase_app_check plugin. + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](https://flutter.dev/). diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml new file mode 100644 index 00000000..b6cd704f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/analysis_options.yaml @@ -0,0 +1,10 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# in the LICENSE file. + +include: ../../../../analysis_options.yaml +linter: + rules: + avoid_print: false + depend_on_referenced_packages: false + library_private_types_in_public_api: false diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle new file mode 100644 index 00000000..92298e72 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/build.gradle @@ -0,0 +1,65 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} +apply from: file("../../../android/local-config.gradle") + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "io.flutter.plugins.firebase.appcheck.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = project.ext.javaVersion + targetCompatibility = project.ext.javaVersion + } + + kotlinOptions { + jvmTarget = "17" + } + + defaultConfig { + applicationId = "io.flutter.plugins.firebase.appcheck.example" + // 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. + minSdkVersion = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json new file mode 100644 index 00000000..6b7e0408 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/google-services.json @@ -0,0 +1,615 @@ +{ + "project_info": { + "project_number": "406099696497", + "firebase_url": "https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app", + "project_id": "flutterfire-e2e-tests", + "storage_bucket": "flutterfire-e2e-tests.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:d86a91cc7b338b233574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.analytics.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:a241c4b471513a203574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-7bvmqp0fffe24vm2arng0dtdeh2tvkgl.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:21d5142deea38dda3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.auth.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-emmujnd7g2ammh5uu9ni6v04p4ateqac.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-in8bfp0nali85oul1o98huoar6eo1vv1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:3ef965ff044efc0b3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.database.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:40da41183cb3d3ff3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:175ea7a64b2faf5e3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firestore.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:7ca3394493cc601a3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.functions.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-tvtvuiqogct1gs1s6lh114jeps7hpjm5.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:6d1c1fbf4688f39c3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.installations.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:74ebb073d7727cd43574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.messaging.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:f54b85cfa36a39f73574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.remoteconfig.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0d4ed619c031c0ac3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.tests" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ib9hj9281l3343cm3nfvvdotaojrthdc.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-lc54d5l8sp90k39r0bb39ovsgo1s9bek.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:899c6485cfce26c13574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase_ui_example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ltgvphphcckosvqhituel5km2k3aecg8.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase_ui_example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:bc0b12b0605df8633574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecoreexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0f3f7bfe78b8b7103574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:2751af6868a69f073574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasestorageexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74a78b93 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt new file mode 100644 index 00000000..fd3526f1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/appcheck/example/MainActivity.kt @@ -0,0 +1,5 @@ +package io.flutter.plugins.firebase.appcheck.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle new file mode 100644 index 00000000..d2ffbffa --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties new file mode 100644 index 00000000..3c0f502f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true +androidGradlePluginVersion=8.3.0 \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle new file mode 100644 index 00000000..4fb566e9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "${androidGradlePluginVersion}" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "2.1.0" apply false +} + +include ":app" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..391a902b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile new file mode 100644 index 00000000..620e46eb --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..1ef35c77 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,553 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4627F94B299406540090DA25 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4632D5BC275CD47A0059DC83 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 46A64A032996811C003FC4F3 /* RunnerRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerRelease.entitlements; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + F919868105D7CB93D33CAD83 /* Pods */, + BBE2A093D0D5DFBA7CE858E4 /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 46A64A032996811C003FC4F3 /* RunnerRelease.entitlements */, + 4632D5BC275CD47A0059DC83 /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + F919868105D7CB93D33CAD83 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 46A64A04299681F5003FC4F3 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4627F94B299406540090DA25 /* GoogleService-Info.plist in Resources */, + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 46A64A04299681F5003FC4F3 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\necho \"YYYYYYYY: ${CONFIGURATION}\"\n"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..8a6c683e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h new file mode 100644 index 00000000..01e6e1d4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m new file mode 100644 index 00000000..7171162c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/AppDelegate.m @@ -0,0 +1,16 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" +@import Firebase; + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (void)didInitializeImplicitFlutterEngine:(NSObject *)engineBridge { + [GeneratedPluginRegistrant registerWithRegistry:engineBridge.pluginRegistry]; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..7e2f0dcb --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-17cfsesi620nhia0sck4map450gngkoh + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.appcheck.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:bd8702ba3865bb333574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist new file mode 100644 index 00000000..3a8a7a2f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIApplicationSupportsIndirectInputEvents + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..70084b41 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.devicecheck.appattest-environment + development + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements new file mode 100644 index 00000000..70084b41 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/RunnerRelease.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.devicecheck.appattest-environment + development + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m new file mode 100644 index 00000000..dff6597e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json new file mode 100644 index 00000000..ab0e60a0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:bd8702ba3865bb333574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart new file mode 100644 index 00000000..8bbd98af --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/firebase_options.dart @@ -0,0 +1,98 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return web; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyB7wZb2tO1-Fs6GbDADUSTs2Qs3w08Hovw', + appId: '1:406099696497:web:87e25e51afe982cd3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + authDomain: 'flutterfire-e2e-tests.firebaseapp.com', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + measurementId: 'G-JN95N1JV2E', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw', + appId: '1:406099696497:android:a241c4b471513a203574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:bd8702ba3865bb333574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.appcheck.example', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:bd8702ba3865bb333574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.appcheck.example', + ); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart new file mode 100644 index 00000000..8f26c643 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/lib/main.dart @@ -0,0 +1,249 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// ignore_for_file: do_not_use_environment + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_app_check/firebase_app_check.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'firebase_options.dart'; + +const kWebRecaptchaSiteKey = '6Lemcn0dAAAAABLkf6aiiHvpGD6x-zF3nOSDU2M8'; + +// Windows: create a debug token in the Firebase Console +// (App Check > Apps > Manage debug tokens), then paste it here +// or set the APP_CHECK_DEBUG_TOKEN environment variable. +const kWindowsDebugToken = String.fromEnvironment( + 'APP_CHECK_DEBUG_TOKEN', + // ignore: avoid_redundant_argument_values + defaultValue: '', +); + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + + // Activate app check after initialization, but before + // usage of any Firebase services. + await FirebaseAppCheck.instance.activate( + providerWeb: kDebugMode + ? WebDebugProvider() + : ReCaptchaV3Provider(kWebRecaptchaSiteKey), + providerAndroid: const AndroidDebugProvider(), + providerApple: const AppleDebugProvider(), + // On Windows, only the debug provider is available. + // You must supply a debug token — the desktop C++ SDK does not + // auto-generate one. Create one in the Firebase Console under + // App Check > Apps > Manage debug tokens, then either: + // - pass it via --dart-define=APP_CHECK_DEBUG_TOKEN= + // - or set the APP_CHECK_DEBUG_TOKEN environment variable + providerWindows: WindowsDebugProvider( + debugToken: kWindowsDebugToken.isNotEmpty ? kWindowsDebugToken : null, + ), + ); + + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + final String title = 'Firebase App Check'; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Firebase App Check', + home: FirebaseAppCheckExample(title: title), + ); + } +} + +class FirebaseAppCheckExample extends StatefulWidget { + FirebaseAppCheckExample({ + Key? key, + required this.title, + }) : super(key: key); + + final String title; + + @override + _FirebaseAppCheck createState() => _FirebaseAppCheck(); +} + +class _FirebaseAppCheck extends State { + final appCheck = FirebaseAppCheck.instance; + String _message = ''; + String _eventToken = 'not yet'; + + @override + void initState() { + appCheck.onTokenChange.listen(setEventToken); + super.initState(); + } + + void setMessage(String message) { + setState(() { + _message = message; + }); + } + + void setEventToken(String? token) { + setState(() { + _eventToken = token ?? 'not yet'; + }); + } + + Future _activate({ + AndroidAppCheckProvider? android, + AppleAppCheckProvider? apple, + WindowsAppCheckProvider? windows, + }) async { + try { + await appCheck.activate( + providerAndroid: android ?? const AndroidPlayIntegrityProvider(), + providerApple: apple ?? const AppleDeviceCheckProvider(), + providerWeb: ReCaptchaV3Provider(kWebRecaptchaSiteKey), + providerWindows: windows ?? const WindowsDebugProvider(), + ); + final providerName = windows?.runtimeType.toString() ?? + apple?.runtimeType.toString() ?? + android?.runtimeType.toString() ?? + 'default'; + setMessage('Activated with $providerName'); + } catch (e) { + setMessage('activate error: $e'); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Text( + 'Providers', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () => _activate( + android: const AndroidDebugProvider(), + apple: const AppleDebugProvider(), + windows: WindowsDebugProvider( + debugToken: + kWindowsDebugToken.isNotEmpty ? kWindowsDebugToken : null, + ), + ), + child: const Text('activate(Debug)'), + ), + ElevatedButton( + onPressed: () => _activate( + android: const AndroidPlayIntegrityProvider(), + apple: const AppleDeviceCheckProvider(), + ), + child: const Text('activate(PlayIntegrity / DeviceCheck)'), + ), + if (!kIsWeb) + ElevatedButton( + onPressed: () => _activate( + apple: const AppleAppAttestProvider(), + ), + child: const Text('activate(AppAttest)'), + ), + if (!kIsWeb) + ElevatedButton( + onPressed: () => _activate( + apple: const AppleAppAttestWithDeviceCheckFallbackProvider(), + ), + child: const Text( + 'activate(AppAttest + DeviceCheck fallback)', + ), + ), + const SizedBox(height: 16), + const Text( + 'Actions', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () async { + try { + final token = await appCheck.getToken(true); + setMessage('Token: ${token?.substring(0, 20)}...'); + } catch (e) { + setMessage('getToken error: $e'); + } + }, + child: const Text('getToken(forceRefresh: true)'), + ), + ElevatedButton( + onPressed: () async { + try { + final token = await appCheck.getLimitedUseToken(); + setMessage( + 'Limited use token: ${token.substring(0, 20)}...', + ); + } catch (e) { + setMessage('getLimitedUseToken error: $e'); + } + }, + child: const Text('getLimitedUseToken()'), + ), + ElevatedButton( + onPressed: () async { + await appCheck.setTokenAutoRefreshEnabled(true); + setMessage('Token auto-refresh enabled'); + }, + child: const Text('setTokenAutoRefreshEnabled(true)'), + ), + ElevatedButton( + onPressed: () async { + try { + final result = await FirebaseFirestore.instance + .collection('flutter-tests') + .limit(1) + .get(); + setMessage( + result.docs.isNotEmpty + ? 'Firestore: Document found' + : 'Firestore: No documents', + ); + } catch (e) { + setMessage('Firestore error: $e'); + } + }, + child: const Text('Test Firestore with App Check'), + ), + const SizedBox(height: 20), + Text( + _message, + style: const TextStyle( + color: Color.fromRGBO(47, 79, 79, 1), + fontSize: 16, + ), + ), + const SizedBox(height: 20), + Text( + 'Token from onTokenChange: $_eventToken', + style: const TextStyle( + color: Color.fromRGBO(128, 0, 128, 1), + fontSize: 14, + ), + ), + ], + ), + ), + ); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile new file mode 100644 index 00000000..ff5ddb3b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c0dc3860 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,613 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 25624AEC275E1E7900B1E491 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0DC934EE60634F0D37DD0EC3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = firebase_app_check_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + 74CB5F55BD11E25520F6FF45 /* Pods */, + 0DC934EE60634F0D37DD0EC3 /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 25624AEB275E1E7900B1E491 /* GoogleService-Info.plist */, + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + 74CB5F55BD11E25520F6FF45 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* firebase_app_check_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 25624AEC275E1E7900B1E491 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..92a5c6f9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..800dd3d2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = firebase_app_check_example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.appcheck.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 io.flutter.plugins.firebase.appcheck.example. All rights reserved. diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..7e2f0dcb --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-17cfsesi620nhia0sck4map450gngkoh.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-17cfsesi620nhia0sck4map450gngkoh + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.appcheck.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:bd8702ba3865bb333574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/Runner/Release.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json new file mode 100644 index 00000000..ab0e60a0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/macos/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:bd8702ba3865bb333574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml new file mode 100644 index 00000000..c652ec30 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/pubspec.yaml @@ -0,0 +1,21 @@ +name: firebase_app_check_example +description: Firebase App Check example application. + +publish_to: 'none' + +version: 1.0.0+1 +resolution: workspace + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + cloud_firestore: ^6.6.0 + firebase_app_check: ^0.4.5 + firebase_core: ^4.11.0 + flutter: + sdk: flutter + +flutter: + uses-material-design: true diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/index.html b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/index.html new file mode 100644 index 00000000..e619aadd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/index.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + flutterfire_app_check + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json new file mode 100644 index 00000000..a5a5ebda --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutterfire_app_check", + "short_name": "flutterfire_app_check", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt new file mode 100644 index 00000000..ffc5f0c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(firebase_app_check_example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "firebase_app_check_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc new file mode 100644 index 00000000..26d198ff --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "io.flutter.plugins.firebase.appcheck" "\0" + VALUE "FileDescription", "firebase_app_check_example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "firebase_app_check_example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 io.flutter.plugins.firebase.appcheck. All rights reserved." "\0" + VALUE "OriginalFilename", "firebase_app_check_example.exe" "\0" + VALUE "ProductName", "firebase_app_check_example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..d1bd86f4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.cpp @@ -0,0 +1,73 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..243c8352 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/flutter_window.h @@ -0,0 +1,37 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp new file mode 100644 index 00000000..129ed2c3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/main.cpp @@ -0,0 +1,46 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t* command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"firebase_app_check_example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h new file mode 100644 index 00000000..91d70fa3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resource.h @@ -0,0 +1,20 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..153653e8 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp new file mode 100644 index 00000000..3b134475 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.cpp @@ -0,0 +1,69 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE* unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = + ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, + nullptr, 0, nullptr, nullptr) - + 1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, + utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h new file mode 100644 index 00000000..8ec0c44d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/utils.h @@ -0,0 +1,23 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..82754b04 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.cpp @@ -0,0 +1,284 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: +/// https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = + L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { ++g_active_window_count; } + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { return window_handle_; } + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = + RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, + &light_mode, &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h new file mode 100644 index 00000000..dd242548 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/example/windows/runner/win32_window.h @@ -0,0 +1,104 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec new file mode 100644 index 00000000..b4d81500 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check.podspec @@ -0,0 +1,46 @@ +require 'yaml' +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + s.source_files = 'firebase_app_check/Sources/firebase_app_check/**/*.swift' + s.ios.deployment_target = '15.0' + + # Flutter dependencies + s.dependency 'Flutter' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'FirebaseAppCheck', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-appcheck\\\"", + 'DEFINES_MODULE' => 'YES', + # Flutter.framework does not contain a i386 slice. + 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' + } +end + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift new file mode 100644 index 00000000..14de1a76 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_app_check", + platforms: [ + .iOS("15.0") + ], + products: [ + .library(name: "firebase-app-check", targets: ["firebase_app_check"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package( + url: "https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk.git", + from: "18.0.0" + ), + .package(name: "firebase_core", path: "../firebase_core"), + ], + targets: [ + .target( + name: "firebase_app_check", + dependencies: [ + .product(name: "FirebaseAppCheck", package: "firebase-ios-sdk"), + .product(name: "RecaptchaEnterprise", package: "recaptcha-enterprise-mobile-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ] + ) + ] +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift new file mode 100644 index 00000000..28a2ec57 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/Constants.swift @@ -0,0 +1,6 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Auto-generated file. Do not edit. +public let versionNumber = "0.4.5" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift new file mode 100644 index 00000000..d8f3a100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift @@ -0,0 +1,236 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(Swift.type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {} + +private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {} + +private class FirebaseAppCheckMessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + FirebaseAppCheckMessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + FirebaseAppCheckMessagesPigeonCodecWriter(data: data) + } +} + +class FirebaseAppCheckMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = FirebaseAppCheckMessagesPigeonCodec( + readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter() + ) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseAppCheckHostApi { + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void) + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void) + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void) + func registerTokenListener(appName: String, completion: @escaping (Result) -> Void) + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseAppCheckHostApiSetup { + static var codec: FlutterStandardMessageCodec { + FirebaseAppCheckMessagesPigeonCodec.shared + } + + /// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + /// `binaryMessenger`. + static func setUp( + binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let activateChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + activateChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let androidProviderArg: String? = nilOrValue(args[1]) + let appleProviderArg: String? = nilOrValue(args[2]) + let debugTokenArg: String? = nilOrValue(args[3]) + api.activate( + appName: appNameArg, androidProvider: androidProviderArg, appleProvider: appleProviderArg, + debugToken: debugTokenArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + activateChannel.setMessageHandler(nil) + } + let getTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let forceRefreshArg = args[1] as! Bool + api.getToken(appName: appNameArg, forceRefresh: forceRefreshArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getTokenChannel.setMessageHandler(nil) + } + let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + setTokenAutoRefreshEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let isTokenAutoRefreshEnabledArg = args[1] as! Bool + api.setTokenAutoRefreshEnabled( + appName: appNameArg, isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setTokenAutoRefreshEnabledChannel.setMessageHandler(nil) + } + let registerTokenListenerChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + registerTokenListenerChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.registerTokenListener(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + registerTokenListenerChannel.setMessageHandler(nil) + } + let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getLimitedUseAppCheckTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.getLimitedUseAppCheckToken(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getLimitedUseAppCheckTokenChannel.setMessageHandler(nil) + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift new file mode 100644 index 00000000..2d63a765 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/ios/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseAppCheck +import FirebaseCore + +#if canImport(FlutterMacOS) + import FlutterMacOS +#else + import Flutter +#endif + +#if canImport(firebase_core) + import firebase_core +#else + import firebase_core_shared +#endif + +let kFirebaseAppCheckChannelName = "plugins.flutter.io/firebase_app_check" +let kFirebaseAppCheckTokenChannelPrefix = "plugins.flutter.io/firebase_app_check/token/" + +// swift-format-ignore: AvoidRetroactiveConformances +extension FlutterError: @retroactive Error {} + +public class FirebaseAppCheckPlugin: NSObject, FlutterPlugin, + FLTFirebasePluginProtocol, FirebaseAppCheckHostApi +{ + private var eventChannels: [String: FlutterEventChannel] = [:] + private var streamHandlers: [String: AppCheckTokenStreamHandler] = [:] + private var providerFactory: FlutterAppCheckProviderFactory? + + static let shared: FirebaseAppCheckPlugin = { + let instance = FirebaseAppCheckPlugin() + instance.providerFactory = FlutterAppCheckProviderFactory() + AppCheck.setAppCheckProviderFactory(instance.providerFactory) + FLTFirebasePluginRegistry.sharedInstance().register(instance) + return instance + }() + + public static func register(with registrar: FlutterPluginRegistrar) { + let binaryMessenger: FlutterBinaryMessenger + + #if os(macOS) + binaryMessenger = registrar.messenger + #elseif os(iOS) + binaryMessenger = registrar.messenger() + #endif + + let instance = shared + instance.binaryMessenger = binaryMessenger + FirebaseAppCheckHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: instance) + + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: instance.firebaseLibraryName(), + with: instance.firebaseLibraryVersion() + ) + } + } + + private var binaryMessenger: FlutterBinaryMessenger? + + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName) else { + completion( + .failure( + FlutterError( + code: "unknown", message: "Firebase app not found: \(appName)", details: nil + ) + ) + ) + return + } + let provider = appleProvider ?? "deviceCheck" + + providerFactory?.configure( + app: app, + providerName: provider, + debugToken: debugToken + ) + + completion(.success(())) + } + + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.token(forcingRefresh: forceRefresh) { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token)) + } + } + } + + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + appCheck.isTokenAutoRefreshEnabled = isTokenAutoRefreshEnabled + completion(.success(())) + } + + func registerTokenListener( + appName: String, + completion: @escaping (Result) -> Void + ) { + let name = kFirebaseAppCheckTokenChannelPrefix + appName + + guard let messenger = binaryMessenger else { + completion( + .failure( + FlutterError( + code: "no-messenger", + message: "Binary messenger not available", + details: nil + ) + ) + ) + return + } + + let channel = FlutterEventChannel(name: name, binaryMessenger: messenger) + let handler = AppCheckTokenStreamHandler() + channel.setStreamHandler(handler) + + eventChannels[name] = channel + streamHandlers[name] = handler + + completion(.success(name)) + } + + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.limitedUseToken { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token ?? "")) + } + } + } + + // MARK: - FLTFirebasePluginProtocol + + public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + for (_, channel) in eventChannels { + channel.setStreamHandler(nil) + } + for (_, handler) in streamHandlers { + _ = handler.onCancel(withArguments: nil) + } + eventChannels.removeAll() + streamHandlers.removeAll() + completion() + } + + public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + [:] + } + + public func firebaseLibraryName() -> String { + "flutter-fire-appcheck" + } + + public func firebaseLibraryVersion() -> String { + versionNumber + } + + public func flutterChannelName() -> String { + kFirebaseAppCheckChannelName + } + + private func createFlutterError(_ error: Error) -> FlutterError { + let nsError = error as NSError + var code = "unknown" + switch nsError.code { + case 0: // FIRAppCheckErrorCodeServerUnreachable + code = "server-unreachable" + case 1: // FIRAppCheckErrorCodeInvalidConfiguration + code = "invalid-configuration" + case 2: // FIRAppCheckErrorCodeKeychain + code = "code-keychain" + case 3: // FIRAppCheckErrorCodeUnsupported + code = "code-unsupported" + default: + code = "unknown" + } + return FlutterError( + code: code, + message: nsError.localizedDescription, + details: nil + ) + } +} + +// MARK: - Token Stream Handler + +class AppCheckTokenStreamHandler: NSObject, FlutterStreamHandler { + private var observer: NSObjectProtocol? + + func onListen( + withArguments arguments: Any?, + eventSink events: @escaping FlutterEventSink + ) -> FlutterError? { + observer = NotificationCenter.default.addObserver( + forName: NSNotification.Name("FIRAppCheckAppCheckTokenDidChangeNotification"), + object: nil, + queue: nil + ) { notification in + if let token = notification.userInfo?["FIRAppCheckTokenNotificationKey"] as? String { + events(["token": token]) + } + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + if let observer { + NotificationCenter.default.removeObserver(observer) + self.observer = nil + } + return nil + } +} + +// MARK: - App Check Provider Factory + +class FlutterAppCheckProviderFactory: NSObject, AppCheckProviderFactory { + private var providers: [String: AppCheckProviderWrapper] = [:] + + func createProvider(with app: FirebaseApp) -> (any AppCheckProvider)? { + if providers[app.name] == nil { + let wrapper = AppCheckProviderWrapper() + // Default to deviceCheck. activate() will reconfigure with the correct provider. + wrapper.configure( + app: app, + providerName: "deviceCheck", + debugToken: nil + ) + providers[app.name] = wrapper + } + return providers[app.name] + } + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + if providers[app.name] == nil { + providers[app.name] = AppCheckProviderWrapper() + } + providers[app.name]?.configure( + app: app, + providerName: providerName, + debugToken: debugToken + ) + } +} + +class AppCheckProviderWrapper: NSObject, AppCheckProvider { + private var delegateProvider: (any AppCheckProvider)? + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + switch providerName { + case "debug": + if let debugToken { + setenv("FIRAAppCheckDebugToken", debugToken, 1) + } + delegateProvider = AppCheckDebugProvider(app: app) + if debugToken == nil, let debugProvider = delegateProvider as? AppCheckDebugProvider { + print("Firebase App Check Debug Token: \(debugProvider.localDebugToken())") + } + case "appAttest": + if #available(iOS 14.0, macOS 14.0, macCatalyst 14.0, tvOS 15.0, watchOS 9.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = AppCheckDebugProvider(app: app) + } + case "appAttestWithDeviceCheckFallback": + if #available(iOS 14.0, macOS 14.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = DeviceCheckProvider(app: app) + } + case "recaptcha": + #if os(iOS) + delegateProvider = RecaptchaProvider(app: app) + if delegateProvider == nil { + print( + "Firebase App Check: failed to initialize RecaptchaProvider. Ensure site key is in GoogleService-Info.plist." + ) + } + #else + print("Firebase App Check: reCAPTCHA is only supported on iOS.") + #endif + default: + // deviceCheck + delegateProvider = DeviceCheckProvider(app: app) + } + } + + func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) { + guard let delegateProvider else { + handler( + nil, + NSError( + domain: "firebase_app_check", code: -1, + userInfo: [NSLocalizedDescriptionKey: "Provider not configured"] + ) + ) + return + } + delegateProvider.getToken(completion: handler) + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart new file mode 100644 index 00000000..5e6a8cc9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/firebase_app_check.dart @@ -0,0 +1,34 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_app_check_platform_interface/firebase_app_check_platform_interface.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; + +export 'package:firebase_app_check_platform_interface/firebase_app_check_platform_interface.dart' + show + AndroidProvider, + AndroidAppCheckProvider, + AndroidDebugProvider, + AndroidPlayIntegrityProvider, + AndroidReCaptchaProvider, + AppleProvider, + AppleAppCheckProvider, + AppleDebugProvider, + AppleDeviceCheckProvider, + AppleAppAttestProvider, + AppleAppAttestWithDeviceCheckFallbackProvider, + AppleReCaptchaProvider, + ReCaptchaEnterpriseProvider, + ReCaptchaV3Provider, + WebDebugProvider, + WebProvider, + WebReCaptchaProvider, + WindowsAppCheckProvider, + WindowsDebugProvider; +export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' + show FirebaseException; + +part 'src/firebase_app_check.dart'; diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart new file mode 100644 index 00000000..8deabfc9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/lib/src/firebase_app_check.dart @@ -0,0 +1,156 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_app_check.dart'; + +class FirebaseAppCheck extends FirebasePluginPlatform + implements FirebaseService { + static Map _firebaseAppCheckInstances = {}; + + FirebaseAppCheck._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_app_check'); + + /// The [FirebaseApp] for this current [FirebaseAppCheck] instance. + FirebaseApp app; + + // Cached and lazily loaded instance of [FirebaseAppCheckPlatform] to avoid + // creating a [MethodChannelFirebaseAppCheck] when not needed or creating an + // instance with the default app before a user specifies an app. + FirebaseAppCheckPlatform? _delegatePackingProperty; + + /// Returns the underlying delegate implementation. + /// + /// If called and no [_delegatePackingProperty] exists, it will first be + /// created and assigned before returning the delegate. + FirebaseAppCheckPlatform get _delegate { + _delegatePackingProperty ??= FirebaseAppCheckPlatform.instanceFor( + app: app, + ); + + return _delegatePackingProperty!; + } + + /// Returns an instance using the default [FirebaseApp]. + static FirebaseAppCheck get instance { + FirebaseApp defaultAppInstance = Firebase.app(); + + return FirebaseAppCheck.instanceFor(app: defaultAppInstance); + } + + /// Returns an instance using a specified [FirebaseApp]. + static FirebaseAppCheck instanceFor({required FirebaseApp app}) { + return _firebaseAppCheckInstances.putIfAbsent(app.name, () { + final instance = FirebaseAppCheck._(app: app); + app.registerService( + instance, + dispose: (appCheck) => appCheck._dispose(), + ); + return instance; + }); + } + + Future _dispose() async { + _firebaseAppCheckInstances.remove(app.name); + final delegate = _delegatePackingProperty; + _delegatePackingProperty = null; + await delegate?.dispose(); + } + + /// Activates the Firebase App Check service. + /// + /// ## Platform Configuration + /// + /// **Web**: Provide the reCAPTCHA v3 Site Key using `webProvider`, which can be + /// found in the Firebase Console. + /// + /// **Android**: The default provider is "play integrity". Use `providerAndroid` + /// to configure alternative providers such as "safety net", debug providers, or + /// custom implementations via `AndroidAppCheckProvider`. + /// + /// **iOS/macOS**: The default provider is "device check". Use `providerApple` + /// to configure alternative providers such as "app attest", debug providers, or + /// "app attest with fallback to device check" via `AppleAppCheckProvider`. + /// Note: App Attest is only available on iOS 14.0+ and macOS 14.0+. + /// + /// **Windows**: Only the debug provider is supported. You **must** supply a + /// debug token — the desktop C++ SDK does not auto-generate one. Either pass + /// it via `providerWindows: WindowsDebugProvider(debugToken: 'your-token')` + /// or set the `APP_CHECK_DEBUG_TOKEN` environment variable. The token must + /// first be registered in the Firebase Console under + /// *App Check → Apps → Manage debug tokens*. + /// + /// ## Migration Notice + /// + /// The `androidProvider` and `appleProvider` parameters will be deprecated + /// in a future release. Use `providerAndroid` and `providerApple` instead, + /// which support the new provider classes including `AndroidDebugProvider` + /// and `AppleDebugProvider` for passing debug tokens directly. + /// + /// For more information, see [the Firebase Documentation](https://firebase.google.com/docs/app-check) + Future activate({ + @Deprecated( + 'Use providerWeb instead. ' + 'This parameter will be removed in a future major release.', + ) + WebProvider? webProvider, + WebProvider? providerWeb, + @Deprecated( + 'Use providerAndroid instead. ' + 'This parameter will be removed in a future major release.', + ) + AndroidProvider androidProvider = AndroidProvider.playIntegrity, + @Deprecated( + 'Use providerApple instead. ' + 'This parameter will be removed in a future major release.', + ) + AppleProvider appleProvider = AppleProvider.deviceCheck, + AndroidAppCheckProvider providerAndroid = + const AndroidPlayIntegrityProvider(), + AppleAppCheckProvider providerApple = const AppleDeviceCheckProvider(), + WindowsAppCheckProvider providerWindows = const WindowsDebugProvider(), + }) { + return _delegate.activate( + webProvider: providerWeb ?? webProvider, + // ignore: deprecated_member_use + androidProvider: androidProvider, + // ignore: deprecated_member_use + appleProvider: appleProvider, + providerAndroid: providerAndroid, + providerApple: providerApple, + providerWindows: providerWindows, + ); + } + + /// Get the current App Check token. + /// + /// Attaches to the most recent in-flight request if one is present. Returns + /// null if no token is present and no token requests are in-flight. + /// + /// If `forceRefresh` is true, will always try to fetch a fresh token. If + /// false, will use a cached token if found in storage. + Future getToken([bool? forceRefresh]) async { + return _delegate.getToken(forceRefresh ?? false); + } + + /// If true, the SDK automatically refreshes App Check tokens as needed. + Future setTokenAutoRefreshEnabled(bool isTokenAutoRefreshEnabled) { + return _delegate.setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled); + } + + /// Requests a limited-use Firebase App Check token. This method should be used only + /// if you need to authorize requests to a non-Firebase backend. + // + // Returns limited-use tokens that are intended for use with your non-Firebase backend + // endpoints that are protected with Replay Protection. This method does not affect + // the token generation behavior of the `getToken()` method. + Future getLimitedUseToken() { + return _delegate.getLimitedUseToken(); + } + + /// Registers a listener to changes in the token state. + Stream get onTokenChange { + return _delegate.onTokenChange; + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec new file mode 100644 index 00000000..497fbc64 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check.podspec @@ -0,0 +1,63 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +begin + required_macos_version = "10.15" + current_target_definition = Pod::Config.instance.podfile.send(:current_target_definition) + user_osx_target = current_target_definition.to_hash["platform"]["osx"] + if (Gem::Version.new(user_osx_target) < Gem::Version.new(required_macos_version)) + error_message = "The FlutterFire plugin #{pubspec['name']} for macOS requires a macOS deployment target of #{required_macos_version} or later." + Pod::UI.warn error_message, [ + "Update the `platform :osx, '#{user_osx_target}'` line in your macOS/Podfile to version `#{required_macos_version}` and ensure you commit this file.", + "Open your `macos/Runner.xcodeproj` Xcode project and under the 'Runner' target General tab set your Deployment Target to #{required_macos_version} or later." + ] + raise Pod::Informative, error_message + end +rescue Pod::Informative + raise +rescue + # Do nothing for all other errors and let `pod install` deal with any issues. +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_app_check/Sources/firebase_app_check/**/*.swift' + + s.platform = :osx, '10.13' + + # Flutter dependencies + s.dependency 'FlutterMacOS' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'Firebase/AppCheck', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-appcheck\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift new file mode 100644 index 00000000..9078dffe --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Package.swift @@ -0,0 +1,36 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_app_check", + platforms: [ + .macOS("10.15") + ], + products: [ + .library(name: "firebase-app-check", targets: ["firebase_app_check"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core-4.11.0"), + ], + targets: [ + .target( + name: "firebase_app_check", + dependencies: [ + .product(name: "FirebaseAppCheck", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ] + ) + ] +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift new file mode 100644 index 00000000..28a2ec57 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/Constants.swift @@ -0,0 +1,6 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Auto-generated file. Do not edit. +public let versionNumber = "0.4.5" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift new file mode 100644 index 00000000..d8f3a100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckMessages.g.swift @@ -0,0 +1,236 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +/// Error class for passing custom error details to Dart side. +final class PigeonError: Error { + let code: String + let message: String? + let details: Sendable? + + init(code: String, message: String?, details: Sendable?) { + self.code = code + self.message = message + self.details = details + } + + var localizedDescription: String { + "PigeonError(code: \(code), message: \(message ?? ""), details: \(details ?? "")" + } +} + +private func wrapResult(_ result: Any?) -> [Any?] { + [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let pigeonError = error as? PigeonError { + return [ + pigeonError.code, + pigeonError.message, + pigeonError.details, + ] + } + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(Swift.type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func isNullish(_ value: Any?) -> Bool { + value is NSNull || value == nil +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +private class FirebaseAppCheckMessagesPigeonCodecReader: FlutterStandardReader {} + +private class FirebaseAppCheckMessagesPigeonCodecWriter: FlutterStandardWriter {} + +private class FirebaseAppCheckMessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + FirebaseAppCheckMessagesPigeonCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + FirebaseAppCheckMessagesPigeonCodecWriter(data: data) + } +} + +class FirebaseAppCheckMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable { + static let shared = FirebaseAppCheckMessagesPigeonCodec( + readerWriter: FirebaseAppCheckMessagesPigeonCodecReaderWriter() + ) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol FirebaseAppCheckHostApi { + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void) + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void) + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void) + func registerTokenListener(appName: String, completion: @escaping (Result) -> Void) + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void) +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class FirebaseAppCheckHostApiSetup { + static var codec: FlutterStandardMessageCodec { + FirebaseAppCheckMessagesPigeonCodec.shared + } + + /// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through the + /// `binaryMessenger`. + static func setUp( + binaryMessenger: FlutterBinaryMessenger, api: FirebaseAppCheckHostApi?, + messageChannelSuffix: String = "" + ) { + let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : "" + let activateChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + activateChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let androidProviderArg: String? = nilOrValue(args[1]) + let appleProviderArg: String? = nilOrValue(args[2]) + let debugTokenArg: String? = nilOrValue(args[3]) + api.activate( + appName: appNameArg, androidProvider: androidProviderArg, appleProvider: appleProviderArg, + debugToken: debugTokenArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + activateChannel.setMessageHandler(nil) + } + let getTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let forceRefreshArg = args[1] as! Bool + api.getToken(appName: appNameArg, forceRefresh: forceRefreshArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getTokenChannel.setMessageHandler(nil) + } + let setTokenAutoRefreshEnabledChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + setTokenAutoRefreshEnabledChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + let isTokenAutoRefreshEnabledArg = args[1] as! Bool + api.setTokenAutoRefreshEnabled( + appName: appNameArg, isTokenAutoRefreshEnabled: isTokenAutoRefreshEnabledArg + ) { result in + switch result { + case .success: + reply(wrapResult(nil)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + setTokenAutoRefreshEnabledChannel.setMessageHandler(nil) + } + let registerTokenListenerChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.registerTokenListener\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + registerTokenListenerChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.registerTokenListener(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + registerTokenListenerChannel.setMessageHandler(nil) + } + let getLimitedUseAppCheckTokenChannel = FlutterBasicMessageChannel( + name: + "dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.getLimitedUseAppCheckToken\(channelSuffix)", + binaryMessenger: binaryMessenger, codec: codec + ) + if let api { + getLimitedUseAppCheckTokenChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let appNameArg = args[0] as! String + api.getLimitedUseAppCheckToken(appName: appNameArg) { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + getLimitedUseAppCheckTokenChannel.setMessageHandler(nil) + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift new file mode 100644 index 00000000..2d63a765 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/macos/firebase_app_check/Sources/firebase_app_check/FirebaseAppCheckPlugin.swift @@ -0,0 +1,369 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import FirebaseAppCheck +import FirebaseCore + +#if canImport(FlutterMacOS) + import FlutterMacOS +#else + import Flutter +#endif + +#if canImport(firebase_core) + import firebase_core +#else + import firebase_core_shared +#endif + +let kFirebaseAppCheckChannelName = "plugins.flutter.io/firebase_app_check" +let kFirebaseAppCheckTokenChannelPrefix = "plugins.flutter.io/firebase_app_check/token/" + +// swift-format-ignore: AvoidRetroactiveConformances +extension FlutterError: @retroactive Error {} + +public class FirebaseAppCheckPlugin: NSObject, FlutterPlugin, + FLTFirebasePluginProtocol, FirebaseAppCheckHostApi +{ + private var eventChannels: [String: FlutterEventChannel] = [:] + private var streamHandlers: [String: AppCheckTokenStreamHandler] = [:] + private var providerFactory: FlutterAppCheckProviderFactory? + + static let shared: FirebaseAppCheckPlugin = { + let instance = FirebaseAppCheckPlugin() + instance.providerFactory = FlutterAppCheckProviderFactory() + AppCheck.setAppCheckProviderFactory(instance.providerFactory) + FLTFirebasePluginRegistry.sharedInstance().register(instance) + return instance + }() + + public static func register(with registrar: FlutterPluginRegistrar) { + let binaryMessenger: FlutterBinaryMessenger + + #if os(macOS) + binaryMessenger = registrar.messenger + #elseif os(iOS) + binaryMessenger = registrar.messenger() + #endif + + let instance = shared + instance.binaryMessenger = binaryMessenger + FirebaseAppCheckHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: instance) + + if FirebaseApp.responds(to: NSSelectorFromString("registerLibrary:withVersion:")) { + FirebaseApp.perform( + NSSelectorFromString("registerLibrary:withVersion:"), + with: instance.firebaseLibraryName(), + with: instance.firebaseLibraryVersion() + ) + } + } + + private var binaryMessenger: FlutterBinaryMessenger? + + func activate( + appName: String, androidProvider: String?, appleProvider: String?, + debugToken: String?, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName) else { + completion( + .failure( + FlutterError( + code: "unknown", message: "Firebase app not found: \(appName)", details: nil + ) + ) + ) + return + } + let provider = appleProvider ?? "deviceCheck" + + providerFactory?.configure( + app: app, + providerName: provider, + debugToken: debugToken + ) + + completion(.success(())) + } + + func getToken( + appName: String, forceRefresh: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.token(forcingRefresh: forceRefresh) { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token)) + } + } + } + + func setTokenAutoRefreshEnabled( + appName: String, isTokenAutoRefreshEnabled: Bool, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + appCheck.isTokenAutoRefreshEnabled = isTokenAutoRefreshEnabled + completion(.success(())) + } + + func registerTokenListener( + appName: String, + completion: @escaping (Result) -> Void + ) { + let name = kFirebaseAppCheckTokenChannelPrefix + appName + + guard let messenger = binaryMessenger else { + completion( + .failure( + FlutterError( + code: "no-messenger", + message: "Binary messenger not available", + details: nil + ) + ) + ) + return + } + + let channel = FlutterEventChannel(name: name, binaryMessenger: messenger) + let handler = AppCheckTokenStreamHandler() + channel.setStreamHandler(handler) + + eventChannels[name] = channel + streamHandlers[name] = handler + + completion(.success(name)) + } + + func getLimitedUseAppCheckToken( + appName: String, + completion: @escaping (Result) -> Void + ) { + guard let app = FLTFirebasePlugin.firebaseAppNamed(appName), + let appCheck = AppCheck.appCheck(app: app) + else { + completion( + .failure( + FlutterError( + code: "unknown", message: "App Check not available for app: \(appName)", details: nil + ) + ) + ) + return + } + + appCheck.limitedUseToken { token, error in + if let error { + completion(.failure(self.createFlutterError(error))) + } else { + completion(.success(token?.token ?? "")) + } + } + } + + // MARK: - FLTFirebasePluginProtocol + + public func didReinitializeFirebaseCore(_ completion: @escaping () -> Void) { + for (_, channel) in eventChannels { + channel.setStreamHandler(nil) + } + for (_, handler) in streamHandlers { + _ = handler.onCancel(withArguments: nil) + } + eventChannels.removeAll() + streamHandlers.removeAll() + completion() + } + + public func pluginConstants(for firebaseApp: FirebaseApp) -> [AnyHashable: Any] { + [:] + } + + public func firebaseLibraryName() -> String { + "flutter-fire-appcheck" + } + + public func firebaseLibraryVersion() -> String { + versionNumber + } + + public func flutterChannelName() -> String { + kFirebaseAppCheckChannelName + } + + private func createFlutterError(_ error: Error) -> FlutterError { + let nsError = error as NSError + var code = "unknown" + switch nsError.code { + case 0: // FIRAppCheckErrorCodeServerUnreachable + code = "server-unreachable" + case 1: // FIRAppCheckErrorCodeInvalidConfiguration + code = "invalid-configuration" + case 2: // FIRAppCheckErrorCodeKeychain + code = "code-keychain" + case 3: // FIRAppCheckErrorCodeUnsupported + code = "code-unsupported" + default: + code = "unknown" + } + return FlutterError( + code: code, + message: nsError.localizedDescription, + details: nil + ) + } +} + +// MARK: - Token Stream Handler + +class AppCheckTokenStreamHandler: NSObject, FlutterStreamHandler { + private var observer: NSObjectProtocol? + + func onListen( + withArguments arguments: Any?, + eventSink events: @escaping FlutterEventSink + ) -> FlutterError? { + observer = NotificationCenter.default.addObserver( + forName: NSNotification.Name("FIRAppCheckAppCheckTokenDidChangeNotification"), + object: nil, + queue: nil + ) { notification in + if let token = notification.userInfo?["FIRAppCheckTokenNotificationKey"] as? String { + events(["token": token]) + } + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + if let observer { + NotificationCenter.default.removeObserver(observer) + self.observer = nil + } + return nil + } +} + +// MARK: - App Check Provider Factory + +class FlutterAppCheckProviderFactory: NSObject, AppCheckProviderFactory { + private var providers: [String: AppCheckProviderWrapper] = [:] + + func createProvider(with app: FirebaseApp) -> (any AppCheckProvider)? { + if providers[app.name] == nil { + let wrapper = AppCheckProviderWrapper() + // Default to deviceCheck. activate() will reconfigure with the correct provider. + wrapper.configure( + app: app, + providerName: "deviceCheck", + debugToken: nil + ) + providers[app.name] = wrapper + } + return providers[app.name] + } + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + if providers[app.name] == nil { + providers[app.name] = AppCheckProviderWrapper() + } + providers[app.name]?.configure( + app: app, + providerName: providerName, + debugToken: debugToken + ) + } +} + +class AppCheckProviderWrapper: NSObject, AppCheckProvider { + private var delegateProvider: (any AppCheckProvider)? + + func configure( + app: FirebaseApp, + providerName: String, + debugToken: String? + ) { + switch providerName { + case "debug": + if let debugToken { + setenv("FIRAAppCheckDebugToken", debugToken, 1) + } + delegateProvider = AppCheckDebugProvider(app: app) + if debugToken == nil, let debugProvider = delegateProvider as? AppCheckDebugProvider { + print("Firebase App Check Debug Token: \(debugProvider.localDebugToken())") + } + case "appAttest": + if #available(iOS 14.0, macOS 14.0, macCatalyst 14.0, tvOS 15.0, watchOS 9.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = AppCheckDebugProvider(app: app) + } + case "appAttestWithDeviceCheckFallback": + if #available(iOS 14.0, macOS 14.0, *) { + delegateProvider = AppAttestProvider(app: app) + } else { + delegateProvider = DeviceCheckProvider(app: app) + } + case "recaptcha": + #if os(iOS) + delegateProvider = RecaptchaProvider(app: app) + if delegateProvider == nil { + print( + "Firebase App Check: failed to initialize RecaptchaProvider. Ensure site key is in GoogleService-Info.plist." + ) + } + #else + print("Firebase App Check: reCAPTCHA is only supported on iOS.") + #endif + default: + // deviceCheck + delegateProvider = DeviceCheckProvider(app: app) + } + } + + func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) { + guard let delegateProvider else { + handler( + nil, + NSError( + domain: "firebase_app_check", code: -1, + userInfo: [NSLocalizedDescriptionKey: "Provider not configured"] + ) + ) + return + } + delegateProvider.getToken(completion: handler) + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml new file mode 100644 index 00000000..605a2914 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/pubspec.yaml @@ -0,0 +1,48 @@ +name: firebase_app_check +description: App Check works alongside other Firebase services to help protect your backend resources from abuse, such as billing fraud or phishing. +homepage: https://firebase.google.com/docs/app-check +repository: https://github.com/firebase/flutterfire/tree/main/packages/firebase_app_check/firebase_app_check +version: 0.4.5 +resolution: workspace +topics: + - firebase + - app-check + - security + - protection + +false_secrets: + - example/** + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + firebase_app_check_platform_interface: ^0.4.1 + firebase_app_check_web: ^0.2.5 + firebase_core: ^4.11.0 + firebase_core_platform_interface: ^7.1.0 + flutter: + sdk: flutter + +dev_dependencies: + async: ^2.5.0 + flutter_test: + sdk: flutter + mockito: ^5.0.0 + plugin_platform_interface: ^2.1.3 + +flutter: + plugin: + platforms: + android: + package: io.flutter.plugins.firebase.appcheck + pluginClass: FirebaseAppCheckPlugin + ios: + pluginClass: FirebaseAppCheckPlugin + macos: + pluginClass: FirebaseAppCheckPlugin + web: + default_package: firebase_app_check_web + windows: + pluginClass: FirebaseAppCheckPluginCApi diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart new file mode 100755 index 00000000..f939040d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/firebase_app_check_test.dart @@ -0,0 +1,79 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_app_check/firebase_app_check.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import './mock.dart'; + +void main() { + setupFirebaseAppCheckMocks(); + late FirebaseApp secondaryApp; + + group('$FirebaseAppCheck', () { + setUpAll(() async { + await Firebase.initializeApp(); + secondaryApp = await Firebase.initializeApp( + name: 'secondaryApp', + options: const FirebaseOptions( + appId: '1:1234567890:ios:42424242424242', + apiKey: '123', + projectId: '123', + messagingSenderId: '1234567890', + ), + ); + }); + + group('instance', () { + test('successful call', () async { + final appCheck = FirebaseAppCheck.instance; + + expect(appCheck, isA()); + expect(appCheck.app.name, defaultFirebaseAppName); + }); + }); + + group('instanceFor', () { + test('successful call', () async { + final appCheck = FirebaseAppCheck.instanceFor(app: secondaryApp); + + expect(appCheck, isA()); + expect(appCheck.app.name, 'secondaryApp'); + }); + + test('creates a fresh instance after app delete and reinitialize', + () async { + const appName = 'delete-reinit-app-check'; + const options = FirebaseOptions( + appId: '1:1234567890:ios:42424242424242', + apiKey: '123', + projectId: '123', + messagingSenderId: '1234567890', + ); + final app = await Firebase.initializeApp( + name: appName, + options: options, + ); + final appCheck1 = FirebaseAppCheck.instanceFor(app: app); + + expect(app.getService(), same(appCheck1)); + + await app.delete(); + + final app2 = await Firebase.initializeApp( + name: appName, + options: options, + ); + addTearDown(app2.delete); + + final appCheck2 = FirebaseAppCheck.instanceFor(app: app2); + + expect(appCheck2, isNot(same(appCheck1))); + expect(appCheck2.app, app2); + expect(app2.getService(), same(appCheck2)); + }); + }); + }); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/mock.dart b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/mock.dart new file mode 100644 index 00000000..0a6701d3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/test/mock.dart @@ -0,0 +1,35 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_core_platform_interface/test.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +typedef Callback = void Function(MethodCall call); + +final List methodCallLog = []; + +void setupFirebaseAppCheckMocks([Callback? customHandlers]) { + TestWidgetsFlutterBinding.ensureInitialized(); + + setupFirebaseCoreMocks(); + TestFirebaseAppHostApi.setUp(MockFirebaseAppHostApi()); +} + +class MockFirebaseAppHostApi implements TestFirebaseAppHostApi { + @override + Future delete(String appName) async {} + + @override + Future setAutomaticDataCollectionEnabled( + String appName, + bool enabled, + ) async {} + + @override + Future setAutomaticResourceManagementEnabled( + String appName, + bool enabled, + ) async {} +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt new file mode 100644 index 00000000..7c40c200 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/CMakeLists.txt @@ -0,0 +1,81 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "firebase_app_check") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_app_check_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "firebase_app_check_plugin.cpp" + "firebase_app_check_plugin.h" + "messages.g.cpp" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +add_library(${PLUGIN_NAME} STATIC + "include/firebase_app_check/firebase_app_check_plugin_c_api.h" + "firebase_app_check_plugin_c_api.cpp" + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_app_check/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) + +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +set(MSVC_RUNTIME_MODE MD) +set(firebase_libs firebase_core_plugin firebase_app_check) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_app_check_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp new file mode 100644 index 00000000..d9a0a72d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.cpp @@ -0,0 +1,249 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_app_check_plugin.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/app_check/debug_provider.h" +#include "firebase/future.h" +#include "firebase_app_check/plugin_version.h" +#include "firebase_core/firebase_core_plugin_c_api.h" +#include "messages.g.h" + +using ::firebase::App; +using ::firebase::Future; +using ::firebase::app_check::AppCheck; +using ::firebase::app_check::AppCheckListener; +using ::firebase::app_check::AppCheckToken; +using ::firebase::app_check::DebugAppCheckProviderFactory; + +namespace firebase_app_check_windows { + +static const std::string kLibraryName = "flutter-fire-app-check"; +static const std::string kEventChannelNamePrefix = + "plugins.flutter.io/firebase_app_check/token/"; + +flutter::BinaryMessenger* FirebaseAppCheckPlugin::binaryMessenger = nullptr; +std::map>> + FirebaseAppCheckPlugin::event_channels_; +std::map + FirebaseAppCheckPlugin::listeners_map_; + +// AppCheckListener implementation that forwards token changes to an EventSink. +class FlutterAppCheckListener : public AppCheckListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnAppCheckTokenChanged(const AppCheckToken& token) override { + if (event_sink_) { + flutter::EncodableMap event; + event[flutter::EncodableValue("token")] = + flutter::EncodableValue(token.token); + event_sink_->Success(flutter::EncodableValue(event)); + } + } + + private: + std::unique_ptr> event_sink_; +}; + +// StreamHandler for token change events. +class TokenStreamHandler + : public flutter::StreamHandler { + public: + TokenStreamHandler(AppCheck* app_check, const std::string& app_name) + : app_check_(app_check), app_name_(app_name) {} + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = std::make_unique(); + listener_->SetEventSink(std::move(events)); + app_check_->AddAppCheckListener(listener_.get()); + FirebaseAppCheckPlugin::listeners_map_[app_name_] = listener_.get(); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + if (listener_) { + app_check_->RemoveAppCheckListener(listener_.get()); + FirebaseAppCheckPlugin::listeners_map_.erase(app_name_); + listener_.reset(); + } + return nullptr; + } + + private: + AppCheck* app_check_; + std::string app_name_; + std::unique_ptr listener_; +}; + +static AppCheck* GetAppCheckFromPigeon(const std::string& app_name) { + App* app = App::GetInstance(app_name.c_str()); + return AppCheck::GetInstance(app); +} + +static FlutterError ParseError(const firebase::FutureBase& completed_future) { + std::string error_code = "unknown"; + int error = completed_future.error(); + switch (error) { + case firebase::app_check::kAppCheckErrorServerUnreachable: + error_code = "server-unreachable"; + break; + case firebase::app_check::kAppCheckErrorInvalidConfiguration: + error_code = "invalid-configuration"; + break; + case firebase::app_check::kAppCheckErrorSystemKeychain: + error_code = "system-keychain"; + break; + case firebase::app_check::kAppCheckErrorUnsupportedProvider: + error_code = "unsupported-provider"; + break; + default: + error_code = "unknown"; + break; + } + + std::string error_message = completed_future.error_message() + ? completed_future.error_message() + : "An unknown error occurred"; + + return FlutterError(error_code, error_message); +} + +// static +void FirebaseAppCheckPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarWindows* registrar) { + auto plugin = std::make_unique(); + + FirebaseAppCheckHostApi::SetUp(registrar->messenger(), plugin.get()); + + registrar->AddPlugin(std::move(plugin)); + + binaryMessenger = registrar->messenger(); + + // Register for platform logging + App::RegisterLibrary(kLibraryName.c_str(), getPluginVersion().c_str(), + nullptr); +} + +FirebaseAppCheckPlugin::FirebaseAppCheckPlugin() {} + +FirebaseAppCheckPlugin::~FirebaseAppCheckPlugin() { + for (auto& [app_name, listener] : listeners_map_) { + App* app = App::GetInstance(app_name.c_str()); + if (app) { + AppCheck* app_check = AppCheck::GetInstance(app); + if (app_check) { + app_check->RemoveAppCheckListener(listener); + } + } + } + listeners_map_.clear(); + event_channels_.clear(); +} + +void FirebaseAppCheckPlugin::Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) { + // On Windows/desktop, only the Debug provider is available. + DebugAppCheckProviderFactory* factory = + DebugAppCheckProviderFactory::GetInstance(); + + if (debug_token != nullptr && !debug_token->empty()) { + factory->SetDebugToken(*debug_token); + } + + AppCheck::SetAppCheckProviderFactory(factory); + + result(std::nullopt); +} + +void FirebaseAppCheckPlugin::GetToken( + const std::string& app_name, bool force_refresh, + std::function> reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + Future future = app_check->GetAppCheckToken(force_refresh); + future.OnCompletion([result](const Future& completed_future) { + if (completed_future.error() != 0) { + result(ParseError(completed_future)); + } else { + const AppCheckToken* token = completed_future.result(); + if (token) { + result(std::optional(token->token)); + } else { + result(std::optional(std::nullopt)); + } + } + }); +} + +void FirebaseAppCheckPlugin::SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + app_check->SetTokenAutoRefreshEnabled(is_token_auto_refresh_enabled); + result(std::nullopt); +} + +void FirebaseAppCheckPlugin::RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + const std::string name = kEventChannelNamePrefix + app_name; + + auto event_channel = + std::make_unique>( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + event_channel->SetStreamHandler( + std::make_unique(app_check, app_name)); + + event_channels_[app_name] = std::move(event_channel); + + result(name); +} + +void FirebaseAppCheckPlugin::GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) { + AppCheck* app_check = GetAppCheckFromPigeon(app_name); + + Future future = app_check->GetLimitedUseAppCheckToken(); + future.OnCompletion([result](const Future& completed_future) { + if (completed_future.error() != 0) { + result(ParseError(completed_future)); + } else { + const AppCheckToken* token = completed_future.result(); + if (token) { + result(token->token); + } else { + result(FlutterError("unknown", "Failed to get limited use token")); + } + } + }); +} + +} // namespace firebase_app_check_windows diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h new file mode 100644 index 00000000..baabf2bd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin.h @@ -0,0 +1,72 @@ +/* + * Copyright 2025, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ + +#include +#include +#include + +#include +#include +#include + +#include "firebase/app.h" +#include "firebase/app_check.h" +#include "firebase/future.h" +#include "messages.g.h" + +namespace firebase_app_check_windows { + +class TokenStreamHandler; + +class FirebaseAppCheckPlugin : public flutter::Plugin, + public FirebaseAppCheckHostApi { + friend class TokenStreamHandler; + + public: + static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar); + + FirebaseAppCheckPlugin(); + + virtual ~FirebaseAppCheckPlugin(); + + // Disallow copy and assign. + FirebaseAppCheckPlugin(const FirebaseAppCheckPlugin&) = delete; + FirebaseAppCheckPlugin& operator=(const FirebaseAppCheckPlugin&) = delete; + + // FirebaseAppCheckHostApi methods. + void Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) override; + void GetToken(const std::string& app_name, bool force_refresh, + std::function> reply)> + result) override; + void SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) override; + void RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) override; + void GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) override; + + private: + static flutter::BinaryMessenger* binaryMessenger; + static std::map< + std::string, + std::unique_ptr>> + event_channels_; + static std::map + listeners_map_; +}; + +} // namespace firebase_app_check_windows + +#endif // FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp new file mode 100644 index 00000000..f0ace78f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/firebase_app_check_plugin_c_api.cpp @@ -0,0 +1,16 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_app_check/firebase_app_check_plugin_c_api.h" + +#include + +#include "firebase_app_check_plugin.h" + +void FirebaseAppCheckPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + firebase_app_check_windows::FirebaseAppCheckPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h new file mode 100644 index 00000000..ab2d9e94 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/include/firebase_app_check/firebase_app_check_plugin_c_api.h @@ -0,0 +1,29 @@ +/* + * Copyright 2025, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void FirebaseAppCheckPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_PLUGIN_FIREBASE_APP_CHECK_PLUGIN_C_API_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp new file mode 100644 index 00000000..0da3e3c1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.cpp @@ -0,0 +1,517 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#undef _HAS_EXCEPTIONS + +#include "messages.g.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace firebase_app_check_windows { +using ::flutter::BasicMessageChannel; +using ::flutter::CustomEncodableValue; +using ::flutter::EncodableList; +using ::flutter::EncodableMap; +using ::flutter::EncodableValue; + +FlutterError CreateConnectionError(const std::string channel_name) { + return FlutterError( + "channel-error", + "Unable to establish connection on channel: '" + channel_name + "'.", + EncodableValue("")); +} + +namespace { +template +bool PigeonInternalDeepEquals(const T& a, const T& b); + +bool PigeonInternalDeepEquals(const double& a, const double& b); + +template +bool PigeonInternalDeepEquals(const std::vector& a, const std::vector& b); + +template +bool PigeonInternalDeepEquals(const std::map& a, const std::map& b); + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b); + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b); + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b); + +template +bool PigeonInternalDeepEquals(const T& a, const T& b) { + return a == b; +} + +template +bool PigeonInternalDeepEquals(const std::vector& a, + const std::vector& b) { + if (a.size() != b.size()) { + return false; + } + for (size_t i = 0; i < a.size(); ++i) { + if (!PigeonInternalDeepEquals(a[i], b[i])) { + return false; + } + } + return true; +} + +template +bool PigeonInternalDeepEquals(const std::map& a, + const std::map& b) { + if (a.size() != b.size()) { + return false; + } + for (const auto& kv : a) { + bool found = false; + for (const auto& b_kv : b) { + if (PigeonInternalDeepEquals(kv.first, b_kv.first)) { + if (PigeonInternalDeepEquals(kv.second, b_kv.second)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; +} + +bool PigeonInternalDeepEquals(const double& a, const double& b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == b) || (std::isnan(a) && std::isnan(b)); +} + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b) { + if (!a && !b) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b) { + if (a.get() == b.get()) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b) { + if (a.index() != b.index()) { + return false; + } + if (const double* da = std::get_if(&a)) { + return PigeonInternalDeepEquals(*da, std::get(b)); + } else if (const ::flutter::EncodableList* la = + std::get_if<::flutter::EncodableList>(&a)) { + return PigeonInternalDeepEquals(*la, std::get<::flutter::EncodableList>(b)); + } else if (const ::flutter::EncodableMap* ma = + std::get_if<::flutter::EncodableMap>(&a)) { + return PigeonInternalDeepEquals(*ma, std::get<::flutter::EncodableMap>(b)); + } + return a == b; +} + +template +size_t PigeonInternalDeepHash(const T& v); + +size_t PigeonInternalDeepHash(const double& v); + +template +size_t PigeonInternalDeepHash(const std::vector& v); + +template +size_t PigeonInternalDeepHash(const std::map& v); + +template +size_t PigeonInternalDeepHash(const std::optional& v); + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v); + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v); + +template +size_t PigeonInternalDeepHash(const T& v) { + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::vector& v) { + size_t result = 1; + for (const auto& item : v) { + result = result * 31 + PigeonInternalDeepHash(item); + } + return result; +} + +template +size_t PigeonInternalDeepHash(const std::map& v) { + size_t result = 0; + for (const auto& kv : v) { + result += ((PigeonInternalDeepHash(kv.first) * 31) ^ + PigeonInternalDeepHash(kv.second)); + } + return result; +} + +size_t PigeonInternalDeepHash(const double& v) { + if (std::isnan(v)) { + // Normalize NaN to a consistent hash. + return std::hash()(std::numeric_limits::quiet_NaN()); + } + if (v == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return std::hash()(0.0); + } + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::optional& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v) { + size_t result = v.index(); + if (const double* dv = std::get_if(&v)) { + result = result * 31 + PigeonInternalDeepHash(*dv); + } else if (const ::flutter::EncodableList* lv = + std::get_if<::flutter::EncodableList>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*lv); + } else if (const ::flutter::EncodableMap* mv = + std::get_if<::flutter::EncodableMap>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*mv); + } else { + std::visit( + [&result](const auto& val) { + using T = std::decay_t; + if constexpr (!std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v) { + result = result * 31 + PigeonInternalDeepHash(val); + } + }, + v); + } + return result; +} + +} // namespace + +PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {} + +EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const { + return ::flutter::StandardCodecSerializer::ReadValueOfType(type, stream); +} + +void PigeonInternalCodecSerializer::WriteValue( + const EncodableValue& value, ::flutter::ByteStreamWriter* stream) const { + ::flutter::StandardCodecSerializer::WriteValue(value, stream); +} + +/// The codec used by FirebaseAppCheckHostApi. +const ::flutter::StandardMessageCodec& FirebaseAppCheckHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through +// the `binary_messenger`. +void FirebaseAppCheckHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api) { + FirebaseAppCheckHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAppCheckHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, FirebaseAppCheckHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.activate" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_android_provider_arg = args.at(1); + const auto* android_provider_arg = + std::get_if(&encodable_android_provider_arg); + const auto& encodable_apple_provider_arg = args.at(2); + const auto* apple_provider_arg = + std::get_if(&encodable_apple_provider_arg); + const auto& encodable_debug_token_arg = args.at(3); + const auto* debug_token_arg = + std::get_if(&encodable_debug_token_arg); + api->Activate(app_name_arg, android_provider_arg, + apple_provider_arg, debug_token_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_force_refresh_arg = args.at(1); + if (encodable_force_refresh_arg.IsNull()) { + reply(WrapError("force_refresh_arg unexpectedly null.")); + return; + } + const auto& force_refresh_arg = + std::get(encodable_force_refresh_arg); + api->GetToken( + app_name_arg, force_refresh_arg, + [reply](ErrorOr>&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + auto output_optional = std::move(output).TakeValue(); + if (output_optional) { + wrapped.push_back( + EncodableValue(std::move(output_optional).value())); + } else { + wrapped.push_back(EncodableValue()); + } + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.setTokenAutoRefreshEnabled" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + const auto& encodable_is_token_auto_refresh_enabled_arg = + args.at(1); + if (encodable_is_token_auto_refresh_enabled_arg.IsNull()) { + reply(WrapError( + "is_token_auto_refresh_enabled_arg unexpectedly null.")); + return; + } + const auto& is_token_auto_refresh_enabled_arg = + std::get(encodable_is_token_auto_refresh_enabled_arg); + api->SetTokenAutoRefreshEnabled( + app_name_arg, is_token_auto_refresh_enabled_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.registerTokenListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + api->RegisterTokenListener( + app_name_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_app_check_platform_interface." + "FirebaseAppCheckHostApi.getLimitedUseAppCheckToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_name_arg = args.at(0); + if (encodable_app_name_arg.IsNull()) { + reply(WrapError("app_name_arg unexpectedly null.")); + return; + } + const auto& app_name_arg = + std::get(encodable_app_name_arg); + api->GetLimitedUseAppCheckToken( + app_name_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAppCheckHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAppCheckHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +} // namespace firebase_app_check_windows diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h new file mode 100644 index 00000000..50ae4829 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/messages.g.h @@ -0,0 +1,119 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_app_check_windows { + +// Generated class from Pigeon. + +class FlutterError { + public: + explicit FlutterError(const std::string& code) : code_(code) {} + explicit FlutterError(const std::string& code, const std::string& message) + : code_(code), message_(message) {} + explicit FlutterError(const std::string& code, const std::string& message, + const ::flutter::EncodableValue& details) + : code_(code), message_(message), details_(details) {} + + const std::string& code() const { return code_; } + const std::string& message() const { return message_; } + const ::flutter::EncodableValue& details() const { return details_; } + + private: + std::string code_; + std::string message_; + ::flutter::EncodableValue details_; +}; + +template +class ErrorOr { + public: + ErrorOr(const T& rhs) : v_(rhs) {} + ErrorOr(const T&& rhs) : v_(std::move(rhs)) {} + ErrorOr(const FlutterError& rhs) : v_(rhs) {} + ErrorOr(const FlutterError&& rhs) : v_(std::move(rhs)) {} + + bool has_error() const { return std::holds_alternative(v_); } + const T& value() const { return std::get(v_); }; + const FlutterError& error() const { return std::get(v_); }; + + private: + friend class FirebaseAppCheckHostApi; + ErrorOr() = default; + T TakeValue() && { return std::get(std::move(v_)); } + + std::variant v_; +}; + +class PigeonInternalCodecSerializer + : public ::flutter::StandardCodecSerializer { + public: + PigeonInternalCodecSerializer(); + inline static PigeonInternalCodecSerializer& GetInstance() { + static PigeonInternalCodecSerializer sInstance; + return sInstance; + } + + void WriteValue(const ::flutter::EncodableValue& value, + ::flutter::ByteStreamWriter* stream) const override; + + protected: + ::flutter::EncodableValue ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const override; +}; + +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAppCheckHostApi { + public: + FirebaseAppCheckHostApi(const FirebaseAppCheckHostApi&) = delete; + FirebaseAppCheckHostApi& operator=(const FirebaseAppCheckHostApi&) = delete; + virtual ~FirebaseAppCheckHostApi() {} + virtual void Activate( + const std::string& app_name, const std::string* android_provider, + const std::string* apple_provider, const std::string* debug_token, + std::function reply)> result) = 0; + virtual void GetToken( + const std::string& app_name, bool force_refresh, + std::function> reply)> + result) = 0; + virtual void SetTokenAutoRefreshEnabled( + const std::string& app_name, bool is_token_auto_refresh_enabled, + std::function reply)> result) = 0; + virtual void RegisterTokenListener( + const std::string& app_name, + std::function reply)> result) = 0; + virtual void GetLimitedUseAppCheckToken( + const std::string& app_name, + std::function reply)> result) = 0; + + // The codec used by FirebaseAppCheckHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAppCheckHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAppCheckHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAppCheckHostApi() = default; +}; +} // namespace firebase_app_check_windows +#endif // PIGEON_MESSAGES_G_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in new file mode 100644 index 00000000..0a52f845 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_app_check-0.4.5/windows/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2025, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_app_check_windows { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_app_check_windows + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md new file mode 100644 index 00000000..b712b5e1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/CHANGELOG.md @@ -0,0 +1,1613 @@ +## 6.5.4 + + - **FIX**: resolve FlutterSceneLifeCycleDelegate conformance guard ([#18385](https://github.com/firebase/flutterfire/issues/18385)). ([48d67196](https://github.com/firebase/flutterfire/commit/48d67196a10affe09724529df5f67cf40b62bccf)) + +## 6.5.3 + + - Update a dependency to the latest release. + +## 6.5.2 + + - **FIX**(auth,android): update token retrieval in PigeonParser to handle Number type correctly ([#18328](https://github.com/firebase/flutterfire/issues/18328)). ([3b77147b](https://github.com/firebase/flutterfire/commit/3b77147bc00bb19af5f4821436a1a4cdd8ff6791)) + - **DOCS**(auth): clarify behavior of password reset email with email enumeration protection enabled ([#18296](https://github.com/firebase/flutterfire/issues/18296)). ([0bcce87a](https://github.com/firebase/flutterfire/commit/0bcce87a17830797dae6ff3c1a8ba4ce210c2c0d)) + +## 6.5.1 + + - Update a dependency to the latest release. + +## 6.5.0 + + - **REFACTOR**: move all packages to workspace ([#18182](https://github.com/firebase/flutterfire/issues/18182)). ([6cdfcb10](https://github.com/firebase/flutterfire/commit/6cdfcb103da7be46ccb190d7e107d8c537aa1ff8)) + - **FIX**: update core, auth and app-check logic so internal resources on method channels are properly disposed ([#18268](https://github.com/firebase/flutterfire/issues/18268)). ([a0de4ed8](https://github.com/firebase/flutterfire/commit/a0de4ed86b0dff89bb9e557f2a54f38cd2546016)) + - **FIX**(auth,apple): remove incorrect paths in Package.swift files search paths ([#18239](https://github.com/firebase/flutterfire/issues/18239)). ([7c2fa5b8](https://github.com/firebase/flutterfire/commit/7c2fa5b83201f2f68e031476dc37ad41809215f2)) + - **FIX**(auth,iOS): update import path for autogenerated messages ([#18227](https://github.com/firebase/flutterfire/issues/18227)). ([4351179d](https://github.com/firebase/flutterfire/commit/4351179d357eeab6b23ec66f45d558c02d3fde69)) + - **FEAT**(core): Add Auth and AppCheck as App's registered service. ([#18237](https://github.com/firebase/flutterfire/issues/18237)). ([7ce191cb](https://github.com/firebase/flutterfire/commit/7ce191cbd598b299cd0ec64b45d1366914367a5d)) + - **FEAT**: upgrade pigeon to version 26.3.4 ([#18205](https://github.com/firebase/flutterfire/issues/18205)). ([cb6b4aef](https://github.com/firebase/flutterfire/commit/cb6b4aeffc568755ea3eebe32b998f00237bf5ad)) + - **FEAT**(auth,android): add revokeAccessToken support for Android ([#18206](https://github.com/firebase/flutterfire/issues/18206)) ([#18207](https://github.com/firebase/flutterfire/issues/18207)). ([7e0a2227](https://github.com/firebase/flutterfire/commit/7e0a222700178a57d064c27b4ef62cefdda1e253)) + +## 6.4.0 + + - **FIX**(auth,ios): serialize Sign in with Apple to prevent crash on overlapping requests ([#18172](https://github.com/firebase/flutterfire/issues/18172)). ([752cbcaa](https://github.com/firebase/flutterfire/commit/752cbcaa57f887a8fea3bda728bb8482290fa049)) + - **FEAT**: use local firebase_core instead of remote SPM dependency ([#18141](https://github.com/firebase/flutterfire/issues/18141)). ([995caf40](https://github.com/firebase/flutterfire/commit/995caf400df80c0fde7151c651ccc6c0f756e381)) + +## 6.3.0 + + - **FIX**(auth): fix inconsistence in casing in the native iOS SDK and Web SDK ([#18086](https://github.com/firebase/flutterfire/issues/18086)). ([60b5cd5c](https://github.com/firebase/flutterfire/commit/60b5cd5c7888fa932124958125e87bd39e1c323c)) + - **FIX**(auth,ios): fix crash that could happen when reloading currentUser informations ([#18065](https://github.com/firebase/flutterfire/issues/18065)). ([6e6f6546](https://github.com/firebase/flutterfire/commit/6e6f65468c07045e1c21b1d7970234b2dfc16b3d)) + - **FIX**(auth,windows): add pluginregistry to properly restore state on Windows ([#18049](https://github.com/firebase/flutterfire/issues/18049)). ([8d715a77](https://github.com/firebase/flutterfire/commit/8d715a777a4827bff59f820d9978007bd7568a7d)) + - **FEAT**(ios): migrate iOS to UIScene lifecycle ([#18054](https://github.com/firebase/flutterfire/issues/18054)). ([3ffa4110](https://github.com/firebase/flutterfire/commit/3ffa411098132fd5182a84be4e7a226106bc7451)) + - **DOCS**(auth): add documentation about errors code when Email Enumeration Protection is activated ([#18084](https://github.com/firebase/flutterfire/issues/18084)). ([476ba53f](https://github.com/firebase/flutterfire/commit/476ba53f016f20009fd571ad6ab359631f97094b)) + +## 6.2.0 + + - **FEAT**(remote-config,windows): add support for windows ([#18006](https://github.com/firebase/flutterfire/issues/18006)). ([a6ec167f](https://github.com/firebase/flutterfire/commit/a6ec167f4ece9c9b455a916366781f482cc380b3)) + +## 6.1.4 + + - Update a dependency to the latest release. + +## 6.1.3 + + - Update a dependency to the latest release. + +## 6.1.2 + + - Update a dependency to the latest release. + +## 6.1.1 + + - Update a dependency to the latest release. + +## 6.1.0 + + - **FEAT**(auth): TOTP macOS support ([#17513](https://github.com/firebase/flutterfire/issues/17513)). ([41890d62](https://github.com/firebase/flutterfire/commit/41890d62a49258df097c19fd3b90e0b5de181526)) + +## 6.0.2 + + - Update a dependency to the latest release. + +## 6.0.1 + + - **FIX**(auth,apple): Move FirebaseAuth imports to implementation files ([#17607](https://github.com/firebase/flutterfire/issues/17607)). ([0c3ccd37](https://github.com/firebase/flutterfire/commit/0c3ccd3722038a47e656b0a703a0395a78befc5b)) + +## 6.0.0 + +> Note: This release has breaking changes. + + - **FEAT**(auth): validatePassword method/PasswordPolicy Support ([#17439](https://github.com/firebase/flutterfire/issues/17439)). ([9a032b34](https://github.com/firebase/flutterfire/commit/9a032b344d6a22c1e3a181ae27e511939f2d8972)) + - **BREAKING** **FEAT**: bump iOS SDK to version 12.0.0 ([#17549](https://github.com/firebase/flutterfire/issues/17549)). ([b2619e68](https://github.com/firebase/flutterfire/commit/b2619e685fec897513483df1d7be347b64f95606)) + - **BREAKING** **FEAT**(auth): remove deprecated functions ([#17562](https://github.com/firebase/flutterfire/issues/17562)). ([d50aad95](https://github.com/firebase/flutterfire/commit/d50aad954443904d64d4ebd4442ebc63ed702986)) + - **BREAKING** **FEAT**: bump Android SDK to version 34.0.0 ([#17554](https://github.com/firebase/flutterfire/issues/17554)). ([a5bdc051](https://github.com/firebase/flutterfire/commit/a5bdc051d40ee44e39cf0b8d2a7801bc6f618b67)) + +## Removed Methods + +- `ActionCodeSettings.dynamicLinkDomain` - Firebase Dynamic Links is deprecated and will be shut down +- `MicrosoftAuthProvider.credential()` - Use `signInWithProvider(MicrosoftAuthProvider)` instead +- `FirebaseAuth.instanceFor()` persistence parameter - Use `setPersistence()` instead +- `FirebaseAuth.fetchSignInMethodsForEmail()` - Removed for security best practices +- `User.updateEmail()` - Use `verifyBeforeUpdateEmail()` instead + +## Migration Guide + +### ActionCodeSettings +```dart +// Before +ActionCodeSettings( + url: 'https://example.com', + dynamicLinkDomain: 'example.page.link', +) + +// After +ActionCodeSettings( + url: 'https://example.com', + linkDomain: 'your-custom-domain.com', // Use custom Firebase Hosting domain +) +``` + +### Microsoft Authentication +```dart +// Before +final credential = MicrosoftAuthProvider.credential(accessToken); +await FirebaseAuth.instance.signInWithCredential(credential); + +// After +final provider = MicrosoftAuthProvider(); +await FirebaseAuth.instance.signInWithProvider(provider); +``` + +### FirebaseAuth Instance +```dart +// Before +FirebaseAuth.instanceFor(app: app, persistence: Persistence.local); + +// After +final auth = FirebaseAuth.instanceFor(app: app); +auth.setPersistence(Persistence.local); +``` + +### Email Updates +```dart +// Before +await user.updateEmail('new@email.com'); + +// After +await user.verifyBeforeUpdateEmail('new@email.com'); +``` + +### Email Sign-in Methods +The `fetchSignInMethodsForEmail()` method has been removed for security reasons. Consider implementing alternative authentication flows that don't require email enumeration. + +## 5.7.0 + + - **FEAT**(auth,macos): add support for `publish` and `addApplicationDelegate` on macOS FlutterPluginRegistrar ([#17518](https://github.com/firebase/flutterfire/issues/17518)). ([376bb6ea](https://github.com/firebase/flutterfire/commit/376bb6ea8878df3f25cc1416fe26ace2203fd793)) + +## 5.6.2 + + - Update a dependency to the latest release. + +## 5.6.1 + + - Update a dependency to the latest release. + +## 5.6.0 + + - **FEAT**(auth): add support for initializeRecaptchaConfig ([#17365](https://github.com/firebase/flutterfire/issues/17365)). ([73f9028e](https://github.com/firebase/flutterfire/commit/73f9028e114874fddc8a4f76f22b247504a95a02)) + +## 5.5.4 + + - **FIX**(auth,apple): prevent EXC_BAD_ACCESS crash in Apple Sign-In completion handler ([#17273](https://github.com/firebase/flutterfire/issues/17273)). ([cc7d28ae](https://github.com/firebase/flutterfire/commit/cc7d28ae09036464f7ece6a2637bae6a3c7a292d)) + - **DOCS**(firebase_auth): Removed duplicates; fixed typos; removed "unnecessary use of a null check" ([#16815](https://github.com/firebase/flutterfire/issues/16815)). ([0eb17e13](https://github.com/firebase/flutterfire/commit/0eb17e13587ebfe5c8d64cbba9c0a2ccd0b7ce90)) + +## 5.5.3 + + - **FIX**(auth,iOS): include missing email and credential in account-exists-with-different-credential error ([#17180](https://github.com/firebase/flutterfire/issues/17180)). ([2a0bdc64](https://github.com/firebase/flutterfire/commit/2a0bdc64086e99f8a98bd18b472b36bcfe05a9a4)) + +## 5.5.2 + + - Update a dependency to the latest release. + +## 5.5.1 + + - Update a dependency to the latest release. + +## 5.5.0 + + - **FEAT**(auth): support for `linkDomain` in `ActionCodeSettings` ([#17099](https://github.com/firebase/flutterfire/issues/17099)). ([090cdb20](https://github.com/firebase/flutterfire/commit/090cdb2078dc66e58aa4b1a3ef9a48101467b6ac)) + +## 5.4.2 + + - Update a dependency to the latest release. + +## 5.4.1 + + - Update a dependency to the latest release. + +## 5.4.0 + + + - **FIX**: Remove dart:io imports for analytics, auth and app check ([#16827](https://github.com/firebase/flutterfire/issues/16827)). ([8c7f57c4](https://github.com/firebase/flutterfire/commit/8c7f57c4a181b8cae3b0d2ba564682ad7d68f484)) + - **FIX**(firebase_auth): Fix `std::variant` compiler errors with VS 2022 17.12 ([#16840](https://github.com/firebase/flutterfire/issues/16840)). ([b88b71f4](https://github.com/firebase/flutterfire/commit/b88b71f45c856eb0ff2d2caefb8b6aa367e91418)) + - **FEAT**(auth): Swift Package Manager support ([#16773](https://github.com/firebase/flutterfire/issues/16773)). ([69abbe19](https://github.com/firebase/flutterfire/commit/69abbe19bb37e6eb450b0b5123a74c2d68a761c7)) + +## 5.3.4 + + - **FIX**(auth,android): `signInWithProvider()` for non-default instances ([#13522](https://github.com/firebase/flutterfire/issues/13522)). ([fe016a44](https://github.com/firebase/flutterfire/commit/fe016a4487993c8aa444e15c9881fe355b5f6624)) + +## 5.3.3 + + - Update a dependency to the latest release. + +## 5.3.2 + + - **FIX**(auth,apple): set nullability on pigeon parser method ([#13571](https://github.com/firebase/flutterfire/issues/13571)). ([7e8a1b2e](https://github.com/firebase/flutterfire/commit/7e8a1b2e5be454b168d942056c4abb7f8e92a9a8)) + +## 5.3.1 + + - **FIX**(all,apple): use modular headers to import ([#13400](https://github.com/firebase/flutterfire/issues/13400)). ([d7d2d4b9](https://github.com/firebase/flutterfire/commit/d7d2d4b93e7c00226027fffde46699f3d5388a41)) + +## 5.3.0 + + - **FEAT**(fdc): Initial Release of Data Connect ([#13313](https://github.com/firebase/flutterfire/issues/13313)). ([603a6726](https://github.com/firebase/flutterfire/commit/603a67261a2f7cbdd6ef594bfaef480aeb820683)) + +## 5.2.1 + + - Update a dependency to the latest release. + +## 5.2.0 + + - **FEAT**: bump iOS SDK to version 11.0.0 ([#13158](https://github.com/firebase/flutterfire/issues/13158)). ([c0e0c997](https://github.com/firebase/flutterfire/commit/c0e0c99703ea394d1bb873ac225c5fe3539b002d)) + - **DOCS**: remove reference to flutter.io and firebase.flutter.dev ([#13152](https://github.com/firebase/flutterfire/issues/13152)). ([5f0874b9](https://github.com/firebase/flutterfire/commit/5f0874b91e28a203dd62d37d391e5760c91f5729)) + +## 5.1.4 + + - **FIX**(firebase_auth): added supporting rawNonce for OAuth credential on Windows platform ([#13086](https://github.com/firebase/flutterfire/issues/13086)). ([12e87de9](https://github.com/firebase/flutterfire/commit/12e87de93ddc39d41a6a634d7d03766b3e36996a)) + +## 5.1.3 + + - **DOCS**(auth): add information about error codes for email/password functions ([#13100](https://github.com/firebase/flutterfire/issues/13100)). ([aeafc356](https://github.com/firebase/flutterfire/commit/aeafc356953a0531003f765e766ffcff2387401d)) + +## 5.1.2 + + - **DOCS**(auth): add information about error codes for `verifyBeforeUpdateEmail` ([#13036](https://github.com/firebase/flutterfire/issues/13036)). ([8ef7421d](https://github.com/firebase/flutterfire/commit/8ef7421d6a524938087769537ac70ec249096ed4)) + +## 5.1.1 + + - **FIX**(auth,apple): bug with cached `AuthCredential`, hash key was producing different value ([#12957](https://github.com/firebase/flutterfire/issues/12957)). ([ef0077e3](https://github.com/firebase/flutterfire/commit/ef0077e37744360264eb60d6eea4359a5cc13227)) + - **FIX**(auth,windows): fix a crash that could happen when using `sendEmailVerification` or `sendPasswordResetEmail` ([#12946](https://github.com/firebase/flutterfire/issues/12946)). ([a1008290](https://github.com/firebase/flutterfire/commit/a100829087dbf83ea59e73c3811d87b67e2a4012)) + - **DOCS**: Update documentation for auth/user-not-found exception to reflect email enumeration protection ([#12964](https://github.com/firebase/flutterfire/issues/12964)). ([125f8209](https://github.com/firebase/flutterfire/commit/125f820971331ec75e7fe59cff3b296c42c7d8f3)) + +## 5.1.0 + + - **FIX**(auth,ios): fix the parsing of an error that could specifically happen when using MicrosoftProvider ([#12920](https://github.com/firebase/flutterfire/issues/12920)). ([3b415e64](https://github.com/firebase/flutterfire/commit/3b415e641e6107b131a170277bbc1fa0e2908e27)) + - **FEAT**(auth,apple): create a credential with `idToken`, `rawNonce` & `appleFullPersonName` ([#12356](https://github.com/firebase/flutterfire/issues/12356)). ([17793080](https://github.com/firebase/flutterfire/commit/177930802ca13a3af1610968e54b8ce79f0781ca)) + +## 5.0.0 + +> Note: This release has breaking changes. + + - **BREAKING** **REFACTOR**: android plugins require `minSdk 21`, auth requires `minSdk 23` ahead of android BOM `>=33.0.0` ([#12873](https://github.com/firebase/flutterfire/issues/12873)). ([52accfc6](https://github.com/firebase/flutterfire/commit/52accfc6c39d6360d9c0f36efe369ede990b7362)) + - **BREAKING** **REFACTOR**: bump all iOS deployment targets to iOS 13 ahead of Firebase iOS SDK `v11` breaking change ([#12872](https://github.com/firebase/flutterfire/issues/12872)). ([de0cea2c](https://github.com/firebase/flutterfire/commit/de0cea2c3c36694a76361be784255986fac84a43)) + - **BREAKING** **REFACTOR**(auth): remove deprecated API ahead of breaking change release ([#12859](https://github.com/firebase/flutterfire/issues/12859)). ([995fa7e1](https://github.com/firebase/flutterfire/commit/995fa7e19540fe52ba75a66865823c8ca86b6657)) + +## 4.20.0 + + - **FIX**(auth,android): remove unnecessary error type guarding ([#12816](https://github.com/firebase/flutterfire/issues/12816)). ([7d4c200a](https://github.com/firebase/flutterfire/commit/7d4c200ac6f06a50c2e7ee852aea2c9fa7bcb0ff)) + - **FEAT**(auth,windows): `verifyBeforeUpdateEmail()` API support ([#12825](https://github.com/firebase/flutterfire/issues/12825)). ([111b1ad9](https://github.com/firebase/flutterfire/commit/111b1ad91e985b0462532bc579e64342b7f46fe2)) + - **FEAT**(auth): update Pigeon version to 19 ([#12828](https://github.com/firebase/flutterfire/issues/12828)). ([5e76153f](https://github.com/firebase/flutterfire/commit/5e76153fbcd337a26e83abc2b43b651ab6c501bc)) + - **FEAT**: bump CPP SDK to version 11.10.0 ([#12749](https://github.com/firebase/flutterfire/issues/12749)). ([2e410a23](https://github.com/firebase/flutterfire/commit/2e410a232758292baa70f8e78464bd3c62ec0373)) + +## 4.19.6 + + - **FIX**(auth,android): allow nullable `accessToken` when creating `OAuthProvider` ([#12795](https://github.com/firebase/flutterfire/issues/12795)). ([490319d4](https://github.com/firebase/flutterfire/commit/490319d4c046917bdd227c19fd37185d63076b4a)) + +## 4.19.5 + + - **FIX**(auth,windows): allow `idToken` and `accessToken` to be nullable to stop windows crashing for `signInWithCredential()` ([#12688](https://github.com/firebase/flutterfire/issues/12688)). ([ca9f92d0](https://github.com/firebase/flutterfire/commit/ca9f92d05f717b46c80307987f560454b90a4d67)) + +## 4.19.4 + + - Update a dependency to the latest release. + +## 4.19.3 + + - **FIX**(auth,ios): Give more details on internal error when calling `sendSignInLinkToEmail`. ([#12671](https://github.com/firebase/flutterfire/issues/12671)). ([2b086029](https://github.com/firebase/flutterfire/commit/2b0860296bf577c99810643bb286b7219ee9291f)) + +## 4.19.2 + + - Update a dependency to the latest release. + +## 4.19.1 + + - Update a dependency to the latest release. + +## 4.19.0 + + - **FEAT**(android): Bump `compileSdk` version of Android plugins to latest stable (34) ([#12566](https://github.com/firebase/flutterfire/issues/12566)). ([e891fab2](https://github.com/firebase/flutterfire/commit/e891fab291e9beebc223000b133a6097e066a7fc)) + +## 4.18.0 + + - **FIX**(auth,android): fixing an issue that could cause `getEnrolledFactors` to return an empty list if signing out in the same app session ([#12488](https://github.com/firebase/flutterfire/issues/12488)). ([04280a31](https://github.com/firebase/flutterfire/commit/04280a31310dbbe51a8e619f031f5190d02e695d)) + - **FEAT**(firebase_auth): add custom auth domain setter to Firebase Auth ([#12218](https://github.com/firebase/flutterfire/issues/12218)). ([e1297800](https://github.com/firebase/flutterfire/commit/e12978009e0fd785f267db560972ab0bbe021fcb)) + - **FEAT**(auth,windows): add support for oAuth with credentials on Windows ([#12154](https://github.com/firebase/flutterfire/issues/12154)). ([cc708e6f](https://github.com/firebase/flutterfire/commit/cc708e6fdce6053772da0f08c9872e1dbe9899b1)) + +## 4.17.9 + + - Update a dependency to the latest release. + +## 4.17.8 + + - Update a dependency to the latest release. + +## 4.17.7 + + - Update a dependency to the latest release. + +## 4.17.6 + + - Update a dependency to the latest release. + +## 4.17.5 + + - Update a dependency to the latest release. + +## 4.17.4 + + - Update a dependency to the latest release. + +## 4.17.3 + + - Update a dependency to the latest release. + +## 4.17.2 + + - **FIX**(auth,web): fix null safety issue in typing JS Interop ([#12250](https://github.com/firebase/flutterfire/issues/12250)). ([d0d30405](https://github.com/firebase/flutterfire/commit/d0d30405a895ae221603ddd158b1cb1636312fb4)) + +## 4.17.1 + + - Update a dependency to the latest release. + +## 4.17.0 + + - **FIX**(auth): deprecate `updateEmail()` & `fetchSignInMethodsForEmail()` ([#12143](https://github.com/firebase/flutterfire/issues/12143)). ([dcfd9e80](https://github.com/firebase/flutterfire/commit/dcfd9e801c3231d17821355df5865b179cf0bf11)) + - **FEAT**(auth,apple): Game Center sign-in support ([#12228](https://github.com/firebase/flutterfire/issues/12228)). ([ac625ec7](https://github.com/firebase/flutterfire/commit/ac625ec7a2ceb8c7ef78180f3bcaa8294cf06a2e)) + - **FEAT**(auth,android): Play Games provider sign-in support ([#12201](https://github.com/firebase/flutterfire/issues/12201)). ([1fb9019d](https://github.com/firebase/flutterfire/commit/1fb9019de1fd832223aa56139d98c1194b2d5efa)) + - **FEAT**(auth,windows): add support for `creationTime` and `lastSignInTime` ([#12116](https://github.com/firebase/flutterfire/issues/12116)). ([387e9434](https://github.com/firebase/flutterfire/commit/387e94343a237d0976bdfa4f5c0e20c6922456fa)) + +## 4.16.0 + + - **FIX**(auth,windows): fix a parsing issue of the Pigeon message on Windows for sendPasswordResetEmail ([#12082](https://github.com/firebase/flutterfire/issues/12082)). ([17c4ab12](https://github.com/firebase/flutterfire/commit/17c4ab128650c8e7a4f7e3cea0c55d1fea0998fd)) + - **FEAT**: allow users to disable automatic host mapping ([#11962](https://github.com/firebase/flutterfire/issues/11962)). ([13c1ce33](https://github.com/firebase/flutterfire/commit/13c1ce333b8cd113241a1f7ac07181c1c76194bc)) + +## 4.15.3 + + - **FIX**(auth): return email address if one is returned by the auth exception ([#11978](https://github.com/firebase/flutterfire/issues/11978)). ([ceee304d](https://github.com/firebase/flutterfire/commit/ceee304dd87cd66e34a7f7fa67c9961b72c10e72)) + +## 4.15.2 + + - Update a dependency to the latest release. + +## 4.15.1 + + - Update a dependency to the latest release. + +## 4.15.0 + + - **FEAT**(auth): add support for custom domains on mobile ([#11925](https://github.com/firebase/flutterfire/issues/11925)). ([552119c7](https://github.com/firebase/flutterfire/commit/552119c78e2750a929c6226de22f9f6d8df948a4)) + +## 4.14.1 + + - **FIX**(auth,apple): need to cache `AuthCredential` on native in case Dart exception passes `AuthCredential` back to user for sign-in ([#11889](https://github.com/firebase/flutterfire/issues/11889)). ([9c09f224](https://github.com/firebase/flutterfire/commit/9c09f22416f549e3b80bc7e618b07c1c3c24ee31)) + - **FIX**(auth,web): use the device language when using `setLanguageCode` with null ([#11905](https://github.com/firebase/flutterfire/issues/11905)). ([f9322b6f](https://github.com/firebase/flutterfire/commit/f9322b6f25cd9520c5e033361e63a4db3f375a15)) + - **FIX**(auth): add proper error message when trying to access the multifactor object on an unsupported platform ([#11894](https://github.com/firebase/flutterfire/issues/11894)). ([27d1c47d](https://github.com/firebase/flutterfire/commit/27d1c47d1168198e9fa296fcff52feb1f0a345d2)) + +## 4.14.0 + + - **FEAT**(auth,windows): add Windows support for Google Sign In ([#11861](https://github.com/firebase/flutterfire/issues/11861)). ([cde57d05](https://github.com/firebase/flutterfire/commit/cde57d059e099913efc994db27141540a2a981d1)) + +## 4.13.0 + + - **FEAT**(firebase_auth): export `AuthProvider` from `firebase_auth_interface` ([#11470](https://github.com/firebase/flutterfire/issues/11470)). ([39881e7e](https://github.com/firebase/flutterfire/commit/39881e7e4671faa94b274d980aad81829e6e0bfc)) + - **FEAT**(windows): add platform logging for core, auth, firestore and storage ([#11790](https://github.com/firebase/flutterfire/issues/11790)). ([e7d428d1](https://github.com/firebase/flutterfire/commit/e7d428d14be1535a2d579d4b2d376fbb81f06742)) + +## 4.12.1 + + - Update a dependency to the latest release. + +## 4.12.0 + + - **FEAT**(storage,windows): Add windows support ([#11617](https://github.com/firebase/flutterfire/issues/11617)). ([87ea02c8](https://github.com/firebase/flutterfire/commit/87ea02c8ae03eb351636cf202961ad0df6caebd8)) + +## 4.11.1 + + - **FIX**(ios): fix clashing filenames between Auth and Firestore ([#11731](https://github.com/firebase/flutterfire/issues/11731)). ([8770cafc](https://github.com/firebase/flutterfire/commit/8770cafccccb11607b5530311e3150ac08cd172e)) + +## 4.11.0 + + - **FIX**(auth): ensure `PigeonAuthCredential` is passed back to Dart side within try/catch ([#11683](https://github.com/firebase/flutterfire/issues/11683)). ([d42c3396](https://github.com/firebase/flutterfire/commit/d42c33969b096a9825af21c624f8d93aebede8b2)) + - **FEAT**: Full support of AGP 8 ([#11699](https://github.com/firebase/flutterfire/issues/11699)). ([bdb5b270](https://github.com/firebase/flutterfire/commit/bdb5b27084d225809883bdaa6aa5954650551927)) + - **FEAT**(firestore,windows): add support to Windows ([#11516](https://github.com/firebase/flutterfire/issues/11516)). ([e51d2a2d](https://github.com/firebase/flutterfire/commit/e51d2a2d287f4162f5a67d8200f1bf57fc2afe14)) + +## 4.10.1 + + - Update a dependency to the latest release. + +## 4.10.0 + + - **FIX**(auth): deprecate `FirebaseAuth.instanceFor`'s `persistence` parameter ([#11259](https://github.com/firebase/flutterfire/issues/11259)). ([a1966e82](https://github.com/firebase/flutterfire/commit/a1966e82c15f13119cb28a262a57c67b4f2b8d3b)) + - **FIX**(auth,apple): `fetchSignInMethodsForEmail` if value is `nil`, pass empty array. ([#11596](https://github.com/firebase/flutterfire/issues/11596)). ([6d261cc9](https://github.com/firebase/flutterfire/commit/6d261cc9a147befbfd203004aff8565492567f58)) + - **FEAT**(core,windows): Change the windows plugin compiling way ([#11594](https://github.com/firebase/flutterfire/issues/11594)). ([3dab95e0](https://github.com/firebase/flutterfire/commit/3dab95e01f7f71680aff84db4e9dccfe1e77643b)) + - **FEAT**(auth,windows): add Windows support to auth plugin ([#11089](https://github.com/firebase/flutterfire/issues/11089)). ([0cedfc85](https://github.com/firebase/flutterfire/commit/0cedfc8580bedd9e21b262537e643dbace0d7114)) + - **DOCS**: firebase_auth description ([#11292](https://github.com/firebase/flutterfire/issues/11292)). ([d9e05713](https://github.com/firebase/flutterfire/commit/d9e057137dffca09ea293b5df7292d7b7b21ca99)) + - **DOCS**(auth): update the incorrect "getting started" link ([#11440](https://github.com/firebase/flutterfire/issues/11440)). ([5db956dc](https://github.com/firebase/flutterfire/commit/5db956dc935dfec5be28e0463f7e8499a20d5577)) + +## 4.9.0 + + - **FEAT**(auth): TOTP (time-based one-time password) support for multi-factor authentication ([#11420](https://github.com/firebase/flutterfire/issues/11420)). ([3cc1243c](https://github.com/firebase/flutterfire/commit/3cc1243c94368de44d3a5c4be96b905a0a37b963)) + +## 4.8.0 + + - **FEAT**(auth): `revokeTokenWithAuthorizationCode()` implementation for revoking Apple sign-in token ([#11454](https://github.com/firebase/flutterfire/issues/11454)). ([92de98c9](https://github.com/firebase/flutterfire/commit/92de98c9e62f2bf20712dbfed22dd39f6883eb58)) + +## 4.7.3 + + - **FIX**(auth): rename import header to "firebase_auth_messages.g.h". ([#11472](https://github.com/firebase/flutterfire/issues/11472)). ([693a6f3c](https://github.com/firebase/flutterfire/commit/693a6f3cba3620933b905a964126406ae6ae3374)) + - **FIX**(firebase_auth): Fix forceRefresh parameter conversion before calling native API ([#11464](https://github.com/firebase/flutterfire/issues/11464)). ([86639876](https://github.com/firebase/flutterfire/commit/86639876b8e9138af740a1c74c122fcdb5c4566d)) + - **FIX**(auth): set the tenant id on iOS `FIRAuth` instance ([#11427](https://github.com/firebase/flutterfire/issues/11427)). ([15f3cf5d](https://github.com/firebase/flutterfire/commit/15f3cf5d9b86f287fac22370ea09abf9e773ea60)) + - **FIX**(firebase_auth,android): Remove implicit default locale used in error message ([#11321](https://github.com/firebase/flutterfire/issues/11321)). ([3a20f41c](https://github.com/firebase/flutterfire/commit/3a20f41c0d8a4d61d789874d7bb16d6ef710c9d1)) + +## 4.7.2 + + - **FIX**(auth): fix MFA issue where the error wouldn't be properly caught ([#11370](https://github.com/firebase/flutterfire/issues/11370)). ([72fef03f](https://github.com/firebase/flutterfire/commit/72fef03f775702aaf9a2ce0c6b31aea2a3c200a9)) + - **FIX**(auth,android): `getIdToken()` `IllegalStateException` crash fix ([#11362](https://github.com/firebase/flutterfire/issues/11362)). ([e925b4c9](https://github.com/firebase/flutterfire/commit/e925b4c9a937d90de0bdfb59ffa005938b3862dd)) + - **FIX**(auth,apple): pass in Firebase auth instance for correct app when using Provider sign in ([#11284](https://github.com/firebase/flutterfire/issues/11284)). ([1cffae79](https://github.com/firebase/flutterfire/commit/1cffae79ded28808ba55f2f4c9c1b47817987999)) + +## 4.7.1 + + - **FIX**(auth,android): Fix crash on Android where detaching from engine ([#11296](https://github.com/firebase/flutterfire/issues/11296)). ([d0a37332](https://github.com/firebase/flutterfire/commit/d0a373323a818d5005a58e95042b7ea3652ead50)) + - **FIX**(auth,ios): fix scoping of import for message.g.h, could cause incompatibility with other packages ([#11300](https://github.com/firebase/flutterfire/issues/11300)). ([91ccc57d](https://github.com/firebase/flutterfire/commit/91ccc57d4b40b1b7a77dc0d871f9ff7d3f24ba13)) + +## 4.7.0 + + - **FEAT**(auth): move to Pigeon for Platform channels ([#10802](https://github.com/firebase/flutterfire/issues/10802)). ([43e5b20b](https://github.com/firebase/flutterfire/commit/43e5b20b14799102a6544a4763476eaba44b9cfb)) + +## 4.6.3 + + - Update a dependency to the latest release. + +## 4.6.2 + + - Update a dependency to the latest release. + +## 4.6.1 + + - Update a dependency to the latest release. + +## 4.6.0 + + - **FEAT**: update dependency constraints to `sdk: '>=2.18.0 <4.0.0'` `flutter: '>=3.3.0'` ([#10946](https://github.com/firebase/flutterfire/issues/10946)). ([2772d10f](https://github.com/firebase/flutterfire/commit/2772d10fe510dcc28ec2d37a26b266c935699fa6)) + - **FEAT**: update libraries to be compatible with Flutter 3.10.0 ([#10944](https://github.com/firebase/flutterfire/issues/10944)). ([e1f5a5ea](https://github.com/firebase/flutterfire/commit/e1f5a5ea798c54f19d1d2f7b8f2250f8819f44b7)) + +## 4.5.0 + + - **FIX**: add support for AGP 8.0 ([#10901](https://github.com/firebase/flutterfire/issues/10901)). ([a3b96735](https://github.com/firebase/flutterfire/commit/a3b967354294c295a9be8d699a6adb7f4b1dba7f)) + - **FEAT**: upgrade to dart 3 compatible dependencies ([#10890](https://github.com/firebase/flutterfire/issues/10890)). ([4bd7e59b](https://github.com/firebase/flutterfire/commit/4bd7e59b1f2b09a2230c49830159342dd4592041)) + +## 4.4.2 + + - Update a dependency to the latest release. + +## 4.4.1 + + - Update a dependency to the latest release. + +## 4.4.0 + + - **FEAT**(auth,ios): automatically save the Apple Sign In display name ([#10652](https://github.com/firebase/flutterfire/issues/10652)). ([257f1ffb](https://github.com/firebase/flutterfire/commit/257f1ffbce7abd458df91d8e4b6422d83b5b849f)) + - **FEAT**: bump dart sdk constraint to 2.18 ([#10618](https://github.com/firebase/flutterfire/issues/10618)). ([f80948a2](https://github.com/firebase/flutterfire/commit/f80948a28b62eead358bdb900d5a0dfb97cebb33)) + +## 4.3.0 + + - **FIX**(auth): fix an issue where unenroll would not throw a FirebaseException ([#10572](https://github.com/firebase/flutterfire/issues/10572)). ([8dba33e1](https://github.com/firebase/flutterfire/commit/8dba33e1a95f03d70d527885aa58ce23622e359f)) + - **FEAT**(auth): improve error handling when Email enumeration feature is on ([#10591](https://github.com/firebase/flutterfire/issues/10591)). ([ff083025](https://github.com/firebase/flutterfire/commit/ff083025b724d683cc3a9ed5f4a4987c43663589)) + +## 4.2.10 + + - **FIX**(auth,web): fix currentUser being null when using emulator or named instance ([#10565](https://github.com/firebase/flutterfire/issues/10565)). ([11e8644d](https://github.com/firebase/flutterfire/commit/11e8644df402a5abbb0d0c37714879272dec024c)) + +## 4.2.9 + + - Update a dependency to the latest release. + +## 4.2.8 + + - Update a dependency to the latest release. + +## 4.2.7 + + - Update a dependency to the latest release. + +## 4.2.6 + + - **REFACTOR**: upgrade project to remove warnings from Flutter 3.7 ([#10344](https://github.com/firebase/flutterfire/issues/10344)). ([e0087c84](https://github.com/firebase/flutterfire/commit/e0087c845c7526c11a4241a26d39d4673b0ad29d)) + +## 4.2.5 + + - **FIX**: fix a null pointer exception that could occur when removing an even listener ([#10210](https://github.com/firebase/flutterfire/issues/10210)). ([72d2e973](https://github.com/firebase/flutterfire/commit/72d2e97363d89d716963dd224a2b9578ba446624)) + +## 4.2.4 + + - Update a dependency to the latest release. + +## 4.2.3 + + - Update a dependency to the latest release. + +## 4.2.2 + + - Update a dependency to the latest release. + +## 4.2.1 + + - Update a dependency to the latest release. + +## 4.2.0 + + - **FEAT**: improve error message when user cancels a sign in with a provider ([#10060](https://github.com/firebase/flutterfire/issues/10060)). ([6631da6b](https://github.com/firebase/flutterfire/commit/6631da6b6b165a0c1e3260d744df1d60f3c7abe0)) + +## 4.1.5 + + - **FIX**: Apple Sign In on a secondary app doesnt sign in the correct Firebase Auth instance ([#10018](https://github.com/firebase/flutterfire/issues/10018)). ([f746d5da](https://github.com/firebase/flutterfire/commit/f746d5da0c784e28f08b9fcedfce18933a9e448e)) + +## 4.1.4 + + - **FIX**: tentative fix for null pointer exception in `parseUserInfoList` ([#9960](https://github.com/firebase/flutterfire/issues/9960)). ([dad17407](https://github.com/firebase/flutterfire/commit/dad1740792b893920867528039a9c54398ae7e3e)) + +## 4.1.3 + + - **FIX**: fix reauthenticateWithProvider on iOS with Sign In With Apple that would throw a linked exception ([#9919](https://github.com/firebase/flutterfire/issues/9919)). ([7318a8f3](https://github.com/firebase/flutterfire/commit/7318a8f32de07bd47026d3e07b80b4bab5df1e6a)) + +## 4.1.2 + + - Update a dependency to the latest release. + +## 4.1.1 + + - Update a dependency to the latest release. + +## 4.1.0 + + - **REFACTOR**: add `verify` to `QueryPlatform` and change internal `verifyToken` API to `verify` ([#9711](https://github.com/firebase/flutterfire/issues/9711)). ([c99a842f](https://github.com/firebase/flutterfire/commit/c99a842f3e3f5f10246e73f51530cc58c42b49a3)) + - **FIX**: properly propagate the `FirebaseAuthMultiFactorException` for all reauthenticate and link methods ([#9700](https://github.com/firebase/flutterfire/issues/9700)). ([9ad97c82](https://github.com/firebase/flutterfire/commit/9ad97c82ead0f5c6f1307625374c34e0dcde730b)) + - **FEAT**: expose reauthenticateWithRedirect and reauthenticateWithPopup ([#9696](https://github.com/firebase/flutterfire/issues/9696)). ([2a1f910f](https://github.com/firebase/flutterfire/commit/2a1f910ff6cab21a126c62fd4322a14ec263b629)) + +## 4.0.2 + + - Update a dependency to the latest release. + +## 4.0.1 + +- Update a dependency to the latest release. + +## 4.0.0 + +> Note: This release has breaking changes. + + - **BREAKING** **FEAT**: Firebase iOS SDK version: `10.0.0` ([#9708](https://github.com/firebase/flutterfire/issues/9708)). ([9627c56a](https://github.com/firebase/flutterfire/commit/9627c56a37d657d0250b6f6b87d0fec1c31d4ba3)) + +## 3.11.2 + + - **DOCS**: update `setSettings()` inline documentation ([#9655](https://github.com/firebase/flutterfire/issues/9655)). ([39ca0029](https://github.com/firebase/flutterfire/commit/39ca00299ec5c6e0f2dc9b0b5a8d71b8d59d51d4)) + +## 3.11.1 + + - **FIX**: fix an iOS crash when using Sign In With Apple due to invalid return of nil instead of NSNull ([#9644](https://github.com/firebase/flutterfire/issues/9644)). ([3f76b53f](https://github.com/firebase/flutterfire/commit/3f76b53f375f4398652abfa7c9236571ee0bd87f)) + +## 3.11.0 + + - **FEAT**: add OAuth Access Token support to sign in with providers ([#9593](https://github.com/firebase/flutterfire/issues/9593)). ([cb6661bb](https://github.com/firebase/flutterfire/commit/cb6661bbc701031d6f920ace3a6efc8e8d56aa4c)) + - **FEAT**: add `linkWithRedirect` to the web ([#9580](https://github.com/firebase/flutterfire/issues/9580)). ([d834b90f](https://github.com/firebase/flutterfire/commit/d834b90f29fc1929a195d7d546170e4ea03c6ab1)) + +## 3.10.0 + + - **FIX**: fix path of generated Pigeon files to prevent name collision ([#9569](https://github.com/firebase/flutterfire/issues/9569)). ([71bde27d](https://github.com/firebase/flutterfire/commit/71bde27d4e613096f121abb16d7ea8483c3fbcd8)) + - **FEAT**: add `reauthenticateWithProvider` ([#9570](https://github.com/firebase/flutterfire/issues/9570)). ([dad6b481](https://github.com/firebase/flutterfire/commit/dad6b4813c682e35315dda3965ea8aaf5ba030e8)) + +## 3.9.0 + + - **REFACTOR**: deprecate `signInWithAuthProvider` in favor of `signInWithProvider` ([#9542](https://github.com/firebase/flutterfire/issues/9542)). ([ca340ea1](https://github.com/firebase/flutterfire/commit/ca340ea19c8dbb340f083e48cf1b0de36f7d64c4)) + - **FEAT**: add `linkWithProvider` to support for linking auth providers ([#9535](https://github.com/firebase/flutterfire/issues/9535)). ([1ac14fb1](https://github.com/firebase/flutterfire/commit/1ac14fb147f83cf5c7874004a9dc61838dce8da8)) + +## 3.8.0 + + - **FIX**: remove default scopes on iOS for Sign in With Apple ([#9477](https://github.com/firebase/flutterfire/issues/9477)). ([3fe02b29](https://github.com/firebase/flutterfire/commit/3fe02b2937135ea6d576c7e445da5f4266ff0fdf)) + - **FEAT**: add Twitter login for Android, iOS and Web ([#9421](https://github.com/firebase/flutterfire/issues/9421)). ([0bc6e6d5](https://github.com/firebase/flutterfire/commit/0bc6e6d5333e6be0d5749a083206f3f5bb79a7ba)) + - **FEAT**: add Yahoo as provider for iOS, Android and Web ([#9443](https://github.com/firebase/flutterfire/issues/9443)). ([6c3108a7](https://github.com/firebase/flutterfire/commit/6c3108a767aca3b1a844b2b5da04b2da45bc9fbd)) + - **DOCS**: fix typo "appearance" in `platform_interface_firebase_auth.dart` ([#9472](https://github.com/firebase/flutterfire/issues/9472)). ([323b917b](https://github.com/firebase/flutterfire/commit/323b917b5eecf0e5161a61c66f6cabac5b23e1b8)) + +## 3.7.0 + + - **FEAT**: add Microsoft login for Android, iOS and Web ([#9415](https://github.com/firebase/flutterfire/issues/9415)). ([1610ce8a](https://github.com/firebase/flutterfire/commit/1610ce8ac96d6da202ef014e9a3dfeb4acfacec9)) + - **FEAT**: add Sign in with Apple directly in Firebase Auth for Android, iOS 13+ and Web ([#9408](https://github.com/firebase/flutterfire/issues/9408)). ([da36b986](https://github.com/firebase/flutterfire/commit/da36b9861b7d635382705b4893eed85fd672125c)) + +## 3.6.4 + + - **FIX**: fix an error where MultifactorInfo factorId could be null on iOS ([#9367](https://github.com/firebase/flutterfire/issues/9367)). ([88bded11](https://github.com/firebase/flutterfire/commit/88bded119607473c7546154ac8bdd149a2d3f21f)) + +## 3.6.3 + + - **FIX**: use correct UTC time from server for `currentUser?.metadata.creationTime` & `currentUser?.metadata.lastSignInTime` ([#9248](https://github.com/firebase/flutterfire/issues/9248)). ([a6204128](https://github.com/firebase/flutterfire/commit/a6204128edf1f54ac734385d0ed6214d50cebd1b)) + - **DOCS**: explicit mention that `refreshToken` is empty string on native platforms on the `User`instance ([#9183](https://github.com/firebase/flutterfire/issues/9183)). ([1aa1c163](https://github.com/firebase/flutterfire/commit/1aa1c1638edc632dedf8de0f02127e26b1a86e17)) + +## 3.6.2 + + - **DOCS**: update `getIdTokenResult` inline documentation ([#9150](https://github.com/firebase/flutterfire/issues/9150)). ([519518ce](https://github.com/firebase/flutterfire/commit/519518ce3ed36580e35713e791281b251018201c)) + +## 3.6.1 + + - Update a dependency to the latest release. + +## 3.6.0 + + - **FIX**: pass `Persistence` value to `FirebaseAuth.instanceFor(app: app, persistence: persistence)` for setting persistence on Web platform ([#9138](https://github.com/firebase/flutterfire/issues/9138)). ([ae7ebaf8](https://github.com/firebase/flutterfire/commit/ae7ebaf8e304a2676b2acfa68aadf0538468b4a0)) + - **FIX**: fix crash on Android where detaching from engine was not properly resetting the Pigeon handler ([#9218](https://github.com/firebase/flutterfire/issues/9218)). ([96d35df0](https://github.com/firebase/flutterfire/commit/96d35df09914fbe40515fdcd20b17a802f37270d)) + - **FEAT**: expose the missing MultiFactor classes through the universal package ([#9194](https://github.com/firebase/flutterfire/issues/9194)). ([d8bf8185](https://github.com/firebase/flutterfire/commit/d8bf818528c3705350cdb1b4675d600ba1d29d14)) + +## 3.5.1 + + - Update a dependency to the latest release. + +## 3.5.0 + + - **FEAT**: add all providers available to MFA ([#9159](https://github.com/firebase/flutterfire/issues/9159)). ([5a03a859](https://github.com/firebase/flutterfire/commit/5a03a859385f0b06ad9afe8e8c706c046976b8d8)) + - **FEAT**: add phone MFA ([#9044](https://github.com/firebase/flutterfire/issues/9044)). ([1b85c8b7](https://github.com/firebase/flutterfire/commit/1b85c8b7fbcc3f21767f23981cb35061772d483f)) + +## 3.4.2 + + - Update a dependency to the latest release. + +## 3.4.1 + + - **FIX**: bump `firebase_core_platform_interface` version to fix previous release. ([bea70ea5](https://github.com/firebase/flutterfire/commit/bea70ea5cbbb62cbfd2a7a74ae3a07cb12b3ee5a)) + +## 3.4.0 + + - **FIX**: Web recaptcha hover removed after use. (#8812). ([790e450e](https://github.com/firebase/flutterfire/commit/790e450e8d6acd2fc50e0232c77a152430c7b3ea)) + - **FIX**: java.util.ConcurrentModificationException (#8967). ([dc6c04ae](https://github.com/firebase/flutterfire/commit/dc6c04aeb4fc535a8ccadf9c11fb4d5dc413606d)) + - **FEAT**: update GitHub sign in implementation (#8976). ([ffd3b019](https://github.com/firebase/flutterfire/commit/ffd3b019c3158c66476671d9a9df245035cc2295)) + +## 3.3.20 + + - **REFACTOR**: use `firebase.google.com` link for `homepage` in `pubspec.yaml` (#8729). ([43df32d4](https://github.com/firebase/flutterfire/commit/43df32d457a28523f5956a2252dafd47856ac756)) + - **REFACTOR**: use "firebase" instead of "FirebaseExtended" as organisation in all links for this repository (#8791). ([d90b8357](https://github.com/firebase/flutterfire/commit/d90b8357db01d65e753021358668f0b129713e6b)) + - **FIX**: update firebase_auth example to not be dependent on an emulator (#8601). ([bdc9772e](https://github.com/firebase/flutterfire/commit/bdc9772ec8a3fb6609b66c42166d6d132ddb67d9)) + - **DOCS**: fix two typos. (#8876). ([7390d5c5](https://github.com/firebase/flutterfire/commit/7390d5c51e61aeb4d59c0d74093921fad3f35083)) + - **DOCS**: point to "firebase.google" domain for hyperlinks in the usage section of `README.md` files (#8814). ([78006e0d](https://github.com/firebase/flutterfire/commit/78006e0d5b9dce8038ce3606a43ddcbc8a4a71b9)) + +## 3.3.19 + + - **DOCS**: use camel case style for "FlutterFire" in `README.md` (#8748). ([c6ff0b21](https://github.com/firebase/flutterfire/commit/c6ff0b21352eb0f9a9a576ca7ef737d203292a58)) + +## 3.3.18 + + - Update a dependency to the latest release. + +## 3.3.17 + + - Update a dependency to the latest release. + +## 3.3.16 + + - **REFACTOR**: remove deprecated `Tasks.call()` API from Android. (#8452). ([3e92496b](https://github.com/firebase/flutterfire/commit/3e92496b2783ec149258c22d3167c5388dcb1c40)) + +## 3.3.15 + + - **FIX**: Use iterator instead of enhanced for loop on android. (#8498). ([027c75a6](https://github.com/firebase/flutterfire/commit/027c75a60b39a40e6a3edc12edc51487cc954503)) + +## 3.3.14 + + - Update a dependency to the latest release. + +## 3.3.13 + + - Update a dependency to the latest release. + +## 3.3.12 + + - Update a dependency to the latest release. + +## 3.3.11 + + - **FIX**: Update APN token once auth plugin has been initialized on `iOS`. (#8201). ([ab6239dd](https://github.com/firebase/flutterfire/commit/ab6239ddf5cb14211b76bced04ec52203919a57a)) + +## 3.3.10 + + - **FIX**: return correct error code for linkWithCredential `provider-already-linked` on Android (#8245). ([ae090719](https://github.com/firebase/flutterfire/commit/ae090719ebbb0873cf227f76004feeae9a7d0580)) + - **FIX**: Fixed bug that sets email to `nil` on `iOS` when the `User` has no provider. (#8209). ([fb646438](https://github.com/firebase/flutterfire/commit/fb646438f219b0f0f7c6a8c52e2b9daa4afc833e)) + +## 3.3.9 + + - **FIX**: update all Dart SDK version constraints to Dart >= 2.16.0 (#8184). ([df4a5bab](https://github.com/firebase/flutterfire/commit/df4a5bab3c029399b4f257a5dd658d302efe3908)) + +## 3.3.8 + + - Update a dependency to the latest release. + +## 3.3.7 + + - **DOCS**: Update documentation for `currentUser` property to make expectations clearer. (#7843). ([59bb47c2](https://github.com/firebase/flutterfire/commit/59bb47c2490fbd641a1fcc26f2f888e8f4f02671)) + +## 3.3.6 + + - Update a dependency to the latest release. + +## 3.3.5 + + - **FIX**: bump Android `compileSdkVersion` to 31 (#7726). ([a9562bac](https://github.com/firebase/flutterfire/commit/a9562bac60ba927fb3664a47a7f7eaceb277dca6)) + +## 3.3.4 + + - **REFACTOR**: fix all `unnecessary_import` analyzer issues introduced with Flutter 2.8. ([7f0e82c9](https://github.com/firebase/flutterfire/commit/7f0e82c978a3f5a707dd95c7e9136a3e106ff75e)) + +## 3.3.3 + + - Update a dependency to the latest release. + +## 3.3.2 + + - **DOCS**: Fix typos and remove unused imports (#7504). + +## 3.3.1 + + - Update a dependency to the latest release. + +## 3.3.0 + + - **REFACTOR**: migrate remaining examples & e2e tests to null-safety (#7393). + - **FEAT**: automatically inject Firebase JS SDKs (#7359). + +## 3.2.0 + + - **FEAT**: support initializing default `FirebaseApp` instances from Dart (#6549). + +## 3.1.5 + + - Update a dependency to the latest release. + +## 3.1.4 + + - **REFACTOR**: remove deprecated Flutter Android v1 Embedding usages, including in example app (#7158). + - **STYLE**: macOS & iOS; explicitly include header that defines `TARGET_OS_OSX` (#7116). + +## 3.1.3 + + - **REFACTOR**: migrate example app to null-safety (#7111). + +## 3.1.2 + + - **FIX**: allow setLanguage to accept null (#7050). + - **CHORE**: remove google-signin plugin temporarily to fix CI (#7047). + +## 3.1.1 + + - **FIX**: use Locale.ROOT while processing error code (#6946). + +## 3.1.0 + + - **FEAT**: expose linkWithPopup() & correctly parse credentials in exceptions (#6562). + +## 3.0.2 + + - **STYLE**: enable additional lint rules (#6832). + - **FIX**: precise error message is propagated (#6793). + - **FIX**: Use angle bracket import consistently when importing Firebase.h for iOS (#5891). + - **FIX**: stop idTokenChanges & userChanges firing twice on initial listen (#6560). + +## 3.0.1 + + - **FIX**: reinstate deprecated emulator apis (#6626). + +## 3.0.0 + +> Note: This release has breaking changes. + + - **FEAT**: setSettings now possible for android (#6367). + - **DOCS**: phone provider account linking update (#6465). + - **CHORE**: update v2 embedding support (#6506). + - **CHORE**: verifyPhoneNumber() example (#6476). + - **CHORE**: rm deprecated jcenter repository (#6431). + - **BREAKING** **FEAT**: useEmulator(host, port) API update (#6439). + +## 2.0.0 + +> Note: This release has breaking changes. + + - **FEAT**: setSettings now possible for android (#6367). + - **DOCS**: phone provider account linking update (#6465). + - **CHORE**: verifyPhoneNumber() example (#6476). + - **CHORE**: rm deprecated jcenter repository (#6431). + - **BREAKING** **FEAT**: useAuthEmulator(host, port) API update. + +## 1.4.1 + + - Update a dependency to the latest release. + +## 1.4.0 + + - **FEAT**: add tenantId support (#5736). + +## 1.3.0 + + - **FEAT**: add User.updateDisplayName and User.updatePhotoURL (#6213). + - **DOCS**: Add Flutter Favorite badge (#6190). + +## 1.2.0 + + - **FEAT**: upgrade Firebase JS SDK version to 8.6.1. + - **FIX**: podspec osx version checking script should use a version range instead of a single fixed version. + +## 1.1.4 + + - **FIX**: correctly cleanup Dictionary handlers (#6101). + - **DOCS**: Update the documentation of sendPasswordResetEmail (#6051). + - **CHORE**: publish packages (#6022). + - **CHORE**: publish packages. + +## 1.1.3 + + - **FIX**: Fix firebase_auth not being registered as a plugin (#5987). + - **CI**: refactor to use Firebase Auth emulator (#5939). + +## 1.1.2 + + - **FIX**: fixed an issue where Web could not connect to the Firebase Auth emulator (#5940). + - **FIX**: Import all necessary headers from the header file. (#5890). + - **FIX**: Move communication to EventChannels (#4643). + - **DOCS**: remove implicit-cast in the doc of AuthProviders (#5862). + +## 1.1.1 + + - **FIX**: ensure web is initialized before sending stream events (#5766). + - **DOCS**: Add UserInfoCard widget in auth example SignInPage (#4635). + - **CI**: fix analyzer issues in example. + - **CHORE**: update Web plugins to use Firebase JS SDK version 8.4.1 (#4464). + +## 1.1.0 + + - **FEAT**: PhoneAuthProvider.credential and PhoneAuthProvider.credentialFromToken now return a PhoneAuthCredential (#5675). + - **CHORE**: update drive dependency (#5740). + +## 1.0.3 + + - **DOCS**: userChanges clarification (#5698). + +## 1.0.2 + + - Update a dependency to the latest release. + +## 1.0.1 + + - **DOCS**: note that auth emulator is not supported for web (#5169). + +## 1.0.0 + + - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. + +## 1.0.0-1.0.nullsafety.0 + + - Bump "firebase_auth" to `1.0.0-1.0.nullsafety.0`. + +## 0.21.0-1.1.nullsafety.3 + + - Update a dependency to the latest release. + +## 0.21.0-1.1.nullsafety.2 + + - **TESTS**: update mockito API usage in tests + +## 0.21.0-1.1.nullsafety.1 + + - **REFACTOR**: pubspec & dependency updates (#4932). + +## 0.21.0-1.1.nullsafety.0 + + - **FEAT**: implement support for `useEmulator` (#4263). + +## 0.21.0-1.0.nullsafety.0 + + - **FIX**: bump firebase_core_* package versions to updated NNBD versioning format (#4832). + +## 0.21.0-nullsafety.0 + + - **FEAT**: Migrated to null safety (#4633) + +## 0.20.0+1 + + - **FIX**: package compatibility. + +## 0.20.0 + +> Note: This release has breaking changes. + + - **FIX**: null pointer exception if user metadata null (#4622). + - **FEAT**: add check on podspec to assist upgrading users deployment target. + - **BUILD**: commit Podfiles with 10.12 deployment target. + - **BUILD**: remove default sdk version, version should always come from firebase_core, or be user defined. + - **BUILD**: set macOS deployment target to 10.12 (from 10.11). + - **BREAKING** **BUILD**: set osx min supported platform version to 10.12. + +## 0.19.0+1 + + - Update a dependency to the latest release. + +## 0.19.0 + +> Note: This release has breaking changes. + + - **CHORE**: harmonize dependencies and version handling. + - **BREAKING** **REFACTOR**: remove all currently deprecated APIs. + - **BREAKING** **FEAT**: forward port to firebase-ios-sdk v7.3.0. + - Due to this SDK upgrade, iOS 10 is now the minimum supported version by FlutterFire. Please update your build target version. + +## 0.18.4+1 + + - Update a dependency to the latest release. + +## 0.18.4 + + - **FEAT**: bump android `com.android.tools.build` & `'com.google.gms:google-services` versions (#4269). + - **DOCS**: Fixed two typos in method documentation (#4219). + +## 0.18.3+1 + + - **TEST**: Explicitly opt-out from null safety. + - **FIX**: stop authStateChange firing twice for initial event (#4099). + - **FIX**: updated email link signin to use latest format for ActionCodeSettings (#3425). + - **CHORE**: add missing dependency to example app. + - **CHORE**: bump gradle wrapper to 5.6.4 (#4158). + +## 0.18.3 + + - **FEAT**: migrate firebase interop files to local repository (#3973). + - **FEAT**: bump `compileSdkVersion` to 29 in preparation for upcoming Play Store requirement. + - **FEAT** [WEB] adds support for `EmailAuthProvider.credentialWithLink` + - **FEAT** [WEB] adds support for `FirebaseAuth.setSettings` + - **FEAT** [WEB] adds support for `User.tenantId` + - **FEAT** [WEB] `FirebaseAuthException` now supports `email` & `credential` properties + - **FEAT** [WEB] `ActionCodeInfo` now supports `previousEmail` field + +## 0.18.2 + + - **FEAT**: bump compileSdkVersion to 29 (#3975). + - **FEAT**: update Firebase iOS SDK version to 6.33.0 (from 6.26.0). + +## 0.18.1+2 + + - **FIX**: on iOS use sendEmailVerificationWithActionCodeSettings instead of sendEmailVerificationWithCompletion (#3686). + - **DOCS**: README updates (#3768). + +## 0.18.1+1 + + - **FIX**: Optional params for "signInWithCredential" method are converted to "nil" if "null" for iOS (#3731). + +## 0.18.1 + + - **FIX**: local dependencies in example apps (#3319). + - **FIX**: fix IdTokenResult timestamps (web, ios) (#3357). + - **FIX**: pub.dev score fixes (#3318). + - **FIX**: use unknown APNS token type (#3345). + - **FIX**: update FLTFirebaseAuthPlugin.m (#3360). + - **FIX**: use correct FIRAuth instance on listeners (#3316). + - **FEAT**: add support for linkWithPhoneNumber (#3436). + - **FEAT**: use named arguments for ActionCodeSettings (#3269). + - **FEAT**: implement signInWithPhoneNumber on web (#3205). + - **FEAT**: expose smsCode (android only) (#3308). + - **DOCS**: fixed signOut method documentation (#3342). + +## 0.18.0+1 + +* Fixed an Android issue where certain network related Firebase Auth error codes would come through as `unknown`. [(#3217)](https://github.com/firebase/flutterfire/pull/3217) +* Added missing deprecations: `FirebaseUser` class and `photoUrl` getter. +* Bump `firebase_auth_platform_interface` dependency to fix an assertion issue when creating Google sign-in credentials. +* Bump `firebase_auth_web` dependency to `^0.3.0+1`. + +## 0.18.0 + +Overall, Firebase Auth has been heavily reworked to bring it inline with the federated plugin setup along with adding new features, documentation and many more unit and end-to-end tests. The API has mainly been kept the same, however there are some breaking changes. + +### General + +- **BREAKING**: The `FirebaseUser` class has been renamed to `User`. +- **BREAKING**: The `AuthResult` class has been renamed to `UserCredential`. +- **NEW**: The `ActionCodeSettings` class is now consumable on all supporting methods. + - **NEW**: Added support for the `dynamicLinkDomain` property. +- **NEW**: Added a new `FirebaseAuthException` class (extends `FirebaseException`). + - All errors are now returned as a `FirebaseAuthException`, allowing you to access the code & message associated with the error. + - In addition, it is now possible to access the `email` and `credential` properties on exceptions if they exist. + +### `FirebaseAuth` + +- **BREAKING**: Accessing the current user via `currentUser()` is now synchronous via the `currentUser` getter. +- **BREAKING**: `isSignInWithEmailLink()` is now synchronous. +- **DEPRECATED**: `FirebaseAuth.fromApp()` is now deprecated in favor of `FirebaseAuth.instanceFor()`. +- **DEPRECATED**: `onAuthStateChanged` has been deprecated in favor of `authStateChanges()`. +- **NEW**: Added support for `idTokenChanges()` stream listener. +- **NEW**: Added support for `userChanges()` stream listener. + - The purpose of this API is to allow users to subscribe to all user events without having to manually hydrate app state in cases where a manual reload was required (e.g. `updateProfile()`). +- **NEW**: Added support for `applyActionCode()`. +- **NEW**: Added support for `checkActionCode()`. +- **NEW**: Added support for `verifyPasswordResetCode()`. +- **NEW**: Added support for accessing the current language code via the `languageCode` getter. +- **NEW**: `setLanguageCode()` now supports providing a `null` value. + - On web platforms, if `null` is provided the Firebase projects default language will be set. + - On native platforms, if `null` is provided the device language will be used. +- **NEW**: `verifyPhoneNumber()` exposes a `autoRetrievedSmsCodeForTesting` property. + - This allows developers to test automatic SMS code resolution on Android devices during development. +- **NEW** (iOS): `appVerificationDisabledForTesting` setting can now be set for iOS. + - This allows developers to skip ReCaptcha verification when testing phone authentication. +- **NEW** (iOS): `userAccessGroup` setting can now be set for iOS & MacOS. + - This allows developers to share authentication states across multiple apps or extensions on iOS & MacOS. For more information see the [Firebase iOS SDK documentation](https://firebase.google.com/docs/auth/ios/single-sign-on). + +### `User` + +- **BREAKING**: Removed the `UpdateUserInfo` class when using `updateProfile` in favor of named arguments. +- **NEW**: Added support for `getIdTokenResult()`. +- **NEW**: Added support for `verifyBeforeUpdateEmail()`. +- **FIX**: Fixed several iOS crashes when the Firebase SDK returned `nil` property values. +- **FIX**: Fixed an issue on Web & iOS where a users email address would still show after unlinking the email/password provider. + +### `UserCredential` + +- **NEW**: Added support for accessing the users `AuthCredential` via the `credential` property. + +### `AuthProvider` & `AuthCredential` + +- **DEPRECATED**: All sub-class (e.g. `GoogleAuthProvider`) `getCredential()` methods have been deprecated in favor of `credential()`. + - **DEPRECATED**: `EmailAuthProvider.getCredentialWithLink()` has been deprecated in favor of `EmailAuthProvider.credentialWithLink()`. +- **NEW**: Supporting providers can now assign scope and custom request parameters. + - The scope and parameters will be used on web platforms when triggering a redirect or popup via `signInWithPopup()` or `signInWithRedirect()`. + +## 0.17.0-dev.2 + +* Update plugin and example to use the same core. + +## 0.17.0-dev.1 + +* Depend on `firebase_core` pre-release versions. + +## 0.16.1+2 + +* Update README to make it clear which authentication options are possible. + +## 0.16.1+1 + +* Fix bug #2656 (verifyPhoneNumber always use the default FirebaseApp, not the configured one) + +## 0.16.1 + +* Update lower bound of dart dependency to 2.0.0. + +## 0.16.0 + +* Migrate to Android v2 embedding. + +## 0.15.5+3 + +* Fix for missing UserAgent.h compilation failures. + +## 0.15.5+2 + +* Update the platform interface dependency to 1.1.7 and update tests. + +## 0.15.5+1 + +* Make the pedantic dev_dependency explicit. + +## 0.15.5 + +* Add macOS support + +## 0.15.4+1 + +* Fix fallthrough bug in Android code. + +## 0.15.4 + +* Add support for `confirmPasswordReset` on Android and iOS. + +## 0.15.3+1 + +* Add integration instructions for the `web` platform. + +## 0.15.3 + +* Add support for OAuth Authentication for iOS and Android to solve generic providers authentication. + +## 0.15.2 + +* Add web support by default. +* Require Flutter SDK 1.12.13+hotfix.4 or later. + +## 0.15.1+1 + +* Remove the deprecated `author:` field from pubspec.yaml +* Migrate the plugin to the pubspec platforms manifest. +* Bump the minimum Flutter version to 1.10.0. + +## 0.15.1 + +* Migrate to use `firebase_auth_platform_interface`. + +## 0.15.0+2 + +* Update homepage since this package was moved. + +## 0.15.0+1 + +* Added missing ERROR_WRONG_PASSWORD Exception to the `reauthenticateWithCredential` docs. + +## 0.15.0 + +* Fixed `NoSuchMethodError` in `reauthenticateWithCredential`. +* Fixed `IdTokenResult` analyzer warnings. +* Reduced visibility of `IdTokenResult` constructor. + +## 0.14.0+10 + +* Formatted lists in member documentations for better readability. + +## 0.14.0+9 + +* Fix the behavior of `getIdToken` to use the `refresh` parameter instead of always refreshing. + +## 0.14.0+8 + +* Updated README instructions for contributing for consistency with other Flutterfire plugins. + +## 0.14.0+7 + +* Remove AndroidX warning. + +## 0.14.0+6 + +* Update example app with correct const constructors. + +## 0.14.0+5 + +* On iOS, `fetchSignInMethodsForEmail` now returns an empty list when the email + cannot be found, matching the Android behavior. + +## 0.14.0+4 + +* Fixed "Register a user" example code snippet in README.md. + +## 0.14.0+3 + +* Update documentation to reflect new repository location. +* Update unit tests to call `TestWidgetsFlutterBinding.ensureInitialized`. +* Remove executable bit on LICENSE file. + +## 0.14.0+2 + +* Reduce compiler warnings on iOS port by replacing `int` with `long` backing in returned timestamps. + +## 0.14.0+1 + +* Add dependency on `androidx.annotation:annotation:1.0.0`. + +## 0.14.0 + +* Added new `IdTokenResult` class. +* **Breaking Change**. `getIdToken()` method now returns `IdTokenResult` instead of a token `String`. + Use the `token` property of `IdTokenResult` to retrieve the token `String`. +* Added integration testing for `getIdToken()`. + +## 0.13.1+1 + +* Update authentication example in README. + +## 0.13.1 + +* Fixed a crash on iOS when sign-in fails. +* Additional integration testing. +* Updated documentation for `FirebaseUser.delete()` to include error codes. +* Updated Firebase project to match other Flutterfire apps. + +## 0.13.0 + +* **Breaking change**: Replace `FirebaseUserMetadata.creationTimestamp` and + `FirebaseUserMetadata.lastSignInTimestamp` with `creationTime` and `lastSignInTime`. + Previously on iOS `creationTimestamp` and `lastSignInTimestamp` returned in + seconds and on Android in milliseconds. Now, both platforms provide values as a + `DateTime`. + +## 0.12.0+1 + +* Fixes iOS sign-in exceptions when `additionalUserInfo` is `nil` or has `nil` fields. +* Additional integration testing. + +## 0.12.0 + +* Added new `AuthResult` and `AdditionalUserInfo` classes. +* **Breaking Change**. Sign-in methods now return `AuthResult` instead of `FirebaseUser`. + Retrieve the `FirebaseUser` using the `user` property of `AuthResult`. + +## 0.11.1+12 + +* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. + +## 0.11.1+11 + +* On iOS, `getIdToken()` now uses the `refresh` parameter instead of always using `true`. + +## 0.11.1+10 + +* On Android, `providerData` now includes `UserInfo` for the phone authentication provider. + +## 0.11.1+9 + +* Update README to clarify importance of filling out all fields for OAuth consent screen. + +## 0.11.1+8 + +* Automatically register for iOS notifications, ensuring that phone authentication + will work even if Firebase method swizzling is disabled. + +## 0.11.1+7 + +* Automatically use version from pubspec.yaml when reporting usage to Firebase. + +## 0.11.1+6 + +* Add documentation of support email requirement to README. + +## 0.11.1+5 + +* Fix `updatePhoneNumberCredential` on Android. + +## 0.11.1+4 + +* Fix `updatePhoneNumberCredential` on iOS. + +## 0.11.1+3 + +* Add missing template type parameter to `invokeMethod` calls. +* Bump minimum Flutter version to 1.5.0. +* Replace invokeMethod with invokeMapMethod wherever necessary. +* FirebaseUser private constructor takes `Map` instead of `Map`. + +## 0.11.1+2 + +* Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 + +## 0.11.1+1 + +* Updated the error code documentation for `linkWithCredential`. + +## 0.11.1 + +* Support for `updatePhoneNumberCredential`. + +## 0.11.0 + +* **Breaking change**: `linkWithCredential` is now a function of `FirebaseUser`instead of + `FirebaseAuth`. +* Added test for newer `linkWithCredential` function. + +## 0.10.0+1 + +* Increase Firebase/Auth CocoaPod dependency to '~> 6.0'. + +## 0.10.0 + +* Update firebase_dynamic_links dependency. +* Update Android dependencies to latest. + +## 0.9.0 + +* **Breaking change**: `PhoneVerificationCompleted` now provides an `AuthCredential` that can + be used with `signInWithCredential` or `linkWithCredential` instead of signing in automatically. +* **Breaking change**: Remove internal counter `nextHandle` from public API. + +## 0.8.4+5 + +* Increase Firebase/Auth CocoaPod dependency to '~> 5.19'. + +## 0.8.4+4 + +* Update FirebaseAuth CocoaPod dependency to ensure availability of `FIRAuthErrorUserInfoNameKey`. + +## 0.8.4+3 + +* Updated deprecated API usage on iOS to use non-deprecated versions. +* Updated FirebaseAuth CocoaPod dependency to ensure a minimum version of 5.0. + +## 0.8.4+2 + +* Fixes an error in the documentation of createUserWithEmailAndPassword. + +## 0.8.4+1 + +* Adds credential for email authentication with link. + +## 0.8.4 + +* Adds support for email link authentication. + +## 0.8.3 + +* Make providerId 'const String' to use in 'case' statement. + +## 0.8.2+1 + +* Fixed bug where `PhoneCodeAutoRetrievalTimeout` callback was never called. + +## 0.8.2 + +* Fixed `linkWithCredential` on Android. + +## 0.8.1+5 + +* Added a driver test. + +## 0.8.1+4 + +* Update README. +* Update the example app with separate pages for registration and sign-in. + +## 0.8.1+3 + +* Reduce compiler warnings in Android plugin +* Raise errors early when accessing methods that require a Firebase User + +## 0.8.1+2 + +* Log messages about automatic configuration of the default app are now less confusing. + +## 0.8.1+1 + +* Remove categories. + +## 0.8.1 + +* Fixes Firebase auth phone sign-in for Android. + +## 0.8.0+3 + +* Log a more detailed warning at build time about the previous AndroidX + migration. + +## 0.8.0+2 + +* Update Google sign-in example in the README. + +## 0.8.0+1 + +* Update a broken dependency. + +## 0.8.0 + +* **Breaking change**. Migrate from the deprecated original Android Support + Library to AndroidX. This shouldn't result in any functional changes, but it + requires any Android apps using this plugin to [also + migrate](https://developer.android.com/jetpack/androidx/migrate) if they're + using the original support library. + +## 0.7.0 + +* Introduce third-party auth provider classes that generate `AuthCredential`s +* **Breaking Change** Signing in, linking, and reauthenticating now require an `AuthCredential` +* **Breaking Change** Unlinking now uses providerId +* **Breaking Change** Moved reauthentication to FirebaseUser + +## 0.6.7 + +* `FirebaseAuth` and `FirebaseUser` are now fully documented. +* `PlatformExceptions` now report error codes as stated in docs. +* Credentials can now be unlinked from Accounts with new methods on `FirebaseUser`. + +## 0.6.6 + +* Users can now reauthenticate in response to operations that require a recent sign-in. + +## 0.6.5 + +* Fixing async method `verifyPhoneNumber`, that would never return even in a successful call. + +## 0.6.4 + +* Added support for Github signin and linking Github accounts to existing users. + +## 0.6.3 + +* Add multi app support. + +## 0.6.2+1 + +* Bump Android dependencies to latest. + +## 0.6.2 + +* Add access to user metadata. + +## 0.6.1 + +* Adding support for linkWithTwitterCredential in FirebaseAuth. + +## 0.6.0 + +* Added support for `updatePassword` in `FirebaseUser`. +* **Breaking Change** Moved `updateEmail` and `updateProfile` to `FirebaseUser`. + This brings the `firebase_auth` package inline with other implementations and documentation. + +## 0.5.20 + +* Replaced usages of guava's: ImmutableList and ImmutableMap with platform +Collections.unmodifiableList() and Collections.unmodifiableMap(). + +## 0.5.19 + +* Update test package dependency to pick up Dart 2 support. +* Modified dependency on google_sign_in to point to a published + version instead of a relative path. + +## 0.5.18 + +* Adding support for updateEmail in FirebaseAuth. + +## 0.5.17 + +* Adding support for FirebaseUser.delete. + +## 0.5.16 + +* Adding support for setLanguageCode in FirebaseAuth. + +## 0.5.15 + +* Bump Android and Firebase dependency versions. + +## 0.5.14 + +* Fixed handling of auto phone number verification. + +## 0.5.13 + +* Add support for phone number authentication. + +## 0.5.12 + +* Fixed ArrayIndexOutOfBoundsException in handleStopListeningAuthState + +## 0.5.11 + +* Updated Gradle tooling to match Android Studio 3.1.2. + +## 0.5.10 + +* Updated iOS implementation to reflect Firebase API changes. + +## 0.5.9 + +* Added support for signing in with a Twitter account. + +## 0.5.8 + +* Added support to reload firebase user + +## 0.5.7 + +* Added support to sendEmailVerification + +## 0.5.6 + +* Added support for linkWithFacebookCredential + +## 0.5.5 + +* Updated Google Play Services dependencies to version 15.0.0. + +## 0.5.4 + +* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. + +## 0.5.3 + +* Secure fetchProvidersForEmail (no providers) + +## 0.5.2 + +* Fixed Dart 2 type error in fetchProvidersForEmail. + +## 0.5.1 + +* Added support to fetchProvidersForEmail + +## 0.5.0 + +* **Breaking change**. Set SDK constraints to match the Flutter beta release. + +## 0.4.7 + +* Fixed Dart 2 type errors. + +## 0.4.6 + +* Fixed Dart 2 type errors. + +## 0.4.5 + +* Enabled use in Swift projects. + +## 0.4.4 + +* Added support for sendPasswordResetEmail + +## 0.4.3 + +* Moved to the io.flutter.plugins organization. + +## 0.4.2 + +* Added support for changing user data + +## 0.4.1 + +* Simplified and upgraded Android project template to Android SDK 27. +* Updated package description. + +## 0.4.0 + +* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin + 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in + order to use this version of the plugin. Instructions can be found + [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). +* Relaxed GMS dependency to [11.4.0,12.0[ + +## 0.3.2 + +* Added FLT prefix to iOS types +* Change GMS dependency to 11.4.+ + +## 0.3.1 + +* Change GMS dependency to 11.+ + +## 0.3.0 + +* **Breaking Change**: Method FirebaseUser getToken was renamed to getIdToken. + +## 0.2.5 + +* Added support for linkWithCredential with Google credential + +## 0.2.4 + +* Added support for `signInWithCustomToken` +* Added `Stream onAuthStateChanged` event to listen when the user change + +## 0.2.3+1 + +* Aligned author name with rest of repo. + +## 0.2.3 + +* Remove dependency on Google/SignIn + +## 0.2.2 + +* Remove dependency on FirebaseUI + +## 0.2.1 + +* Added support for linkWithEmailAndPassword + +## 0.2.0 + +* **Breaking Change**: Method currentUser is async now. + +## 0.1.2 + +* Added support for signInWithFacebook + +## 0.1.1 + +* Updated to Firebase SDK to always use latest patch version for 11.0.x builds + +## 0.1.0 + +* Updated to Firebase SDK Version 11.0.1 +* **Breaking Change**: You need to add a maven section with the "https://maven.google.com" endpoint to the repository section of your `android/build.gradle`. For example: +```gradle +allprojects { + repositories { + jcenter() + maven { // NEW + url "https://maven.google.com" // NEW + } // NEW + } +} +``` + +## 0.0.4 + +* Add method getToken() to FirebaseUser + +## 0.0.3+1 + +* Updated README.md + +## 0.0.3 + +* Added support for createUserWithEmailAndPassword, signInWithEmailAndPassword, and signOut Firebase methods + +## 0.0.2+1 + +* Updated README.md + +## 0.0.2 + +* Bump buildToolsVersion to 25.0.3 + +## 0.0.1 + +* Initial Release diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/LICENSE b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/LICENSE new file mode 100644 index 00000000..000b4618 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/README.md new file mode 100755 index 00000000..230c522d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/README.md @@ -0,0 +1,26 @@ +[](https://flutter.dev/docs/development/packages-and-plugins/favorites) + +# Firebase Auth for Flutter +[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) + +A Flutter plugin to use the [Firebase Authentication API](https://firebase.google.com/products/auth/). + +To learn more about Firebase Auth, please visit the [Firebase website](https://firebase.google.com/products/auth) + +## Getting Started + +To get started with Firebase Auth for Flutter, please [see the documentation](https://firebase.google.com/docs/auth/flutter/start). + +## Usage + +To use this plugin, please visit the [Authentication Usage documentation](https://firebase.google.com/docs/auth/flutter/manage-users) + +## Issues and feedback + +Please file FlutterFire specific issues, bugs, or feature requests in our [issue tracker](https://github.com/firebase/flutterfire/issues/new). + +Plugin issues that are not specific to FlutterFire can be filed in the [Flutter issue tracker](https://github.com/flutter/flutter/issues/new). + +To contribute a change to this plugin, +please review our [contribution guide](https://github.com/firebase/flutterfire/blob/main/CONTRIBUTING.md) +and open a [pull request](https://github.com/firebase/flutterfire/pulls). diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/build.gradle new file mode 100755 index 00000000..1004a0e7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/build.gradle @@ -0,0 +1,66 @@ +group 'io.flutter.plugins.firebase.auth' +version '1.0-SNAPSHOT' + +apply plugin: 'com.android.library' + +buildscript { + repositories { + google() + mavenCentral() + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +def firebaseCoreProject = findProject(':firebase_core') +if (firebaseCoreProject == null) { + throw new GradleException('Could not find the firebase_core FlutterFire plugin, have you added it as a dependency in your pubspec?') +} else if (!firebaseCoreProject.properties['FirebaseSDKVersion']) { + throw new GradleException('A newer version of the firebase_core FlutterFire plugin is required, please update your firebase_core pubspec dependency.') +} + +def getRootProjectExtOrCoreProperty(name, firebaseCoreProject) { + if (!rootProject.ext.has('FlutterFire')) return firebaseCoreProject.properties[name] + if (!rootProject.ext.get('FlutterFire')[name]) return firebaseCoreProject.properties[name] + return rootProject.ext.get('FlutterFire').get(name) +} + +android { + // Conditional for compatibility with AGP <4.2. + if (project.android.hasProperty("namespace")) { + namespace 'io.flutter.plugins.firebase.auth' + } + + compileSdkVersion 34 + + defaultConfig { + minSdkVersion 23 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion(17) + targetCompatibility JavaVersion.toVersion(17) + } + + buildFeatures { + buildConfig true + } + + lintOptions { + disable 'InvalidPackage' + } + dependencies { + api firebaseCoreProject + implementation platform("com.google.firebase:firebase-bom:${getRootProjectExtOrCoreProperty("FirebaseSDKVersion", firebaseCoreProject)}") + implementation 'com.google.firebase:firebase-auth' + implementation 'androidx.annotation:annotation:1.7.0' + } +} + +apply from: file("./user-agent.gradle") diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle.properties b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle.properties new file mode 100755 index 00000000..8bd86f68 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/settings.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/settings.gradle new file mode 100755 index 00000000..ec51773d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/settings.gradle @@ -0,0 +1,8 @@ +rootProject.name = 'firebase_auth' + +pluginManagement { + plugins { + id "com.android.application" version "8.3.0" + id "com.android.library" version "8.3.0" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml new file mode 100755 index 00000000..087541c2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java new file mode 100644 index 00000000..e4147bee --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/AuthStateChannelStreamHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuth.AuthStateListener; +import com.google.firebase.auth.FirebaseUser; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class AuthStateChannelStreamHandler implements StreamHandler { + + private final FirebaseAuth firebaseAuth; + private AuthStateListener authStateListener; + + public AuthStateChannelStreamHandler(FirebaseAuth firebaseAuth) { + this.firebaseAuth = firebaseAuth; + } + + @Override + public void onListen(Object arguments, EventSink events) { + Map event = new HashMap<>(); + event.put(Constants.APP_NAME, firebaseAuth.getApp().getName()); + + final AtomicBoolean initialAuthState = new AtomicBoolean(true); + + authStateListener = + auth -> { + if (initialAuthState.get()) { + initialAuthState.set(false); + return; + } + + FirebaseUser user = auth.getCurrentUser(); + + if (user == null) { + event.put(Constants.USER, null); + } else { + event.put( + Constants.USER, PigeonParser.manuallyToList(PigeonParser.parseFirebaseUser(user))); + } + + events.success(event); + }; + + firebaseAuth.addAuthStateListener(authStateListener); + } + + @Override + public void onCancel(Object arguments) { + if (authStateListener != null) { + firebaseAuth.removeAuthStateListener(authStateListener); + authStateListener = null; + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java new file mode 100644 index 00000000..2dd8df20 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/Constants.java @@ -0,0 +1,46 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +public class Constants { + + public static final String APP_NAME = "appName"; + + // Providers + public static final String SIGN_IN_METHOD_PASSWORD = "password"; + public static final String SIGN_IN_METHOD_EMAIL_LINK = "emailLink"; + public static final String SIGN_IN_METHOD_FACEBOOK = "facebook.com"; + public static final String SIGN_IN_METHOD_GOOGLE = "google.com"; + public static final String SIGN_IN_METHOD_TWITTER = "twitter.com"; + public static final String SIGN_IN_METHOD_GITHUB = "github.com"; + public static final String SIGN_IN_METHOD_PHONE = "phone"; + public static final String SIGN_IN_METHOD_OAUTH = "oauth"; + public static final String SIGN_IN_METHOD_PLAY_GAMES = "playgames.google.com"; + // User + public static final String USER = "user"; + public static final String EMAIL = "email"; + + public static final String PROVIDER_ID = "providerId"; + public static final String CREDENTIAL = "credential"; + public static final String SECRET = "secret"; + public static final String ID_TOKEN = "idToken"; + public static final String TOKEN = "token"; + public static final String ACCESS_TOKEN = "accessToken"; + public static final String RAW_NONCE = "rawNonce"; + public static final String EMAIL_LINK = "emailLink"; + public static final String VERIFICATION_ID = "verificationId"; + public static final String SMS_CODE = "smsCode"; + public static final String SIGN_IN_METHOD = "signInMethod"; + public static final String FORCE_RESENDING_TOKEN = "forceResendingToken"; + public static final String NAME = "name"; + public static final String SERVER_AUTH_CODE = "serverAuthCode"; + + // MultiFactor + public static final String MULTI_FACTOR_HINTS = "multiFactorHints"; + public static final String MULTI_FACTOR_SESSION_ID = "multiFactorSessionId"; + public static final String MULTI_FACTOR_RESOLVER_ID = "multiFactorResolverId"; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java new file mode 100755 index 00000000..a122221c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPlugin.java @@ -0,0 +1,782 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.firebase.auth; + +import static io.flutter.plugins.firebase.auth.FlutterFirebaseMultiFactor.multiFactorUserMap; +import static io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry.registerPlugin; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.TaskCompletionSource; +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.ActionCodeResult; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.MultiFactor; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import com.google.firebase.auth.SignInMethodQueryResult; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin; +import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** Flutter plugin for Firebase Auth. */ +public class FlutterFirebaseAuthPlugin + implements FlutterFirebasePlugin, + FlutterPlugin, + ActivityAware, + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi { + + private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_auth"; + + // Stores the instances of native AuthCredentials by their hashCode + static final HashMap authCredentials = new HashMap<>(); + + @Nullable private BinaryMessenger messenger; + + private MethodChannel channel; + private Activity activity; + + private final Map streamHandlers = new HashMap<>(); + + private final FlutterFirebaseAuthUser firebaseAuthUser = new FlutterFirebaseAuthUser(); + private final FlutterFirebaseMultiFactor firebaseMultiFactor = new FlutterFirebaseMultiFactor(); + + private final FlutterFirebaseTotpMultiFactor firebaseTotpMultiFactor = + new FlutterFirebaseTotpMultiFactor(); + private final FlutterFirebaseTotpSecret firebaseTotpSecret = new FlutterFirebaseTotpSecret(); + + private void initInstance(BinaryMessenger messenger) { + registerPlugin(METHOD_CHANNEL_NAME, this); + channel = new MethodChannel(messenger, METHOD_CHANNEL_NAME); + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi.setUp(messenger, this); + GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi.setUp(messenger, firebaseAuthUser); + GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi.setUp(messenger, firebaseMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi.setUp(messenger, firebaseMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi.setUp(messenger, firebaseTotpMultiFactor); + GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi.setUp(messenger, firebaseTotpSecret); + + this.messenger = messenger; + } + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + initInstance(binding.getBinaryMessenger()); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + + assert messenger != null; + GeneratedAndroidFirebaseAuth.FirebaseAuthHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi.setUp(messenger, null); + GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi.setUp(messenger, null); + + channel = null; + messenger = null; + + removeEventListeners(); + } + + @Override + public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) { + activity = activityPluginBinding.getActivity(); + firebaseAuthUser.setActivity(activity); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + activity = null; + firebaseAuthUser.setActivity(null); + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) { + activity = activityPluginBinding.getActivity(); + firebaseAuthUser.setActivity(activity); + } + + @Override + public void onDetachedFromActivity() { + activity = null; + firebaseAuthUser.setActivity(null); + } + + // Only access activity with this method. + @Nullable + private Activity getActivity() { + return activity; + } + + static FirebaseAuth getAuthFromPigeon( + GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp pigeonApp) { + FirebaseApp app = FirebaseApp.getInstance(pigeonApp.getAppName()); + FirebaseAuth auth = FirebaseAuth.getInstance(app); + if (pigeonApp.getTenantId() != null) { + auth.setTenantId(pigeonApp.getTenantId()); + } + String customDomain = FlutterFirebaseCorePlugin.customAuthDomain.get(pigeonApp.getAppName()); + if (customDomain != null) { + auth.setCustomAuthDomain(customDomain); + } + + // Auth's `getCustomAuthDomain` supersedes value from `customAuthDomain` map set by + // `initializeApp` + if (pigeonApp.getCustomAuthDomain() != null) { + auth.setCustomAuthDomain(pigeonApp.getCustomAuthDomain()); + } + + return auth; + } + + @Override + public void registerIdTokenListener( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + final FirebaseAuth auth = getAuthFromPigeon(app); + final IdTokenChannelStreamHandler handler = new IdTokenChannelStreamHandler(auth); + final String name = METHOD_CHANNEL_NAME + "/id-token/" + auth.getApp().getName(); + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + result.success(name); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void registerAuthStateListener( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + final FirebaseAuth auth = getAuthFromPigeon(app); + final AuthStateChannelStreamHandler handler = new AuthStateChannelStreamHandler(auth); + final String name = METHOD_CHANNEL_NAME + "/auth-state/" + auth.getApp().getName(); + final EventChannel channel = new EventChannel(messenger, name); + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + result.success(name); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void useEmulator( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String host, + @NonNull Long port, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth.useEmulator(host, port.intValue()); + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void applyActionCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .applyActionCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void checkActionCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .checkActionCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + ActionCodeResult actionCodeInfo = task.getResult(); + result.success(PigeonParser.parseActionCodeResult(actionCodeInfo)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void confirmPasswordReset( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull String newPassword, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .confirmPasswordReset(code, newPassword) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void createUserWithEmailAndPassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .createUserWithEmailAndPassword(email, password) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInAnonymously( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInAnonymously() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (credential == null) { + throw FlutterFirebaseAuthPluginException.invalidCredential(); + } + firebaseAuth + .signInWithCredential(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithCustomToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String token, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .signInWithCustomToken(token) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithEmailAndPassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInWithEmailAndPassword(email, password) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithEmailLink( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String emailLink, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .signInWithEmailLink(email, emailLink) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signInWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + OAuthProvider.Builder provider = + OAuthProvider.newBuilder(signInProvider.getProviderId(), firebaseAuth); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseAuth + .startActivityForSignInWithProvider(getActivity(), provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void signOut( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + if (firebaseAuth.getCurrentUser() != null) { + final Map appMultiFactorUser = + multiFactorUserMap.get(app.getAppName()); + if (appMultiFactorUser != null) { + appMultiFactorUser.remove(firebaseAuth.getCurrentUser().getUid()); + } + } + firebaseAuth.signOut(); + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void fetchSignInMethodsForEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull GeneratedAndroidFirebaseAuth.Result> result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .fetchSignInMethodsForEmail(email) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + SignInMethodQueryResult signInMethodQueryResult = task.getResult(); + result.success(signInMethodQueryResult.getSignInMethods()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendPasswordResetEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + if (actionCodeSettings == null) { + firebaseAuth + .sendPasswordResetEmail(email) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseAuth + .sendPasswordResetEmail(email, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendSignInLinkToEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .sendSignInLinkToEmail(email, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void setLanguageCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @Nullable String languageCode, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + if (languageCode == null) { + firebaseAuth.useAppLanguage(); + } else { + firebaseAuth.setLanguageCode(languageCode); + } + + result.success(firebaseAuth.getLanguageCode()); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void setSettings( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalFirebaseAuthSettings settings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + try { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .getFirebaseAuthSettings() + .setAppVerificationDisabledForTesting(settings.getAppVerificationDisabledForTesting()); + + if (settings.getForceRecaptchaFlow() != null) { + firebaseAuth + .getFirebaseAuthSettings() + .forceRecaptchaFlowForTesting(settings.getForceRecaptchaFlow()); + } + + if (settings.getPhoneNumber() != null && settings.getSmsCode() != null) { + firebaseAuth + .getFirebaseAuthSettings() + .setAutoRetrievedSmsCodeForPhoneNumber( + settings.getPhoneNumber(), settings.getSmsCode()); + } + + result.success(); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void verifyPasswordResetCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .verifyPasswordResetCode(code) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(task.getResult()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void verifyPhoneNumber( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalVerifyPhoneNumberRequest request, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + try { + String eventChannelName = METHOD_CHANNEL_NAME + "/phone/" + UUID.randomUUID().toString(); + EventChannel channel = new EventChannel(messenger, eventChannelName); + + MultiFactorSession multiFactorSession = null; + + if (request.getMultiFactorSessionId() != null) { + multiFactorSession = + FlutterFirebaseMultiFactor.multiFactorSessionMap.get(request.getMultiFactorSessionId()); + } + + final String multiFactorInfoId = request.getMultiFactorInfoId(); + PhoneMultiFactorInfo multiFactorInfo = null; + + if (multiFactorInfoId != null) { + for (String resolverId : FlutterFirebaseMultiFactor.multiFactorResolverMap.keySet()) { + for (MultiFactorInfo info : + FlutterFirebaseMultiFactor.multiFactorResolverMap.get(resolverId).getHints()) { + if (info.getUid().equals(multiFactorInfoId) && info instanceof PhoneMultiFactorInfo) { + multiFactorInfo = (PhoneMultiFactorInfo) info; + break; + } + } + } + } + + PhoneNumberVerificationStreamHandler handler = + new PhoneNumberVerificationStreamHandler( + getActivity(), + app, + request, + multiFactorSession, + multiFactorInfo, + credential -> { + int hashCode = credential.hashCode(); + authCredentials.put(hashCode, credential); + }); + + channel.setStreamHandler(handler); + streamHandlers.put(channel, handler); + + result.success(eventChannelName); + } catch (Exception e) { + result.error(e); + } + } + + @Override + public void revokeTokenWithAuthorizationCode( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String authorizationCode, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + // Should never get here as we throw Exception on Dart side. + result.success(); + } + + @Override + public void revokeAccessToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String accessToken, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + + firebaseAuth + .revokeAccessToken(accessToken) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void initializeRecaptchaConfig( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseAuth firebaseAuth = getAuthFromPigeon(app); + firebaseAuth + .initializeRecaptchaConfig() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public Task> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) { + TaskCompletionSource> taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( + () -> { + try { + Map constants = new HashMap<>(); + FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); + FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); + String languageCode = firebaseAuth.getLanguageCode(); + + GeneratedAndroidFirebaseAuth.InternalUserDetails user = + firebaseUser == null ? null : PigeonParser.parseFirebaseUser(firebaseUser); + + if (languageCode != null) { + constants.put("APP_LANGUAGE_CODE", languageCode); + } + + if (user != null) { + constants.put("APP_CURRENT_USER", PigeonParser.manuallyToList(user)); + } + + taskCompletionSource.setResult(constants); + } catch (Exception e) { + taskCompletionSource.setException(e); + } + }); + + return taskCompletionSource.getTask(); + } + + @Override + public Task didReinitializeFirebaseCore() { + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + + cachedThreadPool.execute( + () -> { + try { + removeEventListeners(); + authCredentials.clear(); + taskCompletionSource.setResult(null); + } catch (Exception e) { + taskCompletionSource.setException(e); + } + }); + + return taskCompletionSource.getTask(); + } + + private void removeEventListeners() { + for (EventChannel eventChannel : streamHandlers.keySet()) { + StreamHandler streamHandler = streamHandlers.get(eventChannel); + if (streamHandler != null) { + streamHandler.onCancel(null); + } + eventChannel.setStreamHandler(null); + } + streamHandlers.clear(); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java new file mode 100644 index 00000000..a42bcb56 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthPluginException.java @@ -0,0 +1,157 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.Nullable; +import com.google.firebase.FirebaseApiNotAvailableException; +import com.google.firebase.FirebaseNetworkException; +import com.google.firebase.FirebaseTooManyRequestsException; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.FirebaseAuthException; +import com.google.firebase.auth.FirebaseAuthMultiFactorException; +import com.google.firebase.auth.FirebaseAuthUserCollisionException; +import com.google.firebase.auth.FirebaseAuthWeakPasswordException; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorResolver; +import com.google.firebase.auth.MultiFactorSession; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseAuthPluginException { + + static GeneratedAndroidFirebaseAuth.FlutterError parserExceptionToFlutter( + @Nullable Exception nativeException) { + if (nativeException == null) { + return new GeneratedAndroidFirebaseAuth.FlutterError("UNKNOWN", null, null); + } + String code = "UNKNOWN"; + + String message = nativeException.getMessage(); + Map additionalData = new HashMap<>(); + + if (nativeException instanceof FirebaseAuthMultiFactorException) { + final FirebaseAuthMultiFactorException multiFactorException = + (FirebaseAuthMultiFactorException) nativeException; + Map output = new HashMap<>(); + + MultiFactorResolver multiFactorResolver = multiFactorException.getResolver(); + final List hints = multiFactorResolver.getHints(); + + final MultiFactorSession session = multiFactorResolver.getSession(); + final String sessionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorSessionMap.put(sessionId, session); + + final String resolverId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorResolverMap.put(resolverId, multiFactorResolver); + + final List> pigeonHints = PigeonParser.multiFactorInfoToMap(hints); + + output.put( + Constants.APP_NAME, + multiFactorException.getResolver().getFirebaseAuth().getApp().getName()); + + output.put(Constants.MULTI_FACTOR_HINTS, pigeonHints); + + output.put(Constants.MULTI_FACTOR_SESSION_ID, sessionId); + output.put(Constants.MULTI_FACTOR_RESOLVER_ID, resolverId); + + return new GeneratedAndroidFirebaseAuth.FlutterError( + multiFactorException.getErrorCode(), multiFactorException.getLocalizedMessage(), output); + } + + if (nativeException instanceof FirebaseNetworkException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseNetworkException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "network-request-failed", + "A network error (such as timeout, interrupted connection or unreachable host) has" + + " occurred.", + null); + } + + if (nativeException instanceof FirebaseApiNotAvailableException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseApiNotAvailableException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "api-not-available", "The requested API is not available.", null); + } + + if (nativeException instanceof FirebaseTooManyRequestsException + || (nativeException.getCause() != null + && nativeException.getCause() instanceof FirebaseTooManyRequestsException)) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "too-many-requests", + "We have blocked all requests from this device due to unusual activity. Try again later.", + null); + } + + // Manual message overrides to match other platforms. + if (nativeException.getMessage() != null + && nativeException + .getMessage() + .startsWith("Cannot create PhoneAuthCredential without either verificationProof")) { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "invalid-verification-code", + "The verification ID used to create the phone auth credential is invalid.", + null); + } + + if (message != null + && message.contains("User has already been linked to the given provider.")) { + return FlutterFirebaseAuthPluginException.alreadyLinkedProvider(); + } + + if (nativeException instanceof FirebaseAuthException) { + code = ((FirebaseAuthException) nativeException).getErrorCode(); + } + + if (nativeException instanceof FirebaseAuthWeakPasswordException) { + message = ((FirebaseAuthWeakPasswordException) nativeException).getReason(); + } + + if (nativeException instanceof FirebaseAuthUserCollisionException) { + String email = ((FirebaseAuthUserCollisionException) nativeException).getEmail(); + + if (email != null) { + additionalData.put("email", email); + } + + AuthCredential authCredential = + ((FirebaseAuthUserCollisionException) nativeException).getUpdatedCredential(); + + if (authCredential != null) { + additionalData.put("authCredential", PigeonParser.parseAuthCredential(authCredential)); + } + } + + return new GeneratedAndroidFirebaseAuth.FlutterError(code, message, additionalData); + } + + static GeneratedAndroidFirebaseAuth.FlutterError noUser() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "NO_CURRENT_USER", "No user currently signed in.", null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError invalidCredential() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "INVALID_CREDENTIAL", + "The supplied auth credential is malformed, has expired or is not currently supported.", + null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError noSuchProvider() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "NO_SUCH_PROVIDER", "User was not linked to an account with the given provider.", null); + } + + static GeneratedAndroidFirebaseAuth.FlutterError alreadyLinkedProvider() { + return new GeneratedAndroidFirebaseAuth.FlutterError( + "PROVIDER_ALREADY_LINKED", "User has already been linked to the given provider.", null); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java new file mode 100644 index 00000000..1476a9bd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthRegistrar.java @@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.Keep; +import com.google.firebase.components.Component; +import com.google.firebase.components.ComponentRegistrar; +import com.google.firebase.platforminfo.LibraryVersionComponent; +import java.util.Collections; +import java.util.List; + +@Keep +public class FlutterFirebaseAuthRegistrar implements ComponentRegistrar { + @Override + public List> getComponents() { + return Collections.>singletonList( + LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java new file mode 100644 index 00000000..7039a38f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseAuthUser.java @@ -0,0 +1,548 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import static io.flutter.plugins.firebase.core.FlutterFirebasePlugin.cachedThreadPool; + +import android.app.Activity; +import android.net.Uri; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.tasks.Tasks; +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.GetTokenResult; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.UserProfileChangeRequest; +import java.util.Map; + +public class FlutterFirebaseAuthUser + implements GeneratedAndroidFirebaseAuth.FirebaseAuthUserHostApi { + + private Activity activity; + + public void setActivity(Activity activity) { + this.activity = activity; + } + + public static FirebaseUser getCurrentUserFromPigeon( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp pigeonApp) { + FirebaseApp app = FirebaseApp.getInstance(pigeonApp.getAppName()); + FirebaseAuth auth = FirebaseAuth.getInstance(app); + if (pigeonApp.getTenantId() != null) { + auth.setTenantId(pigeonApp.getTenantId()); + } + + return auth.getCurrentUser(); + } + + @Override + public void delete( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .delete() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getIdToken( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Boolean forceRefresh, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + cachedThreadPool.execute( + () -> { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + try { + GetTokenResult response = Tasks.await(firebaseUser.getIdToken(forceRefresh)); + result.success(PigeonParser.parseTokenResult(response)); + } catch (Exception exception) { + result.error(FlutterFirebaseAuthPluginException.parserExceptionToFlutter(exception)); + } + }); + } + + @Override + public void linkWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (credential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .linkWithCredential(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void linkWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + OAuthProvider.Builder provider = OAuthProvider.newBuilder(signInProvider.getProviderId()); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseUser + .startActivityForLinkWithProvider(activity, provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reauthenticateWithCredential( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + AuthCredential credential = PigeonParser.getCredential(input); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (credential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .reauthenticateAndRetrieveData(credential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reauthenticateWithProvider( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalSignInProvider signInProvider, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + OAuthProvider.Builder provider = OAuthProvider.newBuilder(signInProvider.getProviderId()); + if (signInProvider.getScopes() != null) { + provider.setScopes(signInProvider.getScopes()); + } + if (signInProvider.getCustomParameters() != null) { + provider.addCustomParameters(signInProvider.getCustomParameters()); + } + + firebaseUser + .startActivityForReauthenticateWithProvider(activity, provider.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void reload( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .reload() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void sendEmailVerification( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (actionCodeSettings == null) { + firebaseUser + .sendEmailVerification() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseUser + .sendEmailVerification(PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void unlink( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String providerId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .unlink(providerId) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(PigeonParser.parseAuthResult(task.getResult())); + } else { + Exception exception = task.getException(); + if (exception + .getMessage() + .contains("User was not linked to an account with the given provider.")) { + result.error(FlutterFirebaseAuthPluginException.noSuchProvider()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter(exception)); + } + } + }); + } + + @Override + public void updateEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .updateEmail(newEmail) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updatePassword( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newPassword, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + firebaseUser + .updatePassword(newPassword) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updatePhoneNumber( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + PhoneAuthCredential phoneAuthCredential = + (PhoneAuthCredential) PigeonParser.getCredential(input); + + if (phoneAuthCredential == null) { + result.error(FlutterFirebaseAuthPluginException.invalidCredential()); + return; + } + + firebaseUser + .updatePhoneNumber(phoneAuthCredential) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void updateProfile( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalUserProfile profile, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder(); + + if (profile.getDisplayNameChanged()) { + builder.setDisplayName(profile.getDisplayName()); + } + + if (profile.getPhotoUrlChanged()) { + if (profile.getPhotoUrl() != null) { + builder.setPhotoUri(Uri.parse(profile.getPhotoUrl())); + } else { + builder.setPhotoUri(null); + } + } + + firebaseUser + .updateProfile(builder.build()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + firebaseUser + .reload() + .addOnCompleteListener( + reloadTask -> { + if (reloadTask.isSuccessful()) { + result.success(PigeonParser.parseFirebaseUser(firebaseUser)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + reloadTask.getException())); + } + }); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void verifyBeforeUpdateEmail( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @Nullable GeneratedAndroidFirebaseAuth.InternalActionCodeSettings actionCodeSettings, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + FirebaseUser firebaseUser = getCurrentUserFromPigeon(app); + + if (firebaseUser == null) { + result.error(FlutterFirebaseAuthPluginException.noUser()); + return; + } + + if (actionCodeSettings == null) { + firebaseUser + .verifyBeforeUpdateEmail(newEmail) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + return; + } + + firebaseUser + .verifyBeforeUpdateEmail(newEmail, PigeonParser.getActionCodeSettings(actionCodeSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java new file mode 100644 index 00000000..1ba51914 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseMultiFactor.java @@ -0,0 +1,252 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.MultiFactor; +import com.google.firebase.auth.MultiFactorAssertion; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.MultiFactorResolver; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorGenerator; +import com.google.firebase.internal.api.FirebaseNoSignedInUserException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseMultiFactor + implements GeneratedAndroidFirebaseAuth.MultiFactorUserHostApi, + GeneratedAndroidFirebaseAuth.MultiFactoResolverHostApi { + + // Map an app id to a map of user id to a MultiFactorUser object. + static final Map> multiFactorUserMap = new HashMap<>(); + + // Map an id to a MultiFactorSession object. + static final Map multiFactorSessionMap = new HashMap<>(); + + // Map an id to a MultiFactorResolver object. + static final Map multiFactorResolverMap = new HashMap<>(); + + static final Map multiFactorAssertionMap = new HashMap<>(); + + MultiFactor getAppMultiFactor(@NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app) + throws FirebaseNoSignedInUserException { + final FirebaseUser currentUser = FlutterFirebaseAuthUser.getCurrentUserFromPigeon(app); + if (currentUser == null) { + throw new FirebaseNoSignedInUserException("No user is signed in"); + } + if (multiFactorUserMap.get(app.getAppName()) == null) { + multiFactorUserMap.put(app.getAppName(), new HashMap<>()); + } + + final Map appMultiFactorUser = multiFactorUserMap.get(app.getAppName()); + if (appMultiFactorUser.get(currentUser.getUid()) == null) { + appMultiFactorUser.put(currentUser.getUid(), currentUser.getMultiFactor()); + } + + return appMultiFactorUser.get(currentUser.getUid()); + } + + @Override + public void enrollPhone( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalPhoneMultiFactorAssertion assertion, + @Nullable String displayName, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + PhoneAuthCredential credential = + PhoneAuthProvider.getCredential( + assertion.getVerificationId(), assertion.getVerificationCode()); + + MultiFactorAssertion multiFactorAssertion = PhoneMultiFactorGenerator.getAssertion(credential); + + multiFactor + .enroll(multiFactorAssertion, displayName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void enrollTotp( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String assertionId, + @Nullable String displayName, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + final MultiFactorAssertion multiFactorAssertion = multiFactorAssertionMap.get(assertionId); + + assert multiFactorAssertion != null; + multiFactor + .enroll(multiFactorAssertion, displayName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getSession( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result< + GeneratedAndroidFirebaseAuth.InternalMultiFactorSession> + result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + multiFactor + .getSession() + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + final MultiFactorSession sessionResult = task.getResult(); + final String id = UUID.randomUUID().toString(); + multiFactorSessionMap.put(id, sessionResult); + result.success( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorSession.Builder() + .setId(id) + .build()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void unenroll( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull String factorUid, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(FlutterFirebaseAuthPluginException.parserExceptionToFlutter(e)); + return; + } + + multiFactor + .unenroll(factorUid) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + result.success(); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getEnrolledFactors( + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull + GeneratedAndroidFirebaseAuth.Result< + List> + result) { + final MultiFactor multiFactor; + try { + multiFactor = getAppMultiFactor(app); + } catch (FirebaseNoSignedInUserException e) { + result.error(e); + return; + } + + final List factors = multiFactor.getEnrolledFactors(); + + final List resultFactors = + PigeonParser.multiFactorInfoToPigeon(factors); + + result.success(resultFactors); + } + + @Override + public void resolveSignIn( + @NonNull String resolverId, + @Nullable GeneratedAndroidFirebaseAuth.InternalPhoneMultiFactorAssertion assertion, + @Nullable String totpAssertionId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + final MultiFactorResolver resolver = multiFactorResolverMap.get(resolverId); + + if (resolver == null) { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + new Exception("Resolver not found"))); + return; + } + + MultiFactorAssertion multiFactorAssertion; + + if (assertion != null) { + PhoneAuthCredential credential = + PhoneAuthProvider.getCredential( + assertion.getVerificationId(), assertion.getVerificationCode()); + multiFactorAssertion = PhoneMultiFactorGenerator.getAssertion(credential); + } else { + multiFactorAssertion = multiFactorAssertionMap.get(totpAssertionId); + } + + resolver + .resolveSignIn(multiFactorAssertion) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + final AuthResult authResult = task.getResult(); + result.success(PigeonParser.parseAuthResult(authResult)); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java new file mode 100644 index 00000000..9761a5df --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpMultiFactor.java @@ -0,0 +1,82 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.TotpMultiFactorAssertion; +import com.google.firebase.auth.TotpMultiFactorGenerator; +import com.google.firebase.auth.TotpSecret; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class FlutterFirebaseTotpMultiFactor + implements GeneratedAndroidFirebaseAuth.MultiFactorTotpHostApi { + + // Map an app id to a map of user id to a TotpSecret object. + static final Map multiFactorSecret = new HashMap<>(); + + @Override + public void generateSecret( + @NonNull String sessionId, + @NonNull + GeneratedAndroidFirebaseAuth.Result + result) { + MultiFactorSession multiFactorSession = + FlutterFirebaseMultiFactor.multiFactorSessionMap.get(sessionId); + + assert multiFactorSession != null; + TotpMultiFactorGenerator.generateSecret(multiFactorSession) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + TotpSecret secret = task.getResult(); + multiFactorSecret.put(secret.getSharedSecretKey(), secret); + result.success( + new GeneratedAndroidFirebaseAuth.InternalTotpSecret.Builder() + .setCodeIntervalSeconds((long) secret.getCodeIntervalSeconds()) + .setCodeLength((long) secret.getCodeLength()) + .setSecretKey(secret.getSharedSecretKey()) + .setHashingAlgorithm(secret.getHashAlgorithm()) + .setEnrollmentCompletionDeadline(secret.getEnrollmentCompletionDeadline()) + .build()); + } else { + result.error( + FlutterFirebaseAuthPluginException.parserExceptionToFlutter( + task.getException())); + } + }); + } + + @Override + public void getAssertionForEnrollment( + @NonNull String secretKey, + @NonNull String oneTimePassword, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + final TotpSecret secret = multiFactorSecret.get(secretKey); + + assert secret != null; + TotpMultiFactorAssertion assertion = + TotpMultiFactorGenerator.getAssertionForEnrollment(secret, oneTimePassword); + String assertionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorAssertionMap.put(assertionId, assertion); + result.success(assertionId); + } + + @Override + public void getAssertionForSignIn( + @NonNull String enrollmentId, + @NonNull String oneTimePassword, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + TotpMultiFactorAssertion assertion = + TotpMultiFactorGenerator.getAssertionForSignIn(enrollmentId, oneTimePassword); + String assertionId = UUID.randomUUID().toString(); + FlutterFirebaseMultiFactor.multiFactorAssertionMap.put(assertionId, assertion); + result.success(assertionId); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java new file mode 100644 index 00000000..5b32f828 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/FlutterFirebaseTotpSecret.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.auth.TotpSecret; + +public class FlutterFirebaseTotpSecret + implements GeneratedAndroidFirebaseAuth.MultiFactorTotpSecretHostApi { + + @Override + public void generateQrCodeUrl( + @NonNull String secretKey, + @Nullable String accountName, + @Nullable String issuer, + @NonNull GeneratedAndroidFirebaseAuth.Result result) { + final TotpSecret secret = FlutterFirebaseTotpMultiFactor.multiFactorSecret.get(secretKey); + + assert secret != null; + if (accountName == null || issuer == null) { + result.success(secret.generateQrCodeUrl()); + return; + } + result.success(secret.generateQrCodeUrl(accountName, issuer)); + } + + @Override + public void openInOtpApp( + @NonNull String secretKey, + @NonNull String qrCodeUrl, + @NonNull GeneratedAndroidFirebaseAuth.VoidResult result) { + final TotpSecret secret = FlutterFirebaseTotpMultiFactor.multiFactorSecret.get(secretKey); + assert secret != null; + secret.openInOtpApp(qrCodeUrl); + result.success(); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java new file mode 100644 index 00000000..5aaa168b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/GeneratedAndroidFirebaseAuth.java @@ -0,0 +1,5308 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +package io.flutter.plugins.firebase.auth; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BasicMessageChannel; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MessageCodec; +import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** Generated class from Pigeon. */ +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) +public class GeneratedAndroidFirebaseAuth { + static boolean pigeonDoubleEquals(double a, double b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == 0.0 ? 0.0 : a) == (b == 0.0 ? 0.0 : b) || (Double.isNaN(a) && Double.isNaN(b)); + } + + static boolean pigeonFloatEquals(float a, float b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == 0.0f ? 0.0f : a) == (b == 0.0f ? 0.0f : b) || (Float.isNaN(a) && Float.isNaN(b)); + } + + static int pigeonDoubleHashCode(double d) { + // Normalize -0.0 to 0.0 and handle NaN to ensure consistent hash codes. + if (d == 0.0) { + d = 0.0; + } + long bits = Double.doubleToLongBits(d); + return (int) (bits ^ (bits >>> 32)); + } + + static int pigeonFloatHashCode(float f) { + // Normalize -0.0 to 0.0 and handle NaN to ensure consistent hash codes. + if (f == 0.0f) { + f = 0.0f; + } + return Float.floatToIntBits(f); + } + + static boolean pigeonDeepEquals(Object a, Object b) { + if (a == b) { + return true; + } + if (a == null || b == null) { + return false; + } + if (a instanceof byte[] && b instanceof byte[]) { + return Arrays.equals((byte[]) a, (byte[]) b); + } + if (a instanceof int[] && b instanceof int[]) { + return Arrays.equals((int[]) a, (int[]) b); + } + if (a instanceof long[] && b instanceof long[]) { + return Arrays.equals((long[]) a, (long[]) b); + } + if (a instanceof double[] && b instanceof double[]) { + double[] da = (double[]) a; + double[] db = (double[]) b; + if (da.length != db.length) { + return false; + } + for (int i = 0; i < da.length; i++) { + if (!pigeonDoubleEquals(da[i], db[i])) { + return false; + } + } + return true; + } + if (a instanceof List && b instanceof List) { + List listA = (List) a; + List listB = (List) b; + if (listA.size() != listB.size()) { + return false; + } + for (int i = 0; i < listA.size(); i++) { + if (!pigeonDeepEquals(listA.get(i), listB.get(i))) { + return false; + } + } + return true; + } + if (a instanceof Map && b instanceof Map) { + Map mapA = (Map) a; + Map mapB = (Map) b; + if (mapA.size() != mapB.size()) { + return false; + } + for (Map.Entry entryA : mapA.entrySet()) { + Object keyA = entryA.getKey(); + Object valueA = entryA.getValue(); + boolean found = false; + for (Map.Entry entryB : mapB.entrySet()) { + Object keyB = entryB.getKey(); + if (pigeonDeepEquals(keyA, keyB)) { + Object valueB = entryB.getValue(); + if (pigeonDeepEquals(valueA, valueB)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; + } + if (a instanceof Double && b instanceof Double) { + return pigeonDoubleEquals((double) a, (double) b); + } + if (a instanceof Float && b instanceof Float) { + return pigeonFloatEquals((float) a, (float) b); + } + return a.equals(b); + } + + static int pigeonDeepHashCode(Object value) { + if (value == null) { + return 0; + } + if (value instanceof byte[]) { + return Arrays.hashCode((byte[]) value); + } + if (value instanceof int[]) { + return Arrays.hashCode((int[]) value); + } + if (value instanceof long[]) { + return Arrays.hashCode((long[]) value); + } + if (value instanceof double[]) { + double[] da = (double[]) value; + int result = 1; + for (double d : da) { + result = 31 * result + pigeonDoubleHashCode(d); + } + return result; + } + if (value instanceof List) { + int result = 1; + for (Object item : (List) value) { + result = 31 * result + pigeonDeepHashCode(item); + } + return result; + } + if (value instanceof Map) { + int result = 0; + for (Map.Entry entry : ((Map) value).entrySet()) { + result += + ((pigeonDeepHashCode(entry.getKey()) * 31) ^ pigeonDeepHashCode(entry.getValue())); + } + return result; + } + if (value instanceof Object[]) { + int result = 1; + for (Object item : (Object[]) value) { + result = 31 * result + pigeonDeepHashCode(item); + } + return result; + } + if (value instanceof Double) { + return pigeonDoubleHashCode((double) value); + } + if (value instanceof Float) { + return pigeonFloatHashCode((float) value); + } + return value.hashCode(); + } + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + super(message); + this.code = code; + this.details = details; + } + } + + @NonNull + protected static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList<>(3); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } + return errorList; + } + + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + + /** The type of operation that generated the action code from calling [checkActionCode]. */ + public enum ActionCodeInfoOperation { + /** Unknown operation. */ + UNKNOWN(0), + /** Password reset code generated via [sendPasswordResetEmail]. */ + PASSWORD_RESET(1), + /** Email verification code generated via [User.sendEmailVerification]. */ + VERIFY_EMAIL(2), + /** Email change revocation code generated via [User.updateEmail]. */ + RECOVER_EMAIL(3), + /** Email sign in code generated via [sendSignInLinkToEmail]. */ + EMAIL_SIGN_IN(4), + /** Verify and change email code generated via [User.verifyBeforeUpdateEmail]. */ + VERIFY_AND_CHANGE_EMAIL(5), + /** Action code for reverting second factor addition. */ + REVERT_SECOND_FACTOR_ADDITION(6); + + final int index; + + ActionCodeInfoOperation(final int index) { + this.index = index; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalMultiFactorSession { + private @NonNull String id; + + public @NonNull String getId() { + return id; + } + + public void setId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"id\" is null."); + } + this.id = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalMultiFactorSession() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalMultiFactorSession that = (InternalMultiFactorSession) o; + return pigeonDeepEquals(id, that.id); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), id}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String id; + + @CanIgnoreReturnValue + public @NonNull Builder setId(@NonNull String setterArg) { + this.id = setterArg; + return this; + } + + public @NonNull InternalMultiFactorSession build() { + InternalMultiFactorSession pigeonReturn = new InternalMultiFactorSession(); + pigeonReturn.setId(id); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(1); + toListResult.add(id); + return toListResult; + } + + static @NonNull InternalMultiFactorSession fromList(@NonNull ArrayList pigeonVar_list) { + InternalMultiFactorSession pigeonResult = new InternalMultiFactorSession(); + Object id = pigeonVar_list.get(0); + pigeonResult.setId((String) id); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalPhoneMultiFactorAssertion { + private @NonNull String verificationId; + + public @NonNull String getVerificationId() { + return verificationId; + } + + public void setVerificationId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"verificationId\" is null."); + } + this.verificationId = setterArg; + } + + private @NonNull String verificationCode; + + public @NonNull String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"verificationCode\" is null."); + } + this.verificationCode = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalPhoneMultiFactorAssertion() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalPhoneMultiFactorAssertion that = (InternalPhoneMultiFactorAssertion) o; + return pigeonDeepEquals(verificationId, that.verificationId) + && pigeonDeepEquals(verificationCode, that.verificationCode); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), verificationId, verificationCode}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String verificationId; + + @CanIgnoreReturnValue + public @NonNull Builder setVerificationId(@NonNull String setterArg) { + this.verificationId = setterArg; + return this; + } + + private @Nullable String verificationCode; + + @CanIgnoreReturnValue + public @NonNull Builder setVerificationCode(@NonNull String setterArg) { + this.verificationCode = setterArg; + return this; + } + + public @NonNull InternalPhoneMultiFactorAssertion build() { + InternalPhoneMultiFactorAssertion pigeonReturn = new InternalPhoneMultiFactorAssertion(); + pigeonReturn.setVerificationId(verificationId); + pigeonReturn.setVerificationCode(verificationCode); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(verificationId); + toListResult.add(verificationCode); + return toListResult; + } + + static @NonNull InternalPhoneMultiFactorAssertion fromList( + @NonNull ArrayList pigeonVar_list) { + InternalPhoneMultiFactorAssertion pigeonResult = new InternalPhoneMultiFactorAssertion(); + Object verificationId = pigeonVar_list.get(0); + pigeonResult.setVerificationId((String) verificationId); + Object verificationCode = pigeonVar_list.get(1); + pigeonResult.setVerificationCode((String) verificationCode); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalMultiFactorInfo { + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @NonNull Double enrollmentTimestamp; + + public @NonNull Double getEnrollmentTimestamp() { + return enrollmentTimestamp; + } + + public void setEnrollmentTimestamp(@NonNull Double setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"enrollmentTimestamp\" is null."); + } + this.enrollmentTimestamp = setterArg; + } + + private @Nullable String factorId; + + public @Nullable String getFactorId() { + return factorId; + } + + public void setFactorId(@Nullable String setterArg) { + this.factorId = setterArg; + } + + private @NonNull String uid; + + public @NonNull String getUid() { + return uid; + } + + public void setUid(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"uid\" is null."); + } + this.uid = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalMultiFactorInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalMultiFactorInfo that = (InternalMultiFactorInfo) o; + return pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(enrollmentTimestamp, that.enrollmentTimestamp) + && pigeonDeepEquals(factorId, that.factorId) + && pigeonDeepEquals(uid, that.uid) + && pigeonDeepEquals(phoneNumber, that.phoneNumber); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), displayName, enrollmentTimestamp, factorId, uid, phoneNumber}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable Double enrollmentTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setEnrollmentTimestamp(@NonNull Double setterArg) { + this.enrollmentTimestamp = setterArg; + return this; + } + + private @Nullable String factorId; + + @CanIgnoreReturnValue + public @NonNull Builder setFactorId(@Nullable String setterArg) { + this.factorId = setterArg; + return this; + } + + private @Nullable String uid; + + @CanIgnoreReturnValue + public @NonNull Builder setUid(@NonNull String setterArg) { + this.uid = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + public @NonNull InternalMultiFactorInfo build() { + InternalMultiFactorInfo pigeonReturn = new InternalMultiFactorInfo(); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setEnrollmentTimestamp(enrollmentTimestamp); + pigeonReturn.setFactorId(factorId); + pigeonReturn.setUid(uid); + pigeonReturn.setPhoneNumber(phoneNumber); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(displayName); + toListResult.add(enrollmentTimestamp); + toListResult.add(factorId); + toListResult.add(uid); + toListResult.add(phoneNumber); + return toListResult; + } + + static @NonNull InternalMultiFactorInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalMultiFactorInfo pigeonResult = new InternalMultiFactorInfo(); + Object displayName = pigeonVar_list.get(0); + pigeonResult.setDisplayName((String) displayName); + Object enrollmentTimestamp = pigeonVar_list.get(1); + pigeonResult.setEnrollmentTimestamp((Double) enrollmentTimestamp); + Object factorId = pigeonVar_list.get(2); + pigeonResult.setFactorId((String) factorId); + Object uid = pigeonVar_list.get(3); + pigeonResult.setUid((String) uid); + Object phoneNumber = pigeonVar_list.get(4); + pigeonResult.setPhoneNumber((String) phoneNumber); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class AuthPigeonFirebaseApp { + private @NonNull String appName; + + public @NonNull String getAppName() { + return appName; + } + + public void setAppName(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"appName\" is null."); + } + this.appName = setterArg; + } + + private @Nullable String tenantId; + + public @Nullable String getTenantId() { + return tenantId; + } + + public void setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + } + + private @Nullable String customAuthDomain; + + public @Nullable String getCustomAuthDomain() { + return customAuthDomain; + } + + public void setCustomAuthDomain(@Nullable String setterArg) { + this.customAuthDomain = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + AuthPigeonFirebaseApp() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuthPigeonFirebaseApp that = (AuthPigeonFirebaseApp) o; + return pigeonDeepEquals(appName, that.appName) + && pigeonDeepEquals(tenantId, that.tenantId) + && pigeonDeepEquals(customAuthDomain, that.customAuthDomain); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), appName, tenantId, customAuthDomain}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String appName; + + @CanIgnoreReturnValue + public @NonNull Builder setAppName(@NonNull String setterArg) { + this.appName = setterArg; + return this; + } + + private @Nullable String tenantId; + + @CanIgnoreReturnValue + public @NonNull Builder setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + return this; + } + + private @Nullable String customAuthDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setCustomAuthDomain(@Nullable String setterArg) { + this.customAuthDomain = setterArg; + return this; + } + + public @NonNull AuthPigeonFirebaseApp build() { + AuthPigeonFirebaseApp pigeonReturn = new AuthPigeonFirebaseApp(); + pigeonReturn.setAppName(appName); + pigeonReturn.setTenantId(tenantId); + pigeonReturn.setCustomAuthDomain(customAuthDomain); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(appName); + toListResult.add(tenantId); + toListResult.add(customAuthDomain); + return toListResult; + } + + static @NonNull AuthPigeonFirebaseApp fromList(@NonNull ArrayList pigeonVar_list) { + AuthPigeonFirebaseApp pigeonResult = new AuthPigeonFirebaseApp(); + Object appName = pigeonVar_list.get(0); + pigeonResult.setAppName((String) appName); + Object tenantId = pigeonVar_list.get(1); + pigeonResult.setTenantId((String) tenantId); + Object customAuthDomain = pigeonVar_list.get(2); + pigeonResult.setCustomAuthDomain((String) customAuthDomain); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeInfoData { + private @Nullable String email; + + public @Nullable String getEmail() { + return email; + } + + public void setEmail(@Nullable String setterArg) { + this.email = setterArg; + } + + private @Nullable String previousEmail; + + public @Nullable String getPreviousEmail() { + return previousEmail; + } + + public void setPreviousEmail(@Nullable String setterArg) { + this.previousEmail = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeInfoData that = (InternalActionCodeInfoData) o; + return pigeonDeepEquals(email, that.email) + && pigeonDeepEquals(previousEmail, that.previousEmail); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), email, previousEmail}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String email; + + @CanIgnoreReturnValue + public @NonNull Builder setEmail(@Nullable String setterArg) { + this.email = setterArg; + return this; + } + + private @Nullable String previousEmail; + + @CanIgnoreReturnValue + public @NonNull Builder setPreviousEmail(@Nullable String setterArg) { + this.previousEmail = setterArg; + return this; + } + + public @NonNull InternalActionCodeInfoData build() { + InternalActionCodeInfoData pigeonReturn = new InternalActionCodeInfoData(); + pigeonReturn.setEmail(email); + pigeonReturn.setPreviousEmail(previousEmail); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(email); + toListResult.add(previousEmail); + return toListResult; + } + + static @NonNull InternalActionCodeInfoData fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeInfoData pigeonResult = new InternalActionCodeInfoData(); + Object email = pigeonVar_list.get(0); + pigeonResult.setEmail((String) email); + Object previousEmail = pigeonVar_list.get(1); + pigeonResult.setPreviousEmail((String) previousEmail); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeInfo { + private @NonNull ActionCodeInfoOperation operation; + + public @NonNull ActionCodeInfoOperation getOperation() { + return operation; + } + + public void setOperation(@NonNull ActionCodeInfoOperation setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"operation\" is null."); + } + this.operation = setterArg; + } + + private @NonNull InternalActionCodeInfoData data; + + public @NonNull InternalActionCodeInfoData getData() { + return data; + } + + public void setData(@NonNull InternalActionCodeInfoData setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"data\" is null."); + } + this.data = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalActionCodeInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeInfo that = (InternalActionCodeInfo) o; + return pigeonDeepEquals(operation, that.operation) && pigeonDeepEquals(data, that.data); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), operation, data}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable ActionCodeInfoOperation operation; + + @CanIgnoreReturnValue + public @NonNull Builder setOperation(@NonNull ActionCodeInfoOperation setterArg) { + this.operation = setterArg; + return this; + } + + private @Nullable InternalActionCodeInfoData data; + + @CanIgnoreReturnValue + public @NonNull Builder setData(@NonNull InternalActionCodeInfoData setterArg) { + this.data = setterArg; + return this; + } + + public @NonNull InternalActionCodeInfo build() { + InternalActionCodeInfo pigeonReturn = new InternalActionCodeInfo(); + pigeonReturn.setOperation(operation); + pigeonReturn.setData(data); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(operation); + toListResult.add(data); + return toListResult; + } + + static @NonNull InternalActionCodeInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeInfo pigeonResult = new InternalActionCodeInfo(); + Object operation = pigeonVar_list.get(0); + pigeonResult.setOperation((ActionCodeInfoOperation) operation); + Object data = pigeonVar_list.get(1); + pigeonResult.setData((InternalActionCodeInfoData) data); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAdditionalUserInfo { + private @NonNull Boolean isNewUser; + + public @NonNull Boolean getIsNewUser() { + return isNewUser; + } + + public void setIsNewUser(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isNewUser\" is null."); + } + this.isNewUser = setterArg; + } + + private @Nullable String providerId; + + public @Nullable String getProviderId() { + return providerId; + } + + public void setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + } + + private @Nullable String username; + + public @Nullable String getUsername() { + return username; + } + + public void setUsername(@Nullable String setterArg) { + this.username = setterArg; + } + + private @Nullable String authorizationCode; + + public @Nullable String getAuthorizationCode() { + return authorizationCode; + } + + public void setAuthorizationCode(@Nullable String setterArg) { + this.authorizationCode = setterArg; + } + + private @Nullable Map profile; + + public @Nullable Map getProfile() { + return profile; + } + + public void setProfile(@Nullable Map setterArg) { + this.profile = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAdditionalUserInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAdditionalUserInfo that = (InternalAdditionalUserInfo) o; + return pigeonDeepEquals(isNewUser, that.isNewUser) + && pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(username, that.username) + && pigeonDeepEquals(authorizationCode, that.authorizationCode) + && pigeonDeepEquals(profile, that.profile); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), isNewUser, providerId, username, authorizationCode, profile}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Boolean isNewUser; + + @CanIgnoreReturnValue + public @NonNull Builder setIsNewUser(@NonNull Boolean setterArg) { + this.isNewUser = setterArg; + return this; + } + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String username; + + @CanIgnoreReturnValue + public @NonNull Builder setUsername(@Nullable String setterArg) { + this.username = setterArg; + return this; + } + + private @Nullable String authorizationCode; + + @CanIgnoreReturnValue + public @NonNull Builder setAuthorizationCode(@Nullable String setterArg) { + this.authorizationCode = setterArg; + return this; + } + + private @Nullable Map profile; + + @CanIgnoreReturnValue + public @NonNull Builder setProfile(@Nullable Map setterArg) { + this.profile = setterArg; + return this; + } + + public @NonNull InternalAdditionalUserInfo build() { + InternalAdditionalUserInfo pigeonReturn = new InternalAdditionalUserInfo(); + pigeonReturn.setIsNewUser(isNewUser); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setUsername(username); + pigeonReturn.setAuthorizationCode(authorizationCode); + pigeonReturn.setProfile(profile); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(isNewUser); + toListResult.add(providerId); + toListResult.add(username); + toListResult.add(authorizationCode); + toListResult.add(profile); + return toListResult; + } + + static @NonNull InternalAdditionalUserInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalAdditionalUserInfo pigeonResult = new InternalAdditionalUserInfo(); + Object isNewUser = pigeonVar_list.get(0); + pigeonResult.setIsNewUser((Boolean) isNewUser); + Object providerId = pigeonVar_list.get(1); + pigeonResult.setProviderId((String) providerId); + Object username = pigeonVar_list.get(2); + pigeonResult.setUsername((String) username); + Object authorizationCode = pigeonVar_list.get(3); + pigeonResult.setAuthorizationCode((String) authorizationCode); + Object profile = pigeonVar_list.get(4); + pigeonResult.setProfile((Map) profile); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAuthCredential { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @NonNull String signInMethod; + + public @NonNull String getSignInMethod() { + return signInMethod; + } + + public void setSignInMethod(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"signInMethod\" is null."); + } + this.signInMethod = setterArg; + } + + private @NonNull Long nativeId; + + public @NonNull Long getNativeId() { + return nativeId; + } + + public void setNativeId(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"nativeId\" is null."); + } + this.nativeId = setterArg; + } + + private @Nullable String accessToken; + + public @Nullable String getAccessToken() { + return accessToken; + } + + public void setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAuthCredential() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAuthCredential that = (InternalAuthCredential) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(signInMethod, that.signInMethod) + && pigeonDeepEquals(nativeId, that.nativeId) + && pigeonDeepEquals(accessToken, that.accessToken); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, signInMethod, nativeId, accessToken}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String signInMethod; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInMethod(@NonNull String setterArg) { + this.signInMethod = setterArg; + return this; + } + + private @Nullable Long nativeId; + + @CanIgnoreReturnValue + public @NonNull Builder setNativeId(@NonNull Long setterArg) { + this.nativeId = setterArg; + return this; + } + + private @Nullable String accessToken; + + @CanIgnoreReturnValue + public @NonNull Builder setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + return this; + } + + public @NonNull InternalAuthCredential build() { + InternalAuthCredential pigeonReturn = new InternalAuthCredential(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setSignInMethod(signInMethod); + pigeonReturn.setNativeId(nativeId); + pigeonReturn.setAccessToken(accessToken); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(providerId); + toListResult.add(signInMethod); + toListResult.add(nativeId); + toListResult.add(accessToken); + return toListResult; + } + + static @NonNull InternalAuthCredential fromList(@NonNull ArrayList pigeonVar_list) { + InternalAuthCredential pigeonResult = new InternalAuthCredential(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object signInMethod = pigeonVar_list.get(1); + pigeonResult.setSignInMethod((String) signInMethod); + Object nativeId = pigeonVar_list.get(2); + pigeonResult.setNativeId((Long) nativeId); + Object accessToken = pigeonVar_list.get(3); + pigeonResult.setAccessToken((String) accessToken); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserInfo { + private @NonNull String uid; + + public @NonNull String getUid() { + return uid; + } + + public void setUid(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"uid\" is null."); + } + this.uid = setterArg; + } + + private @Nullable String email; + + public @Nullable String getEmail() { + return email; + } + + public void setEmail(@Nullable String setterArg) { + this.email = setterArg; + } + + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @Nullable String photoUrl; + + public @Nullable String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @NonNull Boolean isAnonymous; + + public @NonNull Boolean getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isAnonymous\" is null."); + } + this.isAnonymous = setterArg; + } + + private @NonNull Boolean isEmailVerified; + + public @NonNull Boolean getIsEmailVerified() { + return isEmailVerified; + } + + public void setIsEmailVerified(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"isEmailVerified\" is null."); + } + this.isEmailVerified = setterArg; + } + + private @Nullable String providerId; + + public @Nullable String getProviderId() { + return providerId; + } + + public void setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + } + + private @Nullable String tenantId; + + public @Nullable String getTenantId() { + return tenantId; + } + + public void setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + } + + private @Nullable String refreshToken; + + public @Nullable String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(@Nullable String setterArg) { + this.refreshToken = setterArg; + } + + private @Nullable Long creationTimestamp; + + public @Nullable Long getCreationTimestamp() { + return creationTimestamp; + } + + public void setCreationTimestamp(@Nullable Long setterArg) { + this.creationTimestamp = setterArg; + } + + private @Nullable Long lastSignInTimestamp; + + public @Nullable Long getLastSignInTimestamp() { + return lastSignInTimestamp; + } + + public void setLastSignInTimestamp(@Nullable Long setterArg) { + this.lastSignInTimestamp = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserInfo() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserInfo that = (InternalUserInfo) o; + return pigeonDeepEquals(uid, that.uid) + && pigeonDeepEquals(email, that.email) + && pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(photoUrl, that.photoUrl) + && pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(isAnonymous, that.isAnonymous) + && pigeonDeepEquals(isEmailVerified, that.isEmailVerified) + && pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(tenantId, that.tenantId) + && pigeonDeepEquals(refreshToken, that.refreshToken) + && pigeonDeepEquals(creationTimestamp, that.creationTimestamp) + && pigeonDeepEquals(lastSignInTimestamp, that.lastSignInTimestamp); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + uid, + email, + displayName, + photoUrl, + phoneNumber, + isAnonymous, + isEmailVerified, + providerId, + tenantId, + refreshToken, + creationTimestamp, + lastSignInTimestamp + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String uid; + + @CanIgnoreReturnValue + public @NonNull Builder setUid(@NonNull String setterArg) { + this.uid = setterArg; + return this; + } + + private @Nullable String email; + + @CanIgnoreReturnValue + public @NonNull Builder setEmail(@Nullable String setterArg) { + this.email = setterArg; + return this; + } + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable String photoUrl; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable Boolean isAnonymous; + + @CanIgnoreReturnValue + public @NonNull Builder setIsAnonymous(@NonNull Boolean setterArg) { + this.isAnonymous = setterArg; + return this; + } + + private @Nullable Boolean isEmailVerified; + + @CanIgnoreReturnValue + public @NonNull Builder setIsEmailVerified(@NonNull Boolean setterArg) { + this.isEmailVerified = setterArg; + return this; + } + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@Nullable String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String tenantId; + + @CanIgnoreReturnValue + public @NonNull Builder setTenantId(@Nullable String setterArg) { + this.tenantId = setterArg; + return this; + } + + private @Nullable String refreshToken; + + @CanIgnoreReturnValue + public @NonNull Builder setRefreshToken(@Nullable String setterArg) { + this.refreshToken = setterArg; + return this; + } + + private @Nullable Long creationTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setCreationTimestamp(@Nullable Long setterArg) { + this.creationTimestamp = setterArg; + return this; + } + + private @Nullable Long lastSignInTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setLastSignInTimestamp(@Nullable Long setterArg) { + this.lastSignInTimestamp = setterArg; + return this; + } + + public @NonNull InternalUserInfo build() { + InternalUserInfo pigeonReturn = new InternalUserInfo(); + pigeonReturn.setUid(uid); + pigeonReturn.setEmail(email); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setPhotoUrl(photoUrl); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setIsAnonymous(isAnonymous); + pigeonReturn.setIsEmailVerified(isEmailVerified); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setTenantId(tenantId); + pigeonReturn.setRefreshToken(refreshToken); + pigeonReturn.setCreationTimestamp(creationTimestamp); + pigeonReturn.setLastSignInTimestamp(lastSignInTimestamp); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(12); + toListResult.add(uid); + toListResult.add(email); + toListResult.add(displayName); + toListResult.add(photoUrl); + toListResult.add(phoneNumber); + toListResult.add(isAnonymous); + toListResult.add(isEmailVerified); + toListResult.add(providerId); + toListResult.add(tenantId); + toListResult.add(refreshToken); + toListResult.add(creationTimestamp); + toListResult.add(lastSignInTimestamp); + return toListResult; + } + + static @NonNull InternalUserInfo fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserInfo pigeonResult = new InternalUserInfo(); + Object uid = pigeonVar_list.get(0); + pigeonResult.setUid((String) uid); + Object email = pigeonVar_list.get(1); + pigeonResult.setEmail((String) email); + Object displayName = pigeonVar_list.get(2); + pigeonResult.setDisplayName((String) displayName); + Object photoUrl = pigeonVar_list.get(3); + pigeonResult.setPhotoUrl((String) photoUrl); + Object phoneNumber = pigeonVar_list.get(4); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object isAnonymous = pigeonVar_list.get(5); + pigeonResult.setIsAnonymous((Boolean) isAnonymous); + Object isEmailVerified = pigeonVar_list.get(6); + pigeonResult.setIsEmailVerified((Boolean) isEmailVerified); + Object providerId = pigeonVar_list.get(7); + pigeonResult.setProviderId((String) providerId); + Object tenantId = pigeonVar_list.get(8); + pigeonResult.setTenantId((String) tenantId); + Object refreshToken = pigeonVar_list.get(9); + pigeonResult.setRefreshToken((String) refreshToken); + Object creationTimestamp = pigeonVar_list.get(10); + pigeonResult.setCreationTimestamp((Long) creationTimestamp); + Object lastSignInTimestamp = pigeonVar_list.get(11); + pigeonResult.setLastSignInTimestamp((Long) lastSignInTimestamp); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserDetails { + private @NonNull InternalUserInfo userInfo; + + public @NonNull InternalUserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(@NonNull InternalUserInfo setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"userInfo\" is null."); + } + this.userInfo = setterArg; + } + + private @NonNull List> providerData; + + public @NonNull List> getProviderData() { + return providerData; + } + + public void setProviderData(@NonNull List> setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerData\" is null."); + } + this.providerData = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserDetails() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserDetails that = (InternalUserDetails) o; + return pigeonDeepEquals(userInfo, that.userInfo) + && pigeonDeepEquals(providerData, that.providerData); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), userInfo, providerData}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable InternalUserInfo userInfo; + + @CanIgnoreReturnValue + public @NonNull Builder setUserInfo(@NonNull InternalUserInfo setterArg) { + this.userInfo = setterArg; + return this; + } + + private @Nullable List> providerData; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderData(@NonNull List> setterArg) { + this.providerData = setterArg; + return this; + } + + public @NonNull InternalUserDetails build() { + InternalUserDetails pigeonReturn = new InternalUserDetails(); + pigeonReturn.setUserInfo(userInfo); + pigeonReturn.setProviderData(providerData); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(userInfo); + toListResult.add(providerData); + return toListResult; + } + + static @NonNull InternalUserDetails fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserDetails pigeonResult = new InternalUserDetails(); + Object userInfo = pigeonVar_list.get(0); + pigeonResult.setUserInfo((InternalUserInfo) userInfo); + Object providerData = pigeonVar_list.get(1); + pigeonResult.setProviderData((List>) providerData); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserCredential { + private @Nullable InternalUserDetails user; + + public @Nullable InternalUserDetails getUser() { + return user; + } + + public void setUser(@Nullable InternalUserDetails setterArg) { + this.user = setterArg; + } + + private @Nullable InternalAdditionalUserInfo additionalUserInfo; + + public @Nullable InternalAdditionalUserInfo getAdditionalUserInfo() { + return additionalUserInfo; + } + + public void setAdditionalUserInfo(@Nullable InternalAdditionalUserInfo setterArg) { + this.additionalUserInfo = setterArg; + } + + private @Nullable InternalAuthCredential credential; + + public @Nullable InternalAuthCredential getCredential() { + return credential; + } + + public void setCredential(@Nullable InternalAuthCredential setterArg) { + this.credential = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserCredential that = (InternalUserCredential) o; + return pigeonDeepEquals(user, that.user) + && pigeonDeepEquals(additionalUserInfo, that.additionalUserInfo) + && pigeonDeepEquals(credential, that.credential); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), user, additionalUserInfo, credential}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable InternalUserDetails user; + + @CanIgnoreReturnValue + public @NonNull Builder setUser(@Nullable InternalUserDetails setterArg) { + this.user = setterArg; + return this; + } + + private @Nullable InternalAdditionalUserInfo additionalUserInfo; + + @CanIgnoreReturnValue + public @NonNull Builder setAdditionalUserInfo( + @Nullable InternalAdditionalUserInfo setterArg) { + this.additionalUserInfo = setterArg; + return this; + } + + private @Nullable InternalAuthCredential credential; + + @CanIgnoreReturnValue + public @NonNull Builder setCredential(@Nullable InternalAuthCredential setterArg) { + this.credential = setterArg; + return this; + } + + public @NonNull InternalUserCredential build() { + InternalUserCredential pigeonReturn = new InternalUserCredential(); + pigeonReturn.setUser(user); + pigeonReturn.setAdditionalUserInfo(additionalUserInfo); + pigeonReturn.setCredential(credential); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(user); + toListResult.add(additionalUserInfo); + toListResult.add(credential); + return toListResult; + } + + static @NonNull InternalUserCredential fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserCredential pigeonResult = new InternalUserCredential(); + Object user = pigeonVar_list.get(0); + pigeonResult.setUser((InternalUserDetails) user); + Object additionalUserInfo = pigeonVar_list.get(1); + pigeonResult.setAdditionalUserInfo((InternalAdditionalUserInfo) additionalUserInfo); + Object credential = pigeonVar_list.get(2); + pigeonResult.setCredential((InternalAuthCredential) credential); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalAuthCredentialInput { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @NonNull String signInMethod; + + public @NonNull String getSignInMethod() { + return signInMethod; + } + + public void setSignInMethod(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"signInMethod\" is null."); + } + this.signInMethod = setterArg; + } + + private @Nullable String token; + + public @Nullable String getToken() { + return token; + } + + public void setToken(@Nullable String setterArg) { + this.token = setterArg; + } + + private @Nullable String accessToken; + + public @Nullable String getAccessToken() { + return accessToken; + } + + public void setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalAuthCredentialInput() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalAuthCredentialInput that = (InternalAuthCredentialInput) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(signInMethod, that.signInMethod) + && pigeonDeepEquals(token, that.token) + && pigeonDeepEquals(accessToken, that.accessToken); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, signInMethod, token, accessToken}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable String signInMethod; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInMethod(@NonNull String setterArg) { + this.signInMethod = setterArg; + return this; + } + + private @Nullable String token; + + @CanIgnoreReturnValue + public @NonNull Builder setToken(@Nullable String setterArg) { + this.token = setterArg; + return this; + } + + private @Nullable String accessToken; + + @CanIgnoreReturnValue + public @NonNull Builder setAccessToken(@Nullable String setterArg) { + this.accessToken = setterArg; + return this; + } + + public @NonNull InternalAuthCredentialInput build() { + InternalAuthCredentialInput pigeonReturn = new InternalAuthCredentialInput(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setSignInMethod(signInMethod); + pigeonReturn.setToken(token); + pigeonReturn.setAccessToken(accessToken); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(providerId); + toListResult.add(signInMethod); + toListResult.add(token); + toListResult.add(accessToken); + return toListResult; + } + + static @NonNull InternalAuthCredentialInput fromList( + @NonNull ArrayList pigeonVar_list) { + InternalAuthCredentialInput pigeonResult = new InternalAuthCredentialInput(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object signInMethod = pigeonVar_list.get(1); + pigeonResult.setSignInMethod((String) signInMethod); + Object token = pigeonVar_list.get(2); + pigeonResult.setToken((String) token); + Object accessToken = pigeonVar_list.get(3); + pigeonResult.setAccessToken((String) accessToken); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalActionCodeSettings { + private @NonNull String url; + + public @NonNull String getUrl() { + return url; + } + + public void setUrl(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"url\" is null."); + } + this.url = setterArg; + } + + private @Nullable String dynamicLinkDomain; + + public @Nullable String getDynamicLinkDomain() { + return dynamicLinkDomain; + } + + public void setDynamicLinkDomain(@Nullable String setterArg) { + this.dynamicLinkDomain = setterArg; + } + + private @NonNull Boolean handleCodeInApp; + + public @NonNull Boolean getHandleCodeInApp() { + return handleCodeInApp; + } + + public void setHandleCodeInApp(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"handleCodeInApp\" is null."); + } + this.handleCodeInApp = setterArg; + } + + private @Nullable String iOSBundleId; + + public @Nullable String getIOSBundleId() { + return iOSBundleId; + } + + public void setIOSBundleId(@Nullable String setterArg) { + this.iOSBundleId = setterArg; + } + + private @Nullable String androidPackageName; + + public @Nullable String getAndroidPackageName() { + return androidPackageName; + } + + public void setAndroidPackageName(@Nullable String setterArg) { + this.androidPackageName = setterArg; + } + + private @NonNull Boolean androidInstallApp; + + public @NonNull Boolean getAndroidInstallApp() { + return androidInstallApp; + } + + public void setAndroidInstallApp(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"androidInstallApp\" is null."); + } + this.androidInstallApp = setterArg; + } + + private @Nullable String androidMinimumVersion; + + public @Nullable String getAndroidMinimumVersion() { + return androidMinimumVersion; + } + + public void setAndroidMinimumVersion(@Nullable String setterArg) { + this.androidMinimumVersion = setterArg; + } + + private @Nullable String linkDomain; + + public @Nullable String getLinkDomain() { + return linkDomain; + } + + public void setLinkDomain(@Nullable String setterArg) { + this.linkDomain = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalActionCodeSettings() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalActionCodeSettings that = (InternalActionCodeSettings) o; + return pigeonDeepEquals(url, that.url) + && pigeonDeepEquals(dynamicLinkDomain, that.dynamicLinkDomain) + && pigeonDeepEquals(handleCodeInApp, that.handleCodeInApp) + && pigeonDeepEquals(iOSBundleId, that.iOSBundleId) + && pigeonDeepEquals(androidPackageName, that.androidPackageName) + && pigeonDeepEquals(androidInstallApp, that.androidInstallApp) + && pigeonDeepEquals(androidMinimumVersion, that.androidMinimumVersion) + && pigeonDeepEquals(linkDomain, that.linkDomain); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + url, + dynamicLinkDomain, + handleCodeInApp, + iOSBundleId, + androidPackageName, + androidInstallApp, + androidMinimumVersion, + linkDomain + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String url; + + @CanIgnoreReturnValue + public @NonNull Builder setUrl(@NonNull String setterArg) { + this.url = setterArg; + return this; + } + + private @Nullable String dynamicLinkDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setDynamicLinkDomain(@Nullable String setterArg) { + this.dynamicLinkDomain = setterArg; + return this; + } + + private @Nullable Boolean handleCodeInApp; + + @CanIgnoreReturnValue + public @NonNull Builder setHandleCodeInApp(@NonNull Boolean setterArg) { + this.handleCodeInApp = setterArg; + return this; + } + + private @Nullable String iOSBundleId; + + @CanIgnoreReturnValue + public @NonNull Builder setIOSBundleId(@Nullable String setterArg) { + this.iOSBundleId = setterArg; + return this; + } + + private @Nullable String androidPackageName; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidPackageName(@Nullable String setterArg) { + this.androidPackageName = setterArg; + return this; + } + + private @Nullable Boolean androidInstallApp; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidInstallApp(@NonNull Boolean setterArg) { + this.androidInstallApp = setterArg; + return this; + } + + private @Nullable String androidMinimumVersion; + + @CanIgnoreReturnValue + public @NonNull Builder setAndroidMinimumVersion(@Nullable String setterArg) { + this.androidMinimumVersion = setterArg; + return this; + } + + private @Nullable String linkDomain; + + @CanIgnoreReturnValue + public @NonNull Builder setLinkDomain(@Nullable String setterArg) { + this.linkDomain = setterArg; + return this; + } + + public @NonNull InternalActionCodeSettings build() { + InternalActionCodeSettings pigeonReturn = new InternalActionCodeSettings(); + pigeonReturn.setUrl(url); + pigeonReturn.setDynamicLinkDomain(dynamicLinkDomain); + pigeonReturn.setHandleCodeInApp(handleCodeInApp); + pigeonReturn.setIOSBundleId(iOSBundleId); + pigeonReturn.setAndroidPackageName(androidPackageName); + pigeonReturn.setAndroidInstallApp(androidInstallApp); + pigeonReturn.setAndroidMinimumVersion(androidMinimumVersion); + pigeonReturn.setLinkDomain(linkDomain); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(8); + toListResult.add(url); + toListResult.add(dynamicLinkDomain); + toListResult.add(handleCodeInApp); + toListResult.add(iOSBundleId); + toListResult.add(androidPackageName); + toListResult.add(androidInstallApp); + toListResult.add(androidMinimumVersion); + toListResult.add(linkDomain); + return toListResult; + } + + static @NonNull InternalActionCodeSettings fromList(@NonNull ArrayList pigeonVar_list) { + InternalActionCodeSettings pigeonResult = new InternalActionCodeSettings(); + Object url = pigeonVar_list.get(0); + pigeonResult.setUrl((String) url); + Object dynamicLinkDomain = pigeonVar_list.get(1); + pigeonResult.setDynamicLinkDomain((String) dynamicLinkDomain); + Object handleCodeInApp = pigeonVar_list.get(2); + pigeonResult.setHandleCodeInApp((Boolean) handleCodeInApp); + Object iOSBundleId = pigeonVar_list.get(3); + pigeonResult.setIOSBundleId((String) iOSBundleId); + Object androidPackageName = pigeonVar_list.get(4); + pigeonResult.setAndroidPackageName((String) androidPackageName); + Object androidInstallApp = pigeonVar_list.get(5); + pigeonResult.setAndroidInstallApp((Boolean) androidInstallApp); + Object androidMinimumVersion = pigeonVar_list.get(6); + pigeonResult.setAndroidMinimumVersion((String) androidMinimumVersion); + Object linkDomain = pigeonVar_list.get(7); + pigeonResult.setLinkDomain((String) linkDomain); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalFirebaseAuthSettings { + private @NonNull Boolean appVerificationDisabledForTesting; + + public @NonNull Boolean getAppVerificationDisabledForTesting() { + return appVerificationDisabledForTesting; + } + + public void setAppVerificationDisabledForTesting(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException( + "Nonnull field \"appVerificationDisabledForTesting\" is null."); + } + this.appVerificationDisabledForTesting = setterArg; + } + + private @Nullable String userAccessGroup; + + public @Nullable String getUserAccessGroup() { + return userAccessGroup; + } + + public void setUserAccessGroup(@Nullable String setterArg) { + this.userAccessGroup = setterArg; + } + + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @Nullable String smsCode; + + public @Nullable String getSmsCode() { + return smsCode; + } + + public void setSmsCode(@Nullable String setterArg) { + this.smsCode = setterArg; + } + + private @Nullable Boolean forceRecaptchaFlow; + + public @Nullable Boolean getForceRecaptchaFlow() { + return forceRecaptchaFlow; + } + + public void setForceRecaptchaFlow(@Nullable Boolean setterArg) { + this.forceRecaptchaFlow = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalFirebaseAuthSettings() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalFirebaseAuthSettings that = (InternalFirebaseAuthSettings) o; + return pigeonDeepEquals( + appVerificationDisabledForTesting, that.appVerificationDisabledForTesting) + && pigeonDeepEquals(userAccessGroup, that.userAccessGroup) + && pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(smsCode, that.smsCode) + && pigeonDeepEquals(forceRecaptchaFlow, that.forceRecaptchaFlow); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + appVerificationDisabledForTesting, + userAccessGroup, + phoneNumber, + smsCode, + forceRecaptchaFlow + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Boolean appVerificationDisabledForTesting; + + @CanIgnoreReturnValue + public @NonNull Builder setAppVerificationDisabledForTesting(@NonNull Boolean setterArg) { + this.appVerificationDisabledForTesting = setterArg; + return this; + } + + private @Nullable String userAccessGroup; + + @CanIgnoreReturnValue + public @NonNull Builder setUserAccessGroup(@Nullable String setterArg) { + this.userAccessGroup = setterArg; + return this; + } + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable String smsCode; + + @CanIgnoreReturnValue + public @NonNull Builder setSmsCode(@Nullable String setterArg) { + this.smsCode = setterArg; + return this; + } + + private @Nullable Boolean forceRecaptchaFlow; + + @CanIgnoreReturnValue + public @NonNull Builder setForceRecaptchaFlow(@Nullable Boolean setterArg) { + this.forceRecaptchaFlow = setterArg; + return this; + } + + public @NonNull InternalFirebaseAuthSettings build() { + InternalFirebaseAuthSettings pigeonReturn = new InternalFirebaseAuthSettings(); + pigeonReturn.setAppVerificationDisabledForTesting(appVerificationDisabledForTesting); + pigeonReturn.setUserAccessGroup(userAccessGroup); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setSmsCode(smsCode); + pigeonReturn.setForceRecaptchaFlow(forceRecaptchaFlow); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(appVerificationDisabledForTesting); + toListResult.add(userAccessGroup); + toListResult.add(phoneNumber); + toListResult.add(smsCode); + toListResult.add(forceRecaptchaFlow); + return toListResult; + } + + static @NonNull InternalFirebaseAuthSettings fromList( + @NonNull ArrayList pigeonVar_list) { + InternalFirebaseAuthSettings pigeonResult = new InternalFirebaseAuthSettings(); + Object appVerificationDisabledForTesting = pigeonVar_list.get(0); + pigeonResult.setAppVerificationDisabledForTesting( + (Boolean) appVerificationDisabledForTesting); + Object userAccessGroup = pigeonVar_list.get(1); + pigeonResult.setUserAccessGroup((String) userAccessGroup); + Object phoneNumber = pigeonVar_list.get(2); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object smsCode = pigeonVar_list.get(3); + pigeonResult.setSmsCode((String) smsCode); + Object forceRecaptchaFlow = pigeonVar_list.get(4); + pigeonResult.setForceRecaptchaFlow((Boolean) forceRecaptchaFlow); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalSignInProvider { + private @NonNull String providerId; + + public @NonNull String getProviderId() { + return providerId; + } + + public void setProviderId(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"providerId\" is null."); + } + this.providerId = setterArg; + } + + private @Nullable List scopes; + + public @Nullable List getScopes() { + return scopes; + } + + public void setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + } + + private @Nullable Map customParameters; + + public @Nullable Map getCustomParameters() { + return customParameters; + } + + public void setCustomParameters(@Nullable Map setterArg) { + this.customParameters = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalSignInProvider() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalSignInProvider that = (InternalSignInProvider) o; + return pigeonDeepEquals(providerId, that.providerId) + && pigeonDeepEquals(scopes, that.scopes) + && pigeonDeepEquals(customParameters, that.customParameters); + } + + @Override + public int hashCode() { + Object[] fields = new Object[] {getClass(), providerId, scopes, customParameters}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String providerId; + + @CanIgnoreReturnValue + public @NonNull Builder setProviderId(@NonNull String setterArg) { + this.providerId = setterArg; + return this; + } + + private @Nullable List scopes; + + @CanIgnoreReturnValue + public @NonNull Builder setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + return this; + } + + private @Nullable Map customParameters; + + @CanIgnoreReturnValue + public @NonNull Builder setCustomParameters(@Nullable Map setterArg) { + this.customParameters = setterArg; + return this; + } + + public @NonNull InternalSignInProvider build() { + InternalSignInProvider pigeonReturn = new InternalSignInProvider(); + pigeonReturn.setProviderId(providerId); + pigeonReturn.setScopes(scopes); + pigeonReturn.setCustomParameters(customParameters); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(providerId); + toListResult.add(scopes); + toListResult.add(customParameters); + return toListResult; + } + + static @NonNull InternalSignInProvider fromList(@NonNull ArrayList pigeonVar_list) { + InternalSignInProvider pigeonResult = new InternalSignInProvider(); + Object providerId = pigeonVar_list.get(0); + pigeonResult.setProviderId((String) providerId); + Object scopes = pigeonVar_list.get(1); + pigeonResult.setScopes((List) scopes); + Object customParameters = pigeonVar_list.get(2); + pigeonResult.setCustomParameters((Map) customParameters); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalVerifyPhoneNumberRequest { + private @Nullable String phoneNumber; + + public @Nullable String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + } + + private @NonNull Long timeout; + + public @NonNull Long getTimeout() { + return timeout; + } + + public void setTimeout(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"timeout\" is null."); + } + this.timeout = setterArg; + } + + private @Nullable Long forceResendingToken; + + public @Nullable Long getForceResendingToken() { + return forceResendingToken; + } + + public void setForceResendingToken(@Nullable Long setterArg) { + this.forceResendingToken = setterArg; + } + + private @Nullable String autoRetrievedSmsCodeForTesting; + + public @Nullable String getAutoRetrievedSmsCodeForTesting() { + return autoRetrievedSmsCodeForTesting; + } + + public void setAutoRetrievedSmsCodeForTesting(@Nullable String setterArg) { + this.autoRetrievedSmsCodeForTesting = setterArg; + } + + private @Nullable String multiFactorInfoId; + + public @Nullable String getMultiFactorInfoId() { + return multiFactorInfoId; + } + + public void setMultiFactorInfoId(@Nullable String setterArg) { + this.multiFactorInfoId = setterArg; + } + + private @Nullable String multiFactorSessionId; + + public @Nullable String getMultiFactorSessionId() { + return multiFactorSessionId; + } + + public void setMultiFactorSessionId(@Nullable String setterArg) { + this.multiFactorSessionId = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalVerifyPhoneNumberRequest() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalVerifyPhoneNumberRequest that = (InternalVerifyPhoneNumberRequest) o; + return pigeonDeepEquals(phoneNumber, that.phoneNumber) + && pigeonDeepEquals(timeout, that.timeout) + && pigeonDeepEquals(forceResendingToken, that.forceResendingToken) + && pigeonDeepEquals(autoRetrievedSmsCodeForTesting, that.autoRetrievedSmsCodeForTesting) + && pigeonDeepEquals(multiFactorInfoId, that.multiFactorInfoId) + && pigeonDeepEquals(multiFactorSessionId, that.multiFactorSessionId); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + phoneNumber, + timeout, + forceResendingToken, + autoRetrievedSmsCodeForTesting, + multiFactorInfoId, + multiFactorSessionId + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String phoneNumber; + + @CanIgnoreReturnValue + public @NonNull Builder setPhoneNumber(@Nullable String setterArg) { + this.phoneNumber = setterArg; + return this; + } + + private @Nullable Long timeout; + + @CanIgnoreReturnValue + public @NonNull Builder setTimeout(@NonNull Long setterArg) { + this.timeout = setterArg; + return this; + } + + private @Nullable Long forceResendingToken; + + @CanIgnoreReturnValue + public @NonNull Builder setForceResendingToken(@Nullable Long setterArg) { + this.forceResendingToken = setterArg; + return this; + } + + private @Nullable String autoRetrievedSmsCodeForTesting; + + @CanIgnoreReturnValue + public @NonNull Builder setAutoRetrievedSmsCodeForTesting(@Nullable String setterArg) { + this.autoRetrievedSmsCodeForTesting = setterArg; + return this; + } + + private @Nullable String multiFactorInfoId; + + @CanIgnoreReturnValue + public @NonNull Builder setMultiFactorInfoId(@Nullable String setterArg) { + this.multiFactorInfoId = setterArg; + return this; + } + + private @Nullable String multiFactorSessionId; + + @CanIgnoreReturnValue + public @NonNull Builder setMultiFactorSessionId(@Nullable String setterArg) { + this.multiFactorSessionId = setterArg; + return this; + } + + public @NonNull InternalVerifyPhoneNumberRequest build() { + InternalVerifyPhoneNumberRequest pigeonReturn = new InternalVerifyPhoneNumberRequest(); + pigeonReturn.setPhoneNumber(phoneNumber); + pigeonReturn.setTimeout(timeout); + pigeonReturn.setForceResendingToken(forceResendingToken); + pigeonReturn.setAutoRetrievedSmsCodeForTesting(autoRetrievedSmsCodeForTesting); + pigeonReturn.setMultiFactorInfoId(multiFactorInfoId); + pigeonReturn.setMultiFactorSessionId(multiFactorSessionId); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(6); + toListResult.add(phoneNumber); + toListResult.add(timeout); + toListResult.add(forceResendingToken); + toListResult.add(autoRetrievedSmsCodeForTesting); + toListResult.add(multiFactorInfoId); + toListResult.add(multiFactorSessionId); + return toListResult; + } + + static @NonNull InternalVerifyPhoneNumberRequest fromList( + @NonNull ArrayList pigeonVar_list) { + InternalVerifyPhoneNumberRequest pigeonResult = new InternalVerifyPhoneNumberRequest(); + Object phoneNumber = pigeonVar_list.get(0); + pigeonResult.setPhoneNumber((String) phoneNumber); + Object timeout = pigeonVar_list.get(1); + pigeonResult.setTimeout((Long) timeout); + Object forceResendingToken = pigeonVar_list.get(2); + pigeonResult.setForceResendingToken((Long) forceResendingToken); + Object autoRetrievedSmsCodeForTesting = pigeonVar_list.get(3); + pigeonResult.setAutoRetrievedSmsCodeForTesting((String) autoRetrievedSmsCodeForTesting); + Object multiFactorInfoId = pigeonVar_list.get(4); + pigeonResult.setMultiFactorInfoId((String) multiFactorInfoId); + Object multiFactorSessionId = pigeonVar_list.get(5); + pigeonResult.setMultiFactorSessionId((String) multiFactorSessionId); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalIdTokenResult { + private @Nullable String token; + + public @Nullable String getToken() { + return token; + } + + public void setToken(@Nullable String setterArg) { + this.token = setterArg; + } + + private @Nullable Long expirationTimestamp; + + public @Nullable Long getExpirationTimestamp() { + return expirationTimestamp; + } + + public void setExpirationTimestamp(@Nullable Long setterArg) { + this.expirationTimestamp = setterArg; + } + + private @Nullable Long authTimestamp; + + public @Nullable Long getAuthTimestamp() { + return authTimestamp; + } + + public void setAuthTimestamp(@Nullable Long setterArg) { + this.authTimestamp = setterArg; + } + + private @Nullable Long issuedAtTimestamp; + + public @Nullable Long getIssuedAtTimestamp() { + return issuedAtTimestamp; + } + + public void setIssuedAtTimestamp(@Nullable Long setterArg) { + this.issuedAtTimestamp = setterArg; + } + + private @Nullable String signInProvider; + + public @Nullable String getSignInProvider() { + return signInProvider; + } + + public void setSignInProvider(@Nullable String setterArg) { + this.signInProvider = setterArg; + } + + private @Nullable Map claims; + + public @Nullable Map getClaims() { + return claims; + } + + public void setClaims(@Nullable Map setterArg) { + this.claims = setterArg; + } + + private @Nullable String signInSecondFactor; + + public @Nullable String getSignInSecondFactor() { + return signInSecondFactor; + } + + public void setSignInSecondFactor(@Nullable String setterArg) { + this.signInSecondFactor = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalIdTokenResult that = (InternalIdTokenResult) o; + return pigeonDeepEquals(token, that.token) + && pigeonDeepEquals(expirationTimestamp, that.expirationTimestamp) + && pigeonDeepEquals(authTimestamp, that.authTimestamp) + && pigeonDeepEquals(issuedAtTimestamp, that.issuedAtTimestamp) + && pigeonDeepEquals(signInProvider, that.signInProvider) + && pigeonDeepEquals(claims, that.claims) + && pigeonDeepEquals(signInSecondFactor, that.signInSecondFactor); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + token, + expirationTimestamp, + authTimestamp, + issuedAtTimestamp, + signInProvider, + claims, + signInSecondFactor + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String token; + + @CanIgnoreReturnValue + public @NonNull Builder setToken(@Nullable String setterArg) { + this.token = setterArg; + return this; + } + + private @Nullable Long expirationTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setExpirationTimestamp(@Nullable Long setterArg) { + this.expirationTimestamp = setterArg; + return this; + } + + private @Nullable Long authTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setAuthTimestamp(@Nullable Long setterArg) { + this.authTimestamp = setterArg; + return this; + } + + private @Nullable Long issuedAtTimestamp; + + @CanIgnoreReturnValue + public @NonNull Builder setIssuedAtTimestamp(@Nullable Long setterArg) { + this.issuedAtTimestamp = setterArg; + return this; + } + + private @Nullable String signInProvider; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInProvider(@Nullable String setterArg) { + this.signInProvider = setterArg; + return this; + } + + private @Nullable Map claims; + + @CanIgnoreReturnValue + public @NonNull Builder setClaims(@Nullable Map setterArg) { + this.claims = setterArg; + return this; + } + + private @Nullable String signInSecondFactor; + + @CanIgnoreReturnValue + public @NonNull Builder setSignInSecondFactor(@Nullable String setterArg) { + this.signInSecondFactor = setterArg; + return this; + } + + public @NonNull InternalIdTokenResult build() { + InternalIdTokenResult pigeonReturn = new InternalIdTokenResult(); + pigeonReturn.setToken(token); + pigeonReturn.setExpirationTimestamp(expirationTimestamp); + pigeonReturn.setAuthTimestamp(authTimestamp); + pigeonReturn.setIssuedAtTimestamp(issuedAtTimestamp); + pigeonReturn.setSignInProvider(signInProvider); + pigeonReturn.setClaims(claims); + pigeonReturn.setSignInSecondFactor(signInSecondFactor); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(7); + toListResult.add(token); + toListResult.add(expirationTimestamp); + toListResult.add(authTimestamp); + toListResult.add(issuedAtTimestamp); + toListResult.add(signInProvider); + toListResult.add(claims); + toListResult.add(signInSecondFactor); + return toListResult; + } + + static @NonNull InternalIdTokenResult fromList(@NonNull ArrayList pigeonVar_list) { + InternalIdTokenResult pigeonResult = new InternalIdTokenResult(); + Object token = pigeonVar_list.get(0); + pigeonResult.setToken((String) token); + Object expirationTimestamp = pigeonVar_list.get(1); + pigeonResult.setExpirationTimestamp((Long) expirationTimestamp); + Object authTimestamp = pigeonVar_list.get(2); + pigeonResult.setAuthTimestamp((Long) authTimestamp); + Object issuedAtTimestamp = pigeonVar_list.get(3); + pigeonResult.setIssuedAtTimestamp((Long) issuedAtTimestamp); + Object signInProvider = pigeonVar_list.get(4); + pigeonResult.setSignInProvider((String) signInProvider); + Object claims = pigeonVar_list.get(5); + pigeonResult.setClaims((Map) claims); + Object signInSecondFactor = pigeonVar_list.get(6); + pigeonResult.setSignInSecondFactor((String) signInSecondFactor); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalUserProfile { + private @Nullable String displayName; + + public @Nullable String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + } + + private @Nullable String photoUrl; + + public @Nullable String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + } + + private @NonNull Boolean displayNameChanged; + + public @NonNull Boolean getDisplayNameChanged() { + return displayNameChanged; + } + + public void setDisplayNameChanged(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"displayNameChanged\" is null."); + } + this.displayNameChanged = setterArg; + } + + private @NonNull Boolean photoUrlChanged; + + public @NonNull Boolean getPhotoUrlChanged() { + return photoUrlChanged; + } + + public void setPhotoUrlChanged(@NonNull Boolean setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"photoUrlChanged\" is null."); + } + this.photoUrlChanged = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalUserProfile() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalUserProfile that = (InternalUserProfile) o; + return pigeonDeepEquals(displayName, that.displayName) + && pigeonDeepEquals(photoUrl, that.photoUrl) + && pigeonDeepEquals(displayNameChanged, that.displayNameChanged) + && pigeonDeepEquals(photoUrlChanged, that.photoUrlChanged); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] {getClass(), displayName, photoUrl, displayNameChanged, photoUrlChanged}; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable String displayName; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayName(@Nullable String setterArg) { + this.displayName = setterArg; + return this; + } + + private @Nullable String photoUrl; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrl(@Nullable String setterArg) { + this.photoUrl = setterArg; + return this; + } + + private @Nullable Boolean displayNameChanged; + + @CanIgnoreReturnValue + public @NonNull Builder setDisplayNameChanged(@NonNull Boolean setterArg) { + this.displayNameChanged = setterArg; + return this; + } + + private @Nullable Boolean photoUrlChanged; + + @CanIgnoreReturnValue + public @NonNull Builder setPhotoUrlChanged(@NonNull Boolean setterArg) { + this.photoUrlChanged = setterArg; + return this; + } + + public @NonNull InternalUserProfile build() { + InternalUserProfile pigeonReturn = new InternalUserProfile(); + pigeonReturn.setDisplayName(displayName); + pigeonReturn.setPhotoUrl(photoUrl); + pigeonReturn.setDisplayNameChanged(displayNameChanged); + pigeonReturn.setPhotoUrlChanged(photoUrlChanged); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(displayName); + toListResult.add(photoUrl); + toListResult.add(displayNameChanged); + toListResult.add(photoUrlChanged); + return toListResult; + } + + static @NonNull InternalUserProfile fromList(@NonNull ArrayList pigeonVar_list) { + InternalUserProfile pigeonResult = new InternalUserProfile(); + Object displayName = pigeonVar_list.get(0); + pigeonResult.setDisplayName((String) displayName); + Object photoUrl = pigeonVar_list.get(1); + pigeonResult.setPhotoUrl((String) photoUrl); + Object displayNameChanged = pigeonVar_list.get(2); + pigeonResult.setDisplayNameChanged((Boolean) displayNameChanged); + Object photoUrlChanged = pigeonVar_list.get(3); + pigeonResult.setPhotoUrlChanged((Boolean) photoUrlChanged); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class InternalTotpSecret { + private @Nullable Long codeIntervalSeconds; + + public @Nullable Long getCodeIntervalSeconds() { + return codeIntervalSeconds; + } + + public void setCodeIntervalSeconds(@Nullable Long setterArg) { + this.codeIntervalSeconds = setterArg; + } + + private @Nullable Long codeLength; + + public @Nullable Long getCodeLength() { + return codeLength; + } + + public void setCodeLength(@Nullable Long setterArg) { + this.codeLength = setterArg; + } + + private @Nullable Long enrollmentCompletionDeadline; + + public @Nullable Long getEnrollmentCompletionDeadline() { + return enrollmentCompletionDeadline; + } + + public void setEnrollmentCompletionDeadline(@Nullable Long setterArg) { + this.enrollmentCompletionDeadline = setterArg; + } + + private @Nullable String hashingAlgorithm; + + public @Nullable String getHashingAlgorithm() { + return hashingAlgorithm; + } + + public void setHashingAlgorithm(@Nullable String setterArg) { + this.hashingAlgorithm = setterArg; + } + + private @NonNull String secretKey; + + public @NonNull String getSecretKey() { + return secretKey; + } + + public void setSecretKey(@NonNull String setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"secretKey\" is null."); + } + this.secretKey = setterArg; + } + + /** Constructor is non-public to enforce null safety; use Builder. */ + InternalTotpSecret() {} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InternalTotpSecret that = (InternalTotpSecret) o; + return pigeonDeepEquals(codeIntervalSeconds, that.codeIntervalSeconds) + && pigeonDeepEquals(codeLength, that.codeLength) + && pigeonDeepEquals(enrollmentCompletionDeadline, that.enrollmentCompletionDeadline) + && pigeonDeepEquals(hashingAlgorithm, that.hashingAlgorithm) + && pigeonDeepEquals(secretKey, that.secretKey); + } + + @Override + public int hashCode() { + Object[] fields = + new Object[] { + getClass(), + codeIntervalSeconds, + codeLength, + enrollmentCompletionDeadline, + hashingAlgorithm, + secretKey + }; + return pigeonDeepHashCode(fields); + } + + public static final class Builder { + + private @Nullable Long codeIntervalSeconds; + + @CanIgnoreReturnValue + public @NonNull Builder setCodeIntervalSeconds(@Nullable Long setterArg) { + this.codeIntervalSeconds = setterArg; + return this; + } + + private @Nullable Long codeLength; + + @CanIgnoreReturnValue + public @NonNull Builder setCodeLength(@Nullable Long setterArg) { + this.codeLength = setterArg; + return this; + } + + private @Nullable Long enrollmentCompletionDeadline; + + @CanIgnoreReturnValue + public @NonNull Builder setEnrollmentCompletionDeadline(@Nullable Long setterArg) { + this.enrollmentCompletionDeadline = setterArg; + return this; + } + + private @Nullable String hashingAlgorithm; + + @CanIgnoreReturnValue + public @NonNull Builder setHashingAlgorithm(@Nullable String setterArg) { + this.hashingAlgorithm = setterArg; + return this; + } + + private @Nullable String secretKey; + + @CanIgnoreReturnValue + public @NonNull Builder setSecretKey(@NonNull String setterArg) { + this.secretKey = setterArg; + return this; + } + + public @NonNull InternalTotpSecret build() { + InternalTotpSecret pigeonReturn = new InternalTotpSecret(); + pigeonReturn.setCodeIntervalSeconds(codeIntervalSeconds); + pigeonReturn.setCodeLength(codeLength); + pigeonReturn.setEnrollmentCompletionDeadline(enrollmentCompletionDeadline); + pigeonReturn.setHashingAlgorithm(hashingAlgorithm); + pigeonReturn.setSecretKey(secretKey); + return pigeonReturn; + } + } + + @NonNull + public ArrayList toList() { + ArrayList toListResult = new ArrayList<>(5); + toListResult.add(codeIntervalSeconds); + toListResult.add(codeLength); + toListResult.add(enrollmentCompletionDeadline); + toListResult.add(hashingAlgorithm); + toListResult.add(secretKey); + return toListResult; + } + + static @NonNull InternalTotpSecret fromList(@NonNull ArrayList pigeonVar_list) { + InternalTotpSecret pigeonResult = new InternalTotpSecret(); + Object codeIntervalSeconds = pigeonVar_list.get(0); + pigeonResult.setCodeIntervalSeconds((Long) codeIntervalSeconds); + Object codeLength = pigeonVar_list.get(1); + pigeonResult.setCodeLength((Long) codeLength); + Object enrollmentCompletionDeadline = pigeonVar_list.get(2); + pigeonResult.setEnrollmentCompletionDeadline((Long) enrollmentCompletionDeadline); + Object hashingAlgorithm = pigeonVar_list.get(3); + pigeonResult.setHashingAlgorithm((String) hashingAlgorithm); + Object secretKey = pigeonVar_list.get(4); + pigeonResult.setSecretKey((String) secretKey); + return pigeonResult; + } + } + + private static class PigeonCodec extends StandardMessageCodec { + public static final PigeonCodec INSTANCE = new PigeonCodec(); + + private PigeonCodec() {} + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + case (byte) 129: + { + Object value = readValue(buffer); + return value == null + ? null + : ActionCodeInfoOperation.values()[((Long) value).intValue()]; + } + case (byte) 130: + return InternalMultiFactorSession.fromList((ArrayList) readValue(buffer)); + case (byte) 131: + return InternalPhoneMultiFactorAssertion.fromList((ArrayList) readValue(buffer)); + case (byte) 132: + return InternalMultiFactorInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 133: + return AuthPigeonFirebaseApp.fromList((ArrayList) readValue(buffer)); + case (byte) 134: + return InternalActionCodeInfoData.fromList((ArrayList) readValue(buffer)); + case (byte) 135: + return InternalActionCodeInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 136: + return InternalAdditionalUserInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 137: + return InternalAuthCredential.fromList((ArrayList) readValue(buffer)); + case (byte) 138: + return InternalUserInfo.fromList((ArrayList) readValue(buffer)); + case (byte) 139: + return InternalUserDetails.fromList((ArrayList) readValue(buffer)); + case (byte) 140: + return InternalUserCredential.fromList((ArrayList) readValue(buffer)); + case (byte) 141: + return InternalAuthCredentialInput.fromList((ArrayList) readValue(buffer)); + case (byte) 142: + return InternalActionCodeSettings.fromList((ArrayList) readValue(buffer)); + case (byte) 143: + return InternalFirebaseAuthSettings.fromList((ArrayList) readValue(buffer)); + case (byte) 144: + return InternalSignInProvider.fromList((ArrayList) readValue(buffer)); + case (byte) 145: + return InternalVerifyPhoneNumberRequest.fromList((ArrayList) readValue(buffer)); + case (byte) 146: + return InternalIdTokenResult.fromList((ArrayList) readValue(buffer)); + case (byte) 147: + return InternalUserProfile.fromList((ArrayList) readValue(buffer)); + case (byte) 148: + return InternalTotpSecret.fromList((ArrayList) readValue(buffer)); + default: + return super.readValueOfType(type, buffer); + } + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { + if (value instanceof ActionCodeInfoOperation) { + stream.write(129); + writeValue(stream, value == null ? null : ((ActionCodeInfoOperation) value).index); + } else if (value instanceof InternalMultiFactorSession) { + stream.write(130); + writeValue(stream, ((InternalMultiFactorSession) value).toList()); + } else if (value instanceof InternalPhoneMultiFactorAssertion) { + stream.write(131); + writeValue(stream, ((InternalPhoneMultiFactorAssertion) value).toList()); + } else if (value instanceof InternalMultiFactorInfo) { + stream.write(132); + writeValue(stream, ((InternalMultiFactorInfo) value).toList()); + } else if (value instanceof AuthPigeonFirebaseApp) { + stream.write(133); + writeValue(stream, ((AuthPigeonFirebaseApp) value).toList()); + } else if (value instanceof InternalActionCodeInfoData) { + stream.write(134); + writeValue(stream, ((InternalActionCodeInfoData) value).toList()); + } else if (value instanceof InternalActionCodeInfo) { + stream.write(135); + writeValue(stream, ((InternalActionCodeInfo) value).toList()); + } else if (value instanceof InternalAdditionalUserInfo) { + stream.write(136); + writeValue(stream, ((InternalAdditionalUserInfo) value).toList()); + } else if (value instanceof InternalAuthCredential) { + stream.write(137); + writeValue(stream, ((InternalAuthCredential) value).toList()); + } else if (value instanceof InternalUserInfo) { + stream.write(138); + writeValue(stream, ((InternalUserInfo) value).toList()); + } else if (value instanceof InternalUserDetails) { + stream.write(139); + writeValue(stream, ((InternalUserDetails) value).toList()); + } else if (value instanceof InternalUserCredential) { + stream.write(140); + writeValue(stream, ((InternalUserCredential) value).toList()); + } else if (value instanceof InternalAuthCredentialInput) { + stream.write(141); + writeValue(stream, ((InternalAuthCredentialInput) value).toList()); + } else if (value instanceof InternalActionCodeSettings) { + stream.write(142); + writeValue(stream, ((InternalActionCodeSettings) value).toList()); + } else if (value instanceof InternalFirebaseAuthSettings) { + stream.write(143); + writeValue(stream, ((InternalFirebaseAuthSettings) value).toList()); + } else if (value instanceof InternalSignInProvider) { + stream.write(144); + writeValue(stream, ((InternalSignInProvider) value).toList()); + } else if (value instanceof InternalVerifyPhoneNumberRequest) { + stream.write(145); + writeValue(stream, ((InternalVerifyPhoneNumberRequest) value).toList()); + } else if (value instanceof InternalIdTokenResult) { + stream.write(146); + writeValue(stream, ((InternalIdTokenResult) value).toList()); + } else if (value instanceof InternalUserProfile) { + stream.write(147); + writeValue(stream, ((InternalUserProfile) value).toList()); + } else if (value instanceof InternalTotpSecret) { + stream.write(148); + writeValue(stream, ((InternalTotpSecret) value).toList()); + } else { + super.writeValue(stream, value); + } + } + } + + /** Asynchronous error handling return type for non-nullable API method returns. */ + public interface Result { + /** Success case callback method for handling returns. */ + void success(@NonNull T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Asynchronous error handling return type for nullable API method returns. */ + public interface NullableResult { + /** Success case callback method for handling returns. */ + void success(@Nullable T result); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Asynchronous error handling return type for void API method returns. */ + public interface VoidResult { + /** Success case callback method for handling returns. */ + void success(); + + /** Failure case callback method for handling errors. */ + void error(@NonNull Throwable error); + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface FirebaseAuthHostApi { + + void registerIdTokenListener( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void registerAuthStateListener( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void useEmulator( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String host, + @NonNull Long port, + @NonNull VoidResult result); + + void applyActionCode( + @NonNull AuthPigeonFirebaseApp app, @NonNull String code, @NonNull VoidResult result); + + void checkActionCode( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull Result result); + + void confirmPasswordReset( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String code, + @NonNull String newPassword, + @NonNull VoidResult result); + + void createUserWithEmailAndPassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull Result result); + + void signInAnonymously( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void signInWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void signInWithCustomToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String token, + @NonNull Result result); + + void signInWithEmailAndPassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String password, + @NonNull Result result); + + void signInWithEmailLink( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull String emailLink, + @NonNull Result result); + + void signInWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void signOut(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + void fetchSignInMethodsForEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull Result> result); + + void sendPasswordResetEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void sendSignInLinkToEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String email, + @NonNull InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void setLanguageCode( + @NonNull AuthPigeonFirebaseApp app, + @Nullable String languageCode, + @NonNull Result result); + + void setSettings( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalFirebaseAuthSettings settings, + @NonNull VoidResult result); + + void verifyPasswordResetCode( + @NonNull AuthPigeonFirebaseApp app, @NonNull String code, @NonNull Result result); + + void verifyPhoneNumber( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalVerifyPhoneNumberRequest request, + @NonNull Result result); + + void revokeTokenWithAuthorizationCode( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String authorizationCode, + @NonNull VoidResult result); + + void revokeAccessToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String accessToken, + @NonNull VoidResult result); + + void initializeRecaptchaConfig(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + /** The codec used by FirebaseAuthHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `FirebaseAuthHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseAuthHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable FirebaseAuthHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerIdTokenListener" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.registerIdTokenListener(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerAuthStateListener" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.registerAuthStateListener(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.useEmulator" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String hostArg = (String) args.get(1); + Long portArg = (Long) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.useEmulator(appArg, hostArg, portArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.applyActionCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.applyActionCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.checkActionCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalActionCodeInfo result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.checkActionCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.confirmPasswordReset" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + String newPasswordArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.confirmPasswordReset(appArg, codeArg, newPasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.createUserWithEmailAndPassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String passwordArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.createUserWithEmailAndPassword(appArg, emailArg, passwordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInAnonymously" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInAnonymously(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithCustomToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String tokenArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithCustomToken(appArg, tokenArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithEmailAndPassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String passwordArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithEmailAndPassword(appArg, emailArg, passwordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithEmailLink" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + String emailLinkArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithEmailLink(appArg, emailArg, emailLinkArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signInWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signInWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signOut" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.signOut(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.fetchSignInMethodsForEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.fetchSignInMethodsForEmail(appArg, emailArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.sendPasswordResetEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendPasswordResetEmail(appArg, emailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.sendSignInLinkToEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String emailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendSignInLinkToEmail(appArg, emailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.setLanguageCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String languageCodeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.setLanguageCode(appArg, languageCodeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.setSettings" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalFirebaseAuthSettings settingsArg = + (InternalFirebaseAuthSettings) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.setSettings(appArg, settingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.verifyPasswordResetCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String codeArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyPasswordResetCode(appArg, codeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.verifyPhoneNumber" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalVerifyPhoneNumberRequest requestArg = + (InternalVerifyPhoneNumberRequest) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyPhoneNumber(appArg, requestArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.revokeTokenWithAuthorizationCode" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String authorizationCodeArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.revokeTokenWithAuthorizationCode(appArg, authorizationCodeArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.revokeAccessToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String accessTokenArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.revokeAccessToken(appArg, accessTokenArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.initializeRecaptchaConfig" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.initializeRecaptchaConfig(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface FirebaseAuthUserHostApi { + + void delete(@NonNull AuthPigeonFirebaseApp app, @NonNull VoidResult result); + + void getIdToken( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Boolean forceRefresh, + @NonNull Result result); + + void linkWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void linkWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void reauthenticateWithCredential( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void reauthenticateWithProvider( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalSignInProvider signInProvider, + @NonNull Result result); + + void reload(@NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void sendEmailVerification( + @NonNull AuthPigeonFirebaseApp app, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + void unlink( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String providerId, + @NonNull Result result); + + void updateEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @NonNull Result result); + + void updatePassword( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newPassword, + @NonNull Result result); + + void updatePhoneNumber( + @NonNull AuthPigeonFirebaseApp app, + @NonNull Map input, + @NonNull Result result); + + void updateProfile( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalUserProfile profile, + @NonNull Result result); + + void verifyBeforeUpdateEmail( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String newEmail, + @Nullable InternalActionCodeSettings actionCodeSettings, + @NonNull VoidResult result); + + /** The codec used by FirebaseAuthUserHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable FirebaseAuthUserHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable FirebaseAuthUserHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.delete" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.delete(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.getIdToken" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Boolean forceRefreshArg = (Boolean) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalIdTokenResult result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getIdToken(appArg, forceRefreshArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.linkWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.linkWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.linkWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.linkWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reauthenticateWithCredential" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reauthenticateWithCredential(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reauthenticateWithProvider" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalSignInProvider signInProviderArg = (InternalSignInProvider) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reauthenticateWithProvider(appArg, signInProviderArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.reload" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.reload(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.sendEmailVerification" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.sendEmailVerification(appArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.unlink" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String providerIdArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.unlink(appArg, providerIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updateEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newEmailArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updateEmail(appArg, newEmailArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updatePassword" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newPasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updatePassword(appArg, newPasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updatePhoneNumber" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Map inputArg = (Map) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updatePhoneNumber(appArg, inputArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.updateProfile" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalUserProfile profileArg = (InternalUserProfile) args.get(1); + Result resultCallback = + new Result() { + public void success(InternalUserDetails result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.updateProfile(appArg, profileArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.verifyBeforeUpdateEmail" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String newEmailArg = (String) args.get(1); + InternalActionCodeSettings actionCodeSettingsArg = + (InternalActionCodeSettings) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.verifyBeforeUpdateEmail( + appArg, newEmailArg, actionCodeSettingsArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorUserHostApi { + + void enrollPhone( + @NonNull AuthPigeonFirebaseApp app, + @NonNull InternalPhoneMultiFactorAssertion assertion, + @Nullable String displayName, + @NonNull VoidResult result); + + void enrollTotp( + @NonNull AuthPigeonFirebaseApp app, + @NonNull String assertionId, + @Nullable String displayName, + @NonNull VoidResult result); + + void getSession( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result result); + + void unenroll( + @NonNull AuthPigeonFirebaseApp app, @NonNull String factorUid, @NonNull VoidResult result); + + void getEnrolledFactors( + @NonNull AuthPigeonFirebaseApp app, @NonNull Result> result); + + /** The codec used by MultiFactorUserHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorUserHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorUserHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorUserHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.enrollPhone" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + InternalPhoneMultiFactorAssertion assertionArg = + (InternalPhoneMultiFactorAssertion) args.get(1); + String displayNameArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.enrollPhone(appArg, assertionArg, displayNameArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.enrollTotp" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String assertionIdArg = (String) args.get(1); + String displayNameArg = (String) args.get(2); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.enrollTotp(appArg, assertionIdArg, displayNameArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.getSession" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalMultiFactorSession result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getSession(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.unenroll" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + String factorUidArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.unenroll(appArg, factorUidArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorUserHostApi.getEnrolledFactors" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + AuthPigeonFirebaseApp appArg = (AuthPigeonFirebaseApp) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getEnrolledFactors(appArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactoResolverHostApi { + + void resolveSignIn( + @NonNull String resolverId, + @Nullable InternalPhoneMultiFactorAssertion assertion, + @Nullable String totpAssertionId, + @NonNull Result result); + + /** The codec used by MultiFactoResolverHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactoResolverHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactoResolverHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactoResolverHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactoResolverHostApi.resolveSignIn" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String resolverIdArg = (String) args.get(0); + InternalPhoneMultiFactorAssertion assertionArg = + (InternalPhoneMultiFactorAssertion) args.get(1); + String totpAssertionIdArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(InternalUserCredential result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.resolveSignIn(resolverIdArg, assertionArg, totpAssertionIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorTotpHostApi { + + void generateSecret(@NonNull String sessionId, @NonNull Result result); + + void getAssertionForEnrollment( + @NonNull String secretKey, @NonNull String oneTimePassword, @NonNull Result result); + + void getAssertionForSignIn( + @NonNull String enrollmentId, + @NonNull String oneTimePassword, + @NonNull Result result); + + /** The codec used by MultiFactorTotpHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorTotpHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorTotpHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorTotpHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.generateSecret" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String sessionIdArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(InternalTotpSecret result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.generateSecret(sessionIdArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.getAssertionForEnrollment" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String oneTimePasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getAssertionForEnrollment(secretKeyArg, oneTimePasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpHostApi.getAssertionForSignIn" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String enrollmentIdArg = (String) args.get(0); + String oneTimePasswordArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.getAssertionForSignIn(enrollmentIdArg, oneTimePasswordArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MultiFactorTotpSecretHostApi { + + void generateQrCodeUrl( + @NonNull String secretKey, + @Nullable String accountName, + @Nullable String issuer, + @NonNull Result result); + + void openInOtpApp( + @NonNull String secretKey, @NonNull String qrCodeUrl, @NonNull VoidResult result); + + /** The codec used by MultiFactorTotpSecretHostApi. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setUp( + @NonNull BinaryMessenger binaryMessenger, @Nullable MultiFactorTotpSecretHostApi api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable MultiFactorTotpSecretHostApi api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpSecretHostApi.generateQrCodeUrl" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String accountNameArg = (String) args.get(1); + String issuerArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.generateQrCodeUrl(secretKeyArg, accountNameArg, issuerArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.MultiFactorTotpSecretHostApi.openInOtpApp" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String secretKeyArg = (String) args.get(0); + String qrCodeUrlArg = (String) args.get(1); + VoidResult resultCallback = + new VoidResult() { + public void success() { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.openInOtpApp(secretKeyArg, qrCodeUrlArg, resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + /** + * Only used to generate the object interface that are use outside of the Pigeon interface + * + *

Generated interface from Pigeon that represents a handler of messages from Flutter. + */ + public interface GenerateInterfaces { + + void pigeonInterface(@NonNull InternalMultiFactorInfo info); + + /** The codec used by GenerateInterfaces. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + + /** + * Sets up an instance of `GenerateInterfaces` to handle messages through the `binaryMessenger`. + */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable GenerateInterfaces api) { + setUp(binaryMessenger, "", api); + } + + static void setUp( + @NonNull BinaryMessenger binaryMessenger, + @NonNull String messageChannelSuffix, + @Nullable GenerateInterfaces api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.firebase_auth_platform_interface.GenerateInterfaces.pigeonInterface" + + messageChannelSuffix, + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + InternalMultiFactorInfo infoArg = (InternalMultiFactorInfo) args.get(0); + try { + api.pigeonInterface(infoArg); + wrapped.add(0, null); + } catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java new file mode 100644 index 00000000..ae413a40 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/IdTokenChannelStreamHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuth.IdTokenListener; +import com.google.firebase.auth.FirebaseUser; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class IdTokenChannelStreamHandler implements StreamHandler { + + private final FirebaseAuth firebaseAuth; + private IdTokenListener idTokenListener; + + public IdTokenChannelStreamHandler(FirebaseAuth firebaseAuth) { + this.firebaseAuth = firebaseAuth; + } + + @Override + public void onListen(Object arguments, EventSink events) { + Map event = new HashMap<>(); + event.put(Constants.APP_NAME, firebaseAuth.getApp().getName()); + + final AtomicBoolean initialAuthState = new AtomicBoolean(true); + + idTokenListener = + auth -> { + if (initialAuthState.get()) { + initialAuthState.set(false); + return; + } + + FirebaseUser user = auth.getCurrentUser(); + + if (user == null) { + event.put(Constants.USER, null); + } else { + event.put( + Constants.USER, PigeonParser.manuallyToList(PigeonParser.parseFirebaseUser(user))); + } + + events.success(event); + }; + + firebaseAuth.addIdTokenListener(idTokenListener); + } + + @Override + public void onCancel(Object arguments) { + if (idTokenListener != null) { + firebaseAuth.removeIdTokenListener(idTokenListener); + idTokenListener = null; + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java new file mode 100644 index 00000000..a227be99 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PhoneNumberVerificationStreamHandler.java @@ -0,0 +1,197 @@ +/* + * Copyright 2022, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.firebase.FirebaseException; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.MultiFactorSession; +import com.google.firebase.auth.PhoneAuthCredential; +import com.google.firebase.auth.PhoneAuthOptions; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +public class PhoneNumberVerificationStreamHandler implements StreamHandler { + + interface OnCredentialsListener { + void onCredentialsReceived(PhoneAuthCredential credential); + } + + final AtomicReference activityRef = new AtomicReference<>(null); + final FirebaseAuth firebaseAuth; + final String phoneNumber; + final PhoneMultiFactorInfo multiFactorInfo; + final int timeout; + final OnCredentialsListener onCredentialsListener; + + final MultiFactorSession multiFactorSession; + + String autoRetrievedSmsCodeForTesting; + Integer forceResendingToken; + + private static final HashMap forceResendingTokens = new HashMap<>(); + + @Nullable private EventSink eventSink; + + public PhoneNumberVerificationStreamHandler( + Activity activity, + @NonNull GeneratedAndroidFirebaseAuth.AuthPigeonFirebaseApp app, + @NonNull GeneratedAndroidFirebaseAuth.InternalVerifyPhoneNumberRequest request, + @Nullable MultiFactorSession multiFactorSession, + @Nullable PhoneMultiFactorInfo multiFactorInfo, + OnCredentialsListener onCredentialsListener) { + this.activityRef.set(activity); + + this.multiFactorSession = multiFactorSession; + this.multiFactorInfo = multiFactorInfo; + firebaseAuth = FlutterFirebaseAuthPlugin.getAuthFromPigeon(app); + phoneNumber = request.getPhoneNumber(); + timeout = Math.toIntExact(request.getTimeout()); + + if (request.getAutoRetrievedSmsCodeForTesting() != null) { + autoRetrievedSmsCodeForTesting = request.getAutoRetrievedSmsCodeForTesting(); + } + + if (request.getForceResendingToken() != null) { + forceResendingToken = Math.toIntExact(request.getForceResendingToken()); + } + + this.onCredentialsListener = onCredentialsListener; + } + + @Override + public void onListen(Object arguments, EventSink events) { + eventSink = events; + + PhoneAuthProvider.OnVerificationStateChangedCallbacks callbacks = + new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { + @Override + public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) { + int phoneAuthCredentialHashCode = phoneAuthCredential.hashCode(); + onCredentialsListener.onCredentialsReceived(phoneAuthCredential); + + Map event = new HashMap<>(); + event.put(Constants.TOKEN, phoneAuthCredentialHashCode); + + if (phoneAuthCredential.getSmsCode() != null) { + event.put(Constants.SMS_CODE, phoneAuthCredential.getSmsCode()); + } + + event.put(Constants.NAME, "Auth#phoneVerificationCompleted"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onVerificationFailed(@NonNull FirebaseException e) { + Map event = new HashMap<>(); + Map error = new HashMap<>(); + GeneratedAndroidFirebaseAuth.FlutterError flutterError = + FlutterFirebaseAuthPluginException.parserExceptionToFlutter(e); + error.put( + "code", + flutterError + .code + .replaceAll("ERROR_", "") + .toLowerCase(Locale.ROOT) + .replaceAll("_", "-")); + error.put("message", flutterError.getMessage()); + error.put("details", flutterError.details); + event.put("error", error); + + event.put(Constants.NAME, "Auth#phoneVerificationFailed"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onCodeSent( + @NonNull String verificationId, + @NonNull PhoneAuthProvider.ForceResendingToken token) { + int forceResendingTokenHashCode = token.hashCode(); + forceResendingTokens.put(forceResendingTokenHashCode, token); + + Map event = new HashMap<>(); + event.put(Constants.VERIFICATION_ID, verificationId); + event.put(Constants.FORCE_RESENDING_TOKEN, forceResendingTokenHashCode); + + event.put(Constants.NAME, "Auth#phoneCodeSent"); + + if (eventSink != null) { + eventSink.success(event); + } + } + + @Override + public void onCodeAutoRetrievalTimeOut(@NonNull String verificationId) { + Map event = new HashMap<>(); + event.put(Constants.VERIFICATION_ID, verificationId); + + event.put(Constants.NAME, "Auth#phoneCodeAutoRetrievalTimeout"); + + if (eventSink != null) { + eventSink.success(event); + } + } + }; + + // Allows the auto-retrieval flow to be tested. + // See https://firebase.google.com/docs/auth/android/phone-auth#integration-testing + if (autoRetrievedSmsCodeForTesting != null) { + firebaseAuth + .getFirebaseAuthSettings() + .setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, autoRetrievedSmsCodeForTesting); + } + + PhoneAuthOptions.Builder phoneAuthOptionsBuilder = new PhoneAuthOptions.Builder(firebaseAuth); + phoneAuthOptionsBuilder.setActivity(activityRef.get()); + phoneAuthOptionsBuilder.setCallbacks(callbacks); + + if (phoneNumber != null) { + phoneAuthOptionsBuilder.setPhoneNumber(phoneNumber); + } + if (multiFactorSession != null) { + phoneAuthOptionsBuilder.setMultiFactorSession(multiFactorSession); + } + if (multiFactorInfo != null) { + phoneAuthOptionsBuilder.setMultiFactorHint(multiFactorInfo); + } + phoneAuthOptionsBuilder.setTimeout((long) timeout, TimeUnit.MILLISECONDS); + + if (forceResendingToken != null) { + PhoneAuthProvider.ForceResendingToken forceResendingToken = + forceResendingTokens.get(this.forceResendingToken); + + if (forceResendingToken != null) { + phoneAuthOptionsBuilder.setForceResendingToken(forceResendingToken); + } + } + + PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptionsBuilder.build()); + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + + activityRef.set(null); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java new file mode 100644 index 00000000..4c9e102a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/src/main/java/io/flutter/plugins/firebase/auth/PigeonParser.java @@ -0,0 +1,382 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +package io.flutter.plugins.firebase.auth; + +import android.net.Uri; +import androidx.annotation.NonNull; +import com.google.firebase.auth.ActionCodeEmailInfo; +import com.google.firebase.auth.ActionCodeInfo; +import com.google.firebase.auth.ActionCodeResult; +import com.google.firebase.auth.ActionCodeSettings; +import com.google.firebase.auth.AdditionalUserInfo; +import com.google.firebase.auth.AuthCredential; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.EmailAuthProvider; +import com.google.firebase.auth.FacebookAuthProvider; +import com.google.firebase.auth.FirebaseAuthProvider; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.FirebaseUserMetadata; +import com.google.firebase.auth.GetTokenResult; +import com.google.firebase.auth.GithubAuthProvider; +import com.google.firebase.auth.GoogleAuthProvider; +import com.google.firebase.auth.MultiFactorInfo; +import com.google.firebase.auth.OAuthCredential; +import com.google.firebase.auth.OAuthProvider; +import com.google.firebase.auth.PhoneAuthProvider; +import com.google.firebase.auth.PhoneMultiFactorInfo; +import com.google.firebase.auth.PlayGamesAuthProvider; +import com.google.firebase.auth.TwitterAuthProvider; +import com.google.firebase.auth.UserInfo; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PigeonParser { + static List manuallyToList( + GeneratedAndroidFirebaseAuth.InternalUserDetails pigeonUserDetails) { + List output = new ArrayList<>(); + output.add(pigeonUserDetails.getUserInfo().toList()); + output.add(pigeonUserDetails.getProviderData()); + return output; + } + + static GeneratedAndroidFirebaseAuth.InternalUserCredential parseAuthResult( + @NonNull AuthResult authResult) { + GeneratedAndroidFirebaseAuth.InternalUserCredential.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalUserCredential.Builder(); + + builder.setAdditionalUserInfo(parseAdditionalUserInfo(authResult.getAdditionalUserInfo())); + builder.setCredential(parseAuthCredential(authResult.getCredential())); + builder.setUser(parseFirebaseUser(authResult.getUser())); + + return builder.build(); + } + + private static GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo parseAdditionalUserInfo( + AdditionalUserInfo additionalUserInfo) { + if (additionalUserInfo == null) { + return null; + } + + GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalAdditionalUserInfo.Builder(); + + builder.setIsNewUser(additionalUserInfo.isNewUser()); + builder.setProfile(additionalUserInfo.getProfile()); + builder.setProviderId(additionalUserInfo.getProviderId()); + builder.setUsername(additionalUserInfo.getUsername()); + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalAuthCredential parseAuthCredential( + AuthCredential authCredential) { + if (authCredential == null) { + return null; + } + + int authCredentialHashCode = authCredential.hashCode(); + FlutterFirebaseAuthPlugin.authCredentials.put(authCredentialHashCode, authCredential); + + GeneratedAndroidFirebaseAuth.InternalAuthCredential.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalAuthCredential.Builder(); + + builder.setProviderId(authCredential.getProvider()); + builder.setSignInMethod(authCredential.getSignInMethod()); + builder.setNativeId((long) authCredentialHashCode); + if (authCredential instanceof OAuthCredential) { + builder.setAccessToken(((OAuthCredential) authCredential).getAccessToken()); + } + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalUserDetails parseFirebaseUser( + FirebaseUser firebaseUser) { + if (firebaseUser == null) { + return null; + } + + GeneratedAndroidFirebaseAuth.InternalUserDetails.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalUserDetails.Builder(); + + GeneratedAndroidFirebaseAuth.InternalUserInfo.Builder builderInfo = + new GeneratedAndroidFirebaseAuth.InternalUserInfo.Builder(); + + builderInfo.setDisplayName(firebaseUser.getDisplayName()); + builderInfo.setEmail(firebaseUser.getEmail()); + builderInfo.setIsEmailVerified(firebaseUser.isEmailVerified()); + builderInfo.setIsAnonymous(firebaseUser.isAnonymous()); + + final FirebaseUserMetadata userMetadata = firebaseUser.getMetadata(); + if (userMetadata != null) { + builderInfo.setCreationTimestamp(firebaseUser.getMetadata().getCreationTimestamp()); + builderInfo.setLastSignInTimestamp(firebaseUser.getMetadata().getLastSignInTimestamp()); + } + builderInfo.setPhoneNumber(firebaseUser.getPhoneNumber()); + builderInfo.setPhotoUrl(parsePhotoUrl(firebaseUser.getPhotoUrl())); + builderInfo.setUid(firebaseUser.getUid()); + builderInfo.setTenantId(firebaseUser.getTenantId()); + + builder.setUserInfo(builderInfo.build()); + builder.setProviderData(parseUserInfoList(firebaseUser.getProviderData())); + + return builder.build(); + } + + private static List> parseUserInfoList( + List userInfoList) { + List> output = new ArrayList<>(); + + if (userInfoList == null) { + return null; + } + + for (UserInfo userInfo : new ArrayList(userInfoList)) { + if (userInfo == null) { + continue; + } + if (!FirebaseAuthProvider.PROVIDER_ID.equals(userInfo.getProviderId())) { + output.add(parseUserInfoToMap(userInfo)); + } + } + + return output; + } + + private static Map parseUserInfoToMap(UserInfo userInfo) { + Map output = new HashMap<>(); + output.put("displayName", userInfo.getDisplayName()); + output.put("email", userInfo.getEmail()); + output.put("isEmailVerified", userInfo.isEmailVerified()); + output.put("phoneNumber", userInfo.getPhoneNumber()); + output.put("photoUrl", parsePhotoUrl(userInfo.getPhotoUrl())); + // Can be null on Emulator + output.put("uid", userInfo.getUid() == null ? "" : userInfo.getUid()); + output.put("providerId", userInfo.getProviderId()); + output.put("isAnonymous", false); + return output; + } + + private static String parsePhotoUrl(Uri photoUri) { + if (photoUri == null) { + return null; + } + + String photoUrl = photoUri.toString(); + + // Return null if the URL is an empty string + return "".equals(photoUrl) ? null : photoUrl; + } + + @SuppressWarnings("ConstantConditions") + static AuthCredential getCredential(Map credentialMap) { + // If the credential map contains a token, it means a native one has been stored + if (credentialMap.get(Constants.TOKEN) != null) { + int token = ((Number) credentialMap.get(Constants.TOKEN)).intValue(); + AuthCredential credential = FlutterFirebaseAuthPlugin.authCredentials.get(token); + + if (credential == null) { + throw FlutterFirebaseAuthPluginException.invalidCredential(); + } + + return credential; + } + + String signInMethod = + (String) Objects.requireNonNull(credentialMap.get(Constants.SIGN_IN_METHOD)); + String secret = (String) credentialMap.get(Constants.SECRET); + String idToken = (String) credentialMap.get(Constants.ID_TOKEN); + String accessToken = (String) credentialMap.get(Constants.ACCESS_TOKEN); + String rawNonce = (String) credentialMap.get(Constants.RAW_NONCE); + + switch (signInMethod) { + case Constants.SIGN_IN_METHOD_PASSWORD: + return EmailAuthProvider.getCredential( + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL)), + Objects.requireNonNull(secret)); + case Constants.SIGN_IN_METHOD_EMAIL_LINK: + return EmailAuthProvider.getCredentialWithLink( + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL)), + (String) Objects.requireNonNull(credentialMap.get(Constants.EMAIL_LINK))); + case Constants.SIGN_IN_METHOD_FACEBOOK: + return FacebookAuthProvider.getCredential(Objects.requireNonNull(accessToken)); + case Constants.SIGN_IN_METHOD_GOOGLE: + return GoogleAuthProvider.getCredential(idToken, accessToken); + case Constants.SIGN_IN_METHOD_TWITTER: + return TwitterAuthProvider.getCredential( + Objects.requireNonNull(accessToken), Objects.requireNonNull(secret)); + case Constants.SIGN_IN_METHOD_GITHUB: + return GithubAuthProvider.getCredential(Objects.requireNonNull(accessToken)); + case Constants.SIGN_IN_METHOD_PHONE: + { + String verificationId = + (String) Objects.requireNonNull(credentialMap.get(Constants.VERIFICATION_ID)); + String smsCode = (String) Objects.requireNonNull(credentialMap.get(Constants.SMS_CODE)); + return PhoneAuthProvider.getCredential(verificationId, smsCode); + } + case Constants.SIGN_IN_METHOD_OAUTH: + { + String providerId = + (String) Objects.requireNonNull(credentialMap.get(Constants.PROVIDER_ID)); + OAuthProvider.CredentialBuilder builder = OAuthProvider.newCredentialBuilder(providerId); + if (accessToken != null) { + builder.setAccessToken(accessToken); + } + if (rawNonce == null) { + builder.setIdToken(Objects.requireNonNull(idToken)); + } else { + builder.setIdTokenWithRawNonce(Objects.requireNonNull(idToken), rawNonce); + } + + return builder.build(); + } + case Constants.SIGN_IN_METHOD_PLAY_GAMES: + { + String serverAuthCode = + (String) Objects.requireNonNull(credentialMap.get(Constants.SERVER_AUTH_CODE)); + return PlayGamesAuthProvider.getCredential(serverAuthCode); + } + default: + return null; + } + } + + static ActionCodeSettings getActionCodeSettings( + @NonNull GeneratedAndroidFirebaseAuth.InternalActionCodeSettings pigeonActionCodeSettings) { + ActionCodeSettings.Builder builder = ActionCodeSettings.newBuilder(); + + builder.setUrl(pigeonActionCodeSettings.getUrl()); + + if (pigeonActionCodeSettings.getDynamicLinkDomain() != null) { + builder.setDynamicLinkDomain(pigeonActionCodeSettings.getDynamicLinkDomain()); + } + + if (pigeonActionCodeSettings.getLinkDomain() != null) { + builder.setLinkDomain(pigeonActionCodeSettings.getLinkDomain()); + } + + builder.setHandleCodeInApp(pigeonActionCodeSettings.getHandleCodeInApp()); + + if (pigeonActionCodeSettings.getAndroidPackageName() != null) { + builder.setAndroidPackageName( + pigeonActionCodeSettings.getAndroidPackageName(), + pigeonActionCodeSettings.getAndroidInstallApp(), + pigeonActionCodeSettings.getAndroidMinimumVersion()); + } + + if (pigeonActionCodeSettings.getIOSBundleId() != null) { + builder.setIOSBundleId(pigeonActionCodeSettings.getIOSBundleId()); + } + + return builder.build(); + } + + static List multiFactorInfoToPigeon( + List hints) { + List pigeonHints = new ArrayList<>(); + for (MultiFactorInfo info : hints) { + if (info instanceof PhoneMultiFactorInfo) { + pigeonHints.add( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo.Builder() + .setPhoneNumber(((PhoneMultiFactorInfo) info).getPhoneNumber()) + .setDisplayName(info.getDisplayName()) + .setEnrollmentTimestamp((double) info.getEnrollmentTimestamp()) + .setUid(info.getUid()) + .setFactorId(info.getFactorId()) + .build()); + + } else { + pigeonHints.add( + new GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo.Builder() + .setDisplayName(info.getDisplayName()) + .setEnrollmentTimestamp((double) info.getEnrollmentTimestamp()) + .setUid(info.getUid()) + .setFactorId(info.getFactorId()) + .build()); + } + } + return pigeonHints; + } + + static List> multiFactorInfoToMap(List hints) { + List> pigeonHints = new ArrayList<>(); + for (GeneratedAndroidFirebaseAuth.InternalMultiFactorInfo info : + multiFactorInfoToPigeon(hints)) { + pigeonHints.add(info.toList()); + } + return pigeonHints; + } + + static GeneratedAndroidFirebaseAuth.InternalActionCodeInfo parseActionCodeResult( + @NonNull ActionCodeResult actionCodeResult) { + GeneratedAndroidFirebaseAuth.InternalActionCodeInfo.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalActionCodeInfo.Builder(); + GeneratedAndroidFirebaseAuth.InternalActionCodeInfoData.Builder builderData = + new GeneratedAndroidFirebaseAuth.InternalActionCodeInfoData.Builder(); + + int operation = actionCodeResult.getOperation(); + + switch (operation) { + case ActionCodeResult.PASSWORD_RESET: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.PASSWORD_RESET); + break; + case ActionCodeResult.VERIFY_EMAIL: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.VERIFY_EMAIL); + break; + case ActionCodeResult.RECOVER_EMAIL: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.RECOVER_EMAIL); + break; + case ActionCodeResult.SIGN_IN_WITH_EMAIL_LINK: + builder.setOperation(GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.EMAIL_SIGN_IN); + break; + case ActionCodeResult.VERIFY_BEFORE_CHANGE_EMAIL: + builder.setOperation( + GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.VERIFY_AND_CHANGE_EMAIL); + break; + case ActionCodeResult.REVERT_SECOND_FACTOR_ADDITION: + builder.setOperation( + GeneratedAndroidFirebaseAuth.ActionCodeInfoOperation.REVERT_SECOND_FACTOR_ADDITION); + break; + } + + ActionCodeInfo actionCodeInfo = actionCodeResult.getInfo(); + + if (actionCodeInfo != null && operation == ActionCodeResult.VERIFY_EMAIL + || operation == ActionCodeResult.PASSWORD_RESET) { + builderData.setEmail(actionCodeInfo.getEmail()); + } else if (operation == ActionCodeResult.RECOVER_EMAIL + || operation == ActionCodeResult.VERIFY_BEFORE_CHANGE_EMAIL) { + ActionCodeEmailInfo actionCodeEmailInfo = + (ActionCodeEmailInfo) Objects.requireNonNull(actionCodeInfo); + builderData.setEmail(actionCodeEmailInfo.getEmail()); + builderData.setPreviousEmail(actionCodeEmailInfo.getPreviousEmail()); + } + + builder.setData(builderData.build()); + + return builder.build(); + } + + static GeneratedAndroidFirebaseAuth.InternalIdTokenResult parseTokenResult( + @NonNull GetTokenResult tokenResult) { + final GeneratedAndroidFirebaseAuth.InternalIdTokenResult.Builder builder = + new GeneratedAndroidFirebaseAuth.InternalIdTokenResult.Builder(); + + builder.setToken(tokenResult.getToken()); + builder.setSignInProvider(tokenResult.getSignInProvider()); + builder.setAuthTimestamp(tokenResult.getAuthTimestamp() * 1000); + builder.setExpirationTimestamp(tokenResult.getExpirationTimestamp() * 1000); + builder.setIssuedAtTimestamp(tokenResult.getIssuedAtTimestamp() * 1000); + builder.setClaims(tokenResult.getClaims()); + builder.setSignInSecondFactor(tokenResult.getSignInSecondFactor()); + + return builder.build(); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle new file mode 100644 index 00000000..38e5e646 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/android/user-agent.gradle @@ -0,0 +1,22 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +String libraryVersionName = "UNKNOWN" +String libraryName = "flutter-fire-auth" +File pubspec = new File(project.projectDir.parentFile, 'pubspec.yaml') + +if (pubspec.exists()) { + String yaml = pubspec.text + // Using \s*['|"]?([^\n|'|"]*)['|"]? to extract version number. + Matcher versionMatcher = Pattern.compile("^version:\\s*['|\"]?([^\\n|'|\"]*)['|\"]?\$", Pattern.MULTILINE).matcher(yaml) + if (versionMatcher.find()) libraryVersionName = versionMatcher.group(1).replaceAll("\\+", "-") +} + +android { + defaultConfig { + // BuildConfig.VERSION_NAME + buildConfigField 'String', 'LIBRARY_VERSION', "\"${libraryVersionName}\"" + // BuildConfig.LIBRARY_NAME + buildConfigField 'String', 'LIBRARY_NAME', "\"${libraryName}\"" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/README.md new file mode 100644 index 00000000..8a9c4d3b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/README.md @@ -0,0 +1,58 @@ +# Firebase Auth Example + +[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) + +Demonstrates how to use the `firebase_auth` plugin and enable multiple auth providers. + +## Phone Auth + +1. Enable phone authentication in the [Firebase console]((https://console.firebase.google.com/u/0/project/_/authentication/providers)). +2. Add test phone number and verification code to the Firebase console. + - For this sample the number `+1 408-555-6969` and verification code `888888` are used. +3. For iOS set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the `GoogleServices-Info.plist` file. +4. Enter the phone number `+1 408-555-6969` and press the `Verify phone number` button. +5. Once the phone number is verified the app displays the test + verification code. +6. Enter the verficication code `888888` and press "Sign in with phone number" +7. Signed in user ID is now displayed in the UI. + +## Google Sign-In + +1. Enable Google authentication in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers). +2. For Android, add your app's package name and SHA-1 fingerprint to the [Settings page](https://console.firebase.google.com/project/_/settings/general) of the Firebase console. Refer to [Authenticating Your Client]('https://developers.google.com/android/guides/client-auth') for details on how to get your app's SHA-1 fingerprint. +3. For iOS set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the `GoogleServices-Info.plist` file (same step for `Phone Auth` above). +4. Select `Google` under `Social Authentication` and click the `Sign In With Google` button. +5. Signed in user's details are displayed in the UI. + +### Running on Web + +Make sure you run the example app on port 5000, since `localhost:5000` is +whitelisted for Google authentication. To do so, run: + +``` +flutter run -d web-server --web-port 5000 +``` + +## GitHub Sign-In +To get your `clientId` and `clientSecret`: +1. Visit https://github.com/settings/developers. +2. Create a new OAuth application. +3. Set **Home Page URL** to `https://react-native-firebase-testing.firebaseapp.com`. +4. Set **Authorization callback URL** to `https://react-native-firebase-testing.firebaseapp.com/__/auth/handler`. +5. After you register your app, add the `clientId` and `clientSecret` to the example app config in [`lib/config.dart`](./lib/config.dart). + +## Twitter Sign-In +Twitter sign in requires you to add keys from Twitter Developer API to Firebase Console, which means you cannot use the provided configurations with the example app, instead, **please create a new Firebase project**, then enable Twitter as an Auth provider (*optionally you can enable the rest of providers supported in this example*). + +To get your `apiKey` and `apiSecretKey` for Twitter: +1. Sign up for a developer account on [Twitter Developer](https://developer.twitter.com). +2. Create a new app and copy your keys. +3. From the dashboard, go to your app settings, then go to OAuth settings and turn on OAuth 1.0a, then add 2 callback URLs: + 1. `flutterfireauth://` + 2. `https://react-native-firebase-testing.firebaseapp.com/__/auth/handler` +4. Add your keys to the example app config in [`lib/config.dart`](./lib/config.dart). + +## Getting Started + +For help getting started with Flutter, view the online +[documentation](https://flutter.dev/). diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml new file mode 100644 index 00000000..201a5ca4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/analysis_options.yaml @@ -0,0 +1,7 @@ +include: ../../../../analysis_options.yaml + +linter: + rules: + avoid_print: false + depend_on_referenced_packages: false + library_private_types_in_public_api: false diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle new file mode 100644 index 00000000..db427be9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/build.gradle @@ -0,0 +1,62 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "io.flutter.plugins.firebase.auth.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + + defaultConfig { + applicationId = "io.flutter.plugins.firebase.auth.example" + // 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. + minSdkVersion = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json new file mode 100644 index 00000000..348716f0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/google-services.json @@ -0,0 +1,615 @@ +{ + "project_info": { + "project_number": "406099696497", + "firebase_url": "https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app", + "project_id": "flutterfire-e2e-tests", + "storage_bucket": "flutterfire-e2e-tests.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:d86a91cc7b338b233574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.analytics.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:a241c4b471513a203574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-7bvmqp0fffe24vm2arng0dtdeh2tvkgl.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.appcheck.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:21d5142deea38dda3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.auth.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-emmujnd7g2ammh5uu9ni6v04p4ateqac.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-in8bfp0nali85oul1o98huoar6eo1vv1.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.auth.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:3ef965ff044efc0b3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dataconnect.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:40da41183cb3d3ff3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.dynamiclinksexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:175ea7a64b2faf5e3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.firestore.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:7ca3394493cc601a3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.functions.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-tvtvuiqogct1gs1s6lh114jeps7hpjm5.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.functions.example", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:6d1c1fbf4688f39c3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.installations.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:74ebb073d7727cd43574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.messaging.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:f54b85cfa36a39f73574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.remoteconfig.example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0d4ed619c031c0ac3574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase.tests" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ib9hj9281l3343cm3nfvvdotaojrthdc.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "5ad0d6d5cbe577ca185b8df246656bebc3957128" + } + }, + { + "client_id": "406099696497-lc54d5l8sp90k39r0bb39ovsgo1s9bek.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase.tests", + "certificate_hash": "909ca1482ef022bbae45a2db6b6d05d807a4c4aa" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:899c6485cfce26c13574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebase_ui_example" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-ltgvphphcckosvqhituel5km2k3aecg8.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "io.flutter.plugins.firebase_ui_example", + "certificate_hash": "a4256c0612686b336af6d138a5479b7dc1ee1af6" + } + }, + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:bc0b12b0605df8633574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecoreexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:0f3f7bfe78b8b7103574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasecrashlyticsexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:406099696497:android:2751af6868a69f073574d0", + "android_client_info": { + "package_name": "io.flutter.plugins.firebasestorageexample" + } + }, + "oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "406099696497-a12gakvts4epfk5pkio7dphc1anjiggc.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "406099696497-0mofiof3ofcgmpmirb6q0fllvb372sme.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "io.flutter.plugins.firebase.example" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74a78b93 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt new file mode 100644 index 00000000..2b88c507 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/kotlin/io/flutter/plugins/firebase/auth/example/MainActivity.kt @@ -0,0 +1,5 @@ +package io.flutter.plugins.firebase.auth.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle new file mode 100644 index 00000000..d2ffbffa --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties new file mode 100644 index 00000000..3b5b324f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle new file mode 100644 index 00000000..a4d924db --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.3.0" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.9.22" apply false +} + +include ":app" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..b3c50a89 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 12.0 + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..88c29144 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,3 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile new file mode 100644 index 00000000..3026bae9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Podfile @@ -0,0 +1,48 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end + + installer.generated_projects.each do |project| + project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + end + end + end +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..9da003ec --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,700 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 081BFEF7D2871CF6AC71DD05 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7B49E087B951778510D20936 /* GoogleService-Info.plist */; }; + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 25A01FAE278D905100D1E790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3DBDE9876E1D48FC8ED096A3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E010D242A20C21968D02B7C9 /* Pods_Runner.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 253804AE278DB662003BA2E2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 2FB2202774601424C6393E3D /* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 7B49E087B951778510D20936 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E010D242A20C21968D02B7C9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ED172FD60C3CC14CD005C328 /* 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 = ""; }; + FD585EE39F3F8D58CFCE5419 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + 3DBDE9876E1D48FC8ED096A3 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 9C7F99B73919EAB4FA657D9E /* Pods */, + 7B49E087B951778510D20936 /* GoogleService-Info.plist */, + DE500BC6E74EB524103D00CE /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 253804AE278DB662003BA2E2 /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 25A01FAD278D905100D1E790 /* GoogleService-Info.plist */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9C7F99B73919EAB4FA657D9E /* Pods */ = { + isa = PBXGroup; + children = ( + 2FB2202774601424C6393E3D /* Pods-Runner.debug.xcconfig */, + ED172FD60C3CC14CD005C328 /* Pods-Runner.release.xcconfig */, + FD585EE39F3F8D58CFCE5419 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + DE500BC6E74EB524103D00CE /* Frameworks */ = { + isa = PBXGroup; + children = ( + E010D242A20C21968D02B7C9 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + AC2BD8C60F3AA720CEA78FA3 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 3E42446041C78F434168F902 /* [CP] Embed Pods Frameworks */, + 7A855ADEADAAB6F658B535DB /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 25A01FAE278D905100D1E790 /* GoogleService-Info.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 081BFEF7D2871CF6AC71DD05 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 3E42446041C78F434168F902 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuthInterop/FirebaseAuthInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework", + "${BUILT_PRODUCTS_DIR}/flutter_facebook_auth/flutter_facebook_auth.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", + "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework/FBAEMKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/FBSDKCoreKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework/FBSDKLoginKit", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAppCheckInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuthInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreExtension.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RecaptchaInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_facebook_auth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBAEMKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit_Basics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKLoginKit.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7A855ADEADAAB6F658B535DB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/firebase_messaging/firebase_messaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/google_sign_in_ios/google_sign_in_ios_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/firebase_messaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/google_sign_in_ios_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + AC2BD8C60F3AA720CEA78FA3 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\\\"${PODS_ROOT}/Headers\\\""; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fc5ae031 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h new file mode 100644 index 00000000..36e21bbf --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m new file mode 100644 index 00000000..70e83933 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..f325ead9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.auth.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:58cbc26aca8e5cf83574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist new file mode 100644 index 00000000..e1ffa4fe --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Info.plist @@ -0,0 +1,98 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Firebase Auth Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + firebase_auth_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + FacebookAppID + 128693022464535 + + FacebookClientToken + 16dbbdf0cfb309034a6ad98ac2a21688 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + fb128693022464535 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIApplicationSupportsIndirectInputEvents + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..16c5d9e0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/Runner.entitlements @@ -0,0 +1,14 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.game-center + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m new file mode 100644 index 00000000..dff6597e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json new file mode 100644 index 00000000..eaca8edd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:58cbc26aca8e5cf83574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart new file mode 100644 index 00000000..b78c948e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/auth.dart @@ -0,0 +1,748 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:barcode_widget/barcode_widget.dart'; +import 'package:collection/collection.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_example/main.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; +import 'package:flutter_signin_button/flutter_signin_button.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +typedef OAuthSignIn = void Function(); + +// If set to true, the app will request notification permissions to use +// silent verification for SMS MFA instead of Recaptcha. +const withSilentVerificationSMSMFA = true; + +/// Helper class to show a snackbar using the passed context. +class ScaffoldSnackbar { + // ignore: public_member_api_docs + ScaffoldSnackbar(this._context); + + /// The scaffold of current context. + factory ScaffoldSnackbar.of(BuildContext context) { + return ScaffoldSnackbar(context); + } + + final BuildContext _context; + + /// Helper method to show a SnackBar. + void show(String message) { + ScaffoldMessenger.of(_context) + ..hideCurrentSnackBar() + ..showSnackBar( + SnackBar( + content: Text(message), + behavior: SnackBarBehavior.floating, + ), + ); + } +} + +/// The mode of the current auth session, either [AuthMode.login] or [AuthMode.register]. +// ignore: public_member_api_docs +enum AuthMode { login, register, phone } + +extension on AuthMode { + String get label => this == AuthMode.login + ? 'Sign in' + : this == AuthMode.phone + ? 'Sign in' + : 'Register'; +} + +/// Entrypoint example for various sign-in flows with Firebase. +class AuthGate extends StatefulWidget { + // ignore: public_member_api_docs + const AuthGate({Key? key}) : super(key: key); + static String? appleAuthorizationCode; + @override + State createState() => _AuthGateState(); +} + +class _AuthGateState extends State { + TextEditingController emailController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + + GlobalKey formKey = GlobalKey(); + String error = ''; + String verificationId = ''; + + AuthMode mode = AuthMode.login; + + bool isLoading = false; + + void setIsLoading() { + setState(() { + isLoading = !isLoading; + }); + } + + late Map authButtons; + + @override + void initState() { + super.initState(); + + if (withSilentVerificationSMSMFA && !kIsWeb) { + FirebaseMessaging messaging = FirebaseMessaging.instance; + messaging.requestPermission(); + } + + if (!kIsWeb && Platform.isMacOS) { + authButtons = { + Buttons.Apple: () => _handleMultiFactorException( + _signInWithApple, + ), + }; + } else { + authButtons = { + Buttons.Apple: () => _handleMultiFactorException( + _signInWithApple, + ), + Buttons.Google: () => _handleMultiFactorException( + _signInWithGoogle, + ), + Buttons.GitHub: () => _handleMultiFactorException( + _signInWithGitHub, + ), + Buttons.Microsoft: () => _handleMultiFactorException( + _signInWithMicrosoft, + ), + Buttons.Twitter: () => _handleMultiFactorException( + _signInWithTwitter, + ), + Buttons.Yahoo: () => _handleMultiFactorException( + _signInWithYahoo, + ), + Buttons.Facebook: () => _handleMultiFactorException( + _signInWithFacebook, + ), + }; + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: FocusScope.of(context).unfocus, + child: Scaffold( + body: Center( + child: SingleChildScrollView( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: SafeArea( + child: Form( + key: formKey, + autovalidateMode: AutovalidateMode.onUserInteraction, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Visibility( + visible: error.isNotEmpty, + child: MaterialBanner( + backgroundColor: + Theme.of(context).colorScheme.error, + content: SelectableText(error), + actions: [ + TextButton( + onPressed: () { + setState(() { + error = ''; + }); + }, + child: const Text( + 'dismiss', + style: TextStyle(color: Colors.white), + ), + ), + ], + contentTextStyle: + const TextStyle(color: Colors.white), + padding: const EdgeInsets.all(10), + ), + ), + const SizedBox(height: 20), + if (mode != AuthMode.phone) + Column( + children: [ + TextFormField( + controller: emailController, + decoration: const InputDecoration( + hintText: 'Email', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + const SizedBox(height: 20), + TextFormField( + controller: passwordController, + obscureText: true, + decoration: const InputDecoration( + hintText: 'Password', + border: OutlineInputBorder(), + ), + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + ], + ), + if (mode == AuthMode.phone) + TextFormField( + controller: phoneController, + decoration: const InputDecoration( + hintText: '+12345678910', + labelText: 'Phone number', + border: OutlineInputBorder(), + ), + validator: (value) => + value != null && value.isNotEmpty + ? null + : 'Required', + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: isLoading + ? null + : () => _handleMultiFactorException( + _emailAndPassword, + ), + child: isLoading + ? const CircularProgressIndicator.adaptive() + : Text(mode.label), + ), + ), + TextButton( + onPressed: _resetPassword, + child: const Text('Forgot password?'), + ), + ...authButtons.keys + .map( + (button) => Padding( + padding: + const EdgeInsets.symmetric(vertical: 5), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: isLoading + ? Container( + color: Colors.grey[200], + height: 50, + width: double.infinity, + ) + : SizedBox( + width: double.infinity, + height: 50, + child: SignInButton( + button, + onPressed: authButtons[button], + ), + ), + ), + ), + ) + .toList(), + SizedBox( + width: double.infinity, + height: 50, + child: OutlinedButton( + onPressed: isLoading + ? null + : () { + if (mode != AuthMode.phone) { + setState(() { + mode = AuthMode.phone; + }); + } else { + setState(() { + mode = AuthMode.login; + }); + } + }, + child: isLoading + ? const CircularProgressIndicator.adaptive() + : Text( + mode != AuthMode.phone + ? 'Sign in with Phone Number' + : 'Sign in with Email and Password', + ), + ), + ), + const SizedBox(height: 20), + if (mode != AuthMode.phone) + RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyLarge, + children: [ + TextSpan( + text: mode == AuthMode.login + ? "Don't have an account? " + : 'You have an account? ', + ), + TextSpan( + text: mode == AuthMode.login + ? 'Register now' + : 'Click to login', + style: const TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = () { + setState(() { + mode = mode == AuthMode.login + ? AuthMode.register + : AuthMode.login; + }); + }, + ), + ], + ), + ), + const SizedBox(height: 10), + RichText( + text: TextSpan( + style: Theme.of(context).textTheme.bodyLarge, + children: [ + const TextSpan(text: 'Or '), + TextSpan( + text: 'continue as guest', + style: const TextStyle(color: Colors.blue), + recognizer: TapGestureRecognizer() + ..onTap = _anonymousAuth, + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ), + ), + ), + ); + } + + Future _resetPassword() async { + String? email; + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Send'), + ), + ], + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Text('Enter your email'), + const SizedBox(height: 20), + TextFormField( + onChanged: (value) { + email = value; + }, + ), + ], + ), + ); + }, + ); + + if (email != null) { + try { + await auth.sendPasswordResetEmail(email: email!); + ScaffoldSnackbar.of(context).show('Password reset email is sent'); + } catch (e) { + ScaffoldSnackbar.of(context).show('Error resetting'); + } + } + } + + Future _anonymousAuth() async { + setIsLoading(); + + try { + await auth.signInAnonymously(); + } on FirebaseAuthException catch (e) { + setState(() { + error = '${e.message}'; + }); + } catch (e) { + setState(() { + error = '$e'; + }); + } finally { + setIsLoading(); + } + } + + Future _handleMultiFactorException( + Future Function() authFunction, + ) async { + setIsLoading(); + try { + await authFunction(); + } on FirebaseAuthMultiFactorException catch (e) { + setState(() { + error = '${e.message}'; + }); + final firstTotpHint = e.resolver.hints + .firstWhereOrNull((element) => element is TotpMultiFactorInfo); + if (firstTotpHint != null) { + final code = await getSmsCodeFromUser(context); + final assertion = await TotpMultiFactorGenerator.getAssertionForSignIn( + firstTotpHint.uid, + code!, + ); + await e.resolver.resolveSignIn(assertion); + return; + } + + final firstPhoneHint = e.resolver.hints + .firstWhereOrNull((element) => element is PhoneMultiFactorInfo); + + if (firstPhoneHint is! PhoneMultiFactorInfo) { + return; + } + await auth.verifyPhoneNumber( + multiFactorSession: e.resolver.session, + multiFactorInfo: firstPhoneHint, + verificationCompleted: (_) {}, + verificationFailed: print, + codeSent: (String verificationId, int? resendToken) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + await e.resolver.resolveSignIn( + PhoneMultiFactorGenerator.getAssertion( + credential, + ), + ); + } on FirebaseAuthException catch (e) { + print(e.message); + } + } + }, + codeAutoRetrievalTimeout: print, + ); + } on FirebaseAuthException catch (e) { + setState(() { + error = '${e.message}'; + }); + } catch (e) { + setState(() { + error = '$e'; + }); + } + setIsLoading(); + } + + Future _emailAndPassword() async { + if (formKey.currentState?.validate() ?? false) { + if (mode == AuthMode.login) { + await auth.signInWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + } else if (mode == AuthMode.register) { + await auth.createUserWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + } else { + await _phoneAuth(); + } + } + } + + Future _phoneAuth() async { + if (mode != AuthMode.phone) { + setState(() { + mode = AuthMode.phone; + }); + } else { + if (kIsWeb) { + final confirmationResult = + await auth.signInWithPhoneNumber(phoneController.text); + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + await confirmationResult.confirm(smsCode); + } + } else { + await auth.verifyPhoneNumber( + phoneNumber: phoneController.text, + verificationCompleted: (_) {}, + verificationFailed: (e) { + setState(() { + error = '${e.message}'; + }); + }, + codeSent: (String verificationId, int? resendToken) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + // Sign the user in (or link) with the credential + await auth.signInWithCredential(credential); + } on FirebaseAuthException catch (e) { + setState(() { + error = e.message ?? ''; + }); + } + } + }, + codeAutoRetrievalTimeout: (e) { + setState(() { + error = e; + }); + }, + ); + } + } + } + + Future _signInWithGoogle() async { + // Trigger the authentication flow + final googleUser = await GoogleSignIn().signIn(); + + // Obtain the auth details from the request + final googleAuth = await googleUser?.authentication; + + if (googleAuth != null) { + // Create a new credential + final credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + // Once signed in, return the UserCredential + await auth.signInWithCredential(credential); + } + } + + Future _signInWithFacebook() async { + // Trigger the authentication flow + // by default we request the email and the public profile + final LoginResult result = await FacebookAuth.instance.login(); + + if (result.status == LoginStatus.success) { + // Get access token + final AccessToken accessToken = result.accessToken!; + + // Login with token + await auth.signInWithCredential( + FacebookAuthProvider.credential(accessToken.tokenString), + ); + } else { + print('Facebook login did not succeed'); + print(result.status); + print(result.message); + } + } +} + +Future _signInWithTwitter() async { + TwitterAuthProvider twitterProvider = TwitterAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(twitterProvider); + } else { + await auth.signInWithProvider(twitterProvider); + } +} + +Future _signInWithApple() async { + final appleProvider = AppleAuthProvider(); + appleProvider.addScope('email'); + + if (kIsWeb) { + // Once signed in, return the UserCredential + await auth.signInWithPopup(appleProvider); + } else { + final userCred = await auth.signInWithProvider(appleProvider); + AuthGate.appleAuthorizationCode = + userCred.additionalUserInfo?.authorizationCode; + } +} + +Future _signInWithYahoo() async { + final yahooProvider = YahooAuthProvider(); + + if (kIsWeb) { + // Once signed in, return the UserCredential + await auth.signInWithPopup(yahooProvider); + } else { + await auth.signInWithProvider(yahooProvider); + } +} + +Future _signInWithGitHub() async { + final githubProvider = GithubAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(githubProvider); + } else { + await auth.signInWithProvider(githubProvider); + } +} + +Future _signInWithMicrosoft() async { + final microsoftProvider = MicrosoftAuthProvider(); + + if (kIsWeb) { + await auth.signInWithPopup(microsoftProvider); + } else { + await auth.signInWithProvider(microsoftProvider); + } +} + +Future getSmsCodeFromUser(BuildContext context) async { + String? smsCode; + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('SMS code:'), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Sign in'), + ), + OutlinedButton( + onPressed: () { + smsCode = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + content: Container( + padding: const EdgeInsets.all(20), + child: TextField( + onChanged: (value) { + smsCode = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ), + ); + }, + ); + + return smsCode; +} + +Future getTotpFromUser( + BuildContext context, + TotpSecret totpSecret, +) async { + String? smsCode; + + final qrCodeUrl = await totpSecret.generateQrCodeUrl( + accountName: FirebaseAuth.instance.currentUser!.email, + issuer: 'Firebase', + ); + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('TOTP code:'), + content: Container( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + BarcodeWidget( + barcode: Barcode.qrCode(), + data: qrCodeUrl, + width: 150, + height: 150, + ), + TextField( + onChanged: (value) { + smsCode = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ElevatedButton( + onPressed: () { + totpSecret.openInOtpApp(qrCodeUrl); + }, + child: const Text('Open in OTP App'), + ), + ], + ), + ), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Sign in'), + ), + OutlinedButton( + onPressed: () { + smsCode = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + ); + }, + ); + + return smsCode; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart new file mode 100644 index 00000000..ba1a88dc --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/firebase_options.dart @@ -0,0 +1,98 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return macos; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyB7wZb2tO1-Fs6GbDADUSTs2Qs3w08Hovw', + appId: '1:406099696497:web:87e25e51afe982cd3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + authDomain: 'flutterfire-e2e-tests.firebaseapp.com', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + measurementId: 'G-JN95N1JV2E', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCdRjCVZlhrq72RuEklEyyxYlBRCYhI2Sw', + appId: '1:406099696497:android:21d5142deea38dda3574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:58cbc26aca8e5cf83574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.auth.example', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c', + appId: '1:406099696497:ios:58cbc26aca8e5cf83574d0', + messagingSenderId: '406099696497', + projectId: 'flutterfire-e2e-tests', + databaseURL: + 'https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app', + storageBucket: 'flutterfire-e2e-tests.appspot.com', + androidClientId: + '406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com', + iosClientId: + '406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com', + iosBundleId: 'io.flutter.plugins.firebase.auth.example', + ); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart new file mode 100755 index 00000000..630c282d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/main.dart @@ -0,0 +1,108 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in_dartio/google_sign_in_dartio.dart'; + +import 'auth.dart'; +import 'firebase_options.dart'; +import 'profile.dart'; + +/// Requires that a Firebase local emulator is running locally. +/// See https://firebase.google.com/docs/auth/flutter/start#optional_prototype_and_test_with_firebase_local_emulator_suite +bool shouldUseFirebaseEmulator = false; + +late final FirebaseApp app; +late final FirebaseAuth auth; + +// Requires that the Firebase Auth emulator is running locally +// e.g via `melos run firebase:emulator`. +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + // We're using the manual installation on non-web platforms since Google sign in plugin doesn't yet support Dart initialization. + // See related issue: https://github.com/flutter/flutter/issues/96391 + + // We store the app and auth to make testing with a named instance easier. + app = await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + auth = FirebaseAuth.instanceFor(app: app); + + if (shouldUseFirebaseEmulator) { + await auth.useAuthEmulator('localhost', 9099); + } + + if (!kIsWeb && Platform.isWindows) { + await GoogleSignInDart.register( + clientId: + '406099696497-g5o9l0blii9970bgmfcfv14pioj90djd.apps.googleusercontent.com', + ); + } + + runApp(const AuthExampleApp()); +} + +/// The entry point of the application. +/// +/// Returns a [MaterialApp]. +class AuthExampleApp extends StatelessWidget { + const AuthExampleApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Firebase Example App', + theme: ThemeData(primarySwatch: Colors.amber), + home: Scaffold( + body: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + Visibility( + visible: constraints.maxWidth >= 1200, + child: Expanded( + child: Container( + height: double.infinity, + color: Theme.of(context).colorScheme.primary, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Firebase Auth Desktop', + style: Theme.of(context).textTheme.headlineMedium, + ), + ], + ), + ), + ), + ), + ), + SizedBox( + width: constraints.maxWidth >= 1200 + ? constraints.maxWidth / 2 + : constraints.maxWidth, + child: StreamBuilder( + stream: auth.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return const ProfilePage(); + } + return const AuthGate(); + }, + ), + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart new file mode 100644 index 00000000..3ccbf5db --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/lib/profile.dart @@ -0,0 +1,391 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:developer'; + +import 'package:collection/collection.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_example/main.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +import 'auth.dart'; + +/// Displayed as a profile image if the user doesn't have one. +const placeholderImage = + 'https://upload.wikimedia.org/wikipedia/commons/c/cd/Portrait_Placeholder_Square.png'; + +/// Profile page shows after sign in or registration. +class ProfilePage extends StatefulWidget { + // ignore: public_member_api_docs + const ProfilePage({Key? key}) : super(key: key); + + @override + // ignore: library_private_types_in_public_api + _ProfilePageState createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + late User user; + late TextEditingController controller; + final phoneController = TextEditingController(); + + String? photoURL; + + bool showSaveButton = false; + bool isLoading = false; + + @override + void initState() { + user = auth.currentUser!; + controller = TextEditingController(text: user.displayName); + + controller.addListener(_onNameChanged); + + auth.userChanges().listen((event) { + if (event != null && mounted) { + setState(() { + user = event; + }); + } + }); + + log(user.toString()); + + super.initState(); + } + + @override + void dispose() { + controller.removeListener(_onNameChanged); + + super.dispose(); + } + + void setIsLoading() { + setState(() { + isLoading = !isLoading; + }); + } + + void _onNameChanged() { + setState(() { + if (controller.text == user.displayName || controller.text.isEmpty) { + showSaveButton = false; + } else { + showSaveButton = true; + } + }); + } + + /// Map User provider data into a list of Provider Ids. + List get userProviders => user.providerData.map((e) => e.providerId).toList(); + + Future updateDisplayName() async { + await user.updateDisplayName(controller.text); + + setState(() { + showSaveButton = false; + }); + + // ignore: use_build_context_synchronously + ScaffoldSnackbar.of(context).show('Name updated'); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: FocusScope.of(context).unfocus, + child: Scaffold( + body: Stack( + children: [ + Center( + child: SizedBox( + width: 400, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + children: [ + CircleAvatar( + maxRadius: 60, + backgroundImage: NetworkImage( + user.photoURL ?? placeholderImage, + ), + ), + Positioned.directional( + textDirection: Directionality.of(context), + end: 0, + bottom: 0, + child: Material( + clipBehavior: Clip.antiAlias, + color: Theme.of(context).colorScheme.secondary, + borderRadius: BorderRadius.circular(40), + child: InkWell( + onTap: () async { + final photoURL = await getPhotoURLFromUser(); + + if (photoURL != null) { + await user.updatePhotoURL(photoURL); + } + }, + radius: 50, + child: const SizedBox( + width: 35, + height: 35, + child: Icon(Icons.edit), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 10), + TextField( + textAlign: TextAlign.center, + controller: controller, + decoration: const InputDecoration( + border: InputBorder.none, + floatingLabelBehavior: FloatingLabelBehavior.never, + alignLabelWithHint: true, + label: Center( + child: Text( + 'Click to add a display name', + ), + ), + ), + ), + Text(user.email ?? user.phoneNumber ?? 'User'), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (userProviders.contains('phone')) + const Icon(Icons.phone), + if (userProviders.contains('password')) + const Icon(Icons.mail), + if (userProviders.contains('google.com')) + SizedBox( + width: 24, + child: Image.network( + 'https://upload.wikimedia.org/wikipedia/commons/0/09/IOS_Google_icon.png', + ), + ), + ], + ), + const SizedBox(height: 20), + TextButton( + onPressed: () { + user.sendEmailVerification(); + }, + child: const Text('Verify Email'), + ), + TextButton( + onPressed: () async { + final a = await user.multiFactor.getEnrolledFactors(); + print(a); + }, + child: const Text('Get enrolled factors'), + ), + TextButton( + onPressed: () async { + if (AuthGate.appleAuthorizationCode != null) { + // The `authorizationCode` is on the user credential. + // e.g. final authorizationCode = userCredential.additionalUserInfo?.authorizationCode; + await FirebaseAuth.instance + .revokeTokenWithAuthorizationCode( + AuthGate.appleAuthorizationCode!, + ); + // You may wish to delete the user at this point + AuthGate.appleAuthorizationCode = null; + } else { + print( + 'Apple `authorizationCode` is null, cannot revoke token.', + ); + } + }, + child: const Text('Revoke Apple auth token'), + ), + TextFormField( + controller: phoneController, + decoration: const InputDecoration( + icon: Icon(Icons.phone), + hintText: '+33612345678', + labelText: 'Phone number', + ), + ), + const SizedBox(height: 20), + TextButton( + onPressed: () async { + final session = await user.multiFactor.getSession(); + await auth.verifyPhoneNumber( + multiFactorSession: session, + phoneNumber: phoneController.text, + verificationCompleted: (_) {}, + verificationFailed: print, + codeSent: ( + String verificationId, + int? resendToken, + ) async { + final smsCode = await getSmsCodeFromUser(context); + + if (smsCode != null) { + // Create a PhoneAuthCredential with the code + final credential = PhoneAuthProvider.credential( + verificationId: verificationId, + smsCode: smsCode, + ); + + try { + await user.multiFactor.enroll( + PhoneMultiFactorGenerator.getAssertion( + credential, + ), + ); + } on FirebaseAuthException catch (e) { + print(e.message); + } + } + }, + codeAutoRetrievalTimeout: print, + ); + }, + child: const Text('Verify Number For MFA'), + ), + TextButton( + onPressed: () async { + final totp = + (await user.multiFactor.getEnrolledFactors()) + .firstWhereOrNull( + (element) => element.factorId == 'totp', + ); + if (totp != null) { + await user.multiFactor.unenroll( + factorUid: + (await user.multiFactor.getEnrolledFactors()) + .firstWhere( + (element) => element.factorId == 'totp', + ) + .uid, + ); + } + final session = await user.multiFactor.getSession(); + final totpSecret = + await TotpMultiFactorGenerator.generateSecret( + session, + ); + print(totpSecret); + final code = + await getTotpFromUser(context, totpSecret); + print('code: $code'); + if (code == null) { + return; + } + await user.multiFactor.enroll( + await TotpMultiFactorGenerator + .getAssertionForEnrollment( + totpSecret, + code, + ), + displayName: 'TOTP', + ); + }, + child: const Text('Enroll TOTP'), + ), + TextButton( + onPressed: () async { + try { + final enrolledFactors = + await user.multiFactor.getEnrolledFactors(); + + await user.multiFactor.unenroll( + factorUid: enrolledFactors.first.uid, + ); + // Show snackbar + ScaffoldSnackbar.of(context).show('MFA unenrolled'); + } catch (e) { + print(e); + } + }, + child: const Text('Unenroll MFA'), + ), + const Divider(), + TextButton( + onPressed: _signOut, + child: const Text('Sign out'), + ), + ], + ), + ), + ), + ), + Positioned.directional( + textDirection: Directionality.of(context), + end: 40, + top: 40, + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: !showSaveButton + ? SizedBox(key: UniqueKey()) + : TextButton( + onPressed: isLoading ? null : updateDisplayName, + child: const Text('Save changes'), + ), + ), + ), + ], + ), + ), + ); + } + + Future getPhotoURLFromUser() async { + String? photoURL; + + // Update the UI - wait for the user to enter the SMS code + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + title: const Text('New image Url:'), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Update'), + ), + OutlinedButton( + onPressed: () { + photoURL = null; + Navigator.of(context).pop(); + }, + child: const Text('Cancel'), + ), + ], + content: Container( + padding: const EdgeInsets.all(20), + child: TextField( + onChanged: (value) { + photoURL = value; + }, + textAlign: TextAlign.center, + autofocus: true, + ), + ), + ); + }, + ); + + return photoURL; + } + + /// Example code for sign out. + Future _signOut() async { + await auth.signOut(); + await GoogleSignIn().signOut(); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..785633d3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5fba960c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile new file mode 100644 index 00000000..9ec46f8c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..4848b09b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,718 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 25A01FB0278D938300D1E790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + B6036D992F5B77F0D48D7883 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1026236A547BC5196614E954 /* Pods_Runner.framework */; }; + C0151CEAF69E3751D6A8FA78 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0B4CF9B1CA3F6E07FE2F953C /* 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 = ""; }; + 1026236A547BC5196614E954 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1E5E064344044E24673A33BD /* 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 = ""; }; + 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 3D7BD4B06D0869EA1407E048 /* 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 = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + B6036D992F5B77F0D48D7883 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 286E7513A68DD39907D77423 /* Pods */ = { + isa = PBXGroup; + children = ( + 3D7BD4B06D0869EA1407E048 /* Pods-Runner.debug.xcconfig */, + 1E5E064344044E24673A33BD /* Pods-Runner.release.xcconfig */, + 0B4CF9B1CA3F6E07FE2F953C /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 286E7513A68DD39907D77423 /* Pods */, + 2F30ED8EF0A1349EA81AEE1A /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 25A01FAF278D938300D1E790 /* GoogleService-Info.plist */, + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1026236A547BC5196614E954 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9C4FABD4FD7B8936CFFEAF31 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + E033F9E34514FF7F419D8FF5 /* [CP] Embed Pods Frameworks */, + 91D69FDB92A2BAB6493D7E50 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = "The Flutter Authors"; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + 25A01FB0278D938300D1E790 /* GoogleService-Info.plist in Resources */, + C0151CEAF69E3751D6A8FA78 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; + }; + 91D69FDB92A2BAB6493D7E50 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/google_sign_in_ios/google_sign_in_ios_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/google_sign_in_ios_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9C4FABD4FD7B8936CFFEAF31 /* [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; + }; + E033F9E34514FF7F419D8FF5 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", + "${BUILT_PRODUCTS_DIR}/facebook_auth_desktop/facebook_auth_desktop.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage_macos/flutter_secure_storage_macos.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/facebook_auth_desktop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage_macos.framework", + ); + 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 */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = YYX2P3XVJ7; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter/ephemeral", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.auth.example; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..764c74b8 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..126b4eb8 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..f653d202 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2020 io.flutter.plugins. All rights reserved. diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..c34fc0a4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..f325ead9 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.406099696497-134k3722m01rtrsklhf3b7k8sqa5r7in + ANDROID_CLIENT_ID + 406099696497-17qn06u8a0dc717u8ul7s49ampk13lul.apps.googleusercontent.com + API_KEY + AIzaSyDooSUGSf63Ghq02_iIhtnmwMDs4HlWS6c + GCM_SENDER_ID + 406099696497 + PLIST_VERSION + 1 + BUNDLE_ID + io.flutter.plugins.firebase.auth.example + PROJECT_ID + flutterfire-e2e-tests + STORAGE_BUCKET + flutterfire-e2e-tests.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:406099696497:ios:58cbc26aca8e5cf83574d0 + DATABASE_URL + https://flutterfire-e2e-tests-default-rtdb.europe-west1.firebasedatabase.app + + \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist new file mode 100644 index 00000000..de633ff2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.448618578101-ja1be10uicsa2dvss16gh4hkqks0vq61 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..cd2171f4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/Runner/Release.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json new file mode 100644 index 00000000..eaca8edd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/macos/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:406099696497:ios:58cbc26aca8e5cf83574d0", + "FIREBASE_PROJECT_ID": "flutterfire-e2e-tests", + "GCM_SENDER_ID": "406099696497" +} \ No newline at end of file diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml new file mode 100644 index 00000000..5068e961 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/pubspec.yaml @@ -0,0 +1,26 @@ +name: firebase_auth_example +description: Demonstrates how to use the firebase_auth plugin. +resolution: workspace + +environment: + sdk: '^3.6.0' + flutter: '>=3.27.0' + +dependencies: + barcode_widget: ^2.0.4 + firebase_auth: ^6.5.4 + firebase_core: ^4.11.0 + firebase_messaging: ^16.4.1 + flutter: + sdk: flutter + flutter_facebook_auth: ^7.1.5 + flutter_signin_button: ^2.0.0 + font_awesome_flutter: ^10.8.0 + google_sign_in: ^6.1.0 + google_sign_in_dartio: ^0.3.0 + +dev_dependencies: + http: ^1.0.0 + +flutter: + uses-material-design: true diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/index.html b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/index.html new file mode 100644 index 00000000..0168402a --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + flutterfire_auth + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json new file mode 100644 index 00000000..88044af3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutterfire_auth", + "short_name": "flutterfire_auth", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt new file mode 100644 index 00000000..13786727 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc new file mode 100644 index 00000000..4477b011 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "io.flutter.plugins.firebase.auth" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 io.flutter.plugins.firebase.auth. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..227a2489 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.cpp @@ -0,0 +1,68 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..2b30f421 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/flutter_window.h @@ -0,0 +1,39 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp new file mode 100644 index 00000000..7a451dd2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/main.cpp @@ -0,0 +1,46 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t* command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h new file mode 100644 index 00000000..3b8e4da1 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resource.h @@ -0,0 +1,22 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp new file mode 100644 index 00000000..9f01ff8b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.cpp @@ -0,0 +1,69 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE* unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = + ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, + nullptr, 0, nullptr, nullptr) - + 1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, + utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h new file mode 100644 index 00000000..67b5c48b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/utils.h @@ -0,0 +1,25 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..45d150e7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.cpp @@ -0,0 +1,284 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: +/// https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = + L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { ++g_active_window_count; } + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { return window_handle_; } + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = + RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, + &light_mode, &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h new file mode 100644 index 00000000..32aab58c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/example/windows/runner/win32_window.h @@ -0,0 +1,106 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec new file mode 100755 index 00000000..eba26315 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth.podspec @@ -0,0 +1,43 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_auth/Sources/firebase_auth/**/*.{h,m}' + s.public_header_files = 'firebase_auth/Sources/firebase_auth/include/Public/**/*.h' + s.private_header_files = 'firebase_auth/Sources/firebase_auth/include/Private/**/*.h' + + s.ios.deployment_target = '15.0' + s.dependency 'Flutter' + + s.dependency 'firebase_core' + s.dependency 'Firebase/Auth', firebase_sdk_version + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-auth\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift new file mode 100644 index 00000000..9793367d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Package.swift @@ -0,0 +1,43 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let libraryVersion = "6.5.4" +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_auth", + platforms: [ + .iOS("15.0") + ], + products: [ + .library(name: "firebase-auth", targets: ["firebase_auth"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core"), + ], + targets: [ + .target( + name: "firebase_auth", + dependencies: [ + .product(name: "FirebaseAuth", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ], + cSettings: [ + .headerSearchPath("include/Private"), + .headerSearchPath("include/Public"), + .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), + .define("LIBRARY_NAME", to: "\"flutter-fire-auth\""), + ] + ) + ] +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m new file mode 100644 index 00000000..5ef9adaf --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m @@ -0,0 +1,56 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTAuthStateChannelStreamHandler { + FIRAuth *_auth; + FIRAuthStateDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{ + @"user" : [NSNull null], + }); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeAuthStateDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m new file mode 100644 index 00000000..606dda68 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -0,0 +1,2376 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; +#import +#import +#if __has_include() +#import +#else +#import +#endif + +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Private/PigeonParser.h" + +#import "include/Public/CustomPigeonHeader.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" +@import CommonCrypto; +#import + +#if __has_include() +#import +#else +#import +#endif + +NSString *const kFLTFirebaseAuthChannelName = @"plugins.flutter.io/firebase_auth"; + +// Argument Keys +NSString *const kAppName = @"appName"; + +// Provider type keys. +NSString *const kSignInMethodPassword = @"password"; +NSString *const kSignInMethodEmailLink = @"emailLink"; +NSString *const kSignInMethodFacebook = @"facebook.com"; +NSString *const kSignInMethodGoogle = @"google.com"; +NSString *const kSignInMethodGameCenter = @"gc.apple.com"; +NSString *const kSignInMethodTwitter = @"twitter.com"; +NSString *const kSignInMethodGithub = @"github.com"; +NSString *const kSignInMethodApple = @"apple.com"; +NSString *const kSignInMethodPhone = @"phone"; +NSString *const kSignInMethodOAuth = @"oauth"; + +// Credential argument keys. +NSString *const kArgumentCredential = @"credential"; +NSString *const kArgumentProviderId = @"providerId"; +NSString *const kArgumentProviderScope = @"scopes"; +NSString *const kArgumentProviderCustomParameters = @"customParameters"; +NSString *const kArgumentSignInMethod = @"signInMethod"; +NSString *const kArgumentSecret = @"secret"; +NSString *const kArgumentIdToken = @"idToken"; +NSString *const kArgumentAccessToken = @"accessToken"; +NSString *const kArgumentRawNonce = @"rawNonce"; +NSString *const kArgumentEmail = @"email"; +NSString *const kArgumentCode = @"code"; +NSString *const kArgumentNewEmail = @"newEmail"; +NSString *const kArgumentEmailLink = kSignInMethodEmailLink; +NSString *const kArgumentToken = @"token"; +NSString *const kArgumentVerificationId = @"verificationId"; +NSString *const kArgumentSmsCode = @"smsCode"; +NSString *const kArgumentActionCodeSettings = @"actionCodeSettings"; +NSString *const kArgumentFamilyName = @"familyName"; +NSString *const kArgumentGivenName = @"givenName"; +NSString *const kArgumentMiddleName = @"middleName"; +NSString *const kArgumentNickname = @"nickname"; +NSString *const kArgumentNamePrefix = @"namePrefix"; +NSString *const kArgumentNameSuffix = @"nameSuffix"; + +// MultiFactor +NSString *const kArgumentMultiFactorHints = @"multiFactorHints"; +NSString *const kArgumentMultiFactorSessionId = @"multiFactorSessionId"; +NSString *const kArgumentMultiFactorResolverId = @"multiFactorResolverId"; +NSString *const kArgumentMultiFactorInfo = @"multiFactorInfo"; + +// Manual error codes & messages. +NSString *const kErrCodeNoCurrentUser = @"no-current-user"; +NSString *const kErrMsgNoCurrentUser = @"No user currently signed in."; +NSString *const kErrCodeInvalidCredential = @"invalid-credential"; +NSString *const kErrMsgInvalidCredential = + @"The supplied auth credential is malformed, has expired or is not " + @"currently supported."; + +// Used for caching credentials between Method Channel method calls. +static NSMutableDictionary *credentialsMap; + +@interface FLTFirebaseAuthPlugin () +@property(nonatomic, retain) NSObject *messenger; +@property(strong, nonatomic) FIROAuthProvider *authProvider; +// Used to keep the user who wants to link with Apple Sign In +@property(strong, nonatomic) FIRUser *linkWithAppleUser; +@property(strong, nonatomic) FIRAuth *signInWithAppleAuth; +@property BOOL isReauthenticatingWithApple; +@property(strong, nonatomic) NSString *currentNonce; +@property(strong, nonatomic) void (^appleCompletion) + (InternalUserCredential *_Nullable, FlutterError *_Nullable); +@property(strong, nonatomic) AuthPigeonFirebaseApp *appleArguments; +/// YES while an `ASAuthorizationController` Sign in with Apple flow is active. +@property(nonatomic, assign) BOOL appleSignInRequestInFlight; + +@end + +@implementation FLTFirebaseAuthPlugin { + // Map an id to a MultiFactorSession object. + NSMutableDictionary *_multiFactorSessionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorResolverMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorAssertionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorTotpSecretMap; + + // Emulator host/port per app, used to build REST URLs for workarounds. + NSMutableDictionary *_emulatorConfigs; + + NSObject *_binaryMessenger; + NSMutableDictionary *_eventChannels; + NSMutableDictionary *> *_streamHandlers; + NSData *_apnsToken; +} + +#pragma mark - FlutterPlugin + +- (instancetype)init:(NSObject *)messenger { + self = [super init]; + if (self) { + [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:self]; + credentialsMap = [NSMutableDictionary dictionary]; + _binaryMessenger = messenger; + _eventChannels = [NSMutableDictionary dictionary]; + _streamHandlers = [NSMutableDictionary dictionary]; + + _multiFactorSessionMap = [NSMutableDictionary dictionary]; + _multiFactorResolverMap = [NSMutableDictionary dictionary]; + _multiFactorAssertionMap = [NSMutableDictionary dictionary]; + _multiFactorTotpSecretMap = [NSMutableDictionary dictionary]; + _emulatorConfigs = [NSMutableDictionary dictionary]; + } + return self; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:kFLTFirebaseAuthChannelName + binaryMessenger:[registrar messenger]]; + FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init:registrar.messenger]; + + [registrar addMethodCallDelegate:instance channel:channel]; + + [registrar publish:instance]; + [registrar addApplicationDelegate:instance]; +#if !TARGET_OS_OSX + if (@available(iOS 13.0, *)) { + if ([registrar respondsToSelector:@selector(addSceneDelegate:)]) { + [registrar performSelector:@selector(addSceneDelegate:) withObject:instance]; + } + } +#endif + SetUpFirebaseAuthHostApi(registrar.messenger, instance); + SetUpFirebaseAuthUserHostApi(registrar.messenger, instance); + SetUpMultiFactorUserHostApi(registrar.messenger, instance); + SetUpMultiFactoResolverHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpSecretHostApi(registrar.messenger, instance); +} + ++ (FlutterError *)convertToFlutterError:(NSError *)error { + NSString *code = @"unknown"; + NSString *message = @"An unknown error has occurred."; + + if (error == nil) { + return [FlutterError errorWithCode:code message:message details:@{}]; + } + + // code + if ([error userInfo][FIRAuthErrorUserInfoNameKey] != nil) { + // See [FIRAuthErrorCodeString] for list of codes. + // Codes are in the format "ERROR_SOME_NAME", converting below to the format + // required in Dart. ERROR_SOME_NAME -> SOME_NAME + NSString *firebaseErrorCode = [error userInfo][FIRAuthErrorUserInfoNameKey]; + code = [firebaseErrorCode stringByReplacingOccurrencesOfString:@"ERROR_" withString:@""]; + // SOME_NAME -> SOME-NAME + code = [code stringByReplacingOccurrencesOfString:@"_" withString:@"-"]; + // SOME-NAME -> some-name + code = [code lowercaseString]; + } + + // message + if ([error userInfo][NSLocalizedDescriptionKey] != nil) { + message = [error userInfo][NSLocalizedDescriptionKey]; + } + + NSMutableDictionary *additionalData = [NSMutableDictionary dictionary]; + // additionalData.email + if ([error userInfo][FIRAuthErrorUserInfoEmailKey] != nil) { + additionalData[kArgumentEmail] = [error userInfo][FIRAuthErrorUserInfoEmailKey]; + } + // We want to store the credential if present for future sign in if the exception contains a + // credential, we pass a token back to Flutter to allow retrieval of the credential. + NSNumber *token = [FLTFirebaseAuthPlugin storeAuthCredentialIfPresent:error]; + + // additionalData.authCredential + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + additionalData[@"authCredential"] = [PigeonParser getPigeonAuthCredential:authCredential + token:token]; + } + + // Manual message overrides to ensure messages/codes matches other platforms. + if ([message isEqual:@"The password must be 6 characters long or more."]) { + message = @"Password should be at least 6 characters"; + } + + return [FlutterError errorWithCode:code message:message details:additionalData]; +} + ++ (id)getNSDictionaryFromAuthCredential:(FIRAuthCredential *)authCredential { + if (authCredential == nil) { + return [NSNull null]; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + return @{ + kArgumentProviderId : authCredential.provider, + // Note: "signInMethod" does not exist on iOS SDK, so using provider + // instead. + kArgumentSignInMethod : authCredential.provider, + kArgumentToken : @([authCredential hash]), + kArgumentAccessToken : accessToken ?: [NSNull null], + }; +} + +- (void)cleanupWithCompletion:(void (^)(void))completion { + // Cleanup credentials. + [credentialsMap removeAllObjects]; + + for (FlutterEventChannel *channel in self->_eventChannels.allValues) { + [channel setStreamHandler:nil]; + } + [self->_eventChannels removeAllObjects]; + for (NSObject *handler in self->_streamHandlers.allValues) { + [handler onCancelWithArguments:nil]; + } + [self->_streamHandlers removeAllObjects]; + + if (completion != nil) completion(); +} + +- (void)detachFromEngineForRegistrar:(NSObject *)registrar { + [self cleanupWithCompletion:nil]; +} + +#pragma mark - AppDelegate + +#if TARGET_OS_IPHONE +#if !__has_include() +- (BOOL)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if ([[FIRAuth auth] canHandleNotification:notification]) { + completionHandler(UIBackgroundFetchResultNoData); + return YES; + } + return NO; +} +#endif + +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + _apnsToken = deviceToken; +} + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + return [[FIRAuth auth] canHandleURL:url]; +} + +#pragma mark - SceneDelegate + +- (BOOL)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0)) { + for (UIOpenURLContext *urlContext in URLContexts) { + if ([[FIRAuth auth] canHandleURL:urlContext.URL]) { + return YES; + } + } + return NO; +} +#endif + +#pragma mark - FLTFirebasePlugin + +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + [self cleanupWithCompletion:completion]; +} + +- (NSString *_Nonnull)firebaseLibraryName { + return @LIBRARY_NAME; +} + +- (NSString *_Nonnull)firebaseLibraryVersion { + return @LIBRARY_VERSION; +} + +- (NSString *_Nonnull)flutterChannelName { + return kFLTFirebaseAuthChannelName; +} + +- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp { + FIRAuth *auth = [FIRAuth authWithApp:firebaseApp]; + return @{ + @"APP_LANGUAGE_CODE" : (id)[auth languageCode] ?: [NSNull null], + @"APP_CURRENT_USER" : [auth currentUser] + ? [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + : [NSNull null], + }; +} + +#pragma mark - Firebase Auth API + +// Adapted from +// https://auth0.com/docs/api-auth/tutorials/nonce#generate-a-cryptographically-random-nonce Used +// for Apple Sign In +- (NSString *)randomNonce:(NSInteger)length { + NSAssert(length > 0, @"Expected nonce to have positive length"); + NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; + NSMutableString *result = [NSMutableString string]; + NSInteger remainingLength = length; + + while (remainingLength > 0) { + NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; + for (NSInteger i = 0; i < 16; i++) { + uint8_t random = 0; + int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); + NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); + + [randoms addObject:@(random)]; + } + + for (NSNumber *random in randoms) { + if (remainingLength == 0) { + break; + } + + if (random.unsignedIntValue < characterSet.length) { + unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; + [result appendFormat:@"%C", character]; + remainingLength--; + } + } + } + + return [result copy]; +} + +- (NSString *)stringBySha256HashingString:(NSString *)input { + const char *string = [input UTF8String]; + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(string, (CC_LONG)strlen(string), result); + + NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hashed appendFormat:@"%02x", result[i]]; + } + return hashed; +} + +static void handleSignInWithApple(FLTFirebaseAuthPlugin *object, FIRAuthDataResult *authResult, + NSString *authorizationCode, NSError *error) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + object.appleCompletion; + if (completion == nil) { + object.appleSignInRequestInFlight = NO; + return; + } + + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + [object handleMultiFactorError:object.appleArguments completion:completion withError:error]; + } else { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:authorizationCode], + nil); +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithAuthorization:(ASAuthorization *)authorization + API_AVAILABLE(macos(10.15), ios(13.0)) { + if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { + ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; + NSString *rawNonce = self.currentNonce; + NSAssert(rawNonce != nil, + @"Invalid state: A login callback was received, but no login request was sent."); + + if (appleIDCredential.identityToken == nil) { + NSLog(@"Unable to fetch identity token."); + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + return; + } + + NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken + encoding:NSUTF8StringEncoding]; + if (idToken == nil) { + NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); + } + + NSString *authorizationCode = nil; + if (appleIDCredential.authorizationCode != nil) { + authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode + encoding:NSUTF8StringEncoding]; + } + + FIROAuthCredential *credential = + [FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:appleIDCredential.fullName]; + + if (self.isReauthenticatingWithApple == YES) { + self.isReauthenticatingWithApple = NO; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [[FIRAuth.auth currentUser] + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else if (self.linkWithAppleUser != nil) { + FIRUser *userToLink = self.linkWithAppleUser; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [userToLink linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, NSError *error) { + self.linkWithAppleUser = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else { + FIRAuth *signInAuth = + self.signInWithAppleAuth != nil ? self.signInWithAppleAuth : FIRAuth.auth; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [signInAuth signInWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + self.signInWithAppleAuth = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + } + } else { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + } +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithError:(NSError *)error API_AVAILABLE(macos(10.15), ios(13.0)) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + + NSLog(@"Sign in with Apple errored: %@", error); + if (completion == nil) { + return; + } + + switch (error.code) { + case ASAuthorizationErrorCanceled: + completion(nil, [FlutterError errorWithCode:@"canceled" + message:@"The user canceled the authorization attempt." + details:nil]); + break; + + case ASAuthorizationErrorInvalidResponse: + completion(nil, [FlutterError + errorWithCode:@"invalid-response" + message:@"The authorization request received an invalid response." + details:nil]); + break; + + case ASAuthorizationErrorNotHandled: + completion(nil, [FlutterError errorWithCode:@"not-handled" + message:@"The authorization request wasn’t handled." + details:nil]); + break; + + case ASAuthorizationErrorFailed: + completion(nil, [FlutterError errorWithCode:@"failed" + message:@"The authorization attempt failed." + details:nil]); + break; + + case ASAuthorizationErrorUnknown: + default: + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + break; + } +} + +- (void)handleInternalError:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *)error { + const NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; + if (underlyingError != nil) { + const NSDictionary *details = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDeserializedResponseKey"]; + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:details]); + return; + } + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:nil]); +} + +- (void)handleMultiFactorError:(AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *_Nullable)error { + FIRMultiFactorResolver *resolver = + (FIRMultiFactorResolver *)error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; + + NSArray *hints = resolver.hints; + FIRMultiFactorSession *session = resolver.session; + + NSString *sessionId = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[sessionId] = session; + + NSString *resolverId = [[NSUUID UUID] UUIDString]; + self->_multiFactorResolverMap[resolverId] = resolver; + + NSMutableArray *pigeonHints = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in hints) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + InternalMultiFactorInfo *object = [InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]; + + [pigeonHints addObject:object.toList]; + } + + NSDictionary *output = @{ + kAppName : app.appName, + kArgumentMultiFactorHints : pigeonHints, + kArgumentMultiFactorSessionId : sessionId, + kArgumentMultiFactorResolverId : resolverId, + }; + completion(nil, [FlutterError errorWithCode:@"second-factor-required" + message:error.description + details:output]); +} + +static void launchAppleSignInRequest(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + InternalSignInProvider *signInProvider, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (@available(iOS 13.0, macOS 10.15, *)) { + if (object.appleSignInRequestInFlight) { + completion(nil, + [FlutterError errorWithCode:@"operation-not-allowed" + message:@"A Sign in with Apple request is already in progress." + details:nil]); + return; + } + + NSString *nonce = [object randomNonce:32]; + object.currentNonce = nonce; + object.appleCompletion = completion; + object.appleArguments = app; + object.appleSignInRequestInFlight = YES; + + ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; + + ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; + NSMutableArray *requestedScopes = [NSMutableArray arrayWithCapacity:2]; + if ([signInProvider.scopes containsObject:@"name"]) { + [requestedScopes addObject:ASAuthorizationScopeFullName]; + } + if ([signInProvider.scopes containsObject:@"email"]) { + [requestedScopes addObject:ASAuthorizationScopeEmail]; + } + request.requestedScopes = [requestedScopes copy]; + request.nonce = [object stringBySha256HashingString:nonce]; + + ASAuthorizationController *authorizationController = + [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[ request ]]; + authorizationController.delegate = object; + authorizationController.presentationContextProvider = object; + [authorizationController performRequests]; + } else { + NSLog(@"Sign in with Apple was introduced in iOS 13, update your Podfile with platform :ios, " + @"'13.0'"); + } +} + +static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + FIRAuth *auth, FIRAuthCredential *credentials, NSError *error, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (error) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [object handleMultiFactorError:app completion:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + if (credentials) { + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; + + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + // Removing since it's not parsed and causing issue when sending back the + // object to Flutter + NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; + [mutableUserInfo + removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + NSError *modifiedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:mutableUserInfo]; + + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:userInfo[@"NSLocalizedDescription"] + details:modifiedError.userInfo]); + + } else if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is + // buried in underlying error. + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:firebaseDictionary[@"message"]]); + } else { + completion(nil, [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:error.userInfo]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; + } +} + +#pragma mark - Utilities + ++ (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + // We temporarily store the non-serializable credential so the + // Dart API can consume these at a later time. + NSNumber *authCredentialHash = @([authCredential hash]); + credentialsMap[authCredentialHash] = authCredential; + return authCredentialHash; + } + return nil; +} + +- (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { + FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; + FIRAuth *auth = [FIRAuth authWithApp:app]; + + auth.tenantID = pigeonApp.tenantId; + auth.customAuthDomain = [FLTFirebaseCorePlugin getCustomDomain:app.name]; + // Auth's `customAuthDomain` supersedes value from `getCustomDomain` set by `initializeApp` + if (pigeonApp.customAuthDomain != nil) { + auth.customAuthDomain = pigeonApp.customAuthDomain; + } + + return auth; +} + +- (void)getFIRAuthCredentialFromArguments:(NSDictionary *)arguments + app:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FIRAuthCredential *credential, + NSError *error))completion { + // If the credential dictionary contains a token, it means a native one has + // been stored for later usage, so we'll attempt to retrieve it here. + if (arguments[kArgumentToken] != nil && ![arguments[kArgumentToken] isEqual:[NSNull null]]) { + NSNumber *credentialHashCode = arguments[kArgumentToken]; + if (credentialsMap[credentialHashCode] != nil) { + completion(credentialsMap[credentialHashCode], nil); + return; + } + } + + NSString *signInMethod = arguments[kArgumentSignInMethod]; + + if ([signInMethod isEqualToString:kSignInMethodGameCenter]) { + // Game Center Games is different to other providers, it requires below callback to get a + // credential. This is why getFIRAuthCredentialFromArguments now requires a completion() + // callback + [FIRGameCenterAuthProvider + getCredentialWithCompletion:^(FIRAuthCredential *credential, NSError *error) { + if (error) { + completion(nil, error); + } else { + completion(credential, nil); + } + }]; + return; + } + + NSString *secret = arguments[kArgumentSecret] == [NSNull null] ? nil : arguments[kArgumentSecret]; + NSString *idToken = + arguments[kArgumentIdToken] == [NSNull null] ? nil : arguments[kArgumentIdToken]; + NSString *accessToken = + arguments[kArgumentAccessToken] == [NSNull null] ? nil : arguments[kArgumentAccessToken]; + NSString *rawNonce = + arguments[kArgumentRawNonce] == [NSNull null] ? nil : arguments[kArgumentRawNonce]; + + // Password Auth + if ([signInMethod isEqualToString:kSignInMethodPassword]) { + NSString *email = arguments[kArgumentEmail]; + completion([FIREmailAuthProvider credentialWithEmail:email password:secret], nil); + return; + } + + // Email Link Auth + if ([signInMethod isEqualToString:kSignInMethodEmailLink]) { + NSString *email = arguments[kArgumentEmail]; + NSString *emailLink = arguments[kArgumentEmailLink]; + completion([FIREmailAuthProvider credentialWithEmail:email link:emailLink], nil); + return; + } + + // Facebook Auth + if ([signInMethod isEqualToString:kSignInMethodFacebook]) { + completion([FIRFacebookAuthProvider credentialWithAccessToken:accessToken], nil); + return; + } + + // Google Auth + if ([signInMethod isEqualToString:kSignInMethodGoogle]) { + completion([FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken], nil); + return; + } + + // Twitter Auth + if ([signInMethod isEqualToString:kSignInMethodTwitter]) { + completion([FIRTwitterAuthProvider credentialWithToken:accessToken secret:secret], nil); + return; + } + + // GitHub Auth + if ([signInMethod isEqualToString:kSignInMethodGithub]) { + completion([FIRGitHubAuthProvider credentialWithToken:accessToken], nil); + return; + } + + // Phone Auth - Only supported on iOS + if ([signInMethod isEqualToString:kSignInMethodPhone]) { +#if TARGET_OS_IPHONE + NSString *verificationId = arguments[kArgumentVerificationId]; + NSString *smsCode = arguments[kArgumentSmsCode]; + completion([[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:verificationId + verificationCode:smsCode], + nil); + return; +#else + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); + return; +#endif + } + // Apple Auth + if ([signInMethod isEqualToString:kSignInMethodApple]) { + if (idToken && rawNonce) { + // Credential with idToken, rawNonce and fullName + NSPersonNameComponents *fullName = [[NSPersonNameComponents alloc] init]; + fullName.givenName = + arguments[kArgumentGivenName] == [NSNull null] ? nil : arguments[kArgumentGivenName]; + fullName.familyName = + arguments[kArgumentFamilyName] == [NSNull null] ? nil : arguments[kArgumentFamilyName]; + fullName.nickname = + arguments[kArgumentNickname] == [NSNull null] ? nil : arguments[kArgumentNickname]; + fullName.namePrefix = + arguments[kArgumentNamePrefix] == [NSNull null] ? nil : arguments[kArgumentNamePrefix]; + fullName.nameSuffix = + arguments[kArgumentNameSuffix] == [NSNull null] ? nil : arguments[kArgumentNameSuffix]; + fullName.middleName = + arguments[kArgumentMiddleName] == [NSNull null] ? nil : arguments[kArgumentMiddleName]; + + completion([FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:fullName], + nil); + return; + } + } + // OAuth + if ([signInMethod isEqualToString:kSignInMethodOAuth]) { + NSString *providerId = arguments[kArgumentProviderId]; + completion([FIROAuthProvider credentialWithProviderID:providerId + IDToken:idToken + rawNonce:rawNonce + accessToken:accessToken], + nil); + return; + } + + NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", signInMethod); + completion(nil, nil); + return; +} + +- (void)ensureAPNSTokenSetting { +#if !TARGET_OS_OSX + FIRApp *defaultApp = [FIRApp defaultApp]; + if (defaultApp) { + if ([FIRAuth auth].APNSToken == nil && _apnsToken != nil) { + [[FIRAuth auth] setAPNSToken:_apnsToken type:FIRAuthAPNSTokenTypeUnknown]; + _apnsToken = nil; + } + } +#endif +} + +- (FIRMultiFactor *)getAppMultiFactorFromPigeon:(nonnull AuthPigeonFirebaseApp *)app { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + return currentUser.multiFactor; +} + +- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController: + (nonnull ASAuthorizationController *)controller API_AVAILABLE(macos(10.15), ios(13.0)) { +#if TARGET_OS_OSX + return [[NSApplication sharedApplication] keyWindow]; +#else + // UIApplication.keyWindow is deprecated in iOS 13+ with UIScene lifecycle. + // Walk the connected scenes to find the foreground active window. + if (@available(iOS 15.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.keyWindow) { + return windowScene.keyWindow; + } + } + } + } else if (@available(iOS 13.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + return window; + } + } + } + } + } + return [[UIApplication sharedApplication] keyWindow]; +#endif +} + +- (void)enrollPhoneApp:(nonnull AuthPigeonFirebaseApp *)app + assertion:(nonnull InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + completion([FlutterError errorWithCode:@"unsupported-platform" + message:@"Phone authentication is not supported on macOS" + details:nil]); +#else + + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + + FIRMultiFactorAssertion *multiFactorAssertion = + [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; + + [multiFactor enrollWithAssertion:multiFactorAssertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +#endif +} + +- (void)getEnrolledFactorsApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + NSArray *enrolledFactors = [multiFactor enrolledFactors]; + + NSMutableArray *results = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in enrolledFactors) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + [results addObject:[InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]]; + } + + completion(results, nil); +} + +- (void)getSessionApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalMultiFactorSession *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session, + NSError *_Nullable error) { + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[UUID] = session; + + InternalMultiFactorSession *pigeonSession = [InternalMultiFactorSession makeWithId:UUID]; + completion(pigeonSession, nil); + }]; +} + +- (void)unenrollApp:(nonnull AuthPigeonFirebaseApp *)app + factorUid:(nonnull NSString *)factorUid + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor unenrollWithFactorUID:factorUid + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"unenroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)enrollTotpApp:(nonnull AuthPigeonFirebaseApp *)app + assertionId:(nonnull NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRMultiFactorAssertion *assertion = _multiFactorAssertionMap[assertionId]; + + [multiFactor enrollWithAssertion:assertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)resolveSignInResolverId:(nonnull NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorResolver *resolver = _multiFactorResolverMap[resolverId]; + + FIRMultiFactorAssertion *multiFactorAssertion; + + if (assertion != nil) { +#if TARGET_OS_IPHONE + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider provider] credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + multiFactorAssertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; +#endif + } else if (totpAssertionId != nil) { + multiFactorAssertion = _multiFactorAssertionMap[totpAssertionId]; + } else { + completion(nil, + [FlutterError errorWithCode:@"resolve-signin-failed" + message:@"Neither assertion nor totpAssertionId were provided" + details:nil]); + return; + } + + [resolver + resolveSignInWithAssertion:multiFactorAssertion + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error == nil) { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } else { + completion(nil, [FlutterError errorWithCode:@"resolve-signin-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)generateSecretSessionId:(nonnull NSString *)sessionId + completion:(nonnull void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorSession *multiFactorSession = _multiFactorSessionMap[sessionId]; + + [FIRTOTPMultiFactorGenerator + generateSecretWithMultiFactorSession:multiFactorSession + completion:^(FIRTOTPSecret *_Nullable secret, + NSError *_Nullable error) { + if (error == nil) { + self->_multiFactorTotpSecretMap[secret.sharedSecretKey] = + secret; + completion([PigeonParser getPigeonTotpSecret:secret], nil); + } else { + completion( + nil, [FlutterError errorWithCode:@"generate-secret-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)getAssertionForEnrollmentSecretKey:(nonnull NSString *)secretKey + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForEnrollmentWithSecret:totpSecret + oneTimePassword:oneTimePassword]; + + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)getAssertionForSignInEnrollmentId:(nonnull NSString *)enrollmentId + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForSignInWithEnrollmentID:enrollmentId + oneTimePassword:oneTimePassword]; + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)generateQrCodeUrlSecretKey:(nonnull NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + completion([totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer], nil); +} + +- (void)openInOtpAppSecretKey:(nonnull NSString *)secretKey + qrCodeUrl:(nonnull NSString *)qrCodeUrl + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + [totpSecret openInOTPAppWithQRCodeURL:qrCodeUrl]; + completion(nil); +} + +- (void)applyActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth applyActionCode:code + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeTokenWithAuthorizationCodeApp:(nonnull AuthPigeonFirebaseApp *)app + authorizationCode:(nonnull NSString *)authorizationCode + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth revokeTokenWithAuthorizationCode:authorizationCode + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeAccessTokenApp:(nonnull AuthPigeonFirebaseApp *)app + accessToken:(nonnull NSString *)accessToken + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + // `revokeAccessToken(_:)` is currently Android-only on the Firebase SDK. + // On Apple platforms use `revokeTokenWithAuthorizationCode:` instead. + completion([FlutterError errorWithCode:@"unsupported-platform-operation" + message:@"revokeAccessToken is not supported on iOS/macOS. " + @"Use revokeTokenWithAuthorizationCode instead." + details:nil]); +} + +- (void)checkActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth checkActionCode:code + completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + InternalActionCodeInfo *result = [self parseActionCode:info]; + if (result.operation == ActionCodeInfoOperationUnknown) { + // Workaround: Firebase iOS SDK >=11.12.0 returns .unknown because + // actionCodeOperation(forRequestType:) only matches camelCase but the + // REST API returns SCREAMING_SNAKE_CASE (e.g. "VERIFY_EMAIL"). + // Re-fetch the raw requestType via REST to resolve the operation. + // See: https://github.com/firebase/flutterfire/issues/17452 + [self resolveActionCodeOperationForApp:app + code:code + fallbackInfo:result + completion:completion]; + } else { + completion(result, nil); + } + } + }]; +} + +- (InternalActionCodeInfo *_Nullable)parseActionCode:(nonnull FIRActionCodeInfo *)info { + InternalActionCodeInfoData *data = [InternalActionCodeInfoData makeWithEmail:info.email + previousEmail:info.previousEmail]; + + ActionCodeInfoOperation operation; + + if (info.operation == FIRActionCodeOperationPasswordReset) { + operation = ActionCodeInfoOperationPasswordReset; + } else if (info.operation == FIRActionCodeOperationVerifyEmail) { + operation = ActionCodeInfoOperationVerifyEmail; + } else if (info.operation == FIRActionCodeOperationRecoverEmail) { + operation = ActionCodeInfoOperationRecoverEmail; + } else if (info.operation == FIRActionCodeOperationEmailLink) { + operation = ActionCodeInfoOperationEmailSignIn; + } else if (info.operation == FIRActionCodeOperationVerifyAndChangeEmail) { + operation = ActionCodeInfoOperationVerifyAndChangeEmail; + } else if (info.operation == FIRActionCodeOperationRevertSecondFactorAddition) { + operation = ActionCodeInfoOperationRevertSecondFactorAddition; + } else { + operation = ActionCodeInfoOperationUnknown; + } + + return [InternalActionCodeInfo makeWithOperation:operation data:data]; +} + +/// Maps a raw requestType string (either camelCase or SCREAMING_SNAKE_CASE) to +/// the corresponding Pigeon enum value. ++ (ActionCodeInfoOperation)operationFromRequestType:(nullable NSString *)requestType { + static NSDictionary *mapping; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mapping = @{ + @"PASSWORD_RESET" : @(ActionCodeInfoOperationPasswordReset), + @"resetPassword" : @(ActionCodeInfoOperationPasswordReset), + @"VERIFY_EMAIL" : @(ActionCodeInfoOperationVerifyEmail), + @"verifyEmail" : @(ActionCodeInfoOperationVerifyEmail), + @"RECOVER_EMAIL" : @(ActionCodeInfoOperationRecoverEmail), + @"recoverEmail" : @(ActionCodeInfoOperationRecoverEmail), + @"EMAIL_SIGNIN" : @(ActionCodeInfoOperationEmailSignIn), + @"signIn" : @(ActionCodeInfoOperationEmailSignIn), + @"VERIFY_AND_CHANGE_EMAIL" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"verifyAndChangeEmail" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"REVERT_SECOND_FACTOR_ADDITION" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + @"revertSecondFactorAddition" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + }; + }); + + NSNumber *value = mapping[requestType]; + return value ? (ActionCodeInfoOperation)value.integerValue : ActionCodeInfoOperationUnknown; +} + +/// Calls the Identity Toolkit REST API directly to retrieve the raw requestType +/// string, which the iOS SDK fails to parse correctly. Falls back to the original +/// result if the REST call fails for any reason. +- (void)resolveActionCodeOperationForApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + fallbackInfo:(nonnull InternalActionCodeInfo *)fallbackInfo + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:app.appName]; + NSString *apiKey = firebaseApp.options.APIKey; + + NSString *baseURL; + NSDictionary *emulatorConfig = _emulatorConfigs[app.appName]; + if (emulatorConfig) { + baseURL = [NSString stringWithFormat:@"http://%@:%@/identitytoolkit.googleapis.com", + emulatorConfig[@"host"], emulatorConfig[@"port"]]; + } else { + baseURL = @"https://identitytoolkit.googleapis.com"; + } + + NSString *urlString = + [NSString stringWithFormat:@"%@/v1/accounts:resetPassword?key=%@", baseURL, apiKey]; + NSURL *url = [NSURL URLWithString:urlString]; + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = @"POST"; + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + request.HTTPBody = [NSJSONSerialization dataWithJSONObject:@{@"oobCode" : code} + options:0 + error:nil]; + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error || !data) { + completion(fallbackInfo, nil); + return; + } + + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (!json || json[@"error"]) { + completion(fallbackInfo, nil); + return; + } + + ActionCodeInfoOperation operation = + [FLTFirebaseAuthPlugin operationFromRequestType:json[@"requestType"]]; + + if (operation != ActionCodeInfoOperationUnknown) { + completion([InternalActionCodeInfo makeWithOperation:operation data:fallbackInfo.data], + nil); + } else { + completion(fallbackInfo, nil); + } + }]; + [task resume]; +} + +- (void)confirmPasswordResetApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth confirmPasswordResetWithCode:code + newPassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)createUserWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth createUserWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)fetchSignInMethodsForEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth fetchSignInMethodsForEmail:email + completion:^(NSArray *_Nullable providers, + NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + if (providers == nil) { + completion(@[], nil); + } else { + completion(providers, nil); + } + } + }]; +} + +- (void)registerAuthStateListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/auth-state/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTAuthStateChannelStreamHandler *handler = + [[FLTAuthStateChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)registerIdTokenListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/id-token/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTIdTokenChannelStreamHandler *handler = + [[FLTIdTokenChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)sendPasswordResetEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + if (actionCodeSettings != nil) { + FIRActionCodeSettings *settings = [PigeonParser parseActionCodeSettings:actionCodeSettings]; + [auth sendPasswordResetWithEmail:email + actionCodeSettings:settings + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } else { + [auth sendPasswordResetWithEmail:email + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } +} + +- (void)sendSignInLinkToEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nonnull InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth sendSignInLinkToEmail:email + actionCodeSettings:[PigeonParser parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeInternalError) { + [self + handleInternalError:^(InternalUserCredential *_Nullable creds, + FlutterError *_Nullable internalError) { + completion(internalError); + } + withError:error]; + } else { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion(nil); + } + }]; +} + +- (void)setLanguageCodeApp:(nonnull AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (languageCode != nil && ![languageCode isEqual:[NSNull null]]) { + auth.languageCode = languageCode; + } else { + [auth useAppLanguage]; + } + + completion(auth.languageCode, nil); +} + +- (void)setSettingsApp:(nonnull AuthPigeonFirebaseApp *)app + settings:(nonnull InternalFirebaseAuthSettings *)settings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (settings.userAccessGroup != nil) { + BOOL useUserAccessGroupSuccessful; + NSError *useUserAccessGroupErrorPtr; + useUserAccessGroupSuccessful = [auth useUserAccessGroup:settings.userAccessGroup + error:&useUserAccessGroupErrorPtr]; + if (!useUserAccessGroupSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:useUserAccessGroupErrorPtr]); + return; + } + } + +#if TARGET_OS_IPHONE + if (settings.appVerificationDisabledForTesting) { + auth.settings.appVerificationDisabledForTesting = settings.appVerificationDisabledForTesting; + } +#else + NSLog(@"FIRAuthSettings.appVerificationDisabledForTesting is not supported " + @"on MacOS."); +#endif + + completion(nil); +} + +- (void)signInAnonymouslyApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [auth + signInWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = + [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError + .userInfo[@"FIRAuthErrorUserInfoDeserializ" + @"edResponseKey"]; + + if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is buried in + // underlying error. + if ([firebaseDictionary[@"code"] + isKindOfClass:[NSNumber class]]) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FlutterError + errorWithCode:firebaseDictionary + [@"code"] + message:firebaseDictionary + [@"message"] + details:nil]); + } + } else { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else if (error.code == + FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)signInWithCustomTokenApp:(nonnull AuthPigeonFirebaseApp *)app + token:(nonnull NSString *)token + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth signInWithCustomToken:token + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailLinkApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + emailLink:(nonnull NSString *)emailLink + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + link:emailLink + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"sign-in-failure" + message: + @"Game Center sign-in requires signing in with 'signInWithCredential()' API." + details:@{}]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.signInWithAppleAuth = auth; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"signInWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId auth:auth]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [self.authProvider + getCredentialWithUIDelegate:nil + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + handleAppleAuthResult(self, app, auth, credential, error, completion); + }]; +#endif +} + +- (void)signOutApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (auth.currentUser == nil) { + completion(nil); + return; + } + + NSError *signOutErrorPtr; + BOOL signOutSuccessful = [auth signOut:&signOutErrorPtr]; + + if (!signOutSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:signOutErrorPtr]); + } else { + completion(nil); + } +} + +- (void)useEmulatorApp:(nonnull AuthPigeonFirebaseApp *)app + host:(nonnull NSString *)host + port:(long)port + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth useEmulatorWithHost:host port:port]; + _emulatorConfigs[app.appName] = @{@"host" : host, @"port" : @(port)}; + completion(nil); +} + +- (void)verifyPasswordResetCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth verifyPasswordResetCode:code + completion:^(NSString *_Nullable email, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(email, nil); + } + }]; +} + +- (void)verifyPhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + request:(nonnull InternalVerifyPhoneNumberRequest *)request + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = [NSString + stringWithFormat:@"%@/phone/%@", kFLTFirebaseAuthChannelName, [NSUUID UUID].UUIDString]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + NSString *multiFactorSessionId = request.multiFactorSessionId; + FIRMultiFactorSession *multiFactorSession = nil; + + if (multiFactorSessionId != nil) { + multiFactorSession = _multiFactorSessionMap[multiFactorSessionId]; + } + + NSString *multiFactorInfoId = request.multiFactorInfoId; + + FIRPhoneMultiFactorInfo *multiFactorInfo = nil; + if (multiFactorInfoId != nil) { + for (NSString *resolverId in _multiFactorResolverMap) { + for (FIRMultiFactorInfo *info in _multiFactorResolverMap[resolverId].hints) { + if ([info.UID isEqualToString:multiFactorInfoId] && + [info class] == [FIRPhoneMultiFactorInfo class]) { + multiFactorInfo = (FIRPhoneMultiFactorInfo *)info; + break; + } + } + } + } + +#if TARGET_OS_OSX + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth]; +#else + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth + request:request + session:multiFactorSession + factorInfo:multiFactorInfo]; +#endif + + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +#endif +} + +- (void)deleteApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser deleteWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)getIdTokenApp:(nonnull AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion:(nonnull void (^)(InternalIdTokenResult *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + getIDTokenResultForcingRefresh:forceRefresh + completion:^(FIRAuthTokenResult *tokenResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + completion([PigeonParser parseIdTokenResult:tokenResult], nil); + }]; +} + +- (void)linkWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)linkWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"provider-link-failure" + message:@"Game Center provider requires linking with 'linkWithCredential()' API." + details:@{}]); + return; + } + + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.linkWithAppleUser = currentUser; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"linkWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser + linkWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, error, completion); + }]; +#endif +} + +- (void)reauthenticateWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion( + nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode: + nil], + nil); + } + }]; + }]; +} + +- (void)reauthenticateWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.isReauthenticatingWithApple = YES; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"reauthenticateWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser reauthenticateWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, + error, completion); + }]; +#endif +} + +- (void)reloadApp:(nonnull AuthPigeonFirebaseApp *)app + completion: + (nonnull void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser reloadWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; +} + +- (void)sendEmailVerificationApp:(nonnull AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationWithActionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)unlinkApp:(nonnull AuthPigeonFirebaseApp *)app + providerId:(nonnull NSString *)providerId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser unlinkFromProvider:providerId + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromFIRUser:user], nil); + } + }]; +} + +- (void)updateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser updateEmail:newEmail + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePasswordApp:(nonnull AuthPigeonFirebaseApp *)app + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + updatePassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { +#if TARGET_OS_IPHONE + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } else { + [currentUser + reloadWithCompletion:^( + NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError: + reloadError]); + } else { + completion( + [PigeonParser getPigeonDetails: + currentUser], + nil); + } + }]; + } + }]; + }]; +#else + NSLog(@"Updating a users phone number via Firebase Authentication is only " + @"supported on the iOS " + @"platform."); + completion(nil, nil); +#endif +} + +- (void)updateProfileApp:(nonnull AuthPigeonFirebaseApp *)app + profile:(nonnull InternalUserProfile *)profile + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + FIRUserProfileChangeRequest *changeRequest = [currentUser profileChangeRequest]; + + if (profile.displayNameChanged) { + changeRequest.displayName = profile.displayName; + } + + if (profile.photoUrlChanged) { + if (profile.photoUrl == nil) { + // We apparently cannot set photoURL to nil/NULL to remove it. + // Instead, setting it to empty string appears to work. + // When doing so, Dart will properly receive `null` anyway. + changeRequest.photoURL = [NSURL URLWithString:@""]; + } else { + changeRequest.photoURL = [NSURL URLWithString:profile.photoUrl]; + } + } + + [changeRequest commitChangesWithCompletion:^(NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)verifyBeforeUpdateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationBeforeUpdatingEmail:newEmail + actionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"initializeRecaptchaConfigWithCompletion is not supported on the " + @"MacOS platform."); + completion(nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth initializeRecaptchaConfigWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +#endif +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m new file mode 100644 index 00000000..315bc5ec --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m @@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTIdTokenChannelStreamHandler { + FIRAuth *_auth; + FIRIDTokenDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{@"user" : [NSNull null]}); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeIDTokenDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m new file mode 100644 index 00000000..511d2caa --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m @@ -0,0 +1,98 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTPhoneNumberVerificationStreamHandler { + FIRAuth *_auth; + NSString *_phoneNumber; +#if TARGET_OS_OSX +#else + FIRMultiFactorSession *_session; + FIRPhoneMultiFactorInfo *_factorInfo; +#endif +} + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(id)auth request:(InternalVerifyPhoneNumberRequest *)request { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + } + return self; +} +#else +- (instancetype)initWithAuth:(id)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + _session = session; + _factorInfo = factorInfo; + } + return self; +} +#endif + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { +#if TARGET_OS_IPHONE + id completer = ^(NSString *verificationID, NSError *error) { + if (error != nil) { + FlutterError *errorDetails = [FLTFirebaseAuthPlugin convertToFlutterError:error]; + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"code" : errorDetails.code, + @"message" : errorDetails.message, + @"details" : errorDetails.details, + } + }); + } else { + events(@{ + @"name" : @"Auth#phoneCodeSent", + @"verificationId" : verificationID, + }); + } + }; + + // Try catch to capture 'missing URL scheme' error. + @try { + if (_factorInfo != nil) { + [[FIRPhoneAuthProvider providerWithAuth:_auth] + verifyPhoneNumberWithMultiFactorInfo:_factorInfo + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + + } else { + [[FIRPhoneAuthProvider providerWithAuth:_auth] verifyPhoneNumber:_phoneNumber + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + } + } @catch (NSException *exception) { + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"message" : exception.reason, + } + }); + } +#endif + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m new file mode 100644 index 00000000..8d7a7b1c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/PigeonParser.m @@ -0,0 +1,171 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/PigeonParser.h" +#import +#import "include/Public/CustomPigeonHeader.h" + +@implementation PigeonParser + ++ (InternalUserCredential *) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalUserCredential + makeWithUser:[self getPigeonDetails:authResult.user] + additionalUserInfo:[self getPigeonAdditionalUserInfo:authResult.additionalUserInfo + authorizationCode:authorizationCode] + credential:[self getPigeonAuthCredential:authResult.credential token:nil]]; +} + ++ (InternalUserCredential *)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user { + return [InternalUserCredential makeWithUser:[self getPigeonDetails:user] + additionalUserInfo:nil + credential:nil]; +} + ++ (InternalUserDetails *)getPigeonDetails:(nonnull FIRUser *)user { + return [InternalUserDetails makeWithUserInfo:[self getPigeonUserInfo:user] + providerData:[self getProviderData:user.providerData]]; +} + ++ (InternalUserInfo *)getPigeonUserInfo:(nonnull FIRUser *)user { + NSString *photoUrlString = user.photoURL.absoluteString; + return [InternalUserInfo + makeWithUid:user.uid + email:user.email + displayName:user.displayName + photoUrl:(photoUrlString.length > 0) ? photoUrlString : nil + phoneNumber:user.phoneNumber + isAnonymous:user.isAnonymous + isEmailVerified:user.emailVerified + providerId:user.providerID + tenantId:user.tenantID + refreshToken:user.refreshToken + creationTimestamp:@((long)([user.metadata.creationDate timeIntervalSince1970] * 1000)) + lastSignInTimestamp:@((long)([user.metadata.lastSignInDate timeIntervalSince1970] * 1000))]; +} + ++ (NSArray *> *)getProviderData: + (nonnull NSArray> *)providerData { + NSMutableArray *> *dataArray = + [NSMutableArray arrayWithCapacity:providerData.count]; + + for (id userInfo in providerData) { + NSString *photoUrlStr = userInfo.photoURL.absoluteString; + NSDictionary *dataDict = @{ + @"providerId" : userInfo.providerID, + // Can be null on emulator + @"uid" : userInfo.uid ?: @"", + @"displayName" : userInfo.displayName ?: [NSNull null], + @"email" : userInfo.email ?: [NSNull null], + @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], + @"photoURL" : photoUrlStr ?: [NSNull null], + // isAnonymous is always false on in a providerData object (the user is not anonymous) + @"isAnonymous" : @NO, + // isEmailVerified is always true on in a providerData object (the email is verified by the + // provider) + @"isEmailVerified" : @YES, + }; + [dataArray addObject:dataDict]; + } + return [dataArray copy]; +} + ++ (InternalAdditionalUserInfo *)getPigeonAdditionalUserInfo: + (nonnull FIRAdditionalUserInfo *)userInfo + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalAdditionalUserInfo makeWithIsNewUser:userInfo.isNewUser + providerId:userInfo.providerID + username:userInfo.username + authorizationCode:authorizationCode + profile:userInfo.profile]; +} + ++ (InternalTotpSecret *)getPigeonTotpSecret:(FIRTOTPSecret *)secret { + return [InternalTotpSecret makeWithCodeIntervalSeconds:nil + codeLength:nil + enrollmentCompletionDeadline:nil + hashingAlgorithm:nil + secretKey:secret.sharedSecretKey]; +} + ++ (InternalAuthCredential *)getPigeonAuthCredential:(FIRAuthCredential *)authCredential + token:(NSNumber *_Nullable)token { + if (authCredential == nil) { + return nil; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + NSUInteger nativeId = + token != nil ? [token unsignedLongValue] : (NSUInteger)[authCredential hash]; + + return [InternalAuthCredential makeWithProviderId:authCredential.provider + signInMethod:authCredential.provider + nativeId:nativeId + accessToken:accessToken ?: nil]; +} + ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings { + if (settings == nil) { + return nil; + } + + FIRActionCodeSettings *codeSettings = [[FIRActionCodeSettings alloc] init]; + + if (settings.url != nil) { + codeSettings.URL = [NSURL URLWithString:settings.url]; + } + + if (settings.linkDomain != nil) { + codeSettings.linkDomain = settings.linkDomain; + } + + codeSettings.handleCodeInApp = settings.handleCodeInApp; + + if (settings.iOSBundleId != nil) { + codeSettings.iOSBundleID = settings.iOSBundleId; + } + + return codeSettings; +} + ++ (InternalIdTokenResult *)parseIdTokenResult:(FIRAuthTokenResult *)tokenResult { + long expirationTimestamp = (long)[tokenResult.expirationDate timeIntervalSince1970] * 1000; + long authTimestamp = (long)[tokenResult.authDate timeIntervalSince1970] * 1000; + long issuedAtTimestamp = (long)[tokenResult.issuedAtDate timeIntervalSince1970] * 1000; + + return [InternalIdTokenResult makeWithToken:tokenResult.token + expirationTimestamp:@(expirationTimestamp) + authTimestamp:@(authTimestamp) + issuedAtTimestamp:@(issuedAtTimestamp) + signInProvider:tokenResult.signInProvider + claims:tokenResult.claims + signInSecondFactor:tokenResult.signInSecondFactor]; +} + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails { + NSMutableArray *output = [NSMutableArray array]; + + id userInfoList = [[userDetails userInfo] toList]; + [output addObject:userInfoList]; + + id providerData = [userDetails providerData]; + [output addObject:providerData]; + + return [output copy]; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m new file mode 100644 index 00000000..82ae8cfc --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m @@ -0,0 +1,3005 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#import "include/Public/firebase_auth_messages.g.h" + +#if TARGET_OS_OSX +@import FlutterMacOS; +#else +@import Flutter; +#endif + +static BOOL __attribute__((unused)) FLTPigeonDeepEquals(id _Nullable a, id _Nullable b) { + if (a == b) { + return YES; + } + if (a == nil) { + return b == [NSNull null]; + } + if (b == nil) { + return a == [NSNull null]; + } + if ([a isKindOfClass:[NSNumber class]] && [b isKindOfClass:[NSNumber class]]) { + return + [a isEqual:b] || (isnan([(NSNumber *)a doubleValue]) && isnan([(NSNumber *)b doubleValue])); + } + if ([a isKindOfClass:[NSArray class]] && [b isKindOfClass:[NSArray class]]) { + NSArray *arrayA = (NSArray *)a; + NSArray *arrayB = (NSArray *)b; + if (arrayA.count != arrayB.count) { + return NO; + } + for (NSUInteger i = 0; i < arrayA.count; i++) { + if (!FLTPigeonDeepEquals(arrayA[i], arrayB[i])) { + return NO; + } + } + return YES; + } + if ([a isKindOfClass:[NSDictionary class]] && [b isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictA = (NSDictionary *)a; + NSDictionary *dictB = (NSDictionary *)b; + if (dictA.count != dictB.count) { + return NO; + } + for (id keyA in dictA) { + id valueA = dictA[keyA]; + BOOL found = NO; + for (id keyB in dictB) { + if (FLTPigeonDeepEquals(keyA, keyB)) { + id valueB = dictB[keyB]; + if (FLTPigeonDeepEquals(valueA, valueB)) { + found = YES; + break; + } else { + return NO; + } + } + } + if (!found) { + return NO; + } + } + return YES; + } + return [a isEqual:b]; +} + +static NSUInteger __attribute__((unused)) FLTPigeonDeepHash(id _Nullable value) { + if (value == nil || value == (id)[NSNull null]) { + return 0; + } + if ([value isKindOfClass:[NSNumber class]]) { + NSNumber *n = (NSNumber *)value; + double d = n.doubleValue; + if (isnan(d)) { + // Normalize NaN to a consistent hash. + return (NSUInteger)0x7FF8000000000000; + } + if (d == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + d = 0.0; + } + return @(d).hash; + } + if ([value isKindOfClass:[NSArray class]]) { + NSUInteger result = 1; + for (id item in (NSArray *)value) { + result = result * 31 + FLTPigeonDeepHash(item); + } + return result; + } + if ([value isKindOfClass:[NSDictionary class]]) { + NSUInteger result = 0; + NSDictionary *dict = (NSDictionary *)value; + for (id key in dict) { + result += ((FLTPigeonDeepHash(key) * 31) ^ FLTPigeonDeepHash(dict[key])); + } + return result; + } + return [value hash]; +} + +static NSArray *wrapResult(id result, FlutterError *error) { + if (error) { + return @[ + error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] + ]; + } + return @[ result ?: [NSNull null] ]; +} + +static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { + id result = array[key]; + return (result == [NSNull null]) ? nil : result; +} + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +@implementation ActionCodeInfoOperationBox +- (instancetype)initWithValue:(ActionCodeInfoOperation)value { + self = [super init]; + if (self) { + _value = value; + } + return self; +} +@end + +@interface InternalMultiFactorSession () ++ (InternalMultiFactorSession *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalPhoneMultiFactorAssertion () ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list; ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalMultiFactorInfo () ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface AuthPigeonFirebaseApp () ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list; ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfoData () ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfo () ++ (InternalActionCodeInfo *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAdditionalUserInfo () ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredential () ++ (InternalAuthCredential *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserInfo () ++ (InternalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserDetails () ++ (InternalUserDetails *)fromList:(NSArray *)list; ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserCredential () ++ (InternalUserCredential *)fromList:(NSArray *)list; ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredentialInput () ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeSettings () ++ (InternalActionCodeSettings *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalFirebaseAuthSettings () ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list; ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalSignInProvider () ++ (InternalSignInProvider *)fromList:(NSArray *)list; ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalVerifyPhoneNumberRequest () ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list; ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalIdTokenResult () ++ (InternalIdTokenResult *)fromList:(NSArray *)list; ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserProfile () ++ (InternalUserProfile *)fromList:(NSArray *)list; ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalTotpSecret () ++ (InternalTotpSecret *)fromList:(NSArray *)list; ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@implementation InternalMultiFactorSession ++ (instancetype)makeWithId:(NSString *)id { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = id; + return pigeonResult; +} ++ (InternalMultiFactorSession *)fromList:(NSArray *)list { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = GetNullableObjectAtIndex(list, 0); + return pigeonResult; +} ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorSession fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.id ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorSession *other = (InternalMultiFactorSession *)object; + return FLTPigeonDeepEquals(self.id, other.id); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.id); + return result; +} +@end + +@implementation InternalPhoneMultiFactorAssertion ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = verificationId; + pigeonResult.verificationCode = verificationCode; + return pigeonResult; +} ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = GetNullableObjectAtIndex(list, 0); + pigeonResult.verificationCode = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list { + return (list) ? [InternalPhoneMultiFactorAssertion fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.verificationId ?: [NSNull null], + self.verificationCode ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalPhoneMultiFactorAssertion *other = (InternalPhoneMultiFactorAssertion *)object; + return FLTPigeonDeepEquals(self.verificationId, other.verificationId) && + FLTPigeonDeepEquals(self.verificationCode, other.verificationCode); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.verificationId); + result = result * 31 + FLTPigeonDeepHash(self.verificationCode); + return result; +} +@end + +@implementation InternalMultiFactorInfo ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.enrollmentTimestamp = enrollmentTimestamp; + pigeonResult.factorId = factorId; + pigeonResult.uid = uid; + pigeonResult.phoneNumber = phoneNumber; + return pigeonResult; +} ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.enrollmentTimestamp = [GetNullableObjectAtIndex(list, 1) doubleValue]; + pigeonResult.factorId = GetNullableObjectAtIndex(list, 2); + pigeonResult.uid = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + @(self.enrollmentTimestamp), + self.factorId ?: [NSNull null], + self.uid ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorInfo *other = (InternalMultiFactorInfo *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + (self.enrollmentTimestamp == other.enrollmentTimestamp || + (isnan(self.enrollmentTimestamp) && isnan(other.enrollmentTimestamp))) && + FLTPigeonDeepEquals(self.factorId, other.factorId) && + FLTPigeonDeepEquals(self.uid, other.uid) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + (isnan(self.enrollmentTimestamp) ? (NSUInteger)0x7FF8000000000000 + : @(self.enrollmentTimestamp).hash); + result = result * 31 + FLTPigeonDeepHash(self.factorId); + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + return result; +} +@end + +@implementation AuthPigeonFirebaseApp ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = appName; + pigeonResult.tenantId = tenantId; + pigeonResult.customAuthDomain = customAuthDomain; + return pigeonResult; +} ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = GetNullableObjectAtIndex(list, 0); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 1); + pigeonResult.customAuthDomain = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list { + return (list) ? [AuthPigeonFirebaseApp fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.appName ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.customAuthDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + AuthPigeonFirebaseApp *other = (AuthPigeonFirebaseApp *)object; + return FLTPigeonDeepEquals(self.appName, other.appName) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.customAuthDomain, other.customAuthDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.appName); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.customAuthDomain); + return result; +} +@end + +@implementation InternalActionCodeInfoData ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = email; + pigeonResult.previousEmail = previousEmail; + return pigeonResult; +} ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = GetNullableObjectAtIndex(list, 0); + pigeonResult.previousEmail = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfoData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.email ?: [NSNull null], + self.previousEmail ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfoData *other = (InternalActionCodeInfoData *)object; + return FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.previousEmail, other.previousEmail); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.previousEmail); + return result; +} +@end + +@implementation InternalActionCodeInfo ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + pigeonResult.operation = operation; + pigeonResult.data = data; + return pigeonResult; +} ++ (InternalActionCodeInfo *)fromList:(NSArray *)list { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + ActionCodeInfoOperationBox *boxedActionCodeInfoOperation = GetNullableObjectAtIndex(list, 0); + pigeonResult.operation = boxedActionCodeInfoOperation.value; + pigeonResult.data = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + [[ActionCodeInfoOperationBox alloc] initWithValue:self.operation], + self.data ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfo *other = (InternalActionCodeInfo *)object; + return self.operation == other.operation && FLTPigeonDeepEquals(self.data, other.data); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.operation).hash; + result = result * 31 + FLTPigeonDeepHash(self.data); + return result; +} +@end + +@implementation InternalAdditionalUserInfo ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = isNewUser; + pigeonResult.providerId = providerId; + pigeonResult.username = username; + pigeonResult.authorizationCode = authorizationCode; + pigeonResult.profile = profile; + return pigeonResult; +} ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 1); + pigeonResult.username = GetNullableObjectAtIndex(list, 2); + pigeonResult.authorizationCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.profile = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAdditionalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.isNewUser), + self.providerId ?: [NSNull null], + self.username ?: [NSNull null], + self.authorizationCode ?: [NSNull null], + self.profile ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAdditionalUserInfo *other = (InternalAdditionalUserInfo *)object; + return self.isNewUser == other.isNewUser && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.username, other.username) && + FLTPigeonDeepEquals(self.authorizationCode, other.authorizationCode) && + FLTPigeonDeepEquals(self.profile, other.profile); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.isNewUser).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.username); + result = result * 31 + FLTPigeonDeepHash(self.authorizationCode); + result = result * 31 + FLTPigeonDeepHash(self.profile); + return result; +} +@end + +@implementation InternalAuthCredential ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.nativeId = nativeId; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredential *)fromList:(NSArray *)list { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.nativeId = [GetNullableObjectAtIndex(list, 2) integerValue]; + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + @(self.nativeId), + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredential *other = (InternalAuthCredential *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + self.nativeId == other.nativeId && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + @(self.nativeId).hash; + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalUserInfo ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = uid; + pigeonResult.email = email; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.isAnonymous = isAnonymous; + pigeonResult.isEmailVerified = isEmailVerified; + pigeonResult.providerId = providerId; + pigeonResult.tenantId = tenantId; + pigeonResult.refreshToken = refreshToken; + pigeonResult.creationTimestamp = creationTimestamp; + pigeonResult.lastSignInTimestamp = lastSignInTimestamp; + return pigeonResult; +} ++ (InternalUserInfo *)fromList:(NSArray *)list { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = GetNullableObjectAtIndex(list, 0); + pigeonResult.email = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayName = GetNullableObjectAtIndex(list, 2); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + pigeonResult.isAnonymous = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.isEmailVerified = [GetNullableObjectAtIndex(list, 6) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 7); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 8); + pigeonResult.refreshToken = GetNullableObjectAtIndex(list, 9); + pigeonResult.creationTimestamp = GetNullableObjectAtIndex(list, 10); + pigeonResult.lastSignInTimestamp = GetNullableObjectAtIndex(list, 11); + return pigeonResult; +} ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.uid ?: [NSNull null], + self.email ?: [NSNull null], + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + @(self.isAnonymous), + @(self.isEmailVerified), + self.providerId ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.refreshToken ?: [NSNull null], + self.creationTimestamp ?: [NSNull null], + self.lastSignInTimestamp ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserInfo *other = (InternalUserInfo *)object; + return FLTPigeonDeepEquals(self.uid, other.uid) && FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.isAnonymous == other.isAnonymous && self.isEmailVerified == other.isEmailVerified && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.refreshToken, other.refreshToken) && + FLTPigeonDeepEquals(self.creationTimestamp, other.creationTimestamp) && + FLTPigeonDeepEquals(self.lastSignInTimestamp, other.lastSignInTimestamp); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.isAnonymous).hash; + result = result * 31 + @(self.isEmailVerified).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.refreshToken); + result = result * 31 + FLTPigeonDeepHash(self.creationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.lastSignInTimestamp); + return result; +} +@end + +@implementation InternalUserDetails ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = userInfo; + pigeonResult.providerData = providerData; + return pigeonResult; +} ++ (InternalUserDetails *)fromList:(NSArray *)list { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = GetNullableObjectAtIndex(list, 0); + pigeonResult.providerData = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserDetails fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.userInfo ?: [NSNull null], + self.providerData ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserDetails *other = (InternalUserDetails *)object; + return FLTPigeonDeepEquals(self.userInfo, other.userInfo) && + FLTPigeonDeepEquals(self.providerData, other.providerData); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.userInfo); + result = result * 31 + FLTPigeonDeepHash(self.providerData); + return result; +} +@end + +@implementation InternalUserCredential ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = user; + pigeonResult.additionalUserInfo = additionalUserInfo; + pigeonResult.credential = credential; + return pigeonResult; +} ++ (InternalUserCredential *)fromList:(NSArray *)list { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = GetNullableObjectAtIndex(list, 0); + pigeonResult.additionalUserInfo = GetNullableObjectAtIndex(list, 1); + pigeonResult.credential = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.user ?: [NSNull null], + self.additionalUserInfo ?: [NSNull null], + self.credential ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserCredential *other = (InternalUserCredential *)object; + return FLTPigeonDeepEquals(self.user, other.user) && + FLTPigeonDeepEquals(self.additionalUserInfo, other.additionalUserInfo) && + FLTPigeonDeepEquals(self.credential, other.credential); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.user); + result = result * 31 + FLTPigeonDeepHash(self.additionalUserInfo); + result = result * 31 + FLTPigeonDeepHash(self.credential); + return result; +} +@end + +@implementation InternalAuthCredentialInput ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.token = token; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.token = GetNullableObjectAtIndex(list, 2); + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredentialInput fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + self.token ?: [NSNull null], + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredentialInput *other = (InternalAuthCredentialInput *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalActionCodeSettings ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = url; + pigeonResult.dynamicLinkDomain = dynamicLinkDomain; + pigeonResult.handleCodeInApp = handleCodeInApp; + pigeonResult.iOSBundleId = iOSBundleId; + pigeonResult.androidPackageName = androidPackageName; + pigeonResult.androidInstallApp = androidInstallApp; + pigeonResult.androidMinimumVersion = androidMinimumVersion; + pigeonResult.linkDomain = linkDomain; + return pigeonResult; +} ++ (InternalActionCodeSettings *)fromList:(NSArray *)list { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = GetNullableObjectAtIndex(list, 0); + pigeonResult.dynamicLinkDomain = GetNullableObjectAtIndex(list, 1); + pigeonResult.handleCodeInApp = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.iOSBundleId = GetNullableObjectAtIndex(list, 3); + pigeonResult.androidPackageName = GetNullableObjectAtIndex(list, 4); + pigeonResult.androidInstallApp = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.androidMinimumVersion = GetNullableObjectAtIndex(list, 6); + pigeonResult.linkDomain = GetNullableObjectAtIndex(list, 7); + return pigeonResult; +} ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.url ?: [NSNull null], + self.dynamicLinkDomain ?: [NSNull null], + @(self.handleCodeInApp), + self.iOSBundleId ?: [NSNull null], + self.androidPackageName ?: [NSNull null], + @(self.androidInstallApp), + self.androidMinimumVersion ?: [NSNull null], + self.linkDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeSettings *other = (InternalActionCodeSettings *)object; + return FLTPigeonDeepEquals(self.url, other.url) && + FLTPigeonDeepEquals(self.dynamicLinkDomain, other.dynamicLinkDomain) && + self.handleCodeInApp == other.handleCodeInApp && + FLTPigeonDeepEquals(self.iOSBundleId, other.iOSBundleId) && + FLTPigeonDeepEquals(self.androidPackageName, other.androidPackageName) && + self.androidInstallApp == other.androidInstallApp && + FLTPigeonDeepEquals(self.androidMinimumVersion, other.androidMinimumVersion) && + FLTPigeonDeepEquals(self.linkDomain, other.linkDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.url); + result = result * 31 + FLTPigeonDeepHash(self.dynamicLinkDomain); + result = result * 31 + @(self.handleCodeInApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.iOSBundleId); + result = result * 31 + FLTPigeonDeepHash(self.androidPackageName); + result = result * 31 + @(self.androidInstallApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.androidMinimumVersion); + result = result * 31 + FLTPigeonDeepHash(self.linkDomain); + return result; +} +@end + +@implementation InternalFirebaseAuthSettings ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = appVerificationDisabledForTesting; + pigeonResult.userAccessGroup = userAccessGroup; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.smsCode = smsCode; + pigeonResult.forceRecaptchaFlow = forceRecaptchaFlow; + return pigeonResult; +} ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.userAccessGroup = GetNullableObjectAtIndex(list, 1); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 2); + pigeonResult.smsCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.forceRecaptchaFlow = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalFirebaseAuthSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.appVerificationDisabledForTesting), + self.userAccessGroup ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + self.smsCode ?: [NSNull null], + self.forceRecaptchaFlow ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalFirebaseAuthSettings *other = (InternalFirebaseAuthSettings *)object; + return self.appVerificationDisabledForTesting == other.appVerificationDisabledForTesting && + FLTPigeonDeepEquals(self.userAccessGroup, other.userAccessGroup) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + FLTPigeonDeepEquals(self.smsCode, other.smsCode) && + FLTPigeonDeepEquals(self.forceRecaptchaFlow, other.forceRecaptchaFlow); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.appVerificationDisabledForTesting).hash; + result = result * 31 + FLTPigeonDeepHash(self.userAccessGroup); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + FLTPigeonDeepHash(self.smsCode); + result = result * 31 + FLTPigeonDeepHash(self.forceRecaptchaFlow); + return result; +} +@end + +@implementation InternalSignInProvider ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.scopes = scopes; + pigeonResult.customParameters = customParameters; + return pigeonResult; +} ++ (InternalSignInProvider *)fromList:(NSArray *)list { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.scopes = GetNullableObjectAtIndex(list, 1); + pigeonResult.customParameters = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list { + return (list) ? [InternalSignInProvider fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.scopes ?: [NSNull null], + self.customParameters ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalSignInProvider *other = (InternalSignInProvider *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.scopes, other.scopes) && + FLTPigeonDeepEquals(self.customParameters, other.customParameters); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.scopes); + result = result * 31 + FLTPigeonDeepHash(self.customParameters); + return result; +} +@end + +@implementation InternalVerifyPhoneNumberRequest ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.timeout = timeout; + pigeonResult.forceResendingToken = forceResendingToken; + pigeonResult.autoRetrievedSmsCodeForTesting = autoRetrievedSmsCodeForTesting; + pigeonResult.multiFactorInfoId = multiFactorInfoId; + pigeonResult.multiFactorSessionId = multiFactorSessionId; + return pigeonResult; +} ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 0); + pigeonResult.timeout = [GetNullableObjectAtIndex(list, 1) integerValue]; + pigeonResult.forceResendingToken = GetNullableObjectAtIndex(list, 2); + pigeonResult.autoRetrievedSmsCodeForTesting = GetNullableObjectAtIndex(list, 3); + pigeonResult.multiFactorInfoId = GetNullableObjectAtIndex(list, 4); + pigeonResult.multiFactorSessionId = GetNullableObjectAtIndex(list, 5); + return pigeonResult; +} ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list { + return (list) ? [InternalVerifyPhoneNumberRequest fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.phoneNumber ?: [NSNull null], + @(self.timeout), + self.forceResendingToken ?: [NSNull null], + self.autoRetrievedSmsCodeForTesting ?: [NSNull null], + self.multiFactorInfoId ?: [NSNull null], + self.multiFactorSessionId ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalVerifyPhoneNumberRequest *other = (InternalVerifyPhoneNumberRequest *)object; + return FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.timeout == other.timeout && + FLTPigeonDeepEquals(self.forceResendingToken, other.forceResendingToken) && + FLTPigeonDeepEquals(self.autoRetrievedSmsCodeForTesting, + other.autoRetrievedSmsCodeForTesting) && + FLTPigeonDeepEquals(self.multiFactorInfoId, other.multiFactorInfoId) && + FLTPigeonDeepEquals(self.multiFactorSessionId, other.multiFactorSessionId); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.timeout).hash; + result = result * 31 + FLTPigeonDeepHash(self.forceResendingToken); + result = result * 31 + FLTPigeonDeepHash(self.autoRetrievedSmsCodeForTesting); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorInfoId); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorSessionId); + return result; +} +@end + +@implementation InternalIdTokenResult ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = token; + pigeonResult.expirationTimestamp = expirationTimestamp; + pigeonResult.authTimestamp = authTimestamp; + pigeonResult.issuedAtTimestamp = issuedAtTimestamp; + pigeonResult.signInProvider = signInProvider; + pigeonResult.claims = claims; + pigeonResult.signInSecondFactor = signInSecondFactor; + return pigeonResult; +} ++ (InternalIdTokenResult *)fromList:(NSArray *)list { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = GetNullableObjectAtIndex(list, 0); + pigeonResult.expirationTimestamp = GetNullableObjectAtIndex(list, 1); + pigeonResult.authTimestamp = GetNullableObjectAtIndex(list, 2); + pigeonResult.issuedAtTimestamp = GetNullableObjectAtIndex(list, 3); + pigeonResult.signInProvider = GetNullableObjectAtIndex(list, 4); + pigeonResult.claims = GetNullableObjectAtIndex(list, 5); + pigeonResult.signInSecondFactor = GetNullableObjectAtIndex(list, 6); + return pigeonResult; +} ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list { + return (list) ? [InternalIdTokenResult fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.token ?: [NSNull null], + self.expirationTimestamp ?: [NSNull null], + self.authTimestamp ?: [NSNull null], + self.issuedAtTimestamp ?: [NSNull null], + self.signInProvider ?: [NSNull null], + self.claims ?: [NSNull null], + self.signInSecondFactor ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalIdTokenResult *other = (InternalIdTokenResult *)object; + return FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.expirationTimestamp, other.expirationTimestamp) && + FLTPigeonDeepEquals(self.authTimestamp, other.authTimestamp) && + FLTPigeonDeepEquals(self.issuedAtTimestamp, other.issuedAtTimestamp) && + FLTPigeonDeepEquals(self.signInProvider, other.signInProvider) && + FLTPigeonDeepEquals(self.claims, other.claims) && + FLTPigeonDeepEquals(self.signInSecondFactor, other.signInSecondFactor); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.expirationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.authTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.issuedAtTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.signInProvider); + result = result * 31 + FLTPigeonDeepHash(self.claims); + result = result * 31 + FLTPigeonDeepHash(self.signInSecondFactor); + return result; +} +@end + +@implementation InternalUserProfile ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.displayNameChanged = displayNameChanged; + pigeonResult.photoUrlChanged = photoUrlChanged; + return pigeonResult; +} ++ (InternalUserProfile *)fromList:(NSArray *)list { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayNameChanged = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.photoUrlChanged = [GetNullableObjectAtIndex(list, 3) boolValue]; + return pigeonResult; +} ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserProfile fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + @(self.displayNameChanged), + @(self.photoUrlChanged), + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserProfile *other = (InternalUserProfile *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + self.displayNameChanged == other.displayNameChanged && + self.photoUrlChanged == other.photoUrlChanged; +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + @(self.displayNameChanged).hash; + result = result * 31 + @(self.photoUrlChanged).hash; + return result; +} +@end + +@implementation InternalTotpSecret ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = codeIntervalSeconds; + pigeonResult.codeLength = codeLength; + pigeonResult.enrollmentCompletionDeadline = enrollmentCompletionDeadline; + pigeonResult.hashingAlgorithm = hashingAlgorithm; + pigeonResult.secretKey = secretKey; + return pigeonResult; +} ++ (InternalTotpSecret *)fromList:(NSArray *)list { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = GetNullableObjectAtIndex(list, 0); + pigeonResult.codeLength = GetNullableObjectAtIndex(list, 1); + pigeonResult.enrollmentCompletionDeadline = GetNullableObjectAtIndex(list, 2); + pigeonResult.hashingAlgorithm = GetNullableObjectAtIndex(list, 3); + pigeonResult.secretKey = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list { + return (list) ? [InternalTotpSecret fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.codeIntervalSeconds ?: [NSNull null], + self.codeLength ?: [NSNull null], + self.enrollmentCompletionDeadline ?: [NSNull null], + self.hashingAlgorithm ?: [NSNull null], + self.secretKey ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalTotpSecret *other = (InternalTotpSecret *)object; + return FLTPigeonDeepEquals(self.codeIntervalSeconds, other.codeIntervalSeconds) && + FLTPigeonDeepEquals(self.codeLength, other.codeLength) && + FLTPigeonDeepEquals(self.enrollmentCompletionDeadline, + other.enrollmentCompletionDeadline) && + FLTPigeonDeepEquals(self.hashingAlgorithm, other.hashingAlgorithm) && + FLTPigeonDeepEquals(self.secretKey, other.secretKey); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.codeIntervalSeconds); + result = result * 31 + FLTPigeonDeepHash(self.codeLength); + result = result * 31 + FLTPigeonDeepHash(self.enrollmentCompletionDeadline); + result = result * 31 + FLTPigeonDeepHash(self.hashingAlgorithm); + result = result * 31 + FLTPigeonDeepHash(self.secretKey); + return result; +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReader : FlutterStandardReader +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReader +- (nullable id)readValueOfType:(UInt8)type { + switch (type) { + case 129: { + NSNumber *enumAsNumber = [self readValue]; + return enumAsNumber == nil + ? nil + : [[ActionCodeInfoOperationBox alloc] initWithValue:[enumAsNumber integerValue]]; + } + case 130: + return [InternalMultiFactorSession fromList:[self readValue]]; + case 131: + return [InternalPhoneMultiFactorAssertion fromList:[self readValue]]; + case 132: + return [InternalMultiFactorInfo fromList:[self readValue]]; + case 133: + return [AuthPigeonFirebaseApp fromList:[self readValue]]; + case 134: + return [InternalActionCodeInfoData fromList:[self readValue]]; + case 135: + return [InternalActionCodeInfo fromList:[self readValue]]; + case 136: + return [InternalAdditionalUserInfo fromList:[self readValue]]; + case 137: + return [InternalAuthCredential fromList:[self readValue]]; + case 138: + return [InternalUserInfo fromList:[self readValue]]; + case 139: + return [InternalUserDetails fromList:[self readValue]]; + case 140: + return [InternalUserCredential fromList:[self readValue]]; + case 141: + return [InternalAuthCredentialInput fromList:[self readValue]]; + case 142: + return [InternalActionCodeSettings fromList:[self readValue]]; + case 143: + return [InternalFirebaseAuthSettings fromList:[self readValue]]; + case 144: + return [InternalSignInProvider fromList:[self readValue]]; + case 145: + return [InternalVerifyPhoneNumberRequest fromList:[self readValue]]; + case 146: + return [InternalIdTokenResult fromList:[self readValue]]; + case 147: + return [InternalUserProfile fromList:[self readValue]]; + case 148: + return [InternalTotpSecret fromList:[self readValue]]; + default: + return [super readValueOfType:type]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecWriter : FlutterStandardWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecWriter +- (void)writeValue:(id)value { + if ([value isKindOfClass:[ActionCodeInfoOperationBox class]]) { + ActionCodeInfoOperationBox *box = (ActionCodeInfoOperationBox *)value; + [self writeByte:129]; + [self writeValue:(value == nil ? [NSNull null] : [NSNumber numberWithInteger:box.value])]; + } else if ([value isKindOfClass:[InternalMultiFactorSession class]]) { + [self writeByte:130]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalPhoneMultiFactorAssertion class]]) { + [self writeByte:131]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalMultiFactorInfo class]]) { + [self writeByte:132]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[AuthPigeonFirebaseApp class]]) { + [self writeByte:133]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfoData class]]) { + [self writeByte:134]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfo class]]) { + [self writeByte:135]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAdditionalUserInfo class]]) { + [self writeByte:136]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredential class]]) { + [self writeByte:137]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserInfo class]]) { + [self writeByte:138]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserDetails class]]) { + [self writeByte:139]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserCredential class]]) { + [self writeByte:140]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredentialInput class]]) { + [self writeByte:141]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeSettings class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalFirebaseAuthSettings class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalSignInProvider class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalVerifyPhoneNumberRequest class]]) { + [self writeByte:145]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalIdTokenResult class]]) { + [self writeByte:146]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserProfile class]]) { + [self writeByte:147]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalTotpSecret class]]) { + [self writeByte:148]; + [self writeValue:[value toList]]; + } else { + [super writeValue:value]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReaderWriter : FlutterStandardReaderWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecWriter alloc] initWithData:data]; +} +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecReader alloc] initWithData:data]; +} +@end + +NSObject *nullGetFirebaseAuthMessagesCodec(void) { + static FlutterStandardMessageCodec *sSharedObject = nil; + static dispatch_once_t sPred = 0; + dispatch_once(&sPred, ^{ + nullFirebaseAuthMessagesPigeonCodecReaderWriter *readerWriter = + [[nullFirebaseAuthMessagesPigeonCodecReaderWriter alloc] init]; + sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; + }); + return sSharedObject; +} +void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerIdTokenListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerIdTokenListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerIdTokenListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerIdTokenListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerAuthStateListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerAuthStateListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerAuthStateListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerAuthStateListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.useEmulator", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(useEmulatorApp:host:port:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(useEmulatorApp:host:port:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_host = GetNullableObjectAtIndex(args, 1); + NSInteger arg_port = [GetNullableObjectAtIndex(args, 2) integerValue]; + [api useEmulatorApp:arg_app + host:arg_host + port:arg_port + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.applyActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(applyActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(applyActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api applyActionCodeApp:arg_app + code:arg_code + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.checkActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(checkActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(checkActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api checkActionCodeApp:arg_app + code:arg_code + completion:^(InternalActionCodeInfo *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.confirmPasswordReset", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(confirmPasswordResetApp:code:newPassword:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(confirmPasswordResetApp:code:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 2); + [api confirmPasswordResetApp:arg_app + code:arg_code + newPassword:arg_newPassword + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.createUserWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api + respondsToSelector:@selector( + createUserWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(createUserWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api createUserWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInAnonymously", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInAnonymouslyApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInAnonymouslyApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signInAnonymouslyApp:arg_app + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCredentialApp:input:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api signInWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCustomToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCustomTokenApp:token:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCustomTokenApp:token:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_token = GetNullableObjectAtIndex(args, 1); + [api signInWithCustomTokenApp:arg_app + token:arg_token + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + signInWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailLink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithEmailLinkApp:email:emailLink:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailLinkApp:email:emailLink:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_emailLink = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailLinkApp:arg_app + email:arg_email + emailLink:arg_emailLink + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api signInWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.signOut", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signOutApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to @selector(signOutApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signOutApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.fetchSignInMethodsForEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(fetchSignInMethodsForEmailApp:email:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(fetchSignInMethodsForEmailApp:email:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + [api fetchSignInMethodsForEmailApp:arg_app + email:arg_email + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendPasswordResetEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendPasswordResetEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendSignInLinkToEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendSignInLinkToEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setLanguageCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setLanguageCodeApp:languageCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setLanguageCodeApp:languageCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_languageCode = GetNullableObjectAtIndex(args, 1); + [api setLanguageCodeApp:arg_app + languageCode:arg_languageCode + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setSettings", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setSettingsApp:settings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setSettingsApp:settings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalFirebaseAuthSettings *arg_settings = GetNullableObjectAtIndex(args, 1); + [api setSettingsApp:arg_app + settings:arg_settings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPasswordResetCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPasswordResetCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPasswordResetCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api verifyPasswordResetCodeApp:arg_app + code:arg_code + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPhoneNumberApp:request:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPhoneNumberApp:request:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalVerifyPhoneNumberRequest *arg_request = GetNullableObjectAtIndex(args, 1); + [api verifyPhoneNumberApp:arg_app + request:arg_request + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeTokenWithAuthorizationCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeTokenWithAuthorizationCodeApp: + authorizationCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeTokenWithAuthorizationCodeApp:authorizationCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_authorizationCode = GetNullableObjectAtIndex(args, 1); + [api revokeTokenWithAuthorizationCodeApp:arg_app + authorizationCode:arg_authorizationCode + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeAccessToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeAccessTokenApp:accessToken:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeAccessTokenApp:accessToken:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_accessToken = GetNullableObjectAtIndex(args, 1); + [api revokeAccessTokenApp:arg_app + accessToken:arg_accessToken + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.initializeRecaptchaConfig", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(initializeRecaptchaConfigApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(initializeRecaptchaConfigApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api initializeRecaptchaConfigApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.delete", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(deleteApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(deleteApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api deleteApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.getIdToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getIdTokenApp:forceRefresh:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(getIdTokenApp:forceRefresh:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + BOOL arg_forceRefresh = [GetNullableObjectAtIndex(args, 1) boolValue]; + [api getIdTokenApp:arg_app + forceRefresh:arg_forceRefresh + completion:^(InternalIdTokenResult *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api linkWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api linkWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reauthenticateWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + reauthenticateWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.reload", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reloadApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(reloadApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api reloadApp:arg_app + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.sendEmailVerification", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + sendEmailVerificationApp:actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(sendEmailVerificationApp:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 1); + [api sendEmailVerificationApp:arg_app + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.unlink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unlinkApp:providerId:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(unlinkApp:providerId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_providerId = GetNullableObjectAtIndex(args, 1); + [api unlinkApp:arg_app + providerId:arg_providerId + completion:^(InternalUserCredential *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.updateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateEmailApp:newEmail:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateEmailApp:newEmail:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + [api + updateEmailApp:arg_app + newEmail:arg_newEmail + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePasswordApp:newPassword:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePasswordApp:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 1); + [api updatePasswordApp:arg_app + newPassword:arg_newPassword + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePhoneNumberApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePhoneNumberApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api updatePhoneNumberApp:arg_app + input:arg_input + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updateProfile", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateProfileApp:profile:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateProfileApp:profile:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalUserProfile *arg_profile = GetNullableObjectAtIndex(args, 1); + [api updateProfileApp:arg_app + profile:arg_profile + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.verifyBeforeUpdateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyBeforeUpdateEmailApp:newEmail: + actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(verifyBeforeUpdateEmailApp:newEmail:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api verifyBeforeUpdateEmailApp:arg_app + newEmail:arg_newEmail + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollPhone", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollPhoneApp:assertion:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollPhoneApp:assertion:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollPhoneApp:arg_app + assertion:arg_assertion + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollTotp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollTotpApp:assertionId:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollTotpApp:assertionId:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_assertionId = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollTotpApp:arg_app + assertionId:arg_assertionId + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.getSession", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getSessionApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getSessionApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getSessionApp:arg_app + completion:^(InternalMultiFactorSession *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.unenroll", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unenrollApp:factorUid:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(unenrollApp:factorUid:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_factorUid = GetNullableObjectAtIndex(args, 1); + [api unenrollApp:arg_app + factorUid:arg_factorUid + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorUserHostApi.getEnrolledFactors", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getEnrolledFactorsApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getEnrolledFactorsApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getEnrolledFactorsApp:arg_app + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactoResolverHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactoResolverHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactoResolverHostApi.resolveSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)], + @"MultiFactoResolverHostApi api (%@) doesn't respond to " + @"@selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_resolverId = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_totpAssertionId = GetNullableObjectAtIndex(args, 2); + [api resolveSignInResolverId:arg_resolverId + assertion:arg_assertion + totpAssertionId:arg_totpAssertionId + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.generateSecret", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(generateSecretSessionId:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(generateSecretSessionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_sessionId = GetNullableObjectAtIndex(args, 0); + [api generateSecretSessionId:arg_sessionId + completion:^(InternalTotpSecret *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForEnrollment", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForEnrollmentSecretKey:arg_secretKey + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_enrollmentId = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForSignInEnrollmentId:arg_enrollmentId + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpSecretHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpSecretHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpSecretHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.generateQrCodeUrl", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + generateQrCodeUrlSecretKey:accountName:issuer:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(generateQrCodeUrlSecretKey:accountName:issuer:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_accountName = GetNullableObjectAtIndex(args, 1); + NSString *arg_issuer = GetNullableObjectAtIndex(args, 2); + [api generateQrCodeUrlSecretKey:arg_secretKey + accountName:arg_accountName + issuer:arg_issuer + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.openInOtpApp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_qrCodeUrl = GetNullableObjectAtIndex(args, 1); + [api openInOtpAppSecretKey:arg_secretKey + qrCodeUrl:arg_qrCodeUrl + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *api) { + SetUpGenerateInterfacesWithSuffix(binaryMessenger, api, @""); +} + +void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.GenerateInterfaces.pigeonInterface", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(pigeonInterfaceInfo:error:)], + @"GenerateInterfaces api (%@) doesn't respond to @selector(pigeonInterfaceInfo:error:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + InternalMultiFactorInfo *arg_info = GetNullableObjectAtIndex(args, 0); + FlutterError *error; + [api pigeonInterfaceInfo:arg_info error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h new file mode 100644 index 00000000..7b7efae7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h @@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import "../Public/CustomPigeonHeader.h" + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTAuthStateChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h new file mode 100644 index 00000000..c1660499 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/CustomPigeonHeader.h" + +#import + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTIdTokenChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h new file mode 100644 index 00000000..53e5f28c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/firebase_auth_messages.g.h" + +#import + +@class FIRAuth; +@class FIRMultiFactorSession; +@class FIRPhoneMultiFactorInfo; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTPhoneNumberVerificationStreamHandler : NSObject + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(FIRAuth *)auth arguments:(NSDictionary *)arguments; +#else +- (instancetype)initWithAuth:(FIRAuth *)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo; +#endif + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h new file mode 100644 index 00000000..b500fd2c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h @@ -0,0 +1,33 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#import +#import "../Public/firebase_auth_messages.g.h" + +@class FIRAuthDataResult; +@class FIRUser; +@class FIRActionCodeSettings; +@class FIRAuthTokenResult; +@class FIRTOTPSecret; +@class FIRAuthCredential; + +@interface PigeonParser : NSObject + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails; ++ (InternalUserCredential *_Nullable) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode; ++ (InternalUserDetails *_Nullable)getPigeonDetails:(nonnull FIRUser *)user; ++ (InternalUserInfo *_Nullable)getPigeonUserInfo:(nonnull FIRUser *)user; ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings; ++ (InternalUserCredential *_Nullable)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user; ++ (InternalIdTokenResult *_Nonnull)parseIdTokenResult:(nonnull FIRAuthTokenResult *)tokenResult; ++ (InternalTotpSecret *_Nonnull)getPigeonTotpSecret:(nonnull FIRTOTPSecret *)secret; ++ (InternalAuthCredential *_Nullable)getPigeonAuthCredential: + (FIRAuthCredential *_Nullable)authCredentialToken + token:(NSNumber *_Nullable)token; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h new file mode 100644 index 00000000..d32a6b45 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h @@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#import "firebase_auth_messages.g.h" + +@interface InternalMultiFactorInfo (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserDetails (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserInfo (Map) +- (NSDictionary *)toList; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h new file mode 100644 index 00000000..53e20eca --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import +#if __has_include() +#import +#else +#import +#endif +#import "firebase_auth_messages.g.h" + +#if !TARGET_OS_OSX +@protocol FlutterSceneLifeCycleDelegate; +#endif + +@interface FLTFirebaseAuthPlugin + : FLTFirebasePlugin ) + , + FlutterSceneLifeCycleDelegate +#endif +#endif + > + ++ (FlutterError *)convertToFlutterError:(NSError *)error; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h new file mode 100644 index 00000000..f83da7e3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/ios/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h @@ -0,0 +1,571 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +@import Foundation; + +@protocol FlutterBinaryMessenger; +@protocol FlutterMessageCodec; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +typedef NS_ENUM(NSUInteger, ActionCodeInfoOperation) { + /// Unknown operation. + ActionCodeInfoOperationUnknown = 0, + /// Password reset code generated via [sendPasswordResetEmail]. + ActionCodeInfoOperationPasswordReset = 1, + /// Email verification code generated via [User.sendEmailVerification]. + ActionCodeInfoOperationVerifyEmail = 2, + /// Email change revocation code generated via [User.updateEmail]. + ActionCodeInfoOperationRecoverEmail = 3, + /// Email sign in code generated via [sendSignInLinkToEmail]. + ActionCodeInfoOperationEmailSignIn = 4, + /// Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + ActionCodeInfoOperationVerifyAndChangeEmail = 5, + /// Action code for reverting second factor addition. + ActionCodeInfoOperationRevertSecondFactorAddition = 6, +}; + +/// Wrapper for ActionCodeInfoOperation to allow for nullability. +@interface ActionCodeInfoOperationBox : NSObject +@property(nonatomic, assign) ActionCodeInfoOperation value; +- (instancetype)initWithValue:(ActionCodeInfoOperation)value; +@end + +@class InternalMultiFactorSession; +@class InternalPhoneMultiFactorAssertion; +@class InternalMultiFactorInfo; +@class AuthPigeonFirebaseApp; +@class InternalActionCodeInfoData; +@class InternalActionCodeInfo; +@class InternalAdditionalUserInfo; +@class InternalAuthCredential; +@class InternalUserInfo; +@class InternalUserDetails; +@class InternalUserCredential; +@class InternalAuthCredentialInput; +@class InternalActionCodeSettings; +@class InternalFirebaseAuthSettings; +@class InternalSignInProvider; +@class InternalVerifyPhoneNumberRequest; +@class InternalIdTokenResult; +@class InternalUserProfile; +@class InternalTotpSecret; + +@interface InternalMultiFactorSession : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithId:(NSString *)id; +@property(nonatomic, copy) NSString *id; +@end + +@interface InternalPhoneMultiFactorAssertion : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode; +@property(nonatomic, copy) NSString *verificationId; +@property(nonatomic, copy) NSString *verificationCode; +@end + +@interface InternalMultiFactorInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, assign) double enrollmentTimestamp; +@property(nonatomic, copy, nullable) NSString *factorId; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@end + +@interface AuthPigeonFirebaseApp : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain; +@property(nonatomic, copy) NSString *appName; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *customAuthDomain; +@end + +@interface InternalActionCodeInfoData : NSObject ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *previousEmail; +@end + +@interface InternalActionCodeInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data; +@property(nonatomic, assign) ActionCodeInfoOperation operation; +@property(nonatomic, strong) InternalActionCodeInfoData *data; +@end + +@interface InternalAdditionalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile; +@property(nonatomic, assign) BOOL isNewUser; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *username; +@property(nonatomic, copy, nullable) NSString *authorizationCode; +@property(nonatomic, copy, nullable) NSDictionary *profile; +@end + +@interface InternalAuthCredential : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, assign) NSInteger nativeId; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) BOOL isAnonymous; +@property(nonatomic, assign) BOOL isEmailVerified; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *refreshToken; +@property(nonatomic, strong, nullable) NSNumber *creationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *lastSignInTimestamp; +@end + +@interface InternalUserDetails : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData; +@property(nonatomic, strong) InternalUserInfo *userInfo; +@property(nonatomic, copy) NSArray *> *providerData; +@end + +@interface InternalUserCredential : NSObject ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential; +@property(nonatomic, strong, nullable) InternalUserDetails *user; +@property(nonatomic, strong, nullable) InternalAdditionalUserInfo *additionalUserInfo; +@property(nonatomic, strong, nullable) InternalAuthCredential *credential; +@end + +@interface InternalAuthCredentialInput : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalActionCodeSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain; +@property(nonatomic, copy) NSString *url; +@property(nonatomic, copy, nullable) NSString *dynamicLinkDomain; +@property(nonatomic, assign) BOOL handleCodeInApp; +@property(nonatomic, copy, nullable) NSString *iOSBundleId; +@property(nonatomic, copy, nullable) NSString *androidPackageName; +@property(nonatomic, assign) BOOL androidInstallApp; +@property(nonatomic, copy, nullable) NSString *androidMinimumVersion; +@property(nonatomic, copy, nullable) NSString *linkDomain; +@end + +@interface InternalFirebaseAuthSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow; +@property(nonatomic, assign) BOOL appVerificationDisabledForTesting; +@property(nonatomic, copy, nullable) NSString *userAccessGroup; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, copy, nullable) NSString *smsCode; +@property(nonatomic, strong, nullable) NSNumber *forceRecaptchaFlow; +@end + +@interface InternalSignInProvider : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy, nullable) NSArray *scopes; +@property(nonatomic, copy, nullable) NSDictionary *customParameters; +@end + +@interface InternalVerifyPhoneNumberRequest : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) NSInteger timeout; +@property(nonatomic, strong, nullable) NSNumber *forceResendingToken; +@property(nonatomic, copy, nullable) NSString *autoRetrievedSmsCodeForTesting; +@property(nonatomic, copy, nullable) NSString *multiFactorInfoId; +@property(nonatomic, copy, nullable) NSString *multiFactorSessionId; +@end + +@interface InternalIdTokenResult : NSObject ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, strong, nullable) NSNumber *expirationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *authTimestamp; +@property(nonatomic, strong, nullable) NSNumber *issuedAtTimestamp; +@property(nonatomic, copy, nullable) NSString *signInProvider; +@property(nonatomic, copy, nullable) NSDictionary *claims; +@property(nonatomic, copy, nullable) NSString *signInSecondFactor; +@end + +@interface InternalUserProfile : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, assign) BOOL displayNameChanged; +@property(nonatomic, assign) BOOL photoUrlChanged; +@end + +@interface InternalTotpSecret : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey; +@property(nonatomic, strong, nullable) NSNumber *codeIntervalSeconds; +@property(nonatomic, strong, nullable) NSNumber *codeLength; +@property(nonatomic, strong, nullable) NSNumber *enrollmentCompletionDeadline; +@property(nonatomic, copy, nullable) NSString *hashingAlgorithm; +@property(nonatomic, copy) NSString *secretKey; +@end + +/// The codec used by all APIs. +NSObject *nullGetFirebaseAuthMessagesCodec(void); + +@protocol FirebaseAuthHostApi +- (void)registerIdTokenListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)registerAuthStateListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)useEmulatorApp:(AuthPigeonFirebaseApp *)app + host:(NSString *)host + port:(NSInteger)port + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)applyActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)checkActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion; +- (void)confirmPasswordResetApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + newPassword:(NSString *)newPassword + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)createUserWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInAnonymouslyApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCustomTokenApp:(AuthPigeonFirebaseApp *)app + token:(NSString *)token + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailLinkApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + emailLink:(NSString *)emailLink + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signOutApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)fetchSignInMethodsForEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)sendPasswordResetEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)sendSignInLinkToEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)setLanguageCodeApp:(AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)setSettingsApp:(AuthPigeonFirebaseApp *)app + settings:(InternalFirebaseAuthSettings *)settings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)verifyPasswordResetCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyPhoneNumberApp:(AuthPigeonFirebaseApp *)app + request:(InternalVerifyPhoneNumberRequest *)request + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)revokeTokenWithAuthorizationCodeApp:(AuthPigeonFirebaseApp *)app + authorizationCode:(NSString *)authorizationCode + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)revokeAccessTokenApp:(AuthPigeonFirebaseApp *)app + accessToken:(NSString *)accessToken + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol FirebaseAuthUserHostApi +- (void)deleteApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getIdTokenApp:(AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion: + (void (^)(InternalIdTokenResult *_Nullable, FlutterError *_Nullable))completion; +- (void)linkWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)linkWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reloadApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)sendEmailVerificationApp:(AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)unlinkApp:(AuthPigeonFirebaseApp *)app + providerId:(NSString *)providerId + completion:(void (^)(InternalUserCredential *_Nullable, FlutterError *_Nullable))completion; +- (void)updateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePasswordApp:(AuthPigeonFirebaseApp *)app + newPassword:(NSString *)newPassword + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePhoneNumberApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updateProfileApp:(AuthPigeonFirebaseApp *)app + profile:(InternalUserProfile *)profile + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyBeforeUpdateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorUserHostApi +- (void)enrollPhoneApp:(AuthPigeonFirebaseApp *)app + assertion:(InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)enrollTotpApp:(AuthPigeonFirebaseApp *)app + assertionId:(NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getSessionApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(InternalMultiFactorSession *_Nullable, FlutterError *_Nullable))completion; +- (void)unenrollApp:(AuthPigeonFirebaseApp *)app + factorUid:(NSString *)factorUid + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getEnrolledFactorsApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactoResolverHostApi +- (void)resolveSignInResolverId:(NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactoResolverHostApiWithSuffix( + id binaryMessenger, NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpHostApi +- (void)generateSecretSessionId:(NSString *)sessionId + completion:(void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForEnrollmentSecretKey:(NSString *)secretKey + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForSignInEnrollmentId:(NSString *)enrollmentId + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpSecretHostApi +- (void)generateQrCodeUrlSecretKey:(NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)openInOtpAppSecretKey:(NSString *)secretKey + qrCodeUrl:(NSString *)qrCodeUrl + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpSecretHostApi( + id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpSecretHostApiWithSuffix( + id binaryMessenger, + NSObject *_Nullable api, NSString *messageChannelSuffix); + +/// Only used to generate the object interface that are use outside of the Pigeon interface +@protocol GenerateInterfaces +- (void)pigeonInterfaceInfo:(InternalMultiFactorInfo *)info + error:(FlutterError *_Nullable *_Nonnull)error; +@end + +extern void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart new file mode 100755 index 00000000..61e60561 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/firebase_auth.dart @@ -0,0 +1,72 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:flutter/foundation.dart'; + +export 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart' + show + FirebaseAuthException, + MultiFactorInfo, + MultiFactorSession, + PhoneMultiFactorInfo, + TotpMultiFactorInfo, + IdTokenResult, + UserMetadata, + UserInfo, + ActionCodeInfo, + ActionCodeSettings, + AdditionalUserInfo, + ActionCodeInfoOperation, + Persistence, + PhoneVerificationCompleted, + PhoneVerificationFailed, + PhoneCodeSent, + PhoneCodeAutoRetrievalTimeout, + AuthCredential, + AuthProvider, + AppleAuthProvider, + AppleFullPersonName, + AppleAuthCredential, + EmailAuthProvider, + EmailAuthCredential, + FacebookAuthProvider, + FacebookAuthCredential, + GameCenterAuthProvider, + GameCenterAuthCredential, + PlayGamesAuthProvider, + PlayGamesAuthCredential, + GithubAuthProvider, + GithubAuthCredential, + GoogleAuthProvider, + GoogleAuthCredential, + YahooAuthProvider, + YahooAuthCredential, + MicrosoftAuthProvider, + OAuthProvider, + OAuthCredential, + PhoneAuthProvider, + PhoneAuthCredential, + SAMLAuthProvider, + TwitterAuthProvider, + TwitterAuthCredential, + RecaptchaVerifierOnSuccess, + RecaptchaVerifierOnExpired, + RecaptchaVerifierOnError, + RecaptchaVerifierSize, + RecaptchaVerifierTheme, + PasswordValidationStatus; +export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' + show FirebaseException; + +part 'src/confirmation_result.dart'; +part 'src/firebase_auth.dart'; +part 'src/multi_factor.dart'; +part 'src/recaptcha_verifier.dart'; +part 'src/user.dart'; +part 'src/user_credential.dart'; diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart new file mode 100644 index 00000000..c039cd79 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/confirmation_result.dart @@ -0,0 +1,36 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A result from a phone number sign-in, link, or reauthenticate call. +/// +/// This class is only usable on web based platforms. +class ConfirmationResult { + ConfirmationResultPlatform _delegate; + + final FirebaseAuth _auth; + + ConfirmationResult._(this._auth, this._delegate) { + ConfirmationResultPlatform.verify(_delegate); + } + + /// The phone number authentication operation's verification ID. + /// + /// This can be used along with the verification code to initialize a phone + /// auth credential. + String get verificationId { + return _delegate.verificationId; + } + + /// Finishes a phone number sign-in, link, or reauthentication, given the code + /// that was sent to the user's mobile device. + Future confirm(String verificationCode) async { + return UserCredential._( + _auth, + await _delegate.confirm(verificationCode), + ); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart new file mode 100644 index 00000000..2f4ebe42 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/firebase_auth.dart @@ -0,0 +1,893 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// The entry point of the Firebase Authentication SDK. +class FirebaseAuth extends FirebasePluginPlatform implements FirebaseService { + // Cached instances of [FirebaseAuth]. + static Map _firebaseAuthInstances = {}; + + // Cached and lazily loaded instance of [FirebaseAuthPlatform] to avoid + // creating a [MethodChannelFirebaseAuth] when not needed or creating an + // instance with the default app before a user specifies an app. + FirebaseAuthPlatform? _delegatePackingProperty; + + /// Returns the underlying delegate implementation. + /// + /// If called and no [_delegatePackingProperty] exists, it will first be + /// created and assigned before returning the delegate. + FirebaseAuthPlatform get _delegate { + _delegatePackingProperty ??= FirebaseAuthPlatform.instanceFor( + app: app, + pluginConstants: pluginConstants, + ); + return _delegatePackingProperty!; + } + + /// The [FirebaseApp] for this current Auth instance. + FirebaseApp app; + + FirebaseAuth._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_auth'); + + /// Returns an instance using the default [FirebaseApp]. + static FirebaseAuth get instance { + FirebaseApp defaultAppInstance = Firebase.app(); + + return FirebaseAuth.instanceFor(app: defaultAppInstance); + } + + /// Returns an instance using a specified [FirebaseApp]. + factory FirebaseAuth.instanceFor({ + required FirebaseApp app, + }) { + return _firebaseAuthInstances.putIfAbsent(app.name, () { + final instance = FirebaseAuth._(app: app); + app.registerService( + instance, + dispose: (auth) => auth._dispose(), + ); + return instance; + }); + } + + Future _dispose() async { + _firebaseAuthInstances.remove(app.name); + final delegate = _delegatePackingProperty; + _delegatePackingProperty = null; + await delegate?.dispose(); + } + + /// Returns the current [User] if they are currently signed-in, or `null` if + /// not. + /// + /// This getter only provides a snapshot of user state. Applications that need + /// to react to changes in user state should instead use [authStateChanges], + /// [idTokenChanges] or [userChanges] to subscribe to updates. + User? get currentUser { + if (_delegate.currentUser != null) { + return User._(this, _delegate.currentUser!); + } + + return null; + } + + /// The current Auth instance's language code. + /// + /// See [setLanguageCode] to update the language code. + String? get languageCode { + return _delegate.languageCode; + } + + /// Changes this instance to point to an Auth emulator running locally. + /// + /// Set the [host] of the local emulator, such as "localhost" + /// Set the [port] of the local emulator, such as "9099" (port 9099 is default for auth package) + /// + /// Note: Must be called immediately, prior to accessing auth methods. + /// Do not use with production credentials as emulator traffic is not encrypted. + Future useAuthEmulator(String host, int port, + {bool automaticHostMapping = true}) async { + String mappedHost = automaticHostMapping ? getMappedHost(host) : host; + + await _delegate.useAuthEmulator(mappedHost, port); + } + + /// The current Auth instance's tenant ID. + String? get tenantId { + return _delegate.tenantId; + } + + /// Set the current Auth instance's tenant ID. + /// + /// When you set the tenant ID of an Auth instance, all future sign-in/sign-up + /// operations will pass this tenant ID and sign in or sign up users to the + /// specified tenant project. When set to null, users are signed in to the + /// parent project. By default, this is set to `null`. + set tenantId(String? tenantId) { + _delegate.tenantId = tenantId; + } + + /// The current Auth instance's custom auth domain. + /// The auth domain used to handle redirects from OAuth provides, for example + /// "my-awesome-app.firebaseapp.com". By default, this is set to `null` and + /// default auth domain is used. + /// + /// If not `null`, this value will supersede `authDomain` property set in `initializeApp`. + String? get customAuthDomain { + return _delegate.customAuthDomain; + } + + /// Set the current Auth instance's auth domain for apple and android platforms. + /// The auth domain used to handle redirects from OAuth provides, for example + /// "my-awesome-app.firebaseapp.com". By default, this is set to `null` and + /// default auth domain is used. + /// + /// If not `null`, this value will supersede `authDomain` property set in `initializeApp`. + set customAuthDomain(String? customAuthDomain) { + // Web and windows do not support setting custom auth domains on the auth instance + if (defaultTargetPlatform == TargetPlatform.windows || kIsWeb) { + final message = defaultTargetPlatform == TargetPlatform.windows + ? 'Cannot set custom auth domain on a FirebaseAuth instance for windows platform' + : 'Cannot set custom auth domain on a FirebaseAuth instance. Set the custom auth domain on `FirebaseOptions.authDomain` instance and pass into `Firebase.initializeApp()` instead.'; + throw UnimplementedError( + message, + ); + } + _delegate.customAuthDomain = customAuthDomain; + } + + /// Applies a verification code sent to the user by email or other out-of-band + /// mechanism. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + Future applyActionCode(String code) async { + await _delegate.applyActionCode(code); + } + + /// Checks a verification code sent to the user by email or other out-of-band + /// mechanism. + /// + /// Returns [ActionCodeInfo] about the code. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + Future checkActionCode(String code) { + return _delegate.checkActionCode(code); + } + + /// Completes the password reset process, given a confirmation code and new + /// password. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the action code has expired. + /// - **invalid-action-code**: + /// - Thrown if the action code is invalid. This can happen if the code is + /// malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given action code has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the action code. This may + /// have happened if the user was deleted between when the action code was + /// issued and when this method was called. + /// - **weak-password**: + /// - Thrown if the new password is not strong enough. + Future confirmPasswordReset({ + required String code, + required String newPassword, + }) async { + await _delegate.confirmPasswordReset(code, newPassword); + } + + /// Tries to create a new user account with the given email address and + /// password. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **email-already-in-use**: + /// - Thrown if there already exists an account with the given email address. + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + /// - **weak-password**: + /// - Thrown if the password is not strong enough. + /// - **too-many-requests**: + /// - Thrown if the user sent too many requests at the same time, for security + /// the api will not allow too many attempts at the same time, user will have + /// to wait for some time + /// - **user-token-expired**: + /// - Thrown if the user is no longer authenticated since his refresh token + /// has been expired + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future createUserWithEmailAndPassword({ + required String email, + required String password, + }) async { + return UserCredential._( + this, + await _delegate.createUserWithEmailAndPassword(email, password), + ); + } + + /// Returns a UserCredential from the redirect-based sign-in flow. + /// + /// If sign-in succeeded, returns the signed in user. If sign-in was + /// unsuccessful, fails with an error. If no redirect operation was called, + /// returns a [UserCredential] with a null User. + /// + /// This method is only support on web platforms. + Future getRedirectResult() async { + return UserCredential._(this, await _delegate.getRedirectResult()); + } + + /// Checks if an incoming link is a sign-in with email link. + bool isSignInWithEmailLink(String emailLink) { + return _delegate.isSignInWithEmailLink(emailLink); + } + + /// Internal helper which pipes internal [Stream] events onto + /// a users own Stream. + Stream _pipeStreamChanges(Stream stream) { + return stream.map((delegateUser) { + if (delegateUser == null) { + return null; + } + + return User._(this, delegateUser); + }).asBroadcastStream(onCancel: (sub) => sub.cancel()); + } + + /// Notifies about changes to the user's sign-in state (such as sign-in or + /// sign-out). + Stream authStateChanges() => + _pipeStreamChanges(_delegate.authStateChanges()); + + /// Notifies about changes to the user's sign-in state (such as sign-in or + /// sign-out) and also token refresh events. + Stream idTokenChanges() => + _pipeStreamChanges(_delegate.idTokenChanges()); + + /// Notifies about changes to any user updates. + /// + /// This is a superset of both [authStateChanges] and [idTokenChanges]. It + /// provides events on all user changes, such as when credentials are linked, + /// unlinked and when updates to the user profile are made. The purpose of + /// this Stream is for listening to realtime updates to the user state + /// (signed-in, signed-out, different user & token refresh) without + /// manually having to call [reload] and then rehydrating changes to your + /// application. + Stream userChanges() => _pipeStreamChanges(_delegate.userChanges()); + + /// Sends a password reset email to the given email address. + /// + /// To complete the password reset, call [confirmPasswordReset] with the code supplied + /// in the email sent to the user, along with the new password specified by the user. + /// + /// If email enumeration protection is enabled for the Firebase project, this + /// method may complete successfully even when the email does not correspond + /// to an existing user. + /// + /// May throw a [FirebaseAuthException] with the following error codes: + /// + /// - **auth/invalid-email**\ + /// Thrown if the email address is not valid. + /// - **auth/missing-android-pkg-name**\ + /// An Android package name must be provided if the Android app is required to be installed. + /// - **auth/missing-continue-uri**\ + /// A continue URL must be provided in the request. + /// - **auth/missing-ios-bundle-id**\ + /// An iOS Bundle ID must be provided if an App Store ID is provided. + /// - **auth/invalid-continue-uri**\ + /// The continue URL provided in the request is invalid. + /// - **auth/unauthorized-continue-uri**\ + /// The domain of the continue URL is not whitelisted. Whitelist the domain in the Firebase console. + /// - **auth/user-not-found**\ + /// Thrown if there is no user corresponding to the email address. Note: This + /// exception is not thrown when email enumeration protection is enabled. + Future sendPasswordResetEmail({ + required String email, + ActionCodeSettings? actionCodeSettings, + }) { + return _delegate.sendPasswordResetEmail(email, actionCodeSettings); + } + + /// Sends a sign in with email link to provided email address. + /// + /// To complete the password reset, call [confirmPasswordReset] with the code + /// supplied in the email sent to the user, along with the new password + /// specified by the user. + /// + /// The [handleCodeInApp] of [actionCodeSettings] must be set to `true` + /// otherwise an [ArgumentError] will be thrown. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + Future sendSignInLinkToEmail({ + required String email, + required ActionCodeSettings actionCodeSettings, + }) async { + if (actionCodeSettings.handleCodeInApp != true) { + throw ArgumentError( + 'The [handleCodeInApp] value of [ActionCodeSettings] must be `true`.', + ); + } + + await _delegate.sendSignInLinkToEmail(email, actionCodeSettings); + } + + /// When set to null, sets the user-facing language code to be the default app language. + /// + /// The language code will propagate to email action templates (password + /// reset, email verification and email change revocation), SMS templates for + /// phone authentication, reCAPTCHA verifier and OAuth popup/redirect + /// operations provided the specified providers support localization with the + /// language code specified. + Future setLanguageCode(String? languageCode) { + return _delegate.setLanguageCode(languageCode); + } + + /// Updates the current instance with the provided settings. + /// + /// [appVerificationDisabledForTesting] This setting applies to Android, iOS and + /// web platforms. When set to `true`, this property disables app + /// verification for the purpose of testing phone authentication. For this + /// property to take effect, it needs to be set before handling a reCAPTCHA + /// app verifier. When this is disabled, a mock reCAPTCHA is rendered + /// instead. This is useful for manual testing during development or for + /// automated integration tests. + /// + /// In order to use this feature, you will need to + /// [whitelist your phone number](https://firebase.google.com/docs/auth/web/phone-auth?authuser=0#test-with-whitelisted-phone-numbers) + /// via the Firebase Console. + /// + /// The default value is `false` (app verification is enabled). + /// + /// [forceRecaptchaFlow] This setting applies to Android only. When set to 'true', + /// it forces the application verification to use the web reCAPTCHA flow for Phone Authentication. + /// Once this has been called, every call to PhoneAuthProvider#verifyPhoneNumber() will skip the SafetyNet verification flow and use the reCAPTCHA flow instead. + /// Calling this method a second time will overwrite the previously passed parameter. + /// + /// [phoneNumber] & [smsCode] These settings apply to Android only. The phone number and SMS code here must have been configured in the Firebase Console (Authentication > Sign In Method > Phone). + /// Once this has been called, every call to PhoneAuthProvider#verifyPhoneNumber() with the same phone number as the one that is configured here will have onVerificationCompleted() triggered as the callback. + /// Calling this method a second time will overwrite the previously passed parameters. Only one number can be configured at a given time. + /// Calling this method with either parameter set to null removes this functionality until valid parameters are passed. + /// Verifying a phone number other than the one configured here will trigger normal behavior. If the phone number is configured as a test phone number in the console, the regular testing flow occurs. Otherwise, normal phone number verification will take place. + /// When this is set and PhoneAuthProvider#verifyPhoneNumber() is called with a matching phone number, PhoneAuthProvider.OnVerificationStateChangedCallbacks.onCodeAutoRetrievalTimeOut(String) will never be called. + /// + /// [userAccessGroup] This setting only applies to iOS and MacOS platforms. + /// When set, it allows you to share authentication state between + /// applications. Set the property to your team group ID or set to `null` + /// to remove sharing capabilities. + /// + /// Key Sharing capabilities must be enabled for your app via XCode (Project + /// settings > Capabilities). To learn more, visit the + /// [Apple documentation](https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps). + Future setSettings({ + bool appVerificationDisabledForTesting = false, + String? userAccessGroup, + String? phoneNumber, + String? smsCode, + bool? forceRecaptchaFlow, + }) { + return _delegate.setSettings( + appVerificationDisabledForTesting: appVerificationDisabledForTesting, + userAccessGroup: userAccessGroup, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + ); + } + + /// Changes the current type of persistence on the current Auth instance for + /// the currently saved Auth session and applies this type of persistence for + /// future sign-in requests, including sign-in with redirect requests. + /// + /// This will return a promise that will resolve once the state finishes + /// copying from one type of storage to the other. Calling a sign-in method + /// after changing persistence will wait for that persistence change to + /// complete before applying it on the new Auth state. + /// + /// This makes it easy for a user signing in to specify whether their session + /// should be remembered or not. It also makes it easier to never persist the + /// Auth state for applications that are shared by other users or have + /// sensitive data. + /// + /// This is only supported on web based platforms. + Future setPersistence(Persistence persistence) async { + return _delegate.setPersistence(persistence); + } + + /// Asynchronously creates and becomes an anonymous user. + /// + /// If there is already an anonymous user signed in, that user will be + /// returned instead. If there is any other existing user signed in, that + /// user will be signed out. + /// + /// **Important**: You must enable Anonymous accounts in the Auth section + /// of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **operation-not-allowed**: + /// - Thrown if anonymous accounts are not enabled. Enable anonymous accounts + /// in the Firebase Console, under the Auth tab. + Future signInAnonymously() async { + return UserCredential._(this, await _delegate.signInAnonymously()); + } + + /// Asynchronously signs in to Firebase with the given 3rd-party credentials + /// (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, + /// etc.) and returns additional identity provider data. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// If the user doesn't have an account already, one will be created + /// automatically. + /// + /// **Important**: You must enable the relevant accounts in the Auth section + /// of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **account-exists-with-different-credential**: + /// - Thrown if there already exists an account with the email address + /// asserted by the credential. + // ignore: deprecated_member_use_from_same_package + /// Resolve this by asking + /// the user to sign in using one of the returned providers. + /// Once the user is signed in, the original credential can be linked to + /// the user with [linkWithCredential]. + /// - **invalid-credential**: + /// - Thrown if the credential is malformed or has expired. + /// - **operation-not-allowed**: + /// - Thrown if the type of account corresponding to the credential is not + /// enabled. Enable the account type in the Firebase Console, under the + /// Auth tab. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given credential has been + /// disabled. + /// - **user-not-found**: + /// - Thrown if signing in with a credential from [EmailAuthProvider.credential] + /// and there is no user corresponding to the given email. + /// - **wrong-password**: + /// - Thrown if signing in with a credential from [EmailAuthProvider.credential] + /// and the password is invalid for the given email, or if the account + /// corresponding to the email does not have a password set. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future signInWithCredential(AuthCredential credential) async { + try { + return UserCredential._( + this, + await _delegate.signInWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Tries to sign in a user with a given custom token. + /// + /// Custom tokens are used to integrate Firebase Auth with existing auth + /// systems, and must be generated by the auth backend. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// If the user identified by the [uid] specified in the token doesn't + /// have an account already, one will be created automatically. + /// + /// Read how to use Custom Token authentication and the cases where it is + /// useful in [the guides](https://firebase.google.com/docs/auth/android/custom-auth). + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **custom-token-mismatch**: + /// - Thrown if the custom token is for a different Firebase App. + /// - **invalid-custom-token**: + /// - Thrown if the custom token format is incorrect. + Future signInWithCustomToken(String token) async { + try { + return UserCredential._( + this, await _delegate.signInWithCustomToken(token)); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Attempts to sign in a user with the given email address and password. + /// + /// If successful, it also signs the user in into the app and updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + /// + /// **Important**: You must enable Email & Password accounts in the Auth + /// section of the Firebase console before being able to use them. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + /// - **user-not-found** _(deprecated)_: + /// - Thrown if there is no user corresponding to the given email. + /// **Note:** This code is no longer returned on projects that have + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default for new projects since September 2023). + /// Use **invalid-credential** instead. + /// - **wrong-password** _(deprecated)_: + /// - Thrown if the password is invalid for the given email, or the account + /// corresponding to the email does not have a password set. + /// **Note:** This code is no longer returned on projects that have + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default for new projects since September 2023). + /// Use **invalid-credential** instead. + /// - **too-many-requests**: + /// - Thrown if the user sent too many requests at the same time, for security + /// the api will not allow too many attempts at the same time, user will have + /// to wait for some time + /// - **user-token-expired**: + /// - Thrown if the user is no longer authenticated since his refresh token + /// has been expired + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **invalid-credential**: + /// - Thrown if the email or password is incorrect. On projects with + /// [email enumeration protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) + /// enabled (the default since September 2023), this replaces + /// **user-not-found** and **wrong-password** to prevent revealing + /// whether an account exists. On the Firebase emulator, the code may + /// appear as **INVALID_LOGIN_CREDENTIALS**. + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future signInWithEmailAndPassword({ + required String email, + required String password, + }) async { + try { + return UserCredential._( + this, + await _delegate.signInWithEmailAndPassword(email, password), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Signs in using an email address and email sign-in link. + /// + /// Fails with an error if the email address is invalid or OTP in email link + /// expires. + /// + /// Confirm the link is a sign-in email link before calling this method, + /// using [isSignInWithEmailLink]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if OTP in email link expires. + /// - **invalid-email**: + /// - Thrown if the email address is not valid. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + Future signInWithEmailLink({ + required String email, + required String emailLink, + }) async { + try { + return UserCredential._( + this, + await _delegate.signInWithEmailLink(email, emailLink), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Signs in with an AuthProvider using native authentication flow. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + Future signInWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + this, + await _delegate.signInWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Starts a sign-in flow for a phone number. + /// + /// You can optionally provide a [RecaptchaVerifier] instance to control the + /// reCAPTCHA widget appearance and behavior. + /// + /// Once the reCAPTCHA verification has completed, called [ConfirmationResult.confirm] + /// with the users SMS verification code to complete the authentication flow. + /// + /// This method is only available on web based platforms. + Future signInWithPhoneNumber( + String phoneNumber, [ + RecaptchaVerifier? verifier, + ]) async { + assert(phoneNumber.isNotEmpty); + // If we add a recaptcha to the page by creating a new instance, we must + // also clear that instance before proceeding. + bool mustClear = verifier == null; + verifier ??= RecaptchaVerifier(auth: _delegate); + final result = + await _delegate.signInWithPhoneNumber(phoneNumber, verifier.delegate); + if (mustClear) { + verifier.clear(); + } + return ConfirmationResult._(this, result); + } + + /// Authenticates a Firebase client using a popup-based OAuth authentication + /// flow. + /// + /// If succeeds, returns the signed in user along with the provider's + /// credential. + /// + /// This method is only available on web based platforms. + Future signInWithPopup(AuthProvider provider) async { + try { + return UserCredential._(this, await _delegate.signInWithPopup(provider)); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Authenticates a Firebase client using a full-page redirect flow. + /// + /// To handle the results and errors for this operation, refer to + /// [getRedirectResult]. + Future signInWithRedirect(AuthProvider provider) { + try { + return _delegate.signInWithRedirect(provider); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(this, e); + } catch (e) { + rethrow; + } + } + + /// Checks a password reset code sent to the user by email or other + /// out-of-band mechanism. + /// + /// Returns the user's email address if valid. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **expired-action-code**: + /// - Thrown if the password reset code has expired. + /// - **invalid-action-code**: + /// - Thrown if the password reset code is invalid. This can happen if the + /// code is malformed or has already been used. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given email has been disabled. + /// - **user-not-found**: + /// - Thrown if there is no user corresponding to the password reset code. + /// This may have happened if the user was deleted between when the code + /// was issued and when this method was called. + Future verifyPasswordResetCode(String code) { + return _delegate.verifyPasswordResetCode(code); + } + + /// Starts a phone number verification process for the given phone number. + /// + /// This method is used to verify that the user-provided phone number belongs + /// to the user. Firebase sends a code via SMS message to the phone number, + /// where you must then prompt the user to enter the code. The code can be + /// combined with the verification ID to create a [PhoneAuthProvider.credential] + /// which you can then use to sign the user in, or link with their account ( + /// see [signInWithCredential] or [linkWithCredential]). + /// + /// On some Android devices, auto-verification can be handled by the device + /// and a [PhoneAuthCredential] will be automatically provided. + /// + /// No duplicated SMS will be sent out unless a [forceResendingToken] is + /// provided. + /// + /// [phoneNumber] The phone number for the account the user is signing up + /// for or signing into. Make sure to pass in a phone number with country + /// code prefixed with plus sign ('+'). + /// Should be null if it's a multi-factor sign in. + /// + /// [multiFactorInfo] The multi factor info you're using to verify the phone number. + /// Should be set if a [multiFactorSession] is provided. + /// + /// [multiFactorSession] The multi factor session you're using to verify the phone number. + /// Should be set if a [multiFactorInfo] is provided. + /// + /// [timeout] The maximum amount of time you are willing to wait for SMS + /// auto-retrieval to be completed by the library. Maximum allowed value + /// is 2 minutes. + /// + /// [forceResendingToken] The [forceResendingToken] obtained from [codeSent] + /// callback to force re-sending another verification SMS before the + /// auto-retrieval timeout. + /// + /// [verificationCompleted] Triggered when an SMS is auto-retrieved or the + /// phone number has been instantly verified. The callback will receive an + /// [PhoneAuthCredential] that can be passed to [signInWithCredential] or + /// [linkWithCredential]. + /// + /// [verificationFailed] Triggered when an error occurred during phone number + /// verification. A [FirebaseAuthException] is provided when this is + /// triggered. + /// + /// [codeSent] Triggered when an SMS has been sent to the users phone, and + /// will include a [verificationId] and [forceResendingToken]. + /// + /// [codeAutoRetrievalTimeout] Triggered when SMS auto-retrieval times out and + /// provide a [verificationId]. + Future verifyPhoneNumber({ + String? phoneNumber, + PhoneMultiFactorInfo? multiFactorInfo, + required PhoneVerificationCompleted verificationCompleted, + required PhoneVerificationFailed verificationFailed, + required PhoneCodeSent codeSent, + required PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout, + @visibleForTesting String? autoRetrievedSmsCodeForTesting, + Duration timeout = const Duration(seconds: 30), + int? forceResendingToken, + MultiFactorSession? multiFactorSession, + }) { + assert( + phoneNumber != null || multiFactorInfo != null, + 'Either phoneNumber or multiFactorInfo must be provided.', + ); + return _delegate.verifyPhoneNumber( + phoneNumber: phoneNumber, + multiFactorInfo: multiFactorInfo, + timeout: timeout, + forceResendingToken: forceResendingToken, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, + // ignore: invalid_use_of_visible_for_testing_member + autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, + multiFactorSession: multiFactorSession, + ); + } + + /// Apple only. Users signed in with Apple provider can revoke their token using an authorization code. + /// Authorization code can be retrieved on the user credential i.e. userCredential.additionalUserInfo.authorizationCode + Future revokeTokenWithAuthorizationCode(String authorizationCode) { + return _delegate.revokeTokenWithAuthorizationCode(authorizationCode); + } + + /// Android only. Revokes the provided accessToken. Currently supports revoking Apple-issued accessToken only. + Future revokeAccessToken(String accessToken) { + return _delegate.revokeAccessToken(accessToken); + } + + /// Signs out the current user. + /// + /// If successful, it also updates + /// any [authStateChanges], [idTokenChanges] or [userChanges] stream + /// listeners. + Future signOut() async { + await _delegate.signOut(); + } + + /// Initializes the reCAPTCHA Enterprise client proactively to enhance reCAPTCHA signal collection and + /// to complete reCAPTCHA-protected flows in a single attempt. + Future initializeRecaptchaConfig() { + return _delegate.initializeRecaptchaConfig(); + } + + /// Validates a password against the password policy configured for the project or tenant. + /// + /// If no tenant ID is set on the Auth instance, then this method will use the password policy configured for the project. + /// Otherwise, this method will use the policy configured for the tenant. If a password policy has not been configured, + /// then the default policy configured for all projects will be used. + /// + /// If an auth flow fails because a submitted password does not meet the password policy requirements and this method has previously been called, + /// then this method will use the most recent policy available when called again. + /// + /// Returns a map with the following keys: + /// - **status**: A boolean indicating if the password is valid. + /// - **passwordPolicy**: The password policy used to validate the password. + /// - **meetsMinPasswordLength**: A boolean indicating if the password meets the minimum length requirement. + /// - **meetsMaxPasswordLength**: A boolean indicating if the password meets the maximum length requirement. + /// - **meetsLowercaseRequirement**: A boolean indicating if the password meets the lowercase requirement. + /// - **meetsUppercaseRequirement**: A boolean indicating if the password meets the uppercase requirement. + /// - **meetsDigitsRequirement**: A boolean indicating if the password meets the digits requirement. + /// - **meetsSymbolsRequirement**: A boolean indicating if the password meets the symbols requirement. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-password**: + /// - Thrown if the password is invalid. + /// - **network-request-failed**: + /// - Thrown if there was a network request error, for example the user + /// doesn't have internet connection + /// - **INVALID_LOGIN_CREDENTIALS** or **invalid-credential**: + /// - Thrown if the password is invalid for the given email, or the account + /// corresponding to the email does not have a password set. + /// Depending on if you are using firebase emulator or not the code is + /// different + /// - **operation-not-allowed**: + /// - Thrown if email/password accounts are not enabled. Enable + /// email/password accounts in the Firebase Console, under the Auth tab. + Future validatePassword( + FirebaseAuth auth, + String? password, + ) async { + if (password == null || password.isEmpty) { + throw FirebaseAuthException( + code: 'invalid-password', + message: 'Password cannot be null or empty', + ); + } + PasswordPolicyApi passwordPolicyApi = + PasswordPolicyApi(auth.app.options.apiKey); + PasswordPolicy passwordPolicy = + await passwordPolicyApi.fetchPasswordPolicy(); + PasswordPolicyImpl passwordPolicyImpl = PasswordPolicyImpl(passwordPolicy); + return passwordPolicyImpl.isPasswordValid(password); + } + + @override + String toString() { + return 'FirebaseAuth(app: ${app.name})'; + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart new file mode 100644 index 00000000..4610e284 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/multi_factor.dart @@ -0,0 +1,213 @@ +// Copyright 2022, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// Defines multi-factor related properties and operations pertaining to a [User]. +/// This class acts as the main entry point for enrolling or un-enrolling +/// second factors for a user, and provides access to their currently enrolled factors. +class MultiFactor { + MultiFactorPlatform _delegate; + + MultiFactor._(this._delegate); + + /// Returns a session identifier for a second factor enrollment operation. + Future getSession() { + return _delegate.getSession(); + } + + /// Enrolls a second factor as identified by the [MultiFactorAssertion] parameter for the current user. + /// + /// [displayName] can be used to provide a display name for the second factor. + Future enroll( + MultiFactorAssertion assertion, { + String? displayName, + }) async { + if (assertion._delegate is TotpMultiFactorGeneratorPlatform) { + assert(displayName != null, 'displayName is mandatory for TOTP'); + } + return _delegate.enroll(assertion._delegate, displayName: displayName); + } + + /// Unenrolls a second factor from this user. + /// + /// [factorUid] is the unique identifier of the second factor to unenroll. + /// [multiFactorInfo] is the [MultiFactorInfo] of the second factor to unenroll. + /// Only one of [factorUid] or [multiFactorInfo] should be provided. + Future unenroll({String? factorUid, MultiFactorInfo? multiFactorInfo}) { + assert( + (factorUid != null && multiFactorInfo == null) || + (factorUid == null && multiFactorInfo != null), + 'Exactly one of `factorUid` or `multiFactorInfo` must be provided', + ); + return _delegate.unenroll( + factorUid: factorUid, + multiFactorInfo: multiFactorInfo, + ); + } + + /// Returns a list of the [MultiFactorInfo] already associated with this user. + Future> getEnrolledFactors() { + return _delegate.getEnrolledFactors(); + } +} + +/// Provider for generating a PhoneMultiFactorAssertion. +class PhoneMultiFactorGenerator { + /// Transforms a PhoneAuthCredential into a [MultiFactorAssertion] + /// which can be used to confirm ownership of a phone second factor. + static MultiFactorAssertion getAssertion( + PhoneAuthCredential credential, + ) { + final assertion = + PhoneMultiFactorGeneratorPlatform.instance.getAssertion(credential); + return MultiFactorAssertion._(assertion); + } +} + +/// Provider for generating a PhoneMultiFactorAssertion. +class TotpMultiFactorGenerator { + /// Transforms a PhoneAuthCredential into a [MultiFactorAssertion] + /// which can be used to confirm ownership of a phone second factor. + static Future generateSecret( + MultiFactorSession session, + ) async { + final secret = + await TotpMultiFactorGeneratorPlatform.instance.generateSecret(session); + return TotpSecret._( + secret.codeIntervalSeconds, + secret.codeLength, + secret.enrollmentCompletionDeadline, + secret.hashingAlgorithm, + secret.secretKey, + secret, + ); + } + + /// Get a [MultiFactorAssertion] + /// which can be used to confirm ownership of a TOTP second factor. + static Future getAssertionForEnrollment( + TotpSecret secret, + String oneTimePassword, + ) async { + final assertion = await TotpMultiFactorGeneratorPlatform.instance + .getAssertionForEnrollment( + secret._instance, + oneTimePassword, + ); + + return MultiFactorAssertion._(assertion); + } + + /// Get a [MultiFactorAssertion] + /// which can be used to confirm ownership of a TOTP second factor. + static Future getAssertionForSignIn( + String enrollmentId, + String oneTimePassword, + ) async { + final assertion = + await TotpMultiFactorGeneratorPlatform.instance.getAssertionForSignIn( + enrollmentId, + oneTimePassword, + ); + + return MultiFactorAssertion._(assertion); + } +} + +class TotpSecret { + final TotpSecretPlatform _instance; + + final int? codeIntervalSeconds; + final int? codeLength; + final DateTime? enrollmentCompletionDeadline; + final String? hashingAlgorithm; + final String secretKey; + + TotpSecret._( + this.codeIntervalSeconds, + this.codeLength, + this.enrollmentCompletionDeadline, + this.hashingAlgorithm, + this.secretKey, + this._instance, + ); + + /// Generate a TOTP secret for the authenticated user. + Future generateQrCodeUrl({ + String? accountName, + String? issuer, + }) { + return _instance.generateQrCodeUrl( + accountName: accountName, + issuer: issuer, + ); + } + + /// Opens the specified QR Code URL in a password manager like iCloud Keychain. + Future openInOtpApp( + String qrCodeUrl, + ) async { + await _instance.openInOtpApp( + qrCodeUrl, + ); + } +} + +/// Represents an assertion that the Firebase Authentication server +/// can use to authenticate a user as part of a multi-factor flow. +class MultiFactorAssertion { + final MultiFactorAssertionPlatform _delegate; + + MultiFactorAssertion._(this._delegate) { + MultiFactorAssertionPlatform.verify(_delegate); + } +} + +/// Utility class that contains methods to resolve second factor +/// requirements on users that have opted into two-factor authentication. +class MultiFactorResolver { + final FirebaseAuth _auth; + final MultiFactorResolverPlatform _delegate; + + MultiFactorResolver._(this._auth, this._delegate) { + MultiFactorResolverPlatform.verify(_delegate); + } + + /// List of [MultiFactorInfo] which represents the available + /// second factors that can be used to complete the sign-in for the current session. + List get hints => _delegate.hints; + + /// A MultiFactorSession, an opaque session identifier for the current sign-in flow. + MultiFactorSession get session => _delegate.session; + + /// Completes sign in with a second factor using an MultiFactorAssertion which + /// confirms that the user has successfully completed the second factor challenge. + Future resolveSignIn( + MultiFactorAssertion assertion, + ) async { + final credential = await _delegate.resolveSignIn(assertion._delegate); + return UserCredential._(_auth, credential); + } +} + +/// MultiFactor exception related to Firebase Authentication. Check the error code +/// and message for more details. +class FirebaseAuthMultiFactorException extends FirebaseAuthException { + final FirebaseAuth _auth; + final FirebaseAuthMultiFactorExceptionPlatform _delegate; + + FirebaseAuthMultiFactorException._(this._auth, this._delegate) + : super( + code: _delegate.code, + message: _delegate.message, + email: _delegate.email, + credential: _delegate.credential, + phoneNumber: _delegate.phoneNumber, + tenantId: _delegate.tenantId, + ); + + MultiFactorResolver get resolver => + MultiFactorResolver._(_auth, _delegate.resolver); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart new file mode 100644 index 00000000..8c86d794 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/recaptcha_verifier.dart @@ -0,0 +1,100 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// An [reCAPTCHA](https://www.google.com/recaptcha/?authuser=0)-based +/// application verifier. +class RecaptchaVerifier { + static final RecaptchaVerifierFactoryPlatform _factory = + RecaptchaVerifierFactoryPlatform.instance; + + RecaptchaVerifier._(this._delegate); + + RecaptchaVerifierFactoryPlatform _delegate; + + /// Creates a new [RecaptchaVerifier] instance used to render a reCAPTCHA widget + /// when calling [signInWithPhoneNumber]. + /// + /// It is possible to configure the reCAPTCHA widget with the following arguments, + /// however if no arguments are provided, an "invisible" reCAPTCHA widget with + /// defaults will be created. + /// + /// [container] If a value is provided, the element must exist in the DOM when + /// [render] or [signInWithPhoneNumber] is called. The reCAPTCHA widget will + /// be rendered within the specified DOM element. + /// + /// If no value is provided, an "invisible" reCAPTCHA will be shown when [render] + /// is called. An invisible reCAPTCHA widget is shown a modal on-top of your + /// application. + /// + /// [size] When providing a custom [container], a size (normal or compact) can + /// be provided to change the size of the reCAPTCHA widget. This has no effect + /// when a [container] is not provided. Defaults to [RecaptchaVerifierSize.normal]. + /// + /// [theme] When providing a custom [container], a theme (light or dark) can + /// be provided to change the appearance of the reCAPTCHA widget. This has no + /// effect when a [container] is not provided. Defaults to [RecaptchaVerifierTheme.light]. + /// + /// [onSuccess] An optional callback which is called when the user successfully + /// completes the reCAPTCHA widget. + /// + /// [onError] An optional callback which is called when the reCAPTCHA widget errors + /// (such as a network issue). + /// + /// [onExpired] An optional callback which is called when the reCAPTCHA expires. + factory RecaptchaVerifier({ + required FirebaseAuthPlatform auth, + String? container, + RecaptchaVerifierSize size = RecaptchaVerifierSize.normal, + RecaptchaVerifierTheme theme = RecaptchaVerifierTheme.light, + RecaptchaVerifierOnSuccess? onSuccess, + RecaptchaVerifierOnError? onError, + RecaptchaVerifierOnExpired? onExpired, + }) { + return RecaptchaVerifier._( + _factory.delegateFor( + auth: auth, + container: container, + size: size, + theme: theme, + onSuccess: onSuccess, + onError: onError, + onExpired: onExpired, + ), + ); + } + + /// Returns the underlying factory delegate instance. + @protected + RecaptchaVerifierFactoryPlatform get delegate { + return _delegate; + } + + /// The application verifier type. For a reCAPTCHA verifier, this is + /// 'recaptcha'. + String get type { + return _delegate.type; + } + + /// Clears the reCAPTCHA widget from the page and destroys the current + /// instance. + void clear() { + return _delegate.clear(); + } + + /// Renders the reCAPTCHA widget on the page. + /// + /// Returns a [Future] that resolves with the reCAPTCHA widget ID. + Future render() async { + return _delegate.render(); + } + + /// Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA + /// token. + Future verify() async { + return _delegate.verify(); + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart new file mode 100644 index 00000000..9b7ccdb7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user.dart @@ -0,0 +1,685 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A user account. +class User { + UserPlatform _delegate; + + final FirebaseAuth _auth; + MultiFactor? _multiFactor; + + User._(this._auth, this._delegate) { + UserPlatform.verify(_delegate); + } + + /// The users display name. + /// + /// Will be `null` if signing in anonymously or via password authentication. + String? get displayName { + return _delegate.displayName; + } + + /// The users email address. + /// + /// Will be `null` if signing in anonymously. + String? get email { + return _delegate.email; + } + + /// Returns whether the users email address has been verified. + /// + /// To send a verification email, see [sendEmailVerification]. + /// + /// Once verified, call [reload] to ensure the latest user information is + /// retrieved from Firebase. + bool get emailVerified { + return _delegate.isEmailVerified; + } + + /// Returns whether the user is a anonymous. + bool get isAnonymous { + return _delegate.isAnonymous; + } + + /// Returns additional metadata about the user, such as their creation time. + UserMetadata get metadata { + return _delegate.metadata; + } + + /// Returns the users phone number. + /// + /// This property will be `null` if the user has not signed in or been has + /// their phone number linked. + String? get phoneNumber { + return _delegate.phoneNumber; + } + + /// Returns a photo URL for the user. + /// + /// This property will be populated if the user has signed in or been linked + /// with a 3rd party OAuth provider (such as Google). + String? get photoURL { + return _delegate.photoURL; + } + + /// Returns a list of user information for each linked provider. + List get providerData { + return _delegate.providerData; + } + + /// Returns a JWT refresh token for the user. + /// + /// This property will be an empty string for native platforms (android, iOS & macOS) as they do not + /// support refresh tokens. + String? get refreshToken { + return _delegate.refreshToken; + } + + /// The current user's tenant ID. + /// + /// This is a read-only property, which indicates the tenant ID used to sign + /// in the current user. This is `null` if the user is signed in from the + /// parent project. + String? get tenantId { + return _delegate.tenantId; + } + + /// The user's unique ID. + String get uid { + return _delegate.uid; + } + + /// Deletes and signs out the user. + /// + /// **Important**: this is a security-sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **requires-recent-login**: + /// - Thrown if the user's last sign-in time does not meet the security + /// threshold. Use [User.reauthenticateWithCredential] to resolve. This + /// does not apply if the user is anonymous. + Future delete() async { + return _delegate.delete(); + } + + /// Returns a JSON Web Token (JWT) used to identify the user to a Firebase + /// service. + /// + /// Returns the current token if it has not expired. Otherwise, this will + /// refresh the token and return a new one. + /// + /// If [forceRefresh] is `true`, the token returned will be refreshed regardless + /// of token expiration. + Future getIdToken([bool forceRefresh = false]) { + return _delegate.getIdToken(forceRefresh); + } + + /// Returns a [IdTokenResult] containing the users JSON Web Token (JWT) and + /// other metadata. + /// + /// Returns the current token if it has not expired. Otherwise, this will + /// refresh the token and return a new one. + /// + /// If [forceRefresh] is `true`, the token returned will be refreshed regardless + /// of token expiration. + Future getIdTokenResult([bool forceRefresh = false]) { + return _delegate.getIdTokenResult(forceRefresh); + } + + /// Links the user account with the given credentials. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. Please note, you will + /// not recover from this error if you're using a [PhoneAuthCredential] to link + /// a provider to an account. Once an attempt to link an account has been made, + /// a new sms code is required to sign in the user. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. To + /// do so, sign in to `email` via one of + /// the providers returned and then [User.linkWithCredential] the original + /// credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **invalid-email**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future linkWithCredential(AuthCredential credential) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links with an AuthProvider using native authentication flow. + /// On web, you should use [linkWithPopup] or [linkWithRedirect] instead. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a Provider. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithProvider( + AuthProvider provider, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithProvider(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a popup on Web. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithPopup( + AuthProvider provider, + ) async { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithPopup(provider), + ); + } + + /// Re-authenticates a user using a redirection on Web. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithRedirect( + AuthProvider provider, + ) async { + await _delegate.reauthenticateWithRedirect(provider); + } + + /// Links the user account with the given provider. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithPopup(AuthProvider provider) async { + try { + return UserCredential._( + _auth, + await _delegate.linkWithPopup(provider), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links the user account with the given provider. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the credential already exists + /// among your users, or is already linked to a Firebase User. For example, + /// this error could be thrown if you are upgrading an anonymous user to a + /// Google user by linking a Google credential to it and the Google + /// credential used is already associated with an existing Firebase Google + /// user. The fields `email`, `phoneNumber`, and `credential` + /// ([AuthCredential]) may be provided, depending on the type of + /// credential. You can recover from this error by signing in with + /// `credential` directly via [signInWithCredential]. + /// - **email-already-in-use**: + /// - Thrown if the email corresponding to the credential already exists + /// among your users. When thrown while linking a credential to an existing + /// user, an `email` and `credential` ([AuthCredential]) fields are also + /// provided. You have to link the credential to the existing user with + /// that email if you wish to continue signing in with that credential. + /// To do so, sign in to `email` via one + /// of the providers and then [User.linkWithCredential] the + /// original credential to that newly signed in user. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the provider in the Firebase Console. Go + /// to the Firebase Console for your project, in the Auth section and the + /// Sign in Method tab and configure the provider. + Future linkWithRedirect(AuthProvider provider) async { + try { + await _delegate.linkWithRedirect(provider); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Links the user account with the given phone number. + /// + /// This method is only supported on web platforms. Use [verifyPhoneNumber] and + /// then [linkWithCredential] on these platforms. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **provider-already-linked**: + /// - Thrown if the provider has already been linked to the user. This error + /// is thrown even if this is not the same provider's account that is + /// currently linked to the user. + /// - **captcha-check-failed**: + /// - Thrown if the reCAPTCHA response token was invalid, expired, or if this + /// method was called from a non-whitelisted domain. + /// - **invalid-phone-number**: + /// - Thrown if the phone number has an invalid format. + /// - **quota-exceeded**: + /// - Thrown if the SMS quota for the Firebase project has been exceeded. + /// - **user-disabled**: + /// - Thrown if the user corresponding to the given phone number has been disabled. + /// - **credential-already-in-use**: + /// - Thrown if the account corresponding to the phone number already exists + /// among your users, or is already linked to a Firebase User. + /// - **operation-not-allowed**: + /// - Thrown if you have not enabled the phone authentication provider in the + /// Firebase Console. Go to the Firebase Console for your project, in the Auth + /// section and the Sign in Method tab and configure the provider. + Future linkWithPhoneNumber( + String phoneNumber, [ + RecaptchaVerifier? verifier, + ]) async { + assert(phoneNumber.isNotEmpty); + // If we add a recaptcha to the page by creating a new instance, we must + // also clear that instance before proceeding. + bool mustClear = verifier == null; + verifier ??= RecaptchaVerifier(auth: _delegate.auth); + try { + final result = + await _delegate.linkWithPhoneNumber(phoneNumber, verifier.delegate); + if (mustClear) { + verifier.clear(); + } + return ConfirmationResult._(_auth, result); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Re-authenticates a user using a fresh credential. + /// + /// Use before operations such as [User.updatePassword] that require tokens + /// from recent sign-in attempts. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **user-mismatch**: + /// - Thrown if the credential given does not correspond to the user. + /// - **user-not-found**: + /// - Thrown if the credential given does not correspond to any existing + /// user. + /// - **invalid-credential**: + /// - Thrown if the provider's credential is not valid. This can happen if it + /// has already expired when calling link, or if it used invalid token(s). + /// See the Firebase documentation for your provider, and make sure you + /// pass in the correct parameters to the credential method. + /// - **invalid-email**: + /// - Thrown if the email used in a [EmailAuthProvider.credential] is + /// invalid. + /// - **wrong-password**: + /// - Thrown if the password used in a [EmailAuthProvider.credential] is not + /// correct or when the user associated with the email does not have a + /// password. + /// - **invalid-verification-code**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the credential is a [PhoneAuthProvider.credential] and the + /// verification ID of the credential is not valid. + Future reauthenticateWithCredential( + AuthCredential credential, + ) async { + try { + return UserCredential._( + _auth, + await _delegate.reauthenticateWithCredential(credential), + ); + } on FirebaseAuthMultiFactorExceptionPlatform catch (e) { + throw FirebaseAuthMultiFactorException._(_auth, e); + } catch (e) { + rethrow; + } + } + + /// Refreshes the current user, if signed in. + Future reload() async { + await _delegate.reload(); + } + + /// Sends a verification email to a user. + /// + /// The verification process is completed by calling [applyActionCode]. + Future sendEmailVerification([ + ActionCodeSettings? actionCodeSettings, + ]) async { + await _delegate.sendEmailVerification(actionCodeSettings); + } + + /// Unlinks a provider from a user account. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **no-such-provider**: + /// - Thrown if the user does not have this provider linked or when the + /// provider ID given does not exist. + Future unlink(String providerId) async { + return User._(_auth, await _delegate.unlink(providerId)); + } + + /// Updates the user's email address. + /// + /// An email will be sent to the original email address (if it was set) that + /// allows to revoke the email address change, in order to protect them from + /// account hijacking. + /// + /// **Important**: this is a security sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + + /// Updates the user's password. + /// + /// **Important**: this is a security sensitive operation that requires the + /// user to have recently signed in. If this requirement isn't met, ask the + /// user to authenticate again and then call [User.reauthenticateWithCredential]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **weak-password**: + /// - Thrown if the password is not strong enough. + /// - **requires-recent-login**: + /// - Thrown if the user's last sign-in time does not meet the security + /// threshold. Use [User.reauthenticateWithCredential] to resolve. This + /// does not apply if the user is anonymous. + Future updatePassword(String newPassword) async { + await _delegate.updatePassword(newPassword); + } + + /// Updates the user's phone number. + /// + /// A credential can be created by verifying a phone number via [verifyPhoneNumber]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **invalid-verification-code**: + /// - Thrown if the verification code of the credential is not valid. + /// - **invalid-verification-id**: + /// - Thrown if the verification ID of the credential is not valid. + Future updatePhoneNumber(PhoneAuthCredential phoneCredential) async { + await _delegate.updatePhoneNumber(phoneCredential); + } + + /// Update the user name. + Future updateDisplayName(String? displayName) { + return _delegate + .updateProfile({'displayName': displayName}); + } + + /// Update the user's profile picture. + Future updatePhotoURL(String? photoURL) { + return _delegate.updateProfile({'photoURL': photoURL}); + } + + /// Updates a user's profile data. + Future updateProfile({String? displayName, String? photoURL}) { + return _delegate.updateProfile({ + 'displayName': displayName, + 'photoURL': photoURL, + }); + } + + /// Sends a verification email to a new email address. The user's email will + /// be updated to the new one after being verified. + /// + /// If you have a custom email action handler, you can complete the + /// verification process by calling [applyActionCode]. + /// + /// A [FirebaseAuthException] maybe thrown with the following error code: + /// - **missing-android-pkg-name**: + /// - An Android package name must be provided if the Android app is required to be installed. + /// - **missing-continue-uri**: + /// - A continue URL must be provided in the request. + /// - **missing-ios-bundle-id**: + /// - An iOS bundle ID must be provided if an App Store ID is provided. + /// - **invalid-continue-uri**: + /// - The continue URL provided in the request is invalid. + /// - **unauthorized-continue-uri**: + /// - The domain of the continue URL is not whitelisted. Whitelist the domain in the Firebase console. + Future verifyBeforeUpdateEmail( + String newEmail, [ + ActionCodeSettings? actionCodeSettings, + ]) async { + await _delegate.verifyBeforeUpdateEmail(newEmail, actionCodeSettings); + } + + MultiFactor get multiFactor { + if (!kIsWeb && (defaultTargetPlatform == TargetPlatform.windows)) { + throw UnimplementedError( + 'MultiFactor Authentication is only supported on web, Android, iOS and macOS.', + ); + } + return _multiFactor ??= MultiFactor._(_delegate.multiFactor); + } + + @override + String toString() { + return '$User(' + 'displayName: $displayName, ' + 'email: $email, ' + 'isEmailVerified: $emailVerified, ' + 'isAnonymous: $isAnonymous, ' + 'metadata: $metadata, ' + 'phoneNumber: $phoneNumber, ' + 'photoURL: $photoURL, ' + 'providerData, $providerData, ' + 'refreshToken: $refreshToken, ' + 'tenantId: $tenantId, ' + 'uid: $uid)'; + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart new file mode 100644 index 00000000..3afbbc7d --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/lib/src/user_credential.dart @@ -0,0 +1,39 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of '../firebase_auth.dart'; + +/// A UserCredential is returned from authentication requests such as +/// [createUserWithEmailAndPassword]. +class UserCredential { + UserCredential._(this._auth, this._delegate) { + UserCredentialPlatform.verify(_delegate); + } + + final FirebaseAuth _auth; + final UserCredentialPlatform _delegate; + + /// Returns additional information about the user, such as whether they are a + /// newly created one. + AdditionalUserInfo? get additionalUserInfo => _delegate.additionalUserInfo; + + /// The users [AuthCredential]. + AuthCredential? get credential => _delegate.credential; + + /// Returns a [User] containing additional information and user specific + /// methods. + User? get user { + // TODO(rousselGit): cache the `user` instance or override == so that ".user == .user" + return _delegate.user == null ? null : User._(_auth, _delegate.user!); + } + + @override + String toString() { + return 'UserCredential(' + 'additionalUserInfo: $additionalUserInfo, ' + 'credential: $credential, ' + 'user: $user)'; + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec new file mode 100755 index 00000000..4e5be544 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth.podspec @@ -0,0 +1,65 @@ +require 'yaml' + +pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) +library_version = pubspec['version'].gsub('+', '-') + +if defined?($FirebaseSDKVersion) + Pod::UI.puts "#{pubspec['name']}: Using user specified Firebase SDK version '#{$FirebaseSDKVersion}'" + firebase_sdk_version = $FirebaseSDKVersion +else + firebase_core_script = File.join(File.expand_path('..', File.expand_path('..', File.dirname(__FILE__))), 'firebase_core/ios/firebase_sdk_version.rb') + if File.exist?(firebase_core_script) + require firebase_core_script + firebase_sdk_version = firebase_sdk_version! + Pod::UI.puts "#{pubspec['name']}: Using Firebase SDK version '#{firebase_sdk_version}' defined in 'firebase_core'" + end +end + +begin + required_macos_version = "10.12" + current_target_definition = Pod::Config.instance.podfile.send(:current_target_definition) + user_osx_target = current_target_definition.to_hash["platform"]["osx"] + if (Gem::Version.new(user_osx_target) < Gem::Version.new(required_macos_version)) + error_message = "The FlutterFire plugin #{pubspec['name']} for macOS requires a macOS deployment target of #{required_macos_version} or later." + Pod::UI.warn error_message, [ + "Update the `platform :osx, '#{user_osx_target}'` line in your macOS/Podfile to version `#{required_macos_version}` and ensure you commit this file.", + "Open your `macos/Runner.xcodeproj` Xcode project and under the 'Runner' target General tab set your Deployment Target to #{required_macos_version} or later." + ] + raise Pod::Informative, error_message + end +rescue Pod::Informative + raise +rescue + # Do nothing for all other errors and let `pod install` deal with any issues. +end + +Pod::Spec.new do |s| + s.name = pubspec['name'] + s.version = library_version + s.summary = pubspec['description'] + s.description = pubspec['description'] + s.homepage = pubspec['homepage'] + s.license = { :file => '../LICENSE' } + s.authors = 'The Chromium Authors' + s.source = { :path => '.' } + + s.source_files = 'firebase_auth/Sources/firebase_auth/**/*.{h,m}' + s.public_header_files = 'firebase_auth/Sources/firebase_auth/include/Public/**/*.h' + s.private_header_files = 'firebase_auth/Sources/firebase_auth/include/Private/**/*.h' + + s.platform = :osx, '10.13' + + # Flutter dependencies + s.dependency 'FlutterMacOS' + + # Firebase dependencies + s.dependency 'firebase_core' + s.dependency 'Firebase/CoreOnly', "~> #{firebase_sdk_version}" + s.dependency 'Firebase/Auth', "~> #{firebase_sdk_version}" + + s.static_framework = true + s.pod_target_xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "LIBRARY_VERSION=\\\"#{library_version}\\\" LIBRARY_NAME=\\\"flutter-fire-auth\\\"", + 'DEFINES_MODULE' => 'YES' + } +end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift new file mode 100644 index 00000000..7360233f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Package.swift @@ -0,0 +1,43 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +// Copyright 2024, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import PackageDescription + +let libraryVersion = "6.5.4" +let firebaseSdkVersion: Version = "12.15.0" + +let package = Package( + name: "firebase_auth", + platforms: [ + .macOS("10.15") + ], + products: [ + .library(name: "firebase-auth", targets: ["firebase_auth"]) + ], + dependencies: [ + .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: firebaseSdkVersion), + .package(name: "firebase_core", path: "../firebase_core-4.11.0"), + ], + targets: [ + .target( + name: "firebase_auth", + dependencies: [ + .product(name: "FirebaseAuth", package: "firebase-ios-sdk"), + .product(name: "firebase-core", package: "firebase_core"), + ], + resources: [ + .process("Resources") + ], + cSettings: [ + .headerSearchPath("include/Private"), + .headerSearchPath("include/Public"), + .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), + .define("LIBRARY_NAME", to: "\"flutter-fire-auth\""), + ] + ) + ] +) diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m new file mode 100644 index 00000000..5ef9adaf --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTAuthStateChannelStreamHandler.m @@ -0,0 +1,56 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTAuthStateChannelStreamHandler { + FIRAuth *_auth; + FIRAuthStateDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{ + @"user" : [NSNull null], + }); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeAuthStateDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m new file mode 100644 index 00000000..606dda68 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -0,0 +1,2376 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; +#import +#import +#if __has_include() +#import +#else +#import +#endif + +#import "include/Private/FLTAuthStateChannelStreamHandler.h" +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Private/PigeonParser.h" + +#import "include/Public/CustomPigeonHeader.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" +@import CommonCrypto; +#import + +#if __has_include() +#import +#else +#import +#endif + +NSString *const kFLTFirebaseAuthChannelName = @"plugins.flutter.io/firebase_auth"; + +// Argument Keys +NSString *const kAppName = @"appName"; + +// Provider type keys. +NSString *const kSignInMethodPassword = @"password"; +NSString *const kSignInMethodEmailLink = @"emailLink"; +NSString *const kSignInMethodFacebook = @"facebook.com"; +NSString *const kSignInMethodGoogle = @"google.com"; +NSString *const kSignInMethodGameCenter = @"gc.apple.com"; +NSString *const kSignInMethodTwitter = @"twitter.com"; +NSString *const kSignInMethodGithub = @"github.com"; +NSString *const kSignInMethodApple = @"apple.com"; +NSString *const kSignInMethodPhone = @"phone"; +NSString *const kSignInMethodOAuth = @"oauth"; + +// Credential argument keys. +NSString *const kArgumentCredential = @"credential"; +NSString *const kArgumentProviderId = @"providerId"; +NSString *const kArgumentProviderScope = @"scopes"; +NSString *const kArgumentProviderCustomParameters = @"customParameters"; +NSString *const kArgumentSignInMethod = @"signInMethod"; +NSString *const kArgumentSecret = @"secret"; +NSString *const kArgumentIdToken = @"idToken"; +NSString *const kArgumentAccessToken = @"accessToken"; +NSString *const kArgumentRawNonce = @"rawNonce"; +NSString *const kArgumentEmail = @"email"; +NSString *const kArgumentCode = @"code"; +NSString *const kArgumentNewEmail = @"newEmail"; +NSString *const kArgumentEmailLink = kSignInMethodEmailLink; +NSString *const kArgumentToken = @"token"; +NSString *const kArgumentVerificationId = @"verificationId"; +NSString *const kArgumentSmsCode = @"smsCode"; +NSString *const kArgumentActionCodeSettings = @"actionCodeSettings"; +NSString *const kArgumentFamilyName = @"familyName"; +NSString *const kArgumentGivenName = @"givenName"; +NSString *const kArgumentMiddleName = @"middleName"; +NSString *const kArgumentNickname = @"nickname"; +NSString *const kArgumentNamePrefix = @"namePrefix"; +NSString *const kArgumentNameSuffix = @"nameSuffix"; + +// MultiFactor +NSString *const kArgumentMultiFactorHints = @"multiFactorHints"; +NSString *const kArgumentMultiFactorSessionId = @"multiFactorSessionId"; +NSString *const kArgumentMultiFactorResolverId = @"multiFactorResolverId"; +NSString *const kArgumentMultiFactorInfo = @"multiFactorInfo"; + +// Manual error codes & messages. +NSString *const kErrCodeNoCurrentUser = @"no-current-user"; +NSString *const kErrMsgNoCurrentUser = @"No user currently signed in."; +NSString *const kErrCodeInvalidCredential = @"invalid-credential"; +NSString *const kErrMsgInvalidCredential = + @"The supplied auth credential is malformed, has expired or is not " + @"currently supported."; + +// Used for caching credentials between Method Channel method calls. +static NSMutableDictionary *credentialsMap; + +@interface FLTFirebaseAuthPlugin () +@property(nonatomic, retain) NSObject *messenger; +@property(strong, nonatomic) FIROAuthProvider *authProvider; +// Used to keep the user who wants to link with Apple Sign In +@property(strong, nonatomic) FIRUser *linkWithAppleUser; +@property(strong, nonatomic) FIRAuth *signInWithAppleAuth; +@property BOOL isReauthenticatingWithApple; +@property(strong, nonatomic) NSString *currentNonce; +@property(strong, nonatomic) void (^appleCompletion) + (InternalUserCredential *_Nullable, FlutterError *_Nullable); +@property(strong, nonatomic) AuthPigeonFirebaseApp *appleArguments; +/// YES while an `ASAuthorizationController` Sign in with Apple flow is active. +@property(nonatomic, assign) BOOL appleSignInRequestInFlight; + +@end + +@implementation FLTFirebaseAuthPlugin { + // Map an id to a MultiFactorSession object. + NSMutableDictionary *_multiFactorSessionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorResolverMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorAssertionMap; + + // Map an id to a MultiFactorResolver object. + NSMutableDictionary *_multiFactorTotpSecretMap; + + // Emulator host/port per app, used to build REST URLs for workarounds. + NSMutableDictionary *_emulatorConfigs; + + NSObject *_binaryMessenger; + NSMutableDictionary *_eventChannels; + NSMutableDictionary *> *_streamHandlers; + NSData *_apnsToken; +} + +#pragma mark - FlutterPlugin + +- (instancetype)init:(NSObject *)messenger { + self = [super init]; + if (self) { + [[FLTFirebasePluginRegistry sharedInstance] registerFirebasePlugin:self]; + credentialsMap = [NSMutableDictionary dictionary]; + _binaryMessenger = messenger; + _eventChannels = [NSMutableDictionary dictionary]; + _streamHandlers = [NSMutableDictionary dictionary]; + + _multiFactorSessionMap = [NSMutableDictionary dictionary]; + _multiFactorResolverMap = [NSMutableDictionary dictionary]; + _multiFactorAssertionMap = [NSMutableDictionary dictionary]; + _multiFactorTotpSecretMap = [NSMutableDictionary dictionary]; + _emulatorConfigs = [NSMutableDictionary dictionary]; + } + return self; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:kFLTFirebaseAuthChannelName + binaryMessenger:[registrar messenger]]; + FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init:registrar.messenger]; + + [registrar addMethodCallDelegate:instance channel:channel]; + + [registrar publish:instance]; + [registrar addApplicationDelegate:instance]; +#if !TARGET_OS_OSX + if (@available(iOS 13.0, *)) { + if ([registrar respondsToSelector:@selector(addSceneDelegate:)]) { + [registrar performSelector:@selector(addSceneDelegate:) withObject:instance]; + } + } +#endif + SetUpFirebaseAuthHostApi(registrar.messenger, instance); + SetUpFirebaseAuthUserHostApi(registrar.messenger, instance); + SetUpMultiFactorUserHostApi(registrar.messenger, instance); + SetUpMultiFactoResolverHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpHostApi(registrar.messenger, instance); + SetUpMultiFactorTotpSecretHostApi(registrar.messenger, instance); +} + ++ (FlutterError *)convertToFlutterError:(NSError *)error { + NSString *code = @"unknown"; + NSString *message = @"An unknown error has occurred."; + + if (error == nil) { + return [FlutterError errorWithCode:code message:message details:@{}]; + } + + // code + if ([error userInfo][FIRAuthErrorUserInfoNameKey] != nil) { + // See [FIRAuthErrorCodeString] for list of codes. + // Codes are in the format "ERROR_SOME_NAME", converting below to the format + // required in Dart. ERROR_SOME_NAME -> SOME_NAME + NSString *firebaseErrorCode = [error userInfo][FIRAuthErrorUserInfoNameKey]; + code = [firebaseErrorCode stringByReplacingOccurrencesOfString:@"ERROR_" withString:@""]; + // SOME_NAME -> SOME-NAME + code = [code stringByReplacingOccurrencesOfString:@"_" withString:@"-"]; + // SOME-NAME -> some-name + code = [code lowercaseString]; + } + + // message + if ([error userInfo][NSLocalizedDescriptionKey] != nil) { + message = [error userInfo][NSLocalizedDescriptionKey]; + } + + NSMutableDictionary *additionalData = [NSMutableDictionary dictionary]; + // additionalData.email + if ([error userInfo][FIRAuthErrorUserInfoEmailKey] != nil) { + additionalData[kArgumentEmail] = [error userInfo][FIRAuthErrorUserInfoEmailKey]; + } + // We want to store the credential if present for future sign in if the exception contains a + // credential, we pass a token back to Flutter to allow retrieval of the credential. + NSNumber *token = [FLTFirebaseAuthPlugin storeAuthCredentialIfPresent:error]; + + // additionalData.authCredential + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + additionalData[@"authCredential"] = [PigeonParser getPigeonAuthCredential:authCredential + token:token]; + } + + // Manual message overrides to ensure messages/codes matches other platforms. + if ([message isEqual:@"The password must be 6 characters long or more."]) { + message = @"Password should be at least 6 characters"; + } + + return [FlutterError errorWithCode:code message:message details:additionalData]; +} + ++ (id)getNSDictionaryFromAuthCredential:(FIRAuthCredential *)authCredential { + if (authCredential == nil) { + return [NSNull null]; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + return @{ + kArgumentProviderId : authCredential.provider, + // Note: "signInMethod" does not exist on iOS SDK, so using provider + // instead. + kArgumentSignInMethod : authCredential.provider, + kArgumentToken : @([authCredential hash]), + kArgumentAccessToken : accessToken ?: [NSNull null], + }; +} + +- (void)cleanupWithCompletion:(void (^)(void))completion { + // Cleanup credentials. + [credentialsMap removeAllObjects]; + + for (FlutterEventChannel *channel in self->_eventChannels.allValues) { + [channel setStreamHandler:nil]; + } + [self->_eventChannels removeAllObjects]; + for (NSObject *handler in self->_streamHandlers.allValues) { + [handler onCancelWithArguments:nil]; + } + [self->_streamHandlers removeAllObjects]; + + if (completion != nil) completion(); +} + +- (void)detachFromEngineForRegistrar:(NSObject *)registrar { + [self cleanupWithCompletion:nil]; +} + +#pragma mark - AppDelegate + +#if TARGET_OS_IPHONE +#if !__has_include() +- (BOOL)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if ([[FIRAuth auth] canHandleNotification:notification]) { + completionHandler(UIBackgroundFetchResultNoData); + return YES; + } + return NO; +} +#endif + +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + _apnsToken = deviceToken; +} + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + return [[FIRAuth auth] canHandleURL:url]; +} + +#pragma mark - SceneDelegate + +- (BOOL)scene:(UIScene *)scene + openURLContexts:(NSSet *)URLContexts API_AVAILABLE(ios(13.0)) { + for (UIOpenURLContext *urlContext in URLContexts) { + if ([[FIRAuth auth] canHandleURL:urlContext.URL]) { + return YES; + } + } + return NO; +} +#endif + +#pragma mark - FLTFirebasePlugin + +- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion { + [self cleanupWithCompletion:completion]; +} + +- (NSString *_Nonnull)firebaseLibraryName { + return @LIBRARY_NAME; +} + +- (NSString *_Nonnull)firebaseLibraryVersion { + return @LIBRARY_VERSION; +} + +- (NSString *_Nonnull)flutterChannelName { + return kFLTFirebaseAuthChannelName; +} + +- (NSDictionary *_Nonnull)pluginConstantsForFIRApp:(FIRApp *_Nonnull)firebaseApp { + FIRAuth *auth = [FIRAuth authWithApp:firebaseApp]; + return @{ + @"APP_LANGUAGE_CODE" : (id)[auth languageCode] ?: [NSNull null], + @"APP_CURRENT_USER" : [auth currentUser] + ? [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + : [NSNull null], + }; +} + +#pragma mark - Firebase Auth API + +// Adapted from +// https://auth0.com/docs/api-auth/tutorials/nonce#generate-a-cryptographically-random-nonce Used +// for Apple Sign In +- (NSString *)randomNonce:(NSInteger)length { + NSAssert(length > 0, @"Expected nonce to have positive length"); + NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; + NSMutableString *result = [NSMutableString string]; + NSInteger remainingLength = length; + + while (remainingLength > 0) { + NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; + for (NSInteger i = 0; i < 16; i++) { + uint8_t random = 0; + int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); + NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); + + [randoms addObject:@(random)]; + } + + for (NSNumber *random in randoms) { + if (remainingLength == 0) { + break; + } + + if (random.unsignedIntValue < characterSet.length) { + unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; + [result appendFormat:@"%C", character]; + remainingLength--; + } + } + } + + return [result copy]; +} + +- (NSString *)stringBySha256HashingString:(NSString *)input { + const char *string = [input UTF8String]; + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(string, (CC_LONG)strlen(string), result); + + NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hashed appendFormat:@"%02x", result[i]]; + } + return hashed; +} + +static void handleSignInWithApple(FLTFirebaseAuthPlugin *object, FIRAuthDataResult *authResult, + NSString *authorizationCode, NSError *error) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + object.appleCompletion; + if (completion == nil) { + object.appleSignInRequestInFlight = NO; + return; + } + + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + [object handleMultiFactorError:object.appleArguments completion:completion withError:error]; + } else { + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + object.appleCompletion = nil; + object.appleSignInRequestInFlight = NO; + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:authorizationCode], + nil); +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithAuthorization:(ASAuthorization *)authorization + API_AVAILABLE(macos(10.15), ios(13.0)) { + if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { + ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; + NSString *rawNonce = self.currentNonce; + NSAssert(rawNonce != nil, + @"Invalid state: A login callback was received, but no login request was sent."); + + if (appleIDCredential.identityToken == nil) { + NSLog(@"Unable to fetch identity token."); + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + return; + } + + NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken + encoding:NSUTF8StringEncoding]; + if (idToken == nil) { + NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); + } + + NSString *authorizationCode = nil; + if (appleIDCredential.authorizationCode != nil) { + authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode + encoding:NSUTF8StringEncoding]; + } + + FIROAuthCredential *credential = + [FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:appleIDCredential.fullName]; + + if (self.isReauthenticatingWithApple == YES) { + self.isReauthenticatingWithApple = NO; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [[FIRAuth.auth currentUser] + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else if (self.linkWithAppleUser != nil) { + FIRUser *userToLink = self.linkWithAppleUser; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [userToLink linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, NSError *error) { + self.linkWithAppleUser = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + + } else { + FIRAuth *signInAuth = + self.signInWithAppleAuth != nil ? self.signInWithAppleAuth : FIRAuth.auth; + void (^capturedCompletion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + [signInAuth signInWithCredential:credential + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + self.signInWithAppleAuth = nil; + handleSignInWithApple(self, authResult, authorizationCode, error); + }]; + } + } else { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + if (completion != nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + } + } +} + +- (void)authorizationController:(ASAuthorizationController *)controller + didCompleteWithError:(NSError *)error API_AVAILABLE(macos(10.15), ios(13.0)) { + void (^completion)(InternalUserCredential *_Nullable, FlutterError *_Nullable) = + self.appleCompletion; + self.appleCompletion = nil; + self.appleSignInRequestInFlight = NO; + + NSLog(@"Sign in with Apple errored: %@", error); + if (completion == nil) { + return; + } + + switch (error.code) { + case ASAuthorizationErrorCanceled: + completion(nil, [FlutterError errorWithCode:@"canceled" + message:@"The user canceled the authorization attempt." + details:nil]); + break; + + case ASAuthorizationErrorInvalidResponse: + completion(nil, [FlutterError + errorWithCode:@"invalid-response" + message:@"The authorization request received an invalid response." + details:nil]); + break; + + case ASAuthorizationErrorNotHandled: + completion(nil, [FlutterError errorWithCode:@"not-handled" + message:@"The authorization request wasn’t handled." + details:nil]); + break; + + case ASAuthorizationErrorFailed: + completion(nil, [FlutterError errorWithCode:@"failed" + message:@"The authorization attempt failed." + details:nil]); + break; + + case ASAuthorizationErrorUnknown: + default: + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + break; + } +} + +- (void)handleInternalError:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *)error { + const NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; + if (underlyingError != nil) { + const NSDictionary *details = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDeserializedResponseKey"]; + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:details]); + return; + } + completion(nil, [FlutterError errorWithCode:@"internal-error" + message:error.description + details:nil]); +} + +- (void)handleMultiFactorError:(AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion + withError:(NSError *_Nullable)error { + FIRMultiFactorResolver *resolver = + (FIRMultiFactorResolver *)error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; + + NSArray *hints = resolver.hints; + FIRMultiFactorSession *session = resolver.session; + + NSString *sessionId = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[sessionId] = session; + + NSString *resolverId = [[NSUUID UUID] UUIDString]; + self->_multiFactorResolverMap[resolverId] = resolver; + + NSMutableArray *pigeonHints = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in hints) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + InternalMultiFactorInfo *object = [InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]; + + [pigeonHints addObject:object.toList]; + } + + NSDictionary *output = @{ + kAppName : app.appName, + kArgumentMultiFactorHints : pigeonHints, + kArgumentMultiFactorSessionId : sessionId, + kArgumentMultiFactorResolverId : resolverId, + }; + completion(nil, [FlutterError errorWithCode:@"second-factor-required" + message:error.description + details:output]); +} + +static void launchAppleSignInRequest(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + InternalSignInProvider *signInProvider, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (@available(iOS 13.0, macOS 10.15, *)) { + if (object.appleSignInRequestInFlight) { + completion(nil, + [FlutterError errorWithCode:@"operation-not-allowed" + message:@"A Sign in with Apple request is already in progress." + details:nil]); + return; + } + + NSString *nonce = [object randomNonce:32]; + object.currentNonce = nonce; + object.appleCompletion = completion; + object.appleArguments = app; + object.appleSignInRequestInFlight = YES; + + ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; + + ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; + NSMutableArray *requestedScopes = [NSMutableArray arrayWithCapacity:2]; + if ([signInProvider.scopes containsObject:@"name"]) { + [requestedScopes addObject:ASAuthorizationScopeFullName]; + } + if ([signInProvider.scopes containsObject:@"email"]) { + [requestedScopes addObject:ASAuthorizationScopeEmail]; + } + request.requestedScopes = [requestedScopes copy]; + request.nonce = [object stringBySha256HashingString:nonce]; + + ASAuthorizationController *authorizationController = + [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[ request ]]; + authorizationController.delegate = object; + authorizationController.presentationContextProvider = object; + [authorizationController performRequests]; + } else { + NSLog(@"Sign in with Apple was introduced in iOS 13, update your Podfile with platform :ios, " + @"'13.0'"); + } +} + +static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFirebaseApp *app, + FIRAuth *auth, FIRAuthCredential *credentials, NSError *error, + void (^_Nonnull completion)(InternalUserCredential *_Nullable, + FlutterError *_Nullable)) { + if (error) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [object handleMultiFactorError:app completion:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + return; + } + if (credentials) { + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; + + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + // Removing since it's not parsed and causing issue when sending back the + // object to Flutter + NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; + [mutableUserInfo + removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + NSError *modifiedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:mutableUserInfo]; + + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:userInfo[@"NSLocalizedDescription"] + details:modifiedError.userInfo]); + + } else if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is + // buried in underlying error. + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:firebaseDictionary[@"message"]]); + } else { + completion(nil, [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:error.userInfo]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; + } +} + +#pragma mark - Utilities + ++ (NSNumber *_Nullable)storeAuthCredentialIfPresent:(NSError *)error { + if ([error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey] != nil) { + FIRAuthCredential *authCredential = [error userInfo][FIRAuthErrorUserInfoUpdatedCredentialKey]; + // We temporarily store the non-serializable credential so the + // Dart API can consume these at a later time. + NSNumber *authCredentialHash = @([authCredential hash]); + credentialsMap[authCredentialHash] = authCredential; + return authCredentialHash; + } + return nil; +} + +- (FIRAuth *_Nullable)getFIRAuthFromAppNameFromPigeon:(AuthPigeonFirebaseApp *)pigeonApp { + FIRApp *app = [FLTFirebasePlugin firebaseAppNamed:pigeonApp.appName]; + FIRAuth *auth = [FIRAuth authWithApp:app]; + + auth.tenantID = pigeonApp.tenantId; + auth.customAuthDomain = [FLTFirebaseCorePlugin getCustomDomain:app.name]; + // Auth's `customAuthDomain` supersedes value from `getCustomDomain` set by `initializeApp` + if (pigeonApp.customAuthDomain != nil) { + auth.customAuthDomain = pigeonApp.customAuthDomain; + } + + return auth; +} + +- (void)getFIRAuthCredentialFromArguments:(NSDictionary *)arguments + app:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FIRAuthCredential *credential, + NSError *error))completion { + // If the credential dictionary contains a token, it means a native one has + // been stored for later usage, so we'll attempt to retrieve it here. + if (arguments[kArgumentToken] != nil && ![arguments[kArgumentToken] isEqual:[NSNull null]]) { + NSNumber *credentialHashCode = arguments[kArgumentToken]; + if (credentialsMap[credentialHashCode] != nil) { + completion(credentialsMap[credentialHashCode], nil); + return; + } + } + + NSString *signInMethod = arguments[kArgumentSignInMethod]; + + if ([signInMethod isEqualToString:kSignInMethodGameCenter]) { + // Game Center Games is different to other providers, it requires below callback to get a + // credential. This is why getFIRAuthCredentialFromArguments now requires a completion() + // callback + [FIRGameCenterAuthProvider + getCredentialWithCompletion:^(FIRAuthCredential *credential, NSError *error) { + if (error) { + completion(nil, error); + } else { + completion(credential, nil); + } + }]; + return; + } + + NSString *secret = arguments[kArgumentSecret] == [NSNull null] ? nil : arguments[kArgumentSecret]; + NSString *idToken = + arguments[kArgumentIdToken] == [NSNull null] ? nil : arguments[kArgumentIdToken]; + NSString *accessToken = + arguments[kArgumentAccessToken] == [NSNull null] ? nil : arguments[kArgumentAccessToken]; + NSString *rawNonce = + arguments[kArgumentRawNonce] == [NSNull null] ? nil : arguments[kArgumentRawNonce]; + + // Password Auth + if ([signInMethod isEqualToString:kSignInMethodPassword]) { + NSString *email = arguments[kArgumentEmail]; + completion([FIREmailAuthProvider credentialWithEmail:email password:secret], nil); + return; + } + + // Email Link Auth + if ([signInMethod isEqualToString:kSignInMethodEmailLink]) { + NSString *email = arguments[kArgumentEmail]; + NSString *emailLink = arguments[kArgumentEmailLink]; + completion([FIREmailAuthProvider credentialWithEmail:email link:emailLink], nil); + return; + } + + // Facebook Auth + if ([signInMethod isEqualToString:kSignInMethodFacebook]) { + completion([FIRFacebookAuthProvider credentialWithAccessToken:accessToken], nil); + return; + } + + // Google Auth + if ([signInMethod isEqualToString:kSignInMethodGoogle]) { + completion([FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken], nil); + return; + } + + // Twitter Auth + if ([signInMethod isEqualToString:kSignInMethodTwitter]) { + completion([FIRTwitterAuthProvider credentialWithToken:accessToken secret:secret], nil); + return; + } + + // GitHub Auth + if ([signInMethod isEqualToString:kSignInMethodGithub]) { + completion([FIRGitHubAuthProvider credentialWithToken:accessToken], nil); + return; + } + + // Phone Auth - Only supported on iOS + if ([signInMethod isEqualToString:kSignInMethodPhone]) { +#if TARGET_OS_IPHONE + NSString *verificationId = arguments[kArgumentVerificationId]; + NSString *smsCode = arguments[kArgumentSmsCode]; + completion([[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:verificationId + verificationCode:smsCode], + nil); + return; +#else + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); + return; +#endif + } + // Apple Auth + if ([signInMethod isEqualToString:kSignInMethodApple]) { + if (idToken && rawNonce) { + // Credential with idToken, rawNonce and fullName + NSPersonNameComponents *fullName = [[NSPersonNameComponents alloc] init]; + fullName.givenName = + arguments[kArgumentGivenName] == [NSNull null] ? nil : arguments[kArgumentGivenName]; + fullName.familyName = + arguments[kArgumentFamilyName] == [NSNull null] ? nil : arguments[kArgumentFamilyName]; + fullName.nickname = + arguments[kArgumentNickname] == [NSNull null] ? nil : arguments[kArgumentNickname]; + fullName.namePrefix = + arguments[kArgumentNamePrefix] == [NSNull null] ? nil : arguments[kArgumentNamePrefix]; + fullName.nameSuffix = + arguments[kArgumentNameSuffix] == [NSNull null] ? nil : arguments[kArgumentNameSuffix]; + fullName.middleName = + arguments[kArgumentMiddleName] == [NSNull null] ? nil : arguments[kArgumentMiddleName]; + + completion([FIROAuthProvider appleCredentialWithIDToken:idToken + rawNonce:rawNonce + fullName:fullName], + nil); + return; + } + } + // OAuth + if ([signInMethod isEqualToString:kSignInMethodOAuth]) { + NSString *providerId = arguments[kArgumentProviderId]; + completion([FIROAuthProvider credentialWithProviderID:providerId + IDToken:idToken + rawNonce:rawNonce + accessToken:accessToken], + nil); + return; + } + + NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", signInMethod); + completion(nil, nil); + return; +} + +- (void)ensureAPNSTokenSetting { +#if !TARGET_OS_OSX + FIRApp *defaultApp = [FIRApp defaultApp]; + if (defaultApp) { + if ([FIRAuth auth].APNSToken == nil && _apnsToken != nil) { + [[FIRAuth auth] setAPNSToken:_apnsToken type:FIRAuthAPNSTokenTypeUnknown]; + _apnsToken = nil; + } + } +#endif +} + +- (FIRMultiFactor *)getAppMultiFactorFromPigeon:(nonnull AuthPigeonFirebaseApp *)app { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + return currentUser.multiFactor; +} + +- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController: + (nonnull ASAuthorizationController *)controller API_AVAILABLE(macos(10.15), ios(13.0)) { +#if TARGET_OS_OSX + return [[NSApplication sharedApplication] keyWindow]; +#else + // UIApplication.keyWindow is deprecated in iOS 13+ with UIScene lifecycle. + // Walk the connected scenes to find the foreground active window. + if (@available(iOS 15.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.keyWindow) { + return windowScene.keyWindow; + } + } + } + } else if (@available(iOS 13.0, *)) { + for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive && + [scene isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)scene; + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + return window; + } + } + } + } + } + return [[UIApplication sharedApplication] keyWindow]; +#endif +} + +- (void)enrollPhoneApp:(nonnull AuthPigeonFirebaseApp *)app + assertion:(nonnull InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + completion([FlutterError errorWithCode:@"unsupported-platform" + message:@"Phone authentication is not supported on macOS" + details:nil]); +#else + + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider providerWithAuth:[self getFIRAuthFromAppNameFromPigeon:app]] + credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + + FIRMultiFactorAssertion *multiFactorAssertion = + [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; + + [multiFactor enrollWithAssertion:multiFactorAssertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +#endif +} + +- (void)getEnrolledFactorsApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + NSArray *enrolledFactors = [multiFactor enrolledFactors]; + + NSMutableArray *results = [NSMutableArray array]; + + for (FIRMultiFactorInfo *multiFactorInfo in enrolledFactors) { + NSString *phoneNumber; + if ([multiFactorInfo class] == [FIRPhoneMultiFactorInfo class]) { + FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo; + phoneNumber = phoneFactorInfo.phoneNumber; + } + + [results addObject:[InternalMultiFactorInfo + makeWithDisplayName:multiFactorInfo.displayName + enrollmentTimestamp:multiFactorInfo.enrollmentDate.timeIntervalSince1970 + factorId:multiFactorInfo.factorID + uid:multiFactorInfo.UID + phoneNumber:phoneNumber]]; + } + + completion(results, nil); +} + +- (void)getSessionApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalMultiFactorSession *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session, + NSError *_Nullable error) { + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorSessionMap[UUID] = session; + + InternalMultiFactorSession *pigeonSession = [InternalMultiFactorSession makeWithId:UUID]; + completion(pigeonSession, nil); + }]; +} + +- (void)unenrollApp:(nonnull AuthPigeonFirebaseApp *)app + factorUid:(nonnull NSString *)factorUid + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + [multiFactor unenrollWithFactorUID:factorUid + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"unenroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)enrollTotpApp:(nonnull AuthPigeonFirebaseApp *)app + assertionId:(nonnull NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRMultiFactor *multiFactor = [self getAppMultiFactorFromPigeon:app]; + + FIRMultiFactorAssertion *assertion = _multiFactorAssertionMap[assertionId]; + + [multiFactor enrollWithAssertion:assertion + displayName:displayName + completion:^(NSError *_Nullable error) { + if (error == nil) { + completion(nil); + } else { + completion([FlutterError errorWithCode:@"enroll-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)resolveSignInResolverId:(nonnull NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorResolver *resolver = _multiFactorResolverMap[resolverId]; + + FIRMultiFactorAssertion *multiFactorAssertion; + + if (assertion != nil) { +#if TARGET_OS_IPHONE + FIRPhoneAuthCredential *credential = + [[FIRPhoneAuthProvider provider] credentialWithVerificationID:[assertion verificationId] + verificationCode:[assertion verificationCode]]; + multiFactorAssertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; +#endif + } else if (totpAssertionId != nil) { + multiFactorAssertion = _multiFactorAssertionMap[totpAssertionId]; + } else { + completion(nil, + [FlutterError errorWithCode:@"resolve-signin-failed" + message:@"Neither assertion nor totpAssertionId were provided" + details:nil]); + return; + } + + [resolver + resolveSignInWithAssertion:multiFactorAssertion + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + if (error == nil) { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } else { + completion(nil, [FlutterError errorWithCode:@"resolve-signin-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)generateSecretSessionId:(nonnull NSString *)sessionId + completion:(nonnull void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion { + FIRMultiFactorSession *multiFactorSession = _multiFactorSessionMap[sessionId]; + + [FIRTOTPMultiFactorGenerator + generateSecretWithMultiFactorSession:multiFactorSession + completion:^(FIRTOTPSecret *_Nullable secret, + NSError *_Nullable error) { + if (error == nil) { + self->_multiFactorTotpSecretMap[secret.sharedSecretKey] = + secret; + completion([PigeonParser getPigeonTotpSecret:secret], nil); + } else { + completion( + nil, [FlutterError errorWithCode:@"generate-secret-failed" + message:error.localizedDescription + details:nil]); + } + }]; +} + +- (void)getAssertionForEnrollmentSecretKey:(nonnull NSString *)secretKey + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForEnrollmentWithSecret:totpSecret + oneTimePassword:oneTimePassword]; + + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)getAssertionForSignInEnrollmentId:(nonnull NSString *)enrollmentId + oneTimePassword:(nonnull NSString *)oneTimePassword + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPMultiFactorAssertion *assertion = + [FIRTOTPMultiFactorGenerator assertionForSignInWithEnrollmentID:enrollmentId + oneTimePassword:oneTimePassword]; + NSString *UUID = [[NSUUID UUID] UUIDString]; + self->_multiFactorAssertionMap[UUID] = assertion; + completion(UUID, nil); +} + +- (void)generateQrCodeUrlSecretKey:(nonnull NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + completion([totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer], nil); +} + +- (void)openInOtpAppSecretKey:(nonnull NSString *)secretKey + qrCodeUrl:(nonnull NSString *)qrCodeUrl + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRTOTPSecret *totpSecret = _multiFactorTotpSecretMap[secretKey]; + [totpSecret openInOTPAppWithQRCodeURL:qrCodeUrl]; + completion(nil); +} + +- (void)applyActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth applyActionCode:code + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeTokenWithAuthorizationCodeApp:(nonnull AuthPigeonFirebaseApp *)app + authorizationCode:(nonnull NSString *)authorizationCode + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth revokeTokenWithAuthorizationCode:authorizationCode + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)revokeAccessTokenApp:(nonnull AuthPigeonFirebaseApp *)app + accessToken:(nonnull NSString *)accessToken + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + // `revokeAccessToken(_:)` is currently Android-only on the Firebase SDK. + // On Apple platforms use `revokeTokenWithAuthorizationCode:` instead. + completion([FlutterError errorWithCode:@"unsupported-platform-operation" + message:@"revokeAccessToken is not supported on iOS/macOS. " + @"Use revokeTokenWithAuthorizationCode instead." + details:nil]); +} + +- (void)checkActionCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth checkActionCode:code + completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + InternalActionCodeInfo *result = [self parseActionCode:info]; + if (result.operation == ActionCodeInfoOperationUnknown) { + // Workaround: Firebase iOS SDK >=11.12.0 returns .unknown because + // actionCodeOperation(forRequestType:) only matches camelCase but the + // REST API returns SCREAMING_SNAKE_CASE (e.g. "VERIFY_EMAIL"). + // Re-fetch the raw requestType via REST to resolve the operation. + // See: https://github.com/firebase/flutterfire/issues/17452 + [self resolveActionCodeOperationForApp:app + code:code + fallbackInfo:result + completion:completion]; + } else { + completion(result, nil); + } + } + }]; +} + +- (InternalActionCodeInfo *_Nullable)parseActionCode:(nonnull FIRActionCodeInfo *)info { + InternalActionCodeInfoData *data = [InternalActionCodeInfoData makeWithEmail:info.email + previousEmail:info.previousEmail]; + + ActionCodeInfoOperation operation; + + if (info.operation == FIRActionCodeOperationPasswordReset) { + operation = ActionCodeInfoOperationPasswordReset; + } else if (info.operation == FIRActionCodeOperationVerifyEmail) { + operation = ActionCodeInfoOperationVerifyEmail; + } else if (info.operation == FIRActionCodeOperationRecoverEmail) { + operation = ActionCodeInfoOperationRecoverEmail; + } else if (info.operation == FIRActionCodeOperationEmailLink) { + operation = ActionCodeInfoOperationEmailSignIn; + } else if (info.operation == FIRActionCodeOperationVerifyAndChangeEmail) { + operation = ActionCodeInfoOperationVerifyAndChangeEmail; + } else if (info.operation == FIRActionCodeOperationRevertSecondFactorAddition) { + operation = ActionCodeInfoOperationRevertSecondFactorAddition; + } else { + operation = ActionCodeInfoOperationUnknown; + } + + return [InternalActionCodeInfo makeWithOperation:operation data:data]; +} + +/// Maps a raw requestType string (either camelCase or SCREAMING_SNAKE_CASE) to +/// the corresponding Pigeon enum value. ++ (ActionCodeInfoOperation)operationFromRequestType:(nullable NSString *)requestType { + static NSDictionary *mapping; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mapping = @{ + @"PASSWORD_RESET" : @(ActionCodeInfoOperationPasswordReset), + @"resetPassword" : @(ActionCodeInfoOperationPasswordReset), + @"VERIFY_EMAIL" : @(ActionCodeInfoOperationVerifyEmail), + @"verifyEmail" : @(ActionCodeInfoOperationVerifyEmail), + @"RECOVER_EMAIL" : @(ActionCodeInfoOperationRecoverEmail), + @"recoverEmail" : @(ActionCodeInfoOperationRecoverEmail), + @"EMAIL_SIGNIN" : @(ActionCodeInfoOperationEmailSignIn), + @"signIn" : @(ActionCodeInfoOperationEmailSignIn), + @"VERIFY_AND_CHANGE_EMAIL" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"verifyAndChangeEmail" : @(ActionCodeInfoOperationVerifyAndChangeEmail), + @"REVERT_SECOND_FACTOR_ADDITION" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + @"revertSecondFactorAddition" : @(ActionCodeInfoOperationRevertSecondFactorAddition), + }; + }); + + NSNumber *value = mapping[requestType]; + return value ? (ActionCodeInfoOperation)value.integerValue : ActionCodeInfoOperationUnknown; +} + +/// Calls the Identity Toolkit REST API directly to retrieve the raw requestType +/// string, which the iOS SDK fails to parse correctly. Falls back to the original +/// result if the REST call fails for any reason. +- (void)resolveActionCodeOperationForApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + fallbackInfo:(nonnull InternalActionCodeInfo *)fallbackInfo + completion:(nonnull void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion { + FIRApp *firebaseApp = [FLTFirebasePlugin firebaseAppNamed:app.appName]; + NSString *apiKey = firebaseApp.options.APIKey; + + NSString *baseURL; + NSDictionary *emulatorConfig = _emulatorConfigs[app.appName]; + if (emulatorConfig) { + baseURL = [NSString stringWithFormat:@"http://%@:%@/identitytoolkit.googleapis.com", + emulatorConfig[@"host"], emulatorConfig[@"port"]]; + } else { + baseURL = @"https://identitytoolkit.googleapis.com"; + } + + NSString *urlString = + [NSString stringWithFormat:@"%@/v1/accounts:resetPassword?key=%@", baseURL, apiKey]; + NSURL *url = [NSURL URLWithString:urlString]; + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + request.HTTPMethod = @"POST"; + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + request.HTTPBody = [NSJSONSerialization dataWithJSONObject:@{@"oobCode" : code} + options:0 + error:nil]; + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] + dataTaskWithRequest:request + completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error || !data) { + completion(fallbackInfo, nil); + return; + } + + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (!json || json[@"error"]) { + completion(fallbackInfo, nil); + return; + } + + ActionCodeInfoOperation operation = + [FLTFirebaseAuthPlugin operationFromRequestType:json[@"requestType"]]; + + if (operation != ActionCodeInfoOperationUnknown) { + completion([InternalActionCodeInfo makeWithOperation:operation data:fallbackInfo.data], + nil); + } else { + completion(fallbackInfo, nil); + } + }]; + [task resume]; +} + +- (void)confirmPasswordResetApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth confirmPasswordResetWithCode:code + newPassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)createUserWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth createUserWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)fetchSignInMethodsForEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + completion:(nonnull void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth fetchSignInMethodsForEmail:email + completion:^(NSArray *_Nullable providers, + NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + if (providers == nil) { + completion(@[], nil); + } else { + completion(providers, nil); + } + } + }]; +} + +- (void)registerAuthStateListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/auth-state/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTAuthStateChannelStreamHandler *handler = + [[FLTAuthStateChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)registerIdTokenListenerApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = + [NSString stringWithFormat:@"%@/id-token/%@", kFLTFirebaseAuthChannelName, auth.app.name]; + + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + FLTIdTokenChannelStreamHandler *handler = + [[FLTIdTokenChannelStreamHandler alloc] initWithAuth:auth]; + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +} + +- (void)sendPasswordResetEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + if (actionCodeSettings != nil) { + FIRActionCodeSettings *settings = [PigeonParser parseActionCodeSettings:actionCodeSettings]; + [auth sendPasswordResetWithEmail:email + actionCodeSettings:settings + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } else { + [auth sendPasswordResetWithEmail:email + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; + } +} + +- (void)sendSignInLinkToEmailApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + actionCodeSettings:(nonnull InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth sendSignInLinkToEmail:email + actionCodeSettings:[PigeonParser parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeInternalError) { + [self + handleInternalError:^(InternalUserCredential *_Nullable creds, + FlutterError *_Nullable internalError) { + completion(internalError); + } + withError:error]; + } else { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion(nil); + } + }]; +} + +- (void)setLanguageCodeApp:(nonnull AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (languageCode != nil && ![languageCode isEqual:[NSNull null]]) { + auth.languageCode = languageCode; + } else { + [auth useAppLanguage]; + } + + completion(auth.languageCode, nil); +} + +- (void)setSettingsApp:(nonnull AuthPigeonFirebaseApp *)app + settings:(nonnull InternalFirebaseAuthSettings *)settings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (settings.userAccessGroup != nil) { + BOOL useUserAccessGroupSuccessful; + NSError *useUserAccessGroupErrorPtr; + useUserAccessGroupSuccessful = [auth useUserAccessGroup:settings.userAccessGroup + error:&useUserAccessGroupErrorPtr]; + if (!useUserAccessGroupSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:useUserAccessGroupErrorPtr]); + return; + } + } + +#if TARGET_OS_IPHONE + if (settings.appVerificationDisabledForTesting) { + auth.settings.appVerificationDisabledForTesting = settings.appVerificationDisabledForTesting; + } +#else + NSLog(@"FIRAuthSettings.appVerificationDisabledForTesting is not supported " + @"on MacOS."); +#endif + + completion(nil); +} + +- (void)signInAnonymouslyApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [auth + signInWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = + [userInfo objectForKey:NSUnderlyingErrorKey]; + + NSDictionary *firebaseDictionary = + underlyingError + .userInfo[@"FIRAuthErrorUserInfoDeserializ" + @"edResponseKey"]; + + if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is buried in + // underlying error. + if ([firebaseDictionary[@"code"] + isKindOfClass:[NSNumber class]]) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FlutterError + errorWithCode:firebaseDictionary + [@"code"] + message:firebaseDictionary + [@"message"] + details:nil]); + } + } else { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else if (error.code == + FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion + withError:error]; + } else { + completion(nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)signInWithCustomTokenApp:(nonnull AuthPigeonFirebaseApp *)app + token:(nonnull NSString *)token + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth signInWithCustomToken:token + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailAndPasswordApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + password:(nonnull NSString *)password + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + password:password + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithEmailLinkApp:(nonnull AuthPigeonFirebaseApp *)app + email:(nonnull NSString *)email + emailLink:(nonnull NSString *)emailLink + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth signInWithEmail:email + link:emailLink + completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { + if (error != nil) { + if (error.code == FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app completion:completion withError:error]; + } else if (error.code == FIRAuthErrorCodeInternalError) { + [self handleInternalError:completion withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; +} + +- (void)signInWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"sign-in-failure" + message: + @"Game Center sign-in requires signing in with 'signInWithCredential()' API." + details:@{}]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.signInWithAppleAuth = auth; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"signInWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId auth:auth]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [self.authProvider + getCredentialWithUIDelegate:nil + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error) { + handleAppleAuthResult(self, app, auth, credential, error, completion); + }]; +#endif +} + +- (void)signOutApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + if (auth.currentUser == nil) { + completion(nil); + return; + } + + NSError *signOutErrorPtr; + BOOL signOutSuccessful = [auth signOut:&signOutErrorPtr]; + + if (!signOutSuccessful) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:signOutErrorPtr]); + } else { + completion(nil); + } +} + +- (void)useEmulatorApp:(nonnull AuthPigeonFirebaseApp *)app + host:(nonnull NSString *)host + port:(long)port + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth useEmulatorWithHost:host port:port]; + _emulatorConfigs[app.appName] = @{@"host" : host, @"port" : @(port)}; + completion(nil); +} + +- (void)verifyPasswordResetCodeApp:(nonnull AuthPigeonFirebaseApp *)app + code:(nonnull NSString *)code + completion:(nonnull void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + [auth verifyPasswordResetCode:code + completion:^(NSString *_Nullable email, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(email, nil); + } + }]; +} + +- (void)verifyPhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + request:(nonnull InternalVerifyPhoneNumberRequest *)request + completion: + (nonnull void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"The Firebase Phone Authentication provider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + + NSString *name = [NSString + stringWithFormat:@"%@/phone/%@", kFLTFirebaseAuthChannelName, [NSUUID UUID].UUIDString]; + FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:name + binaryMessenger:_binaryMessenger]; + + NSString *multiFactorSessionId = request.multiFactorSessionId; + FIRMultiFactorSession *multiFactorSession = nil; + + if (multiFactorSessionId != nil) { + multiFactorSession = _multiFactorSessionMap[multiFactorSessionId]; + } + + NSString *multiFactorInfoId = request.multiFactorInfoId; + + FIRPhoneMultiFactorInfo *multiFactorInfo = nil; + if (multiFactorInfoId != nil) { + for (NSString *resolverId in _multiFactorResolverMap) { + for (FIRMultiFactorInfo *info in _multiFactorResolverMap[resolverId].hints) { + if ([info.UID isEqualToString:multiFactorInfoId] && + [info class] == [FIRPhoneMultiFactorInfo class]) { + multiFactorInfo = (FIRPhoneMultiFactorInfo *)info; + break; + } + } + } + } + +#if TARGET_OS_OSX + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth]; +#else + FLTPhoneNumberVerificationStreamHandler *handler = + [[FLTPhoneNumberVerificationStreamHandler alloc] initWithAuth:auth + request:request + session:multiFactorSession + factorInfo:multiFactorInfo]; +#endif + + [channel setStreamHandler:handler]; + + [_eventChannels setObject:channel forKey:name]; + [_streamHandlers setObject:handler forKey:name]; + + completion(name, nil); +#endif +} + +- (void)deleteApp:(nonnull AuthPigeonFirebaseApp *)app + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser deleteWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)getIdTokenApp:(nonnull AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion:(nonnull void (^)(InternalIdTokenResult *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + getIDTokenResultForcingRefresh:forceRefresh + completion:^(FIRAuthTokenResult *tokenResult, NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; + } + + completion([PigeonParser parseIdTokenResult:tokenResult], nil); + }]; +} + +- (void)linkWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + linkWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion(nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode:nil], + nil); + } + }]; + }]; +} + +- (void)linkWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if ([signInProvider.providerId isEqualToString:kSignInMethodGameCenter]) { + completion( + nil, + [FlutterError + errorWithCode:@"provider-link-failure" + message:@"Game Center provider requires linking with 'linkWithCredential()' API." + details:@{}]); + return; + } + + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.linkWithAppleUser = currentUser; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"linkWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser + linkWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, error, completion); + }]; +#endif +} + +- (void)reauthenticateWithCredentialApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + reauthenticateWithCredential:credential + completion:^(FIRAuthDataResult *authResult, + NSError *error) { + if (error != nil) { + if (error.code == + FIRAuthErrorCodeSecondFactorRequired) { + [self handleMultiFactorError:app + completion:completion + withError:error]; + } else { + completion( + nil, + [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } + } else { + completion( + [PigeonParser + getPigeonUserCredentialFromAuthResult: + authResult + authorizationCode: + nil], + nil); + } + }]; + }]; +} + +- (void)reauthenticateWithProviderApp:(nonnull AuthPigeonFirebaseApp *)app + signInProvider:(nonnull InternalSignInProvider *)signInProvider + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + if ([signInProvider.providerId isEqualToString:kSignInMethodApple]) { + self.isReauthenticatingWithApple = YES; + launchAppleSignInRequest(self, app, signInProvider, completion); + return; + } +#if TARGET_OS_OSX + NSLog(@"reauthenticateWithProvider is not supported on the " + @"MacOS platform."); + completion(nil, nil); +#else + self.authProvider = [FIROAuthProvider providerWithProviderID:signInProvider.providerId]; + NSArray *scopes = signInProvider.scopes; + if (scopes != nil) { + [self.authProvider setScopes:scopes]; + } + NSDictionary *customParameters = signInProvider.customParameters; + if (customParameters != nil) { + [self.authProvider setCustomParameters:customParameters]; + } + + [currentUser reauthenticateWithProvider:self.authProvider + UIDelegate:nil + completion:^(FIRAuthDataResult *authResult, NSError *error) { + handleAppleAuthResult(self, app, auth, authResult.credential, + error, completion); + }]; +#endif +} + +- (void)reloadApp:(nonnull AuthPigeonFirebaseApp *)app + completion: + (nonnull void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser reloadWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; +} + +- (void)sendEmailVerificationApp:(nonnull AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationWithActionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)unlinkApp:(nonnull AuthPigeonFirebaseApp *)app + providerId:(nonnull NSString *)providerId + completion:(nonnull void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser unlinkFromProvider:providerId + completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion([PigeonParser getPigeonUserCredentialFromFIRUser:user], nil); + } + }]; +} + +- (void)updateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser updateEmail:newEmail + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePasswordApp:(nonnull AuthPigeonFirebaseApp *)app + newPassword:(nonnull NSString *)newPassword + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + updatePassword:newPassword + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)updatePhoneNumberApp:(nonnull AuthPigeonFirebaseApp *)app + input:(nonnull NSDictionary *)input + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { +#if TARGET_OS_IPHONE + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [self + getFIRAuthCredentialFromArguments:input + app:app + completion:^(FIRAuthCredential *credential, NSError *error) { + if (credential == nil) { + completion(nil, + [FlutterError errorWithCode:kErrCodeInvalidCredential + message:kErrMsgInvalidCredential + details:nil]); + return; + } + + if (error) { + completion(nil, + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } + + [currentUser + updatePhoneNumberCredential:(FIRPhoneAuthCredential *)credential + completion:^(NSError *_Nullable error) { + if (error != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError:error]); + } else { + [currentUser + reloadWithCompletion:^( + NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion( + nil, [FLTFirebaseAuthPlugin + convertToFlutterError: + reloadError]); + } else { + completion( + [PigeonParser getPigeonDetails: + currentUser], + nil); + } + }]; + } + }]; + }]; +#else + NSLog(@"Updating a users phone number via Firebase Authentication is only " + @"supported on the iOS " + @"platform."); + completion(nil, nil); +#endif +} + +- (void)updateProfileApp:(nonnull AuthPigeonFirebaseApp *)app + profile:(nonnull InternalUserProfile *)profile + completion:(nonnull void (^)(InternalUserDetails *_Nullable, + FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion(nil, [FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + FIRUserProfileChangeRequest *changeRequest = [currentUser profileChangeRequest]; + + if (profile.displayNameChanged) { + changeRequest.displayName = profile.displayName; + } + + if (profile.photoUrlChanged) { + if (profile.photoUrl == nil) { + // We apparently cannot set photoURL to nil/NULL to remove it. + // Instead, setting it to empty string appears to work. + // When doing so, Dart will properly receive `null` anyway. + changeRequest.photoURL = [NSURL URLWithString:@""]; + } else { + changeRequest.photoURL = [NSURL URLWithString:profile.photoUrl]; + } + } + + [changeRequest commitChangesWithCompletion:^(NSError *error) { + if (error != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + [currentUser reloadWithCompletion:^(NSError *_Nullable reloadError) { + if (reloadError != nil) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:reloadError]); + } else { + completion([PigeonParser getPigeonDetails:currentUser], nil); + } + }]; + } + }]; +} + +- (void)verifyBeforeUpdateEmailApp:(nonnull AuthPigeonFirebaseApp *)app + newEmail:(nonnull NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(nonnull void (^)(FlutterError *_Nullable))completion { + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + FIRUser *currentUser = auth.currentUser; + if (currentUser == nil) { + completion([FlutterError errorWithCode:kErrCodeNoCurrentUser + message:kErrMsgNoCurrentUser + details:nil]); + return; + } + + [currentUser + sendEmailVerificationBeforeUpdatingEmail:newEmail + actionCodeSettings:[PigeonParser + parseActionCodeSettings:actionCodeSettings] + completion:^(NSError *error) { + if (error != nil) { + completion( + [FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +} + +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion { +#if TARGET_OS_OSX + NSLog(@"initializeRecaptchaConfigWithCompletion is not supported on the " + @"MacOS platform."); + completion(nil); +#else + FIRAuth *auth = [self getFIRAuthFromAppNameFromPigeon:app]; + [auth initializeRecaptchaConfigWithCompletion:^(NSError *_Nullable error) { + if (error != nil) { + completion([FLTFirebaseAuthPlugin convertToFlutterError:error]); + } else { + completion(nil); + } + }]; +#endif +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m new file mode 100644 index 00000000..315bc5ec --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTIdTokenChannelStreamHandler.m @@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +@import FirebaseAuth; +#import "include/Private/FLTIdTokenChannelStreamHandler.h" +#import +#import "include/Private/PigeonParser.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTIdTokenChannelStreamHandler { + FIRAuth *_auth; + FIRIDTokenDidChangeListenerHandle _listener; +} + +- (instancetype)initWithAuth:(FIRAuth *)auth { + self = [super init]; + if (self) { + _auth = auth; + } + return self; +} + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { + bool __block initialAuthState = YES; + + _listener = [_auth addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, + FIRUser *_Nullable user) { + if (initialAuthState) { + initialAuthState = NO; + return; + } + + if (user) { + events(@{ + @"user" : [PigeonParser getManualList:[PigeonParser getPigeonDetails:[auth currentUser]]] + }); + } else { + events(@{@"user" : [NSNull null]}); + } + }]; + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + if (_listener) { + [_auth removeIDTokenDidChangeListener:_listener]; + } + _listener = nil; + + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m new file mode 100644 index 00000000..511d2caa --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/FLTPhoneNumberVerificationStreamHandler.m @@ -0,0 +1,98 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/FLTPhoneNumberVerificationStreamHandler.h" +#import "include/Public/FLTFirebaseAuthPlugin.h" + +@implementation FLTPhoneNumberVerificationStreamHandler { + FIRAuth *_auth; + NSString *_phoneNumber; +#if TARGET_OS_OSX +#else + FIRMultiFactorSession *_session; + FIRPhoneMultiFactorInfo *_factorInfo; +#endif +} + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(id)auth request:(InternalVerifyPhoneNumberRequest *)request { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + } + return self; +} +#else +- (instancetype)initWithAuth:(id)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo { + self = [super init]; + if (self) { + _auth = auth; + _phoneNumber = request.phoneNumber; + _session = session; + _factorInfo = factorInfo; + } + return self; +} +#endif + +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events { +#if TARGET_OS_IPHONE + id completer = ^(NSString *verificationID, NSError *error) { + if (error != nil) { + FlutterError *errorDetails = [FLTFirebaseAuthPlugin convertToFlutterError:error]; + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"code" : errorDetails.code, + @"message" : errorDetails.message, + @"details" : errorDetails.details, + } + }); + } else { + events(@{ + @"name" : @"Auth#phoneCodeSent", + @"verificationId" : verificationID, + }); + } + }; + + // Try catch to capture 'missing URL scheme' error. + @try { + if (_factorInfo != nil) { + [[FIRPhoneAuthProvider providerWithAuth:_auth] + verifyPhoneNumberWithMultiFactorInfo:_factorInfo + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + + } else { + [[FIRPhoneAuthProvider providerWithAuth:_auth] verifyPhoneNumber:_phoneNumber + UIDelegate:nil + multiFactorSession:_session + completion:completer]; + } + } @catch (NSException *exception) { + events(@{ + @"name" : @"Auth#phoneVerificationFailed", + @"error" : @{ + @"message" : exception.reason, + } + }); + } +#endif + + return nil; +} + +- (FlutterError *)onCancelWithArguments:(id)arguments { + return nil; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m new file mode 100644 index 00000000..8d7a7b1c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/PigeonParser.m @@ -0,0 +1,171 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@import FirebaseAuth; + +#import "include/Private/PigeonParser.h" +#import +#import "include/Public/CustomPigeonHeader.h" + +@implementation PigeonParser + ++ (InternalUserCredential *) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalUserCredential + makeWithUser:[self getPigeonDetails:authResult.user] + additionalUserInfo:[self getPigeonAdditionalUserInfo:authResult.additionalUserInfo + authorizationCode:authorizationCode] + credential:[self getPigeonAuthCredential:authResult.credential token:nil]]; +} + ++ (InternalUserCredential *)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user { + return [InternalUserCredential makeWithUser:[self getPigeonDetails:user] + additionalUserInfo:nil + credential:nil]; +} + ++ (InternalUserDetails *)getPigeonDetails:(nonnull FIRUser *)user { + return [InternalUserDetails makeWithUserInfo:[self getPigeonUserInfo:user] + providerData:[self getProviderData:user.providerData]]; +} + ++ (InternalUserInfo *)getPigeonUserInfo:(nonnull FIRUser *)user { + NSString *photoUrlString = user.photoURL.absoluteString; + return [InternalUserInfo + makeWithUid:user.uid + email:user.email + displayName:user.displayName + photoUrl:(photoUrlString.length > 0) ? photoUrlString : nil + phoneNumber:user.phoneNumber + isAnonymous:user.isAnonymous + isEmailVerified:user.emailVerified + providerId:user.providerID + tenantId:user.tenantID + refreshToken:user.refreshToken + creationTimestamp:@((long)([user.metadata.creationDate timeIntervalSince1970] * 1000)) + lastSignInTimestamp:@((long)([user.metadata.lastSignInDate timeIntervalSince1970] * 1000))]; +} + ++ (NSArray *> *)getProviderData: + (nonnull NSArray> *)providerData { + NSMutableArray *> *dataArray = + [NSMutableArray arrayWithCapacity:providerData.count]; + + for (id userInfo in providerData) { + NSString *photoUrlStr = userInfo.photoURL.absoluteString; + NSDictionary *dataDict = @{ + @"providerId" : userInfo.providerID, + // Can be null on emulator + @"uid" : userInfo.uid ?: @"", + @"displayName" : userInfo.displayName ?: [NSNull null], + @"email" : userInfo.email ?: [NSNull null], + @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], + @"photoURL" : photoUrlStr ?: [NSNull null], + // isAnonymous is always false on in a providerData object (the user is not anonymous) + @"isAnonymous" : @NO, + // isEmailVerified is always true on in a providerData object (the email is verified by the + // provider) + @"isEmailVerified" : @YES, + }; + [dataArray addObject:dataDict]; + } + return [dataArray copy]; +} + ++ (InternalAdditionalUserInfo *)getPigeonAdditionalUserInfo: + (nonnull FIRAdditionalUserInfo *)userInfo + authorizationCode:(nullable NSString *)authorizationCode { + return [InternalAdditionalUserInfo makeWithIsNewUser:userInfo.isNewUser + providerId:userInfo.providerID + username:userInfo.username + authorizationCode:authorizationCode + profile:userInfo.profile]; +} + ++ (InternalTotpSecret *)getPigeonTotpSecret:(FIRTOTPSecret *)secret { + return [InternalTotpSecret makeWithCodeIntervalSeconds:nil + codeLength:nil + enrollmentCompletionDeadline:nil + hashingAlgorithm:nil + secretKey:secret.sharedSecretKey]; +} + ++ (InternalAuthCredential *)getPigeonAuthCredential:(FIRAuthCredential *)authCredential + token:(NSNumber *_Nullable)token { + if (authCredential == nil) { + return nil; + } + + NSString *accessToken = nil; + if ([authCredential isKindOfClass:[FIROAuthCredential class]]) { + if (((FIROAuthCredential *)authCredential).accessToken != nil) { + accessToken = ((FIROAuthCredential *)authCredential).accessToken; + } else if (((FIROAuthCredential *)authCredential).IDToken != nil) { + // For Sign In With Apple, the token is stored in IDToken + accessToken = ((FIROAuthCredential *)authCredential).IDToken; + } + } + + NSUInteger nativeId = + token != nil ? [token unsignedLongValue] : (NSUInteger)[authCredential hash]; + + return [InternalAuthCredential makeWithProviderId:authCredential.provider + signInMethod:authCredential.provider + nativeId:nativeId + accessToken:accessToken ?: nil]; +} + ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings { + if (settings == nil) { + return nil; + } + + FIRActionCodeSettings *codeSettings = [[FIRActionCodeSettings alloc] init]; + + if (settings.url != nil) { + codeSettings.URL = [NSURL URLWithString:settings.url]; + } + + if (settings.linkDomain != nil) { + codeSettings.linkDomain = settings.linkDomain; + } + + codeSettings.handleCodeInApp = settings.handleCodeInApp; + + if (settings.iOSBundleId != nil) { + codeSettings.iOSBundleID = settings.iOSBundleId; + } + + return codeSettings; +} + ++ (InternalIdTokenResult *)parseIdTokenResult:(FIRAuthTokenResult *)tokenResult { + long expirationTimestamp = (long)[tokenResult.expirationDate timeIntervalSince1970] * 1000; + long authTimestamp = (long)[tokenResult.authDate timeIntervalSince1970] * 1000; + long issuedAtTimestamp = (long)[tokenResult.issuedAtDate timeIntervalSince1970] * 1000; + + return [InternalIdTokenResult makeWithToken:tokenResult.token + expirationTimestamp:@(expirationTimestamp) + authTimestamp:@(authTimestamp) + issuedAtTimestamp:@(issuedAtTimestamp) + signInProvider:tokenResult.signInProvider + claims:tokenResult.claims + signInSecondFactor:tokenResult.signInSecondFactor]; +} + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails { + NSMutableArray *output = [NSMutableArray array]; + + id userInfoList = [[userDetails userInfo] toList]; + [output addObject:userInfoList]; + + id providerData = [userDetails providerData]; + [output addObject:providerData]; + + return [output copy]; +} + +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m new file mode 100644 index 00000000..82ae8cfc --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/firebase_auth_messages.g.m @@ -0,0 +1,3005 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#import "include/Public/firebase_auth_messages.g.h" + +#if TARGET_OS_OSX +@import FlutterMacOS; +#else +@import Flutter; +#endif + +static BOOL __attribute__((unused)) FLTPigeonDeepEquals(id _Nullable a, id _Nullable b) { + if (a == b) { + return YES; + } + if (a == nil) { + return b == [NSNull null]; + } + if (b == nil) { + return a == [NSNull null]; + } + if ([a isKindOfClass:[NSNumber class]] && [b isKindOfClass:[NSNumber class]]) { + return + [a isEqual:b] || (isnan([(NSNumber *)a doubleValue]) && isnan([(NSNumber *)b doubleValue])); + } + if ([a isKindOfClass:[NSArray class]] && [b isKindOfClass:[NSArray class]]) { + NSArray *arrayA = (NSArray *)a; + NSArray *arrayB = (NSArray *)b; + if (arrayA.count != arrayB.count) { + return NO; + } + for (NSUInteger i = 0; i < arrayA.count; i++) { + if (!FLTPigeonDeepEquals(arrayA[i], arrayB[i])) { + return NO; + } + } + return YES; + } + if ([a isKindOfClass:[NSDictionary class]] && [b isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictA = (NSDictionary *)a; + NSDictionary *dictB = (NSDictionary *)b; + if (dictA.count != dictB.count) { + return NO; + } + for (id keyA in dictA) { + id valueA = dictA[keyA]; + BOOL found = NO; + for (id keyB in dictB) { + if (FLTPigeonDeepEquals(keyA, keyB)) { + id valueB = dictB[keyB]; + if (FLTPigeonDeepEquals(valueA, valueB)) { + found = YES; + break; + } else { + return NO; + } + } + } + if (!found) { + return NO; + } + } + return YES; + } + return [a isEqual:b]; +} + +static NSUInteger __attribute__((unused)) FLTPigeonDeepHash(id _Nullable value) { + if (value == nil || value == (id)[NSNull null]) { + return 0; + } + if ([value isKindOfClass:[NSNumber class]]) { + NSNumber *n = (NSNumber *)value; + double d = n.doubleValue; + if (isnan(d)) { + // Normalize NaN to a consistent hash. + return (NSUInteger)0x7FF8000000000000; + } + if (d == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + d = 0.0; + } + return @(d).hash; + } + if ([value isKindOfClass:[NSArray class]]) { + NSUInteger result = 1; + for (id item in (NSArray *)value) { + result = result * 31 + FLTPigeonDeepHash(item); + } + return result; + } + if ([value isKindOfClass:[NSDictionary class]]) { + NSUInteger result = 0; + NSDictionary *dict = (NSDictionary *)value; + for (id key in dict) { + result += ((FLTPigeonDeepHash(key) * 31) ^ FLTPigeonDeepHash(dict[key])); + } + return result; + } + return [value hash]; +} + +static NSArray *wrapResult(id result, FlutterError *error) { + if (error) { + return @[ + error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] + ]; + } + return @[ result ?: [NSNull null] ]; +} + +static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { + id result = array[key]; + return (result == [NSNull null]) ? nil : result; +} + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +@implementation ActionCodeInfoOperationBox +- (instancetype)initWithValue:(ActionCodeInfoOperation)value { + self = [super init]; + if (self) { + _value = value; + } + return self; +} +@end + +@interface InternalMultiFactorSession () ++ (InternalMultiFactorSession *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalPhoneMultiFactorAssertion () ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list; ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalMultiFactorInfo () ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list; ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface AuthPigeonFirebaseApp () ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list; ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfoData () ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeInfo () ++ (InternalActionCodeInfo *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAdditionalUserInfo () ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredential () ++ (InternalAuthCredential *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserInfo () ++ (InternalUserInfo *)fromList:(NSArray *)list; ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserDetails () ++ (InternalUserDetails *)fromList:(NSArray *)list; ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserCredential () ++ (InternalUserCredential *)fromList:(NSArray *)list; ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalAuthCredentialInput () ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list; ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalActionCodeSettings () ++ (InternalActionCodeSettings *)fromList:(NSArray *)list; ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalFirebaseAuthSettings () ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list; ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalSignInProvider () ++ (InternalSignInProvider *)fromList:(NSArray *)list; ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalVerifyPhoneNumberRequest () ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list; ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalIdTokenResult () ++ (InternalIdTokenResult *)fromList:(NSArray *)list; ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalUserProfile () ++ (InternalUserProfile *)fromList:(NSArray *)list; ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@interface InternalTotpSecret () ++ (InternalTotpSecret *)fromList:(NSArray *)list; ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + +@implementation InternalMultiFactorSession ++ (instancetype)makeWithId:(NSString *)id { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = id; + return pigeonResult; +} ++ (InternalMultiFactorSession *)fromList:(NSArray *)list { + InternalMultiFactorSession *pigeonResult = [[InternalMultiFactorSession alloc] init]; + pigeonResult.id = GetNullableObjectAtIndex(list, 0); + return pigeonResult; +} ++ (nullable InternalMultiFactorSession *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorSession fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.id ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorSession *other = (InternalMultiFactorSession *)object; + return FLTPigeonDeepEquals(self.id, other.id); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.id); + return result; +} +@end + +@implementation InternalPhoneMultiFactorAssertion ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = verificationId; + pigeonResult.verificationCode = verificationCode; + return pigeonResult; +} ++ (InternalPhoneMultiFactorAssertion *)fromList:(NSArray *)list { + InternalPhoneMultiFactorAssertion *pigeonResult = + [[InternalPhoneMultiFactorAssertion alloc] init]; + pigeonResult.verificationId = GetNullableObjectAtIndex(list, 0); + pigeonResult.verificationCode = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalPhoneMultiFactorAssertion *)nullableFromList:(NSArray *)list { + return (list) ? [InternalPhoneMultiFactorAssertion fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.verificationId ?: [NSNull null], + self.verificationCode ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalPhoneMultiFactorAssertion *other = (InternalPhoneMultiFactorAssertion *)object; + return FLTPigeonDeepEquals(self.verificationId, other.verificationId) && + FLTPigeonDeepEquals(self.verificationCode, other.verificationCode); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.verificationId); + result = result * 31 + FLTPigeonDeepHash(self.verificationCode); + return result; +} +@end + +@implementation InternalMultiFactorInfo ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.enrollmentTimestamp = enrollmentTimestamp; + pigeonResult.factorId = factorId; + pigeonResult.uid = uid; + pigeonResult.phoneNumber = phoneNumber; + return pigeonResult; +} ++ (InternalMultiFactorInfo *)fromList:(NSArray *)list { + InternalMultiFactorInfo *pigeonResult = [[InternalMultiFactorInfo alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.enrollmentTimestamp = [GetNullableObjectAtIndex(list, 1) doubleValue]; + pigeonResult.factorId = GetNullableObjectAtIndex(list, 2); + pigeonResult.uid = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalMultiFactorInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalMultiFactorInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + @(self.enrollmentTimestamp), + self.factorId ?: [NSNull null], + self.uid ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalMultiFactorInfo *other = (InternalMultiFactorInfo *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + (self.enrollmentTimestamp == other.enrollmentTimestamp || + (isnan(self.enrollmentTimestamp) && isnan(other.enrollmentTimestamp))) && + FLTPigeonDeepEquals(self.factorId, other.factorId) && + FLTPigeonDeepEquals(self.uid, other.uid) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + (isnan(self.enrollmentTimestamp) ? (NSUInteger)0x7FF8000000000000 + : @(self.enrollmentTimestamp).hash); + result = result * 31 + FLTPigeonDeepHash(self.factorId); + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + return result; +} +@end + +@implementation AuthPigeonFirebaseApp ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = appName; + pigeonResult.tenantId = tenantId; + pigeonResult.customAuthDomain = customAuthDomain; + return pigeonResult; +} ++ (AuthPigeonFirebaseApp *)fromList:(NSArray *)list { + AuthPigeonFirebaseApp *pigeonResult = [[AuthPigeonFirebaseApp alloc] init]; + pigeonResult.appName = GetNullableObjectAtIndex(list, 0); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 1); + pigeonResult.customAuthDomain = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable AuthPigeonFirebaseApp *)nullableFromList:(NSArray *)list { + return (list) ? [AuthPigeonFirebaseApp fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.appName ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.customAuthDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + AuthPigeonFirebaseApp *other = (AuthPigeonFirebaseApp *)object; + return FLTPigeonDeepEquals(self.appName, other.appName) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.customAuthDomain, other.customAuthDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.appName); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.customAuthDomain); + return result; +} +@end + +@implementation InternalActionCodeInfoData ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = email; + pigeonResult.previousEmail = previousEmail; + return pigeonResult; +} ++ (InternalActionCodeInfoData *)fromList:(NSArray *)list { + InternalActionCodeInfoData *pigeonResult = [[InternalActionCodeInfoData alloc] init]; + pigeonResult.email = GetNullableObjectAtIndex(list, 0); + pigeonResult.previousEmail = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfoData *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfoData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.email ?: [NSNull null], + self.previousEmail ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfoData *other = (InternalActionCodeInfoData *)object; + return FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.previousEmail, other.previousEmail); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.previousEmail); + return result; +} +@end + +@implementation InternalActionCodeInfo ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + pigeonResult.operation = operation; + pigeonResult.data = data; + return pigeonResult; +} ++ (InternalActionCodeInfo *)fromList:(NSArray *)list { + InternalActionCodeInfo *pigeonResult = [[InternalActionCodeInfo alloc] init]; + ActionCodeInfoOperationBox *boxedActionCodeInfoOperation = GetNullableObjectAtIndex(list, 0); + pigeonResult.operation = boxedActionCodeInfoOperation.value; + pigeonResult.data = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalActionCodeInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + [[ActionCodeInfoOperationBox alloc] initWithValue:self.operation], + self.data ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeInfo *other = (InternalActionCodeInfo *)object; + return self.operation == other.operation && FLTPigeonDeepEquals(self.data, other.data); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.operation).hash; + result = result * 31 + FLTPigeonDeepHash(self.data); + return result; +} +@end + +@implementation InternalAdditionalUserInfo ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = isNewUser; + pigeonResult.providerId = providerId; + pigeonResult.username = username; + pigeonResult.authorizationCode = authorizationCode; + pigeonResult.profile = profile; + return pigeonResult; +} ++ (InternalAdditionalUserInfo *)fromList:(NSArray *)list { + InternalAdditionalUserInfo *pigeonResult = [[InternalAdditionalUserInfo alloc] init]; + pigeonResult.isNewUser = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 1); + pigeonResult.username = GetNullableObjectAtIndex(list, 2); + pigeonResult.authorizationCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.profile = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalAdditionalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAdditionalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.isNewUser), + self.providerId ?: [NSNull null], + self.username ?: [NSNull null], + self.authorizationCode ?: [NSNull null], + self.profile ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAdditionalUserInfo *other = (InternalAdditionalUserInfo *)object; + return self.isNewUser == other.isNewUser && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.username, other.username) && + FLTPigeonDeepEquals(self.authorizationCode, other.authorizationCode) && + FLTPigeonDeepEquals(self.profile, other.profile); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.isNewUser).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.username); + result = result * 31 + FLTPigeonDeepHash(self.authorizationCode); + result = result * 31 + FLTPigeonDeepHash(self.profile); + return result; +} +@end + +@implementation InternalAuthCredential ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.nativeId = nativeId; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredential *)fromList:(NSArray *)list { + InternalAuthCredential *pigeonResult = [[InternalAuthCredential alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.nativeId = [GetNullableObjectAtIndex(list, 2) integerValue]; + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + @(self.nativeId), + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredential *other = (InternalAuthCredential *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + self.nativeId == other.nativeId && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + @(self.nativeId).hash; + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalUserInfo ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = uid; + pigeonResult.email = email; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.isAnonymous = isAnonymous; + pigeonResult.isEmailVerified = isEmailVerified; + pigeonResult.providerId = providerId; + pigeonResult.tenantId = tenantId; + pigeonResult.refreshToken = refreshToken; + pigeonResult.creationTimestamp = creationTimestamp; + pigeonResult.lastSignInTimestamp = lastSignInTimestamp; + return pigeonResult; +} ++ (InternalUserInfo *)fromList:(NSArray *)list { + InternalUserInfo *pigeonResult = [[InternalUserInfo alloc] init]; + pigeonResult.uid = GetNullableObjectAtIndex(list, 0); + pigeonResult.email = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayName = GetNullableObjectAtIndex(list, 2); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 3); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 4); + pigeonResult.isAnonymous = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.isEmailVerified = [GetNullableObjectAtIndex(list, 6) boolValue]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 7); + pigeonResult.tenantId = GetNullableObjectAtIndex(list, 8); + pigeonResult.refreshToken = GetNullableObjectAtIndex(list, 9); + pigeonResult.creationTimestamp = GetNullableObjectAtIndex(list, 10); + pigeonResult.lastSignInTimestamp = GetNullableObjectAtIndex(list, 11); + return pigeonResult; +} ++ (nullable InternalUserInfo *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserInfo fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.uid ?: [NSNull null], + self.email ?: [NSNull null], + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + @(self.isAnonymous), + @(self.isEmailVerified), + self.providerId ?: [NSNull null], + self.tenantId ?: [NSNull null], + self.refreshToken ?: [NSNull null], + self.creationTimestamp ?: [NSNull null], + self.lastSignInTimestamp ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserInfo *other = (InternalUserInfo *)object; + return FLTPigeonDeepEquals(self.uid, other.uid) && FLTPigeonDeepEquals(self.email, other.email) && + FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.isAnonymous == other.isAnonymous && self.isEmailVerified == other.isEmailVerified && + FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.tenantId, other.tenantId) && + FLTPigeonDeepEquals(self.refreshToken, other.refreshToken) && + FLTPigeonDeepEquals(self.creationTimestamp, other.creationTimestamp) && + FLTPigeonDeepEquals(self.lastSignInTimestamp, other.lastSignInTimestamp); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.uid); + result = result * 31 + FLTPigeonDeepHash(self.email); + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.isAnonymous).hash; + result = result * 31 + @(self.isEmailVerified).hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.tenantId); + result = result * 31 + FLTPigeonDeepHash(self.refreshToken); + result = result * 31 + FLTPigeonDeepHash(self.creationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.lastSignInTimestamp); + return result; +} +@end + +@implementation InternalUserDetails ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = userInfo; + pigeonResult.providerData = providerData; + return pigeonResult; +} ++ (InternalUserDetails *)fromList:(NSArray *)list { + InternalUserDetails *pigeonResult = [[InternalUserDetails alloc] init]; + pigeonResult.userInfo = GetNullableObjectAtIndex(list, 0); + pigeonResult.providerData = GetNullableObjectAtIndex(list, 1); + return pigeonResult; +} ++ (nullable InternalUserDetails *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserDetails fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.userInfo ?: [NSNull null], + self.providerData ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserDetails *other = (InternalUserDetails *)object; + return FLTPigeonDeepEquals(self.userInfo, other.userInfo) && + FLTPigeonDeepEquals(self.providerData, other.providerData); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.userInfo); + result = result * 31 + FLTPigeonDeepHash(self.providerData); + return result; +} +@end + +@implementation InternalUserCredential ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = user; + pigeonResult.additionalUserInfo = additionalUserInfo; + pigeonResult.credential = credential; + return pigeonResult; +} ++ (InternalUserCredential *)fromList:(NSArray *)list { + InternalUserCredential *pigeonResult = [[InternalUserCredential alloc] init]; + pigeonResult.user = GetNullableObjectAtIndex(list, 0); + pigeonResult.additionalUserInfo = GetNullableObjectAtIndex(list, 1); + pigeonResult.credential = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalUserCredential *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserCredential fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.user ?: [NSNull null], + self.additionalUserInfo ?: [NSNull null], + self.credential ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserCredential *other = (InternalUserCredential *)object; + return FLTPigeonDeepEquals(self.user, other.user) && + FLTPigeonDeepEquals(self.additionalUserInfo, other.additionalUserInfo) && + FLTPigeonDeepEquals(self.credential, other.credential); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.user); + result = result * 31 + FLTPigeonDeepHash(self.additionalUserInfo); + result = result * 31 + FLTPigeonDeepHash(self.credential); + return result; +} +@end + +@implementation InternalAuthCredentialInput ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.signInMethod = signInMethod; + pigeonResult.token = token; + pigeonResult.accessToken = accessToken; + return pigeonResult; +} ++ (InternalAuthCredentialInput *)fromList:(NSArray *)list { + InternalAuthCredentialInput *pigeonResult = [[InternalAuthCredentialInput alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.signInMethod = GetNullableObjectAtIndex(list, 1); + pigeonResult.token = GetNullableObjectAtIndex(list, 2); + pigeonResult.accessToken = GetNullableObjectAtIndex(list, 3); + return pigeonResult; +} ++ (nullable InternalAuthCredentialInput *)nullableFromList:(NSArray *)list { + return (list) ? [InternalAuthCredentialInput fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.signInMethod ?: [NSNull null], + self.token ?: [NSNull null], + self.accessToken ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalAuthCredentialInput *other = (InternalAuthCredentialInput *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.signInMethod, other.signInMethod) && + FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.accessToken, other.accessToken); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.signInMethod); + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.accessToken); + return result; +} +@end + +@implementation InternalActionCodeSettings ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = url; + pigeonResult.dynamicLinkDomain = dynamicLinkDomain; + pigeonResult.handleCodeInApp = handleCodeInApp; + pigeonResult.iOSBundleId = iOSBundleId; + pigeonResult.androidPackageName = androidPackageName; + pigeonResult.androidInstallApp = androidInstallApp; + pigeonResult.androidMinimumVersion = androidMinimumVersion; + pigeonResult.linkDomain = linkDomain; + return pigeonResult; +} ++ (InternalActionCodeSettings *)fromList:(NSArray *)list { + InternalActionCodeSettings *pigeonResult = [[InternalActionCodeSettings alloc] init]; + pigeonResult.url = GetNullableObjectAtIndex(list, 0); + pigeonResult.dynamicLinkDomain = GetNullableObjectAtIndex(list, 1); + pigeonResult.handleCodeInApp = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.iOSBundleId = GetNullableObjectAtIndex(list, 3); + pigeonResult.androidPackageName = GetNullableObjectAtIndex(list, 4); + pigeonResult.androidInstallApp = [GetNullableObjectAtIndex(list, 5) boolValue]; + pigeonResult.androidMinimumVersion = GetNullableObjectAtIndex(list, 6); + pigeonResult.linkDomain = GetNullableObjectAtIndex(list, 7); + return pigeonResult; +} ++ (nullable InternalActionCodeSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalActionCodeSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.url ?: [NSNull null], + self.dynamicLinkDomain ?: [NSNull null], + @(self.handleCodeInApp), + self.iOSBundleId ?: [NSNull null], + self.androidPackageName ?: [NSNull null], + @(self.androidInstallApp), + self.androidMinimumVersion ?: [NSNull null], + self.linkDomain ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalActionCodeSettings *other = (InternalActionCodeSettings *)object; + return FLTPigeonDeepEquals(self.url, other.url) && + FLTPigeonDeepEquals(self.dynamicLinkDomain, other.dynamicLinkDomain) && + self.handleCodeInApp == other.handleCodeInApp && + FLTPigeonDeepEquals(self.iOSBundleId, other.iOSBundleId) && + FLTPigeonDeepEquals(self.androidPackageName, other.androidPackageName) && + self.androidInstallApp == other.androidInstallApp && + FLTPigeonDeepEquals(self.androidMinimumVersion, other.androidMinimumVersion) && + FLTPigeonDeepEquals(self.linkDomain, other.linkDomain); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.url); + result = result * 31 + FLTPigeonDeepHash(self.dynamicLinkDomain); + result = result * 31 + @(self.handleCodeInApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.iOSBundleId); + result = result * 31 + FLTPigeonDeepHash(self.androidPackageName); + result = result * 31 + @(self.androidInstallApp).hash; + result = result * 31 + FLTPigeonDeepHash(self.androidMinimumVersion); + result = result * 31 + FLTPigeonDeepHash(self.linkDomain); + return result; +} +@end + +@implementation InternalFirebaseAuthSettings ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = appVerificationDisabledForTesting; + pigeonResult.userAccessGroup = userAccessGroup; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.smsCode = smsCode; + pigeonResult.forceRecaptchaFlow = forceRecaptchaFlow; + return pigeonResult; +} ++ (InternalFirebaseAuthSettings *)fromList:(NSArray *)list { + InternalFirebaseAuthSettings *pigeonResult = [[InternalFirebaseAuthSettings alloc] init]; + pigeonResult.appVerificationDisabledForTesting = [GetNullableObjectAtIndex(list, 0) boolValue]; + pigeonResult.userAccessGroup = GetNullableObjectAtIndex(list, 1); + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 2); + pigeonResult.smsCode = GetNullableObjectAtIndex(list, 3); + pigeonResult.forceRecaptchaFlow = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalFirebaseAuthSettings *)nullableFromList:(NSArray *)list { + return (list) ? [InternalFirebaseAuthSettings fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.appVerificationDisabledForTesting), + self.userAccessGroup ?: [NSNull null], + self.phoneNumber ?: [NSNull null], + self.smsCode ?: [NSNull null], + self.forceRecaptchaFlow ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalFirebaseAuthSettings *other = (InternalFirebaseAuthSettings *)object; + return self.appVerificationDisabledForTesting == other.appVerificationDisabledForTesting && + FLTPigeonDeepEquals(self.userAccessGroup, other.userAccessGroup) && + FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + FLTPigeonDeepEquals(self.smsCode, other.smsCode) && + FLTPigeonDeepEquals(self.forceRecaptchaFlow, other.forceRecaptchaFlow); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + @(self.appVerificationDisabledForTesting).hash; + result = result * 31 + FLTPigeonDeepHash(self.userAccessGroup); + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + FLTPigeonDeepHash(self.smsCode); + result = result * 31 + FLTPigeonDeepHash(self.forceRecaptchaFlow); + return result; +} +@end + +@implementation InternalSignInProvider ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = providerId; + pigeonResult.scopes = scopes; + pigeonResult.customParameters = customParameters; + return pigeonResult; +} ++ (InternalSignInProvider *)fromList:(NSArray *)list { + InternalSignInProvider *pigeonResult = [[InternalSignInProvider alloc] init]; + pigeonResult.providerId = GetNullableObjectAtIndex(list, 0); + pigeonResult.scopes = GetNullableObjectAtIndex(list, 1); + pigeonResult.customParameters = GetNullableObjectAtIndex(list, 2); + return pigeonResult; +} ++ (nullable InternalSignInProvider *)nullableFromList:(NSArray *)list { + return (list) ? [InternalSignInProvider fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.providerId ?: [NSNull null], + self.scopes ?: [NSNull null], + self.customParameters ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalSignInProvider *other = (InternalSignInProvider *)object; + return FLTPigeonDeepEquals(self.providerId, other.providerId) && + FLTPigeonDeepEquals(self.scopes, other.scopes) && + FLTPigeonDeepEquals(self.customParameters, other.customParameters); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.providerId); + result = result * 31 + FLTPigeonDeepHash(self.scopes); + result = result * 31 + FLTPigeonDeepHash(self.customParameters); + return result; +} +@end + +@implementation InternalVerifyPhoneNumberRequest ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = phoneNumber; + pigeonResult.timeout = timeout; + pigeonResult.forceResendingToken = forceResendingToken; + pigeonResult.autoRetrievedSmsCodeForTesting = autoRetrievedSmsCodeForTesting; + pigeonResult.multiFactorInfoId = multiFactorInfoId; + pigeonResult.multiFactorSessionId = multiFactorSessionId; + return pigeonResult; +} ++ (InternalVerifyPhoneNumberRequest *)fromList:(NSArray *)list { + InternalVerifyPhoneNumberRequest *pigeonResult = [[InternalVerifyPhoneNumberRequest alloc] init]; + pigeonResult.phoneNumber = GetNullableObjectAtIndex(list, 0); + pigeonResult.timeout = [GetNullableObjectAtIndex(list, 1) integerValue]; + pigeonResult.forceResendingToken = GetNullableObjectAtIndex(list, 2); + pigeonResult.autoRetrievedSmsCodeForTesting = GetNullableObjectAtIndex(list, 3); + pigeonResult.multiFactorInfoId = GetNullableObjectAtIndex(list, 4); + pigeonResult.multiFactorSessionId = GetNullableObjectAtIndex(list, 5); + return pigeonResult; +} ++ (nullable InternalVerifyPhoneNumberRequest *)nullableFromList:(NSArray *)list { + return (list) ? [InternalVerifyPhoneNumberRequest fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.phoneNumber ?: [NSNull null], + @(self.timeout), + self.forceResendingToken ?: [NSNull null], + self.autoRetrievedSmsCodeForTesting ?: [NSNull null], + self.multiFactorInfoId ?: [NSNull null], + self.multiFactorSessionId ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalVerifyPhoneNumberRequest *other = (InternalVerifyPhoneNumberRequest *)object; + return FLTPigeonDeepEquals(self.phoneNumber, other.phoneNumber) && + self.timeout == other.timeout && + FLTPigeonDeepEquals(self.forceResendingToken, other.forceResendingToken) && + FLTPigeonDeepEquals(self.autoRetrievedSmsCodeForTesting, + other.autoRetrievedSmsCodeForTesting) && + FLTPigeonDeepEquals(self.multiFactorInfoId, other.multiFactorInfoId) && + FLTPigeonDeepEquals(self.multiFactorSessionId, other.multiFactorSessionId); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.phoneNumber); + result = result * 31 + @(self.timeout).hash; + result = result * 31 + FLTPigeonDeepHash(self.forceResendingToken); + result = result * 31 + FLTPigeonDeepHash(self.autoRetrievedSmsCodeForTesting); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorInfoId); + result = result * 31 + FLTPigeonDeepHash(self.multiFactorSessionId); + return result; +} +@end + +@implementation InternalIdTokenResult ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = token; + pigeonResult.expirationTimestamp = expirationTimestamp; + pigeonResult.authTimestamp = authTimestamp; + pigeonResult.issuedAtTimestamp = issuedAtTimestamp; + pigeonResult.signInProvider = signInProvider; + pigeonResult.claims = claims; + pigeonResult.signInSecondFactor = signInSecondFactor; + return pigeonResult; +} ++ (InternalIdTokenResult *)fromList:(NSArray *)list { + InternalIdTokenResult *pigeonResult = [[InternalIdTokenResult alloc] init]; + pigeonResult.token = GetNullableObjectAtIndex(list, 0); + pigeonResult.expirationTimestamp = GetNullableObjectAtIndex(list, 1); + pigeonResult.authTimestamp = GetNullableObjectAtIndex(list, 2); + pigeonResult.issuedAtTimestamp = GetNullableObjectAtIndex(list, 3); + pigeonResult.signInProvider = GetNullableObjectAtIndex(list, 4); + pigeonResult.claims = GetNullableObjectAtIndex(list, 5); + pigeonResult.signInSecondFactor = GetNullableObjectAtIndex(list, 6); + return pigeonResult; +} ++ (nullable InternalIdTokenResult *)nullableFromList:(NSArray *)list { + return (list) ? [InternalIdTokenResult fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.token ?: [NSNull null], + self.expirationTimestamp ?: [NSNull null], + self.authTimestamp ?: [NSNull null], + self.issuedAtTimestamp ?: [NSNull null], + self.signInProvider ?: [NSNull null], + self.claims ?: [NSNull null], + self.signInSecondFactor ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalIdTokenResult *other = (InternalIdTokenResult *)object; + return FLTPigeonDeepEquals(self.token, other.token) && + FLTPigeonDeepEquals(self.expirationTimestamp, other.expirationTimestamp) && + FLTPigeonDeepEquals(self.authTimestamp, other.authTimestamp) && + FLTPigeonDeepEquals(self.issuedAtTimestamp, other.issuedAtTimestamp) && + FLTPigeonDeepEquals(self.signInProvider, other.signInProvider) && + FLTPigeonDeepEquals(self.claims, other.claims) && + FLTPigeonDeepEquals(self.signInSecondFactor, other.signInSecondFactor); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.token); + result = result * 31 + FLTPigeonDeepHash(self.expirationTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.authTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.issuedAtTimestamp); + result = result * 31 + FLTPigeonDeepHash(self.signInProvider); + result = result * 31 + FLTPigeonDeepHash(self.claims); + result = result * 31 + FLTPigeonDeepHash(self.signInSecondFactor); + return result; +} +@end + +@implementation InternalUserProfile ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = displayName; + pigeonResult.photoUrl = photoUrl; + pigeonResult.displayNameChanged = displayNameChanged; + pigeonResult.photoUrlChanged = photoUrlChanged; + return pigeonResult; +} ++ (InternalUserProfile *)fromList:(NSArray *)list { + InternalUserProfile *pigeonResult = [[InternalUserProfile alloc] init]; + pigeonResult.displayName = GetNullableObjectAtIndex(list, 0); + pigeonResult.photoUrl = GetNullableObjectAtIndex(list, 1); + pigeonResult.displayNameChanged = [GetNullableObjectAtIndex(list, 2) boolValue]; + pigeonResult.photoUrlChanged = [GetNullableObjectAtIndex(list, 3) boolValue]; + return pigeonResult; +} ++ (nullable InternalUserProfile *)nullableFromList:(NSArray *)list { + return (list) ? [InternalUserProfile fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.displayName ?: [NSNull null], + self.photoUrl ?: [NSNull null], + @(self.displayNameChanged), + @(self.photoUrlChanged), + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalUserProfile *other = (InternalUserProfile *)object; + return FLTPigeonDeepEquals(self.displayName, other.displayName) && + FLTPigeonDeepEquals(self.photoUrl, other.photoUrl) && + self.displayNameChanged == other.displayNameChanged && + self.photoUrlChanged == other.photoUrlChanged; +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.displayName); + result = result * 31 + FLTPigeonDeepHash(self.photoUrl); + result = result * 31 + @(self.displayNameChanged).hash; + result = result * 31 + @(self.photoUrlChanged).hash; + return result; +} +@end + +@implementation InternalTotpSecret ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = codeIntervalSeconds; + pigeonResult.codeLength = codeLength; + pigeonResult.enrollmentCompletionDeadline = enrollmentCompletionDeadline; + pigeonResult.hashingAlgorithm = hashingAlgorithm; + pigeonResult.secretKey = secretKey; + return pigeonResult; +} ++ (InternalTotpSecret *)fromList:(NSArray *)list { + InternalTotpSecret *pigeonResult = [[InternalTotpSecret alloc] init]; + pigeonResult.codeIntervalSeconds = GetNullableObjectAtIndex(list, 0); + pigeonResult.codeLength = GetNullableObjectAtIndex(list, 1); + pigeonResult.enrollmentCompletionDeadline = GetNullableObjectAtIndex(list, 2); + pigeonResult.hashingAlgorithm = GetNullableObjectAtIndex(list, 3); + pigeonResult.secretKey = GetNullableObjectAtIndex(list, 4); + return pigeonResult; +} ++ (nullable InternalTotpSecret *)nullableFromList:(NSArray *)list { + return (list) ? [InternalTotpSecret fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + self.codeIntervalSeconds ?: [NSNull null], + self.codeLength ?: [NSNull null], + self.enrollmentCompletionDeadline ?: [NSNull null], + self.hashingAlgorithm ?: [NSNull null], + self.secretKey ?: [NSNull null], + ]; +} +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[self class]]) { + return NO; + } + InternalTotpSecret *other = (InternalTotpSecret *)object; + return FLTPigeonDeepEquals(self.codeIntervalSeconds, other.codeIntervalSeconds) && + FLTPigeonDeepEquals(self.codeLength, other.codeLength) && + FLTPigeonDeepEquals(self.enrollmentCompletionDeadline, + other.enrollmentCompletionDeadline) && + FLTPigeonDeepEquals(self.hashingAlgorithm, other.hashingAlgorithm) && + FLTPigeonDeepEquals(self.secretKey, other.secretKey); +} + +- (NSUInteger)hash { + NSUInteger result = [self class].hash; + result = result * 31 + FLTPigeonDeepHash(self.codeIntervalSeconds); + result = result * 31 + FLTPigeonDeepHash(self.codeLength); + result = result * 31 + FLTPigeonDeepHash(self.enrollmentCompletionDeadline); + result = result * 31 + FLTPigeonDeepHash(self.hashingAlgorithm); + result = result * 31 + FLTPigeonDeepHash(self.secretKey); + return result; +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReader : FlutterStandardReader +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReader +- (nullable id)readValueOfType:(UInt8)type { + switch (type) { + case 129: { + NSNumber *enumAsNumber = [self readValue]; + return enumAsNumber == nil + ? nil + : [[ActionCodeInfoOperationBox alloc] initWithValue:[enumAsNumber integerValue]]; + } + case 130: + return [InternalMultiFactorSession fromList:[self readValue]]; + case 131: + return [InternalPhoneMultiFactorAssertion fromList:[self readValue]]; + case 132: + return [InternalMultiFactorInfo fromList:[self readValue]]; + case 133: + return [AuthPigeonFirebaseApp fromList:[self readValue]]; + case 134: + return [InternalActionCodeInfoData fromList:[self readValue]]; + case 135: + return [InternalActionCodeInfo fromList:[self readValue]]; + case 136: + return [InternalAdditionalUserInfo fromList:[self readValue]]; + case 137: + return [InternalAuthCredential fromList:[self readValue]]; + case 138: + return [InternalUserInfo fromList:[self readValue]]; + case 139: + return [InternalUserDetails fromList:[self readValue]]; + case 140: + return [InternalUserCredential fromList:[self readValue]]; + case 141: + return [InternalAuthCredentialInput fromList:[self readValue]]; + case 142: + return [InternalActionCodeSettings fromList:[self readValue]]; + case 143: + return [InternalFirebaseAuthSettings fromList:[self readValue]]; + case 144: + return [InternalSignInProvider fromList:[self readValue]]; + case 145: + return [InternalVerifyPhoneNumberRequest fromList:[self readValue]]; + case 146: + return [InternalIdTokenResult fromList:[self readValue]]; + case 147: + return [InternalUserProfile fromList:[self readValue]]; + case 148: + return [InternalTotpSecret fromList:[self readValue]]; + default: + return [super readValueOfType:type]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecWriter : FlutterStandardWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecWriter +- (void)writeValue:(id)value { + if ([value isKindOfClass:[ActionCodeInfoOperationBox class]]) { + ActionCodeInfoOperationBox *box = (ActionCodeInfoOperationBox *)value; + [self writeByte:129]; + [self writeValue:(value == nil ? [NSNull null] : [NSNumber numberWithInteger:box.value])]; + } else if ([value isKindOfClass:[InternalMultiFactorSession class]]) { + [self writeByte:130]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalPhoneMultiFactorAssertion class]]) { + [self writeByte:131]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalMultiFactorInfo class]]) { + [self writeByte:132]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[AuthPigeonFirebaseApp class]]) { + [self writeByte:133]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfoData class]]) { + [self writeByte:134]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeInfo class]]) { + [self writeByte:135]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAdditionalUserInfo class]]) { + [self writeByte:136]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredential class]]) { + [self writeByte:137]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserInfo class]]) { + [self writeByte:138]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserDetails class]]) { + [self writeByte:139]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserCredential class]]) { + [self writeByte:140]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalAuthCredentialInput class]]) { + [self writeByte:141]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalActionCodeSettings class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalFirebaseAuthSettings class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalSignInProvider class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalVerifyPhoneNumberRequest class]]) { + [self writeByte:145]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalIdTokenResult class]]) { + [self writeByte:146]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalUserProfile class]]) { + [self writeByte:147]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[InternalTotpSecret class]]) { + [self writeByte:148]; + [self writeValue:[value toList]]; + } else { + [super writeValue:value]; + } +} +@end + +@interface nullFirebaseAuthMessagesPigeonCodecReaderWriter : FlutterStandardReaderWriter +@end +@implementation nullFirebaseAuthMessagesPigeonCodecReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecWriter alloc] initWithData:data]; +} +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[nullFirebaseAuthMessagesPigeonCodecReader alloc] initWithData:data]; +} +@end + +NSObject *nullGetFirebaseAuthMessagesCodec(void) { + static FlutterStandardMessageCodec *sSharedObject = nil; + static dispatch_once_t sPred = 0; + dispatch_once(&sPred, ^{ + nullFirebaseAuthMessagesPigeonCodecReaderWriter *readerWriter = + [[nullFirebaseAuthMessagesPigeonCodecReaderWriter alloc] init]; + sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; + }); + return sSharedObject; +} +void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerIdTokenListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerIdTokenListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerIdTokenListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerIdTokenListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.registerAuthStateListener", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(registerAuthStateListenerApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(registerAuthStateListenerApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api registerAuthStateListenerApp:arg_app + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.useEmulator", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(useEmulatorApp:host:port:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(useEmulatorApp:host:port:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_host = GetNullableObjectAtIndex(args, 1); + NSInteger arg_port = [GetNullableObjectAtIndex(args, 2) integerValue]; + [api useEmulatorApp:arg_app + host:arg_host + port:arg_port + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.applyActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(applyActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(applyActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api applyActionCodeApp:arg_app + code:arg_code + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.checkActionCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(checkActionCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(checkActionCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api checkActionCodeApp:arg_app + code:arg_code + completion:^(InternalActionCodeInfo *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.confirmPasswordReset", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(confirmPasswordResetApp:code:newPassword:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(confirmPasswordResetApp:code:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 2); + [api confirmPasswordResetApp:arg_app + code:arg_code + newPassword:arg_newPassword + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.createUserWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api + respondsToSelector:@selector( + createUserWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(createUserWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api createUserWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInAnonymously", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInAnonymouslyApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInAnonymouslyApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signInAnonymouslyApp:arg_app + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCredentialApp:input:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api signInWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithCustomToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(signInWithCustomTokenApp:token:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithCustomTokenApp:token:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_token = GetNullableObjectAtIndex(args, 1); + [api signInWithCustomTokenApp:arg_app + token:arg_token + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailAndPassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + signInWithEmailAndPasswordApp:email:password:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailAndPasswordApp:email:password:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_password = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailAndPasswordApp:arg_app + email:arg_email + password:arg_password + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithEmailLink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithEmailLinkApp:email:emailLink:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithEmailLinkApp:email:emailLink:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + NSString *arg_emailLink = GetNullableObjectAtIndex(args, 2); + [api signInWithEmailLinkApp:arg_app + email:arg_email + emailLink:arg_emailLink + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.signInWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signInWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(signInWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api signInWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.signOut", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(signOutApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to @selector(signOutApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api signOutApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.fetchSignInMethodsForEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(fetchSignInMethodsForEmailApp:email:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(fetchSignInMethodsForEmailApp:email:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + [api fetchSignInMethodsForEmailApp:arg_app + email:arg_email + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendPasswordResetEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendPasswordResetEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendPasswordResetEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.sendSignInLinkToEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(sendSignInLinkToEmailApp:email:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_email = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api sendSignInLinkToEmailApp:arg_app + email:arg_email + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setLanguageCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setLanguageCodeApp:languageCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setLanguageCodeApp:languageCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_languageCode = GetNullableObjectAtIndex(args, 1); + [api setLanguageCodeApp:arg_app + languageCode:arg_languageCode + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthHostApi.setSettings", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(setSettingsApp:settings:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(setSettingsApp:settings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalFirebaseAuthSettings *arg_settings = GetNullableObjectAtIndex(args, 1); + [api setSettingsApp:arg_app + settings:arg_settings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPasswordResetCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPasswordResetCodeApp:code:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPasswordResetCodeApp:code:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_code = GetNullableObjectAtIndex(args, 1); + [api verifyPasswordResetCodeApp:arg_app + code:arg_code + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.verifyPhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyPhoneNumberApp:request:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(verifyPhoneNumberApp:request:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalVerifyPhoneNumberRequest *arg_request = GetNullableObjectAtIndex(args, 1); + [api verifyPhoneNumberApp:arg_app + request:arg_request + completion:^(NSString *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeTokenWithAuthorizationCode", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeTokenWithAuthorizationCodeApp: + authorizationCode:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeTokenWithAuthorizationCodeApp:authorizationCode:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_authorizationCode = GetNullableObjectAtIndex(args, 1); + [api revokeTokenWithAuthorizationCodeApp:arg_app + authorizationCode:arg_authorizationCode + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.revokeAccessToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(revokeAccessTokenApp:accessToken:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(revokeAccessTokenApp:accessToken:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_accessToken = GetNullableObjectAtIndex(args, 1); + [api revokeAccessTokenApp:arg_app + accessToken:arg_accessToken + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthHostApi.initializeRecaptchaConfig", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(initializeRecaptchaConfigApp:completion:)], + @"FirebaseAuthHostApi api (%@) doesn't respond to " + @"@selector(initializeRecaptchaConfigApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api initializeRecaptchaConfigApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpFirebaseAuthUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.delete", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(deleteApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(deleteApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api deleteApp:arg_app + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.getIdToken", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getIdTokenApp:forceRefresh:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(getIdTokenApp:forceRefresh:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + BOOL arg_forceRefresh = [GetNullableObjectAtIndex(args, 1) boolValue]; + [api getIdTokenApp:arg_app + forceRefresh:arg_forceRefresh + completion:^(InternalIdTokenResult *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api linkWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.linkWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(linkWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(linkWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api linkWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName: + [NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithCredential", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reauthenticateWithCredentialApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithCredentialApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithCredentialApp:arg_app + input:arg_input + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.reauthenticateWithProvider", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + reauthenticateWithProviderApp:signInProvider:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(reauthenticateWithProviderApp:signInProvider:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalSignInProvider *arg_signInProvider = GetNullableObjectAtIndex(args, 1); + [api reauthenticateWithProviderApp:arg_app + signInProvider:arg_signInProvider + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.reload", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(reloadApp:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to @selector(reloadApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api reloadApp:arg_app + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.sendEmailVerification", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + sendEmailVerificationApp:actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(sendEmailVerificationApp:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 1); + [api sendEmailVerificationApp:arg_app + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.unlink", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unlinkApp:providerId:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(unlinkApp:providerId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_providerId = GetNullableObjectAtIndex(args, 1); + [api unlinkApp:arg_app + providerId:arg_providerId + completion:^(InternalUserCredential *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.FirebaseAuthUserHostApi.updateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateEmailApp:newEmail:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateEmailApp:newEmail:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + [api + updateEmailApp:arg_app + newEmail:arg_newEmail + completion:^(InternalUserDetails *_Nullable output, FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePassword", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePasswordApp:newPassword:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePasswordApp:newPassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newPassword = GetNullableObjectAtIndex(args, 1); + [api updatePasswordApp:arg_app + newPassword:arg_newPassword + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updatePhoneNumber", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updatePhoneNumberApp:input:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updatePhoneNumberApp:input:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSDictionary *arg_input = GetNullableObjectAtIndex(args, 1); + [api updatePhoneNumberApp:arg_app + input:arg_input + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.updateProfile", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(updateProfileApp:profile:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(updateProfileApp:profile:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalUserProfile *arg_profile = GetNullableObjectAtIndex(args, 1); + [api updateProfileApp:arg_app + profile:arg_profile + completion:^(InternalUserDetails *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"FirebaseAuthUserHostApi.verifyBeforeUpdateEmail", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(verifyBeforeUpdateEmailApp:newEmail: + actionCodeSettings:completion:)], + @"FirebaseAuthUserHostApi api (%@) doesn't respond to " + @"@selector(verifyBeforeUpdateEmailApp:newEmail:actionCodeSettings:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_newEmail = GetNullableObjectAtIndex(args, 1); + InternalActionCodeSettings *arg_actionCodeSettings = GetNullableObjectAtIndex(args, 2); + [api verifyBeforeUpdateEmailApp:arg_app + newEmail:arg_newEmail + actionCodeSettings:arg_actionCodeSettings + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorUserHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollPhone", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollPhoneApp:assertion:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollPhoneApp:assertion:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollPhoneApp:arg_app + assertion:arg_assertion + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.enrollTotp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(enrollTotpApp:assertionId:displayName:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(enrollTotpApp:assertionId:displayName:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_assertionId = GetNullableObjectAtIndex(args, 1); + NSString *arg_displayName = GetNullableObjectAtIndex(args, 2); + [api enrollTotpApp:arg_app + assertionId:arg_assertionId + displayName:arg_displayName + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.getSession", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getSessionApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getSessionApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getSessionApp:arg_app + completion:^(InternalMultiFactorSession *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.MultiFactorUserHostApi.unenroll", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(unenrollApp:factorUid:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(unenrollApp:factorUid:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + NSString *arg_factorUid = GetNullableObjectAtIndex(args, 1); + [api unenrollApp:arg_app + factorUid:arg_factorUid + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorUserHostApi.getEnrolledFactors", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getEnrolledFactorsApp:completion:)], + @"MultiFactorUserHostApi api (%@) doesn't respond to " + @"@selector(getEnrolledFactorsApp:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + AuthPigeonFirebaseApp *arg_app = GetNullableObjectAtIndex(args, 0); + [api getEnrolledFactorsApp:arg_app + completion:^(NSArray *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactoResolverHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactoResolverHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactoResolverHostApi.resolveSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)], + @"MultiFactoResolverHostApi api (%@) doesn't respond to " + @"@selector(resolveSignInResolverId:assertion:totpAssertionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_resolverId = GetNullableObjectAtIndex(args, 0); + InternalPhoneMultiFactorAssertion *arg_assertion = GetNullableObjectAtIndex(args, 1); + NSString *arg_totpAssertionId = GetNullableObjectAtIndex(args, 2); + [api resolveSignInResolverId:arg_resolverId + assertion:arg_assertion + totpAssertionId:arg_totpAssertionId + completion:^(InternalUserCredential *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.generateSecret", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(generateSecretSessionId:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(generateSecretSessionId:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_sessionId = GetNullableObjectAtIndex(args, 0); + [api generateSecretSessionId:arg_sessionId + completion:^(InternalTotpSecret *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForEnrollment", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForEnrollmentSecretKey:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForEnrollmentSecretKey:arg_secretKey + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpHostApi.getAssertionForSignIn", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector: + @selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)], + @"MultiFactorTotpHostApi api (%@) doesn't respond to " + @"@selector(getAssertionForSignInEnrollmentId:oneTimePassword:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_enrollmentId = GetNullableObjectAtIndex(args, 0); + NSString *arg_oneTimePassword = GetNullableObjectAtIndex(args, 1); + [api getAssertionForSignInEnrollmentId:arg_enrollmentId + oneTimePassword:arg_oneTimePassword + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpMultiFactorTotpSecretHostApi(id binaryMessenger, + NSObject *api) { + SetUpMultiFactorTotpSecretHostApiWithSuffix(binaryMessenger, api, @""); +} + +void SetUpMultiFactorTotpSecretHostApiWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.generateQrCodeUrl", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector( + generateQrCodeUrlSecretKey:accountName:issuer:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(generateQrCodeUrlSecretKey:accountName:issuer:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_accountName = GetNullableObjectAtIndex(args, 1); + NSString *arg_issuer = GetNullableObjectAtIndex(args, 2); + [api generateQrCodeUrlSecretKey:arg_secretKey + accountName:arg_accountName + issuer:arg_issuer + completion:^(NSString *_Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString + stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_interface." + @"MultiFactorTotpSecretHostApi.openInOtpApp", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)], + @"MultiFactorTotpSecretHostApi api (%@) doesn't respond to " + @"@selector(openInOtpAppSecretKey:qrCodeUrl:completion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSString *arg_secretKey = GetNullableObjectAtIndex(args, 0); + NSString *arg_qrCodeUrl = GetNullableObjectAtIndex(args, 1); + [api openInOtpAppSecretKey:arg_secretKey + qrCodeUrl:arg_qrCodeUrl + completion:^(FlutterError *_Nullable error) { + callback(wrapResult(nil, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *api) { + SetUpGenerateInterfacesWithSuffix(binaryMessenger, api, @""); +} + +void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *api, + NSString *messageChannelSuffix) { + messageChannelSuffix = messageChannelSuffix.length > 0 + ? [NSString stringWithFormat:@".%@", messageChannelSuffix] + : @""; + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:[NSString stringWithFormat:@"%@%@", + @"dev.flutter.pigeon.firebase_auth_platform_" + @"interface.GenerateInterfaces.pigeonInterface", + messageChannelSuffix] + binaryMessenger:binaryMessenger + codec:nullGetFirebaseAuthMessagesCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(pigeonInterfaceInfo:error:)], + @"GenerateInterfaces api (%@) doesn't respond to @selector(pigeonInterfaceInfo:error:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + InternalMultiFactorInfo *arg_info = GetNullableObjectAtIndex(args, 0); + FlutterError *error; + [api pigeonInterfaceInfo:arg_info error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h new file mode 100644 index 00000000..7b7efae7 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTAuthStateChannelStreamHandler.h @@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import "../Public/CustomPigeonHeader.h" + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTAuthStateChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h new file mode 100644 index 00000000..c1660499 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTIdTokenChannelStreamHandler.h @@ -0,0 +1,27 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/CustomPigeonHeader.h" + +#import + +@class FIRAuth; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTIdTokenChannelStreamHandler : NSObject + +- (instancetype)initWithAuth:(FIRAuth *)auth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h new file mode 100644 index 00000000..53e5f28c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/FLTPhoneNumberVerificationStreamHandler.h @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import "../Public/firebase_auth_messages.g.h" + +#import + +@class FIRAuth; +@class FIRMultiFactorSession; +@class FIRPhoneMultiFactorInfo; + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTPhoneNumberVerificationStreamHandler : NSObject + +#if TARGET_OS_OSX +- (instancetype)initWithAuth:(FIRAuth *)auth arguments:(NSDictionary *)arguments; +#else +- (instancetype)initWithAuth:(FIRAuth *)auth + request:(InternalVerifyPhoneNumberRequest *)request + session:(FIRMultiFactorSession *)session + factorInfo:(FIRPhoneMultiFactorInfo *)factorInfo; +#endif + +@end + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h new file mode 100644 index 00000000..b500fd2c --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Private/PigeonParser.h @@ -0,0 +1,33 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#import +#import "../Public/firebase_auth_messages.g.h" + +@class FIRAuthDataResult; +@class FIRUser; +@class FIRActionCodeSettings; +@class FIRAuthTokenResult; +@class FIRTOTPSecret; +@class FIRAuthCredential; + +@interface PigeonParser : NSObject + ++ (NSArray *_Nonnull)getManualList:(nonnull InternalUserDetails *)userDetails; ++ (InternalUserCredential *_Nullable) + getPigeonUserCredentialFromAuthResult:(nonnull FIRAuthDataResult *)authResult + authorizationCode:(nullable NSString *)authorizationCode; ++ (InternalUserDetails *_Nullable)getPigeonDetails:(nonnull FIRUser *)user; ++ (InternalUserInfo *_Nullable)getPigeonUserInfo:(nonnull FIRUser *)user; ++ (FIRActionCodeSettings *_Nullable)parseActionCodeSettings: + (nullable InternalActionCodeSettings *)settings; ++ (InternalUserCredential *_Nullable)getPigeonUserCredentialFromFIRUser:(nonnull FIRUser *)user; ++ (InternalIdTokenResult *_Nonnull)parseIdTokenResult:(nonnull FIRAuthTokenResult *)tokenResult; ++ (InternalTotpSecret *_Nonnull)getPigeonTotpSecret:(nonnull FIRTOTPSecret *)secret; ++ (InternalAuthCredential *_Nullable)getPigeonAuthCredential: + (FIRAuthCredential *_Nullable)authCredentialToken + token:(NSNumber *_Nullable)token; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h new file mode 100644 index 00000000..d32a6b45 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/CustomPigeonHeader.h @@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#import "firebase_auth_messages.g.h" + +@interface InternalMultiFactorInfo (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserDetails (Map) +- (NSDictionary *)toList; +@end + +@interface InternalUserInfo (Map) +- (NSDictionary *)toList; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h new file mode 100644 index 00000000..53e20eca --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/FLTFirebaseAuthPlugin.h @@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import +#if __has_include() +#import +#else +#import +#endif +#import "firebase_auth_messages.g.h" + +#if !TARGET_OS_OSX +@protocol FlutterSceneLifeCycleDelegate; +#endif + +@interface FLTFirebaseAuthPlugin + : FLTFirebasePlugin ) + , + FlutterSceneLifeCycleDelegate +#endif +#endif + > + ++ (FlutterError *)convertToFlutterError:(NSError *)error; +@end diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h new file mode 100644 index 00000000..f83da7e3 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/macos/firebase_auth/Sources/firebase_auth/include/Public/firebase_auth_messages.g.h @@ -0,0 +1,571 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +@import Foundation; + +@protocol FlutterBinaryMessenger; +@protocol FlutterMessageCodec; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +/// The type of operation that generated the action code from calling +/// [checkActionCode]. +typedef NS_ENUM(NSUInteger, ActionCodeInfoOperation) { + /// Unknown operation. + ActionCodeInfoOperationUnknown = 0, + /// Password reset code generated via [sendPasswordResetEmail]. + ActionCodeInfoOperationPasswordReset = 1, + /// Email verification code generated via [User.sendEmailVerification]. + ActionCodeInfoOperationVerifyEmail = 2, + /// Email change revocation code generated via [User.updateEmail]. + ActionCodeInfoOperationRecoverEmail = 3, + /// Email sign in code generated via [sendSignInLinkToEmail]. + ActionCodeInfoOperationEmailSignIn = 4, + /// Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + ActionCodeInfoOperationVerifyAndChangeEmail = 5, + /// Action code for reverting second factor addition. + ActionCodeInfoOperationRevertSecondFactorAddition = 6, +}; + +/// Wrapper for ActionCodeInfoOperation to allow for nullability. +@interface ActionCodeInfoOperationBox : NSObject +@property(nonatomic, assign) ActionCodeInfoOperation value; +- (instancetype)initWithValue:(ActionCodeInfoOperation)value; +@end + +@class InternalMultiFactorSession; +@class InternalPhoneMultiFactorAssertion; +@class InternalMultiFactorInfo; +@class AuthPigeonFirebaseApp; +@class InternalActionCodeInfoData; +@class InternalActionCodeInfo; +@class InternalAdditionalUserInfo; +@class InternalAuthCredential; +@class InternalUserInfo; +@class InternalUserDetails; +@class InternalUserCredential; +@class InternalAuthCredentialInput; +@class InternalActionCodeSettings; +@class InternalFirebaseAuthSettings; +@class InternalSignInProvider; +@class InternalVerifyPhoneNumberRequest; +@class InternalIdTokenResult; +@class InternalUserProfile; +@class InternalTotpSecret; + +@interface InternalMultiFactorSession : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithId:(NSString *)id; +@property(nonatomic, copy) NSString *id; +@end + +@interface InternalPhoneMultiFactorAssertion : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithVerificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode; +@property(nonatomic, copy) NSString *verificationId; +@property(nonatomic, copy) NSString *verificationCode; +@end + +@interface InternalMultiFactorInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + enrollmentTimestamp:(double)enrollmentTimestamp + factorId:(nullable NSString *)factorId + uid:(NSString *)uid + phoneNumber:(nullable NSString *)phoneNumber; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, assign) double enrollmentTimestamp; +@property(nonatomic, copy, nullable) NSString *factorId; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@end + +@interface AuthPigeonFirebaseApp : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppName:(NSString *)appName + tenantId:(nullable NSString *)tenantId + customAuthDomain:(nullable NSString *)customAuthDomain; +@property(nonatomic, copy) NSString *appName; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *customAuthDomain; +@end + +@interface InternalActionCodeInfoData : NSObject ++ (instancetype)makeWithEmail:(nullable NSString *)email + previousEmail:(nullable NSString *)previousEmail; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *previousEmail; +@end + +@interface InternalActionCodeInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithOperation:(ActionCodeInfoOperation)operation + data:(InternalActionCodeInfoData *)data; +@property(nonatomic, assign) ActionCodeInfoOperation operation; +@property(nonatomic, strong) InternalActionCodeInfoData *data; +@end + +@interface InternalAdditionalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithIsNewUser:(BOOL)isNewUser + providerId:(nullable NSString *)providerId + username:(nullable NSString *)username + authorizationCode:(nullable NSString *)authorizationCode + profile:(nullable NSDictionary *)profile; +@property(nonatomic, assign) BOOL isNewUser; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *username; +@property(nonatomic, copy, nullable) NSString *authorizationCode; +@property(nonatomic, copy, nullable) NSDictionary *profile; +@end + +@interface InternalAuthCredential : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + nativeId:(NSInteger)nativeId + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, assign) NSInteger nativeId; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalUserInfo : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUid:(NSString *)uid + email:(nullable NSString *)email + displayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + phoneNumber:(nullable NSString *)phoneNumber + isAnonymous:(BOOL)isAnonymous + isEmailVerified:(BOOL)isEmailVerified + providerId:(nullable NSString *)providerId + tenantId:(nullable NSString *)tenantId + refreshToken:(nullable NSString *)refreshToken + creationTimestamp:(nullable NSNumber *)creationTimestamp + lastSignInTimestamp:(nullable NSNumber *)lastSignInTimestamp; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy, nullable) NSString *email; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) BOOL isAnonymous; +@property(nonatomic, assign) BOOL isEmailVerified; +@property(nonatomic, copy, nullable) NSString *providerId; +@property(nonatomic, copy, nullable) NSString *tenantId; +@property(nonatomic, copy, nullable) NSString *refreshToken; +@property(nonatomic, strong, nullable) NSNumber *creationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *lastSignInTimestamp; +@end + +@interface InternalUserDetails : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUserInfo:(InternalUserInfo *)userInfo + providerData:(NSArray *> *)providerData; +@property(nonatomic, strong) InternalUserInfo *userInfo; +@property(nonatomic, copy) NSArray *> *providerData; +@end + +@interface InternalUserCredential : NSObject ++ (instancetype)makeWithUser:(nullable InternalUserDetails *)user + additionalUserInfo:(nullable InternalAdditionalUserInfo *)additionalUserInfo + credential:(nullable InternalAuthCredential *)credential; +@property(nonatomic, strong, nullable) InternalUserDetails *user; +@property(nonatomic, strong, nullable) InternalAdditionalUserInfo *additionalUserInfo; +@property(nonatomic, strong, nullable) InternalAuthCredential *credential; +@end + +@interface InternalAuthCredentialInput : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + signInMethod:(NSString *)signInMethod + token:(nullable NSString *)token + accessToken:(nullable NSString *)accessToken; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy) NSString *signInMethod; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, copy, nullable) NSString *accessToken; +@end + +@interface InternalActionCodeSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithUrl:(NSString *)url + dynamicLinkDomain:(nullable NSString *)dynamicLinkDomain + handleCodeInApp:(BOOL)handleCodeInApp + iOSBundleId:(nullable NSString *)iOSBundleId + androidPackageName:(nullable NSString *)androidPackageName + androidInstallApp:(BOOL)androidInstallApp + androidMinimumVersion:(nullable NSString *)androidMinimumVersion + linkDomain:(nullable NSString *)linkDomain; +@property(nonatomic, copy) NSString *url; +@property(nonatomic, copy, nullable) NSString *dynamicLinkDomain; +@property(nonatomic, assign) BOOL handleCodeInApp; +@property(nonatomic, copy, nullable) NSString *iOSBundleId; +@property(nonatomic, copy, nullable) NSString *androidPackageName; +@property(nonatomic, assign) BOOL androidInstallApp; +@property(nonatomic, copy, nullable) NSString *androidMinimumVersion; +@property(nonatomic, copy, nullable) NSString *linkDomain; +@end + +@interface InternalFirebaseAuthSettings : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithAppVerificationDisabledForTesting:(BOOL)appVerificationDisabledForTesting + userAccessGroup:(nullable NSString *)userAccessGroup + phoneNumber:(nullable NSString *)phoneNumber + smsCode:(nullable NSString *)smsCode + forceRecaptchaFlow:(nullable NSNumber *)forceRecaptchaFlow; +@property(nonatomic, assign) BOOL appVerificationDisabledForTesting; +@property(nonatomic, copy, nullable) NSString *userAccessGroup; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, copy, nullable) NSString *smsCode; +@property(nonatomic, strong, nullable) NSNumber *forceRecaptchaFlow; +@end + +@interface InternalSignInProvider : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithProviderId:(NSString *)providerId + scopes:(nullable NSArray *)scopes + customParameters: + (nullable NSDictionary *)customParameters; +@property(nonatomic, copy) NSString *providerId; +@property(nonatomic, copy, nullable) NSArray *scopes; +@property(nonatomic, copy, nullable) NSDictionary *customParameters; +@end + +@interface InternalVerifyPhoneNumberRequest : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithPhoneNumber:(nullable NSString *)phoneNumber + timeout:(NSInteger)timeout + forceResendingToken:(nullable NSNumber *)forceResendingToken + autoRetrievedSmsCodeForTesting:(nullable NSString *)autoRetrievedSmsCodeForTesting + multiFactorInfoId:(nullable NSString *)multiFactorInfoId + multiFactorSessionId:(nullable NSString *)multiFactorSessionId; +@property(nonatomic, copy, nullable) NSString *phoneNumber; +@property(nonatomic, assign) NSInteger timeout; +@property(nonatomic, strong, nullable) NSNumber *forceResendingToken; +@property(nonatomic, copy, nullable) NSString *autoRetrievedSmsCodeForTesting; +@property(nonatomic, copy, nullable) NSString *multiFactorInfoId; +@property(nonatomic, copy, nullable) NSString *multiFactorSessionId; +@end + +@interface InternalIdTokenResult : NSObject ++ (instancetype)makeWithToken:(nullable NSString *)token + expirationTimestamp:(nullable NSNumber *)expirationTimestamp + authTimestamp:(nullable NSNumber *)authTimestamp + issuedAtTimestamp:(nullable NSNumber *)issuedAtTimestamp + signInProvider:(nullable NSString *)signInProvider + claims:(nullable NSDictionary *)claims + signInSecondFactor:(nullable NSString *)signInSecondFactor; +@property(nonatomic, copy, nullable) NSString *token; +@property(nonatomic, strong, nullable) NSNumber *expirationTimestamp; +@property(nonatomic, strong, nullable) NSNumber *authTimestamp; +@property(nonatomic, strong, nullable) NSNumber *issuedAtTimestamp; +@property(nonatomic, copy, nullable) NSString *signInProvider; +@property(nonatomic, copy, nullable) NSDictionary *claims; +@property(nonatomic, copy, nullable) NSString *signInSecondFactor; +@end + +@interface InternalUserProfile : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithDisplayName:(nullable NSString *)displayName + photoUrl:(nullable NSString *)photoUrl + displayNameChanged:(BOOL)displayNameChanged + photoUrlChanged:(BOOL)photoUrlChanged; +@property(nonatomic, copy, nullable) NSString *displayName; +@property(nonatomic, copy, nullable) NSString *photoUrl; +@property(nonatomic, assign) BOOL displayNameChanged; +@property(nonatomic, assign) BOOL photoUrlChanged; +@end + +@interface InternalTotpSecret : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithCodeIntervalSeconds:(nullable NSNumber *)codeIntervalSeconds + codeLength:(nullable NSNumber *)codeLength + enrollmentCompletionDeadline:(nullable NSNumber *)enrollmentCompletionDeadline + hashingAlgorithm:(nullable NSString *)hashingAlgorithm + secretKey:(NSString *)secretKey; +@property(nonatomic, strong, nullable) NSNumber *codeIntervalSeconds; +@property(nonatomic, strong, nullable) NSNumber *codeLength; +@property(nonatomic, strong, nullable) NSNumber *enrollmentCompletionDeadline; +@property(nonatomic, copy, nullable) NSString *hashingAlgorithm; +@property(nonatomic, copy) NSString *secretKey; +@end + +/// The codec used by all APIs. +NSObject *nullGetFirebaseAuthMessagesCodec(void); + +@protocol FirebaseAuthHostApi +- (void)registerIdTokenListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)registerAuthStateListenerApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)useEmulatorApp:(AuthPigeonFirebaseApp *)app + host:(NSString *)host + port:(NSInteger)port + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)applyActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)checkActionCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion:(void (^)(InternalActionCodeInfo *_Nullable, + FlutterError *_Nullable))completion; +- (void)confirmPasswordResetApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + newPassword:(NSString *)newPassword + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)createUserWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInAnonymouslyApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithCustomTokenApp:(AuthPigeonFirebaseApp *)app + token:(NSString *)token + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailAndPasswordApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + password:(NSString *)password + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithEmailLinkApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + emailLink:(NSString *)emailLink + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signInWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)signOutApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)fetchSignInMethodsForEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +- (void)sendPasswordResetEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)sendSignInLinkToEmailApp:(AuthPigeonFirebaseApp *)app + email:(NSString *)email + actionCodeSettings:(InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)setLanguageCodeApp:(AuthPigeonFirebaseApp *)app + languageCode:(nullable NSString *)languageCode + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)setSettingsApp:(AuthPigeonFirebaseApp *)app + settings:(InternalFirebaseAuthSettings *)settings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)verifyPasswordResetCodeApp:(AuthPigeonFirebaseApp *)app + code:(NSString *)code + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyPhoneNumberApp:(AuthPigeonFirebaseApp *)app + request:(InternalVerifyPhoneNumberRequest *)request + completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)revokeTokenWithAuthorizationCodeApp:(AuthPigeonFirebaseApp *)app + authorizationCode:(NSString *)authorizationCode + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)revokeAccessTokenApp:(AuthPigeonFirebaseApp *)app + accessToken:(NSString *)accessToken + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)initializeRecaptchaConfigApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol FirebaseAuthUserHostApi +- (void)deleteApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getIdTokenApp:(AuthPigeonFirebaseApp *)app + forceRefresh:(BOOL)forceRefresh + completion: + (void (^)(InternalIdTokenResult *_Nullable, FlutterError *_Nullable))completion; +- (void)linkWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)linkWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithCredentialApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reauthenticateWithProviderApp:(AuthPigeonFirebaseApp *)app + signInProvider:(InternalSignInProvider *)signInProvider + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +- (void)reloadApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)sendEmailVerificationApp:(AuthPigeonFirebaseApp *)app + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)unlinkApp:(AuthPigeonFirebaseApp *)app + providerId:(NSString *)providerId + completion:(void (^)(InternalUserCredential *_Nullable, FlutterError *_Nullable))completion; +- (void)updateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePasswordApp:(AuthPigeonFirebaseApp *)app + newPassword:(NSString *)newPassword + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updatePhoneNumberApp:(AuthPigeonFirebaseApp *)app + input:(NSDictionary *)input + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)updateProfileApp:(AuthPigeonFirebaseApp *)app + profile:(InternalUserProfile *)profile + completion: + (void (^)(InternalUserDetails *_Nullable, FlutterError *_Nullable))completion; +- (void)verifyBeforeUpdateEmailApp:(AuthPigeonFirebaseApp *)app + newEmail:(NSString *)newEmail + actionCodeSettings:(nullable InternalActionCodeSettings *)actionCodeSettings + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpFirebaseAuthUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpFirebaseAuthUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorUserHostApi +- (void)enrollPhoneApp:(AuthPigeonFirebaseApp *)app + assertion:(InternalPhoneMultiFactorAssertion *)assertion + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)enrollTotpApp:(AuthPigeonFirebaseApp *)app + assertionId:(NSString *)assertionId + displayName:(nullable NSString *)displayName + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getSessionApp:(AuthPigeonFirebaseApp *)app + completion: + (void (^)(InternalMultiFactorSession *_Nullable, FlutterError *_Nullable))completion; +- (void)unenrollApp:(AuthPigeonFirebaseApp *)app + factorUid:(NSString *)factorUid + completion:(void (^)(FlutterError *_Nullable))completion; +- (void)getEnrolledFactorsApp:(AuthPigeonFirebaseApp *)app + completion:(void (^)(NSArray *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorUserHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorUserHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactoResolverHostApi +- (void)resolveSignInResolverId:(NSString *)resolverId + assertion:(nullable InternalPhoneMultiFactorAssertion *)assertion + totpAssertionId:(nullable NSString *)totpAssertionId + completion:(void (^)(InternalUserCredential *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactoResolverHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactoResolverHostApiWithSuffix( + id binaryMessenger, NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpHostApi +- (void)generateSecretSessionId:(NSString *)sessionId + completion:(void (^)(InternalTotpSecret *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForEnrollmentSecretKey:(NSString *)secretKey + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +- (void)getAssertionForSignInEnrollmentId:(NSString *)enrollmentId + oneTimePassword:(NSString *)oneTimePassword + completion:(void (^)(NSString *_Nullable, + FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpHostApi(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpHostApiWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +@protocol MultiFactorTotpSecretHostApi +- (void)generateQrCodeUrlSecretKey:(NSString *)secretKey + accountName:(nullable NSString *)accountName + issuer:(nullable NSString *)issuer + completion: + (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; +- (void)openInOtpAppSecretKey:(NSString *)secretKey + qrCodeUrl:(NSString *)qrCodeUrl + completion:(void (^)(FlutterError *_Nullable))completion; +@end + +extern void SetUpMultiFactorTotpSecretHostApi( + id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpMultiFactorTotpSecretHostApiWithSuffix( + id binaryMessenger, + NSObject *_Nullable api, NSString *messageChannelSuffix); + +/// Only used to generate the object interface that are use outside of the Pigeon interface +@protocol GenerateInterfaces +- (void)pigeonInterfaceInfo:(InternalMultiFactorInfo *)info + error:(FlutterError *_Nullable *_Nonnull)error; +@end + +extern void SetUpGenerateInterfaces(id binaryMessenger, + NSObject *_Nullable api); + +extern void SetUpGenerateInterfacesWithSuffix(id binaryMessenger, + NSObject *_Nullable api, + NSString *messageChannelSuffix); + +NS_ASSUME_NONNULL_END diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/pubspec.yaml b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/pubspec.yaml new file mode 100755 index 00000000..ed5194bd --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/pubspec.yaml @@ -0,0 +1,52 @@ +name: firebase_auth +description: Flutter plugin for Firebase Auth, enabling + authentication using passwords, phone numbers and identity providers + like Google, Facebook and Twitter. +homepage: https://firebase.google.com/docs/auth +repository: https://github.com/firebase/flutterfire/tree/main/packages/firebase_auth/firebase_auth +version: 6.5.4 +resolution: workspace +topics: + - firebase + - authentication + - identity + - sign-in + - sign-up + +false_secrets: + - example/** + +environment: + sdk: '^3.6.0' + flutter: '>=3.16.0' + +dependencies: + firebase_auth_platform_interface: ^9.0.3 + firebase_auth_web: ^6.2.3 + firebase_core: ^4.11.0 + firebase_core_platform_interface: ^7.1.0 + flutter: + sdk: flutter + meta: ^1.8.0 +dev_dependencies: + async: ^2.5.0 + flutter_test: + sdk: flutter + mockito: ^5.0.0 + plugin_platform_interface: ^2.1.3 + +flutter: + plugin: + platforms: + android: + package: io.flutter.plugins.firebase.auth + pluginClass: FlutterFirebaseAuthPlugin + ios: + pluginClass: FLTFirebaseAuthPlugin + macos: + pluginClass: FLTFirebaseAuthPlugin + web: + default_package: firebase_auth_web + windows: + pluginClass: FirebaseAuthPluginCApi + diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart new file mode 100644 index 00000000..5e570b0b --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/firebase_auth_test.dart @@ -0,0 +1,1382 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:async/async.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import './mock.dart'; + +void main() { + setupFirebaseAuthMocks(); + + late FirebaseAuth auth; + + const String kMockActionCode = '12345'; + const String kMockEmail = 'test@example.com'; + const String kMockPassword = 'passw0rd'; + const String kMockIdToken = '12345'; + const String kMockRawNonce = 'abcde12345'; + const String kMockAccessToken = '67890'; + const String kMockGithubToken = 'github'; + const String kMockCustomToken = '12345'; + const String kMockPhoneNumber = '5555555555'; + const String kMockVerificationId = '12345'; + const String kMockSmsCode = '123456'; + const String kMockLanguage = 'en'; + const String kMockOobCode = 'oobcode'; + const String kMockAuthToken = '12460'; + const String kMockURL = 'http://www.example.com'; + const String kMockHost = 'www.example.com'; + const String kMockValidPassword = + 'Password123!'; // For password policy impl testing + const String kMockInvalidPassword = 'Pa1!'; + const String kMockInvalidPassword2 = 'password123!'; + const String kMockInvalidPassword3 = 'PASSWORD123!'; + const String kMockInvalidPassword4 = 'password!'; + const String kMockInvalidPassword5 = 'Password123'; + const Map kMockPasswordPolicy = { + 'customStrengthOptions': { + 'minPasswordLength': 6, + 'maxPasswordLength': 12, + 'containsLowercaseCharacter': true, + 'containsUppercaseCharacter': true, + 'containsNumericCharacter': true, + 'containsNonAlphanumericCharacter': true, + }, + 'allowedNonAlphanumericCharacters': ['!'], + 'schemaVersion': 1, + 'enforcement': 'OFF', + }; + final PasswordPolicy kMockPasswordPolicyObject = + PasswordPolicy(kMockPasswordPolicy); + const int kMockPort = 31337; + + final TestAuthProvider testAuthProvider = TestAuthProvider(); + final int kMockCreationTimestamp = + DateTime.now().subtract(const Duration(days: 2)).millisecondsSinceEpoch; + final int kMockLastSignInTimestamp = + DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; + + final kMockUser = InternalUserDetails( + userInfo: InternalUserInfo( + uid: '12345', + displayName: 'displayName', + creationTimestamp: kMockCreationTimestamp, + lastSignInTimestamp: kMockLastSignInTimestamp, + isAnonymous: true, + isEmailVerified: false, + ), + providerData: [ + { + 'providerId': 'firebase', + 'uid': '12345', + 'displayName': 'Flutter Test User', + 'photoUrl': 'http://www.example.com/', + 'email': 'test@example.com', + } + ], + ); + + late MockUserPlatform mockUserPlatform; + late MockUserCredentialPlatform mockUserCredPlatform; + late MockConfirmationResultPlatform mockConfirmationResultPlatform; + late MockRecaptchaVerifier mockVerifier; + late AdditionalUserInfo mockAdditionalUserInfo; + late EmailAuthCredential mockCredential; + + MockFirebaseAuth mockAuthPlatform = MockFirebaseAuth(); + + group('$FirebaseAuth', () { + InternalUserDetails user; + // used to generate a unique application name for each test + var testCount = 0; + + setUp(() async { + FirebaseAuthPlatform.instance = mockAuthPlatform = MockFirebaseAuth(); + + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: '$testCount', + options: const FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + ), + ); + + auth = FirebaseAuth.instanceFor(app: app); + user = kMockUser; + + mockUserPlatform = MockUserPlatform( + mockAuthPlatform, TestMultiFactorPlatform(mockAuthPlatform), user); + mockConfirmationResultPlatform = MockConfirmationResultPlatform(); + mockAdditionalUserInfo = AdditionalUserInfo( + isNewUser: false, + username: 'flutterUser', + providerId: 'testProvider', + profile: {'foo': 'bar'}, + ); + mockCredential = EmailAuthProvider.credential( + email: 'test', + password: 'test', + ) as EmailAuthCredential; + mockUserCredPlatform = MockUserCredentialPlatform( + FirebaseAuthPlatform.instance, + mockAdditionalUserInfo, + mockCredential, + mockUserPlatform, + ); + mockVerifier = MockRecaptchaVerifier(); + + when(mockAuthPlatform.signInAnonymously()) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithCredential(any)).thenAnswer( + (_) => Future.value(mockUserCredPlatform)); + + when(mockAuthPlatform.currentUser).thenReturn(mockUserPlatform); + + when(mockAuthPlatform.instanceFor( + app: anyNamed('app'), + pluginConstants: anyNamed('pluginConstants'), + )).thenAnswer((_) => mockUserPlatform); + + when(mockAuthPlatform.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.setInitialValues( + currentUser: anyNamed('currentUser'), + languageCode: anyNamed('languageCode'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.createUserWithEmailAndPassword(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.getRedirectResult()) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithCustomToken(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithEmailAndPassword(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithEmailLink(any, any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithPhoneNumber(any, any)) + .thenAnswer((_) async => mockConfirmationResultPlatform); + + when(mockVerifier.delegate).thenReturn(mockVerifier.mockDelegate); + + when(mockAuthPlatform.signInWithPopup(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.signInWithRedirect(any)) + .thenAnswer((_) async => mockUserCredPlatform); + + when(mockAuthPlatform.authStateChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + when(mockAuthPlatform.idTokenChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + when(mockAuthPlatform.userChanges()).thenAnswer((_) => + Stream.fromIterable([mockUserPlatform])); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(MethodChannelFirebaseAuth.channel, + (call) async { + return {'user': user}; + }); + }); + + // incremented after tests completed, in case a test may want to use this + // value for an assertion (toString) + tearDown(() => testCount++); + + setUp(() async { + user = kMockUser; + await auth.signInAnonymously(); + }); + + group('emulator', () { + test('useAuthEmulator() should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.useAuthEmulator(kMockHost, kMockPort)) + .thenAnswer((i) async {}); + await auth.useAuthEmulator(kMockHost, kMockPort); + verify(mockAuthPlatform.useAuthEmulator(kMockHost, kMockPort)); + }); + }); + + group('currentUser', () { + test('get currentUser', () { + User? user = auth.currentUser; + verify(mockAuthPlatform.currentUser); + expect(user, isA()); + }); + }); + + test('creates a fresh instance after app delete and reinitialize', + () async { + final appName = 'delete-reinit-$testCount'; + const options = FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId', + ); + final app = await Firebase.initializeApp( + name: appName, + options: options, + ); + final auth1 = FirebaseAuth.instanceFor(app: app); + + expect(app.getService(), same(auth1)); + + await app.delete(); + + final app2 = await Firebase.initializeApp( + name: appName, + options: options, + ); + addTearDown(app2.delete); + + final auth2 = FirebaseAuth.instanceFor(app: app2); + + expect(auth2, isNot(same(auth1))); + expect(auth2.app, app2); + expect(app2.getService(), same(auth2)); + }); + + group('tenantId', () { + test('set tenantId should call delegate method', () async { + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: 'tenantIdTest', + options: const FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId')); + + FirebaseAuthPlatform.instance = + FakeFirebaseAuthPlatform(tenantId: 'foo'); + auth = FirebaseAuth.instanceFor(app: app); + + expect(auth.tenantId, 'foo'); + + auth.tenantId = 'bar'; + + expect(auth.tenantId, 'bar'); + expect(FirebaseAuthPlatform.instance.tenantId, 'bar'); + }); + }); + + group('customAuthDomain', () { + test('set customAuthDomain should call delegate method', () async { + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: 'customAuthDomainTest', + options: const FirebaseOptions( + apiKey: 'apiKey', + appId: 'appId', + messagingSenderId: 'messagingSenderId', + projectId: 'projectId')); + + FirebaseAuthPlatform.instance = + FakeFirebaseAuthPlatform(customAuthDomain: 'foo'); + auth = FirebaseAuth.instanceFor(app: app); + + expect(auth.customAuthDomain, 'foo'); + if (defaultTargetPlatform == TargetPlatform.windows || kIsWeb) { + try { + auth.customAuthDomain = 'bar'; + } on UnimplementedError catch (e) { + expect(e.message, contains('Cannot set auth domain')); + } + } else { + auth.customAuthDomain = 'bar'; + + expect(auth.customAuthDomain, 'bar'); + expect(FirebaseAuthPlatform.instance.customAuthDomain, 'bar'); + } + }); + }); + + group('languageCode', () { + test('.languageCode should call delegate method', () { + auth.languageCode; + verify(mockAuthPlatform.languageCode); + }); + + test('setLanguageCode() should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setLanguageCode(any)).thenAnswer((i) async {}); + + await auth.setLanguageCode(kMockLanguage); + verify(mockAuthPlatform.setLanguageCode(kMockLanguage)); + }); + }); + + group('checkActionCode()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.checkActionCode(any)).thenAnswer( + (i) async => ActionCodeInfo( + data: ActionCodeInfoData(email: null, previousEmail: null), + operation: ActionCodeInfoOperation.unknown, + ), + ); + + await auth.checkActionCode(kMockActionCode); + verify(mockAuthPlatform.checkActionCode(kMockActionCode)); + }); + }); + + group('confirmPasswordReset()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.confirmPasswordReset(any, any)) + .thenAnswer((i) async {}); + + await auth.confirmPasswordReset( + code: kMockActionCode, + newPassword: kMockPassword, + ); + verify(mockAuthPlatform.confirmPasswordReset( + kMockActionCode, kMockPassword)); + }); + }); + + group('createUserWithEmailAndPassword()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.createUserWithEmailAndPassword(any, any)) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.createUserWithEmailAndPassword( + email: kMockEmail, + password: kMockPassword, + ); + + verify(mockAuthPlatform.createUserWithEmailAndPassword( + kMockEmail, + kMockPassword, + )); + }); + }); + + group('getRedirectResult()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.getRedirectResult()) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.getRedirectResult(); + verify(mockAuthPlatform.getRedirectResult()); + }); + }); + + group('isSignInWithEmailLink()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.isSignInWithEmailLink(any)) + .thenAnswer((i) => false); + + auth.isSignInWithEmailLink(kMockURL); + verify(mockAuthPlatform.isSignInWithEmailLink(kMockURL)); + }); + }); + + group('authStateChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.authStateChanges()); + expect(await changes.next, isA()); + }); + }); + + group('idTokenChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.idTokenChanges()); + expect(await changes.next, isA()); + }); + }); + + group('userChanges()', () { + test('should stream changes', () async { + final StreamQueue changes = + StreamQueue(auth.userChanges()); + expect(await changes.next, isA()); + }); + }); + + group('sendPasswordResetEmail()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendPasswordResetEmail(any)) + .thenAnswer((i) async {}); + + await auth.sendPasswordResetEmail(email: kMockEmail); + verify(mockAuthPlatform.sendPasswordResetEmail(kMockEmail)); + }); + }); + + group('sendPasswordResetEmail()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendPasswordResetEmail(any)) + .thenAnswer((i) async {}); + + await auth.sendPasswordResetEmail(email: kMockEmail); + verify(mockAuthPlatform.sendPasswordResetEmail(kMockEmail)); + }); + }); + + group('sendSignInLinkToEmail()', () { + test('should throw if actionCodeSettings.handleCodeInApp is not true', + () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendSignInLinkToEmail(any, any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings kMockActionCodeSettingsNull = + ActionCodeSettings(url: kMockURL); + final ActionCodeSettings kMockActionCodeSettingsFalse = + ActionCodeSettings(url: kMockURL); + + // when handleCodeInApp is null + expect( + () => auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsNull), + throwsArgumentError, + ); + // when handleCodeInApp is false + expect( + () => auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsFalse), + throwsArgumentError, + ); + }); + + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.sendSignInLinkToEmail(any, any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings kMockActionCodeSettingsValid = + ActionCodeSettings(url: kMockURL, handleCodeInApp: true); + + await auth.sendSignInLinkToEmail( + email: kMockEmail, + actionCodeSettings: kMockActionCodeSettingsValid, + ); + + verify(mockAuthPlatform.sendSignInLinkToEmail( + kMockEmail, + kMockActionCodeSettingsValid, + )); + }); + }); + + group('setSettings()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setSettings( + appVerificationDisabledForTesting: any, + phoneNumber: any, + smsCode: any, + forceRecaptchaFlow: any, + userAccessGroup: any, + )).thenAnswer((i) async {}); + + String phoneNumber = '123456'; + String smsCode = '1234'; + bool forceRecaptchaFlow = true; + bool appVerificationDisabledForTesting = true; + String userAccessGroup = 'group-id'; + + await auth.setSettings( + appVerificationDisabledForTesting: appVerificationDisabledForTesting, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + userAccessGroup: userAccessGroup, + ); + + verify( + mockAuthPlatform.setSettings( + appVerificationDisabledForTesting: + appVerificationDisabledForTesting, + phoneNumber: phoneNumber, + smsCode: smsCode, + forceRecaptchaFlow: forceRecaptchaFlow, + userAccessGroup: userAccessGroup, + ), + ); + }); + }); + + group('setPersistence()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.setPersistence(any)).thenAnswer((i) async {}); + + await auth.setPersistence(Persistence.LOCAL); + verify(mockAuthPlatform.setPersistence(Persistence.LOCAL)); + }); + }); + + group('signInAnonymously()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.signInAnonymously()) + .thenAnswer((i) async => EmptyUserCredentialPlatform()); + + await auth.signInAnonymously(); + verify(mockAuthPlatform.signInAnonymously()); + }); + }); + + group('signInWithCredential()', () { + test('GithubAuthProvider signInWithCredential', () async { + final AuthCredential credential = + GithubAuthProvider.credential(kMockGithubToken); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('github.com')); + expect(captured.accessToken, equals(kMockGithubToken)); + }); + + test('EmailAuthProvider (withLink) signInWithCredential', () async { + final AuthCredential credential = EmailAuthProvider.credentialWithLink( + email: 'test@example.com', + emailLink: '', + ); + await auth.signInWithCredential(credential); + final EmailAuthCredential captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('password')); + expect(captured.email, equals('test@example.com')); + expect(captured.emailLink, + equals('')); + }); + + test('TwitterAuthProvider signInWithCredential', () async { + final AuthCredential credential = TwitterAuthProvider.credential( + accessToken: kMockIdToken, + secret: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('twitter.com')); + expect(captured.accessToken, equals(kMockIdToken)); + expect(captured.secret, equals(kMockAccessToken)); + }); + + test('GoogleAuthProvider signInWithCredential', () async { + final credential = GoogleAuthProvider.credential( + idToken: kMockIdToken, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('google.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + + test('OAuthProvider signInWithCredential for Apple', () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.accessToken, equals(kMockAccessToken)); + expect(captured.rawNonce, equals(null)); + }); + + test('OAuthProvider signInWithCredential for Apple with rawNonce', + () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + rawNonce: kMockRawNonce, + accessToken: kMockAccessToken, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.rawNonce, equals(kMockRawNonce)); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + + test( + 'OAuthProvider signInWithCredential for Apple with rawNonce (empty accessToken)', + () async { + OAuthProvider oAuthProvider = OAuthProvider('apple.com'); + final AuthCredential credential = oAuthProvider.credential( + idToken: kMockIdToken, + rawNonce: kMockRawNonce, + ); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('apple.com')); + expect(captured.idToken, equals(kMockIdToken)); + expect(captured.rawNonce, equals(kMockRawNonce)); + expect(captured.accessToken, equals(null)); + }); + + test('PhoneAuthProvider signInWithCredential', () async { + final PhoneAuthCredential credential = PhoneAuthProvider.credential( + verificationId: kMockVerificationId, + smsCode: kMockSmsCode, + ); + await auth.signInWithCredential(credential); + final PhoneAuthCredential captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured.providerId, equals('phone')); + expect(captured.verificationId, equals(kMockVerificationId)); + expect(captured.smsCode, equals(kMockSmsCode)); + }); + + test('FacebookAuthProvider signInWithCredential', () async { + final AuthCredential credential = + FacebookAuthProvider.credential(kMockAccessToken); + await auth.signInWithCredential(credential); + final captured = + verify(mockAuthPlatform.signInWithCredential(captureAny)) + .captured + .single; + expect(captured, isA()); + expect(captured.providerId, equals('facebook.com')); + expect(captured.accessToken, equals(kMockAccessToken)); + }); + }); + + group('signInWithCustomToken()', () { + test('should call delegate method', () async { + await auth.signInWithCustomToken(kMockCustomToken); + verify(mockAuthPlatform.signInWithCustomToken(kMockCustomToken)); + }); + }); + + group('signInWithEmailAndPassword()', () { + test('should call delegate method', () async { + await auth.signInWithEmailAndPassword( + email: kMockEmail, password: kMockPassword); + verify(mockAuthPlatform.signInWithEmailAndPassword( + kMockEmail, kMockPassword)); + }); + }); + + group('signInWithEmailLink()', () { + test('should call delegate method', () async { + await auth.signInWithEmailLink(email: kMockEmail, emailLink: kMockURL); + verify(mockAuthPlatform.signInWithEmailLink(kMockEmail, kMockURL)); + }); + }); + + group('signInWithPhoneNumber()', () { + test('should call delegate method', () async { + await auth.signInWithPhoneNumber(kMockPhoneNumber, mockVerifier); + verify(mockAuthPlatform.signInWithPhoneNumber(kMockPhoneNumber, any)); + }); + }); + + group('signInWithPopup()', () { + test('should call delegate method', () async { + await auth.signInWithPopup(testAuthProvider); + verify(mockAuthPlatform.signInWithPopup(testAuthProvider)); + }); + }); + + group('signInWithRedirect()', () { + test('should call delegate method', () async { + await auth.signInWithRedirect(testAuthProvider); + verify(mockAuthPlatform.signInWithRedirect(testAuthProvider)); + }); + }); + + group('signOut()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.signOut()).thenAnswer((i) async {}); + + await auth.signOut(); + verify(mockAuthPlatform.signOut()); + }); + }); + + group('verifyPasswordResetCode()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.verifyPasswordResetCode(any)) + .thenAnswer((i) async => ''); + + await auth.verifyPasswordResetCode(kMockOobCode); + verify(mockAuthPlatform.verifyPasswordResetCode(kMockOobCode)); + }); + }); + + group('verifyPhoneNumber()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.verifyPhoneNumber( + autoRetrievedSmsCodeForTesting: + anyNamed('autoRetrievedSmsCodeForTesting'), + codeAutoRetrievalTimeout: anyNamed('codeAutoRetrievalTimeout'), + codeSent: anyNamed('codeSent'), + forceResendingToken: anyNamed('forceResendingToken'), + phoneNumber: anyNamed('phoneNumber'), + timeout: anyNamed('timeout'), + verificationCompleted: anyNamed('verificationCompleted'), + verificationFailed: anyNamed('verificationFailed'), + )).thenAnswer((i) async {}); + + final PhoneVerificationCompleted verificationCompleted = + (PhoneAuthCredential phoneAuthCredential) {}; + final PhoneVerificationFailed verificationFailed = + (FirebaseAuthException authException) {}; + final PhoneCodeSent codeSent = + (String verificationId, [int? forceResendingToken]) async {}; + final PhoneCodeAutoRetrievalTimeout autoRetrievalTimeout = + (String verificationId) {}; + + await auth.verifyPhoneNumber( + phoneNumber: kMockPhoneNumber, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: autoRetrievalTimeout, + ); + + verify( + mockAuthPlatform.verifyPhoneNumber( + phoneNumber: kMockPhoneNumber, + verificationCompleted: verificationCompleted, + verificationFailed: verificationFailed, + codeSent: codeSent, + codeAutoRetrievalTimeout: autoRetrievalTimeout, + ), + ); + }); + }); + + group('revokeAccessToken()', () { + test('should call delegate method', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockAuthPlatform.revokeAccessToken(kMockAuthToken)) + .thenAnswer((i) async {}); + + await auth.revokeAccessToken(kMockAuthToken); + verify(mockAuthPlatform.revokeAccessToken(kMockAuthToken)); + }); + }); + + group('passwordPolicy', () { + test('passwordPolicy should be initialized with correct parameters', + () async { + PasswordPolicyImpl passwordPolicy = + PasswordPolicyImpl(kMockPasswordPolicyObject); + expect(passwordPolicy.policy, equals(kMockPasswordPolicyObject)); + }); + + PasswordPolicyImpl passwordPolicy = + PasswordPolicyImpl(kMockPasswordPolicyObject); + + test('should return true for valid password', () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockValidPassword); + expect(status.isValid, isTrue); + }); + + test('should return false for invalid password that is too short', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword); + expect(status.isValid, isFalse); + }); + + test( + 'should return false for invalid password with no capital characters', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword2); + expect(status.isValid, isFalse); + }); + + test( + 'should return false for invalid password with no lowercase characters', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword3); + expect(status.isValid, isFalse); + }); + + test('should return false for invalid password with no numbers', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword4); + expect(status.isValid, isFalse); + }); + + test('should return false for invalid password with no symbols', + () async { + final PasswordValidationStatus status = + passwordPolicy.isPasswordValid(kMockInvalidPassword5); + expect(status.isValid, isFalse); + }); + }); + + test('toString()', () async { + expect( + auth.toString(), + equals('FirebaseAuth(app: $testCount)'), + ); + }); + }); +} + +class MockFirebaseAuth extends Mock + with MockPlatformInterfaceMixin + implements TestFirebaseAuthPlatform { + @override + Stream userChanges() { + return super.noSuchMethod( + Invocation.method(#userChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + Stream idTokenChanges() { + return super.noSuchMethod( + Invocation.method(#idTokenChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + Stream authStateChanges() { + return super.noSuchMethod( + Invocation.method(#authStateChanges, []), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, [], {#app: app}), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + Future createUserWithEmailAndPassword( + String? email, + String? password, + ) { + return super.noSuchMethod( + Invocation.method(#createUserWithEmailAndPassword, [email, password]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithPhoneNumber( + String? phoneNumber, + RecaptchaVerifierFactoryPlatform? applicationVerifier, + ) { + return super.noSuchMethod( + Invocation.method( + #signInWithPhoneNumber, + [phoneNumber, applicationVerifier], + ), + returnValue: neverEndingFuture(), + returnValueForMissingStub: + neverEndingFuture(), + ); + } + + @override + Future signInWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithCustomToken(String? token) { + return super.noSuchMethod( + Invocation.method(#signInWithCustomToken, [token]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithEmailAndPassword( + String? email, + String? password, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithEmailAndPassword, [email, password]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithPopup(AuthProvider? provider) { + return super.noSuchMethod( + Invocation.method(#signInWithPopup, [provider]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithEmailLink( + String? email, + String? emailLink, + ) { + return super.noSuchMethod( + Invocation.method(#signInWithEmailLink, [email, emailLink]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInWithRedirect(AuthProvider? provider) { + return super.noSuchMethod( + Invocation.method(#signInWithRedirect, [provider]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signInAnonymously() { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, [], { + #currentUser: currentUser, + #languageCode: languageCode, + }), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + Future getRedirectResult() { + return super.noSuchMethod( + Invocation.method(#getRedirectResult, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setLanguageCode(String? languageCode) { + return super.noSuchMethod( + Invocation.method(#setLanguageCode, [languageCode]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future useAuthEmulator(String host, int port) { + return super.noSuchMethod( + Invocation.method(#useEmulator, [host, port]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future checkActionCode(String? code) { + return super.noSuchMethod( + Invocation.method(#checkActionCode, [code]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future confirmPasswordReset(String? code, String? newPassword) { + return super.noSuchMethod( + Invocation.method(#confirmPasswordReset, [code, newPassword]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + bool isSignInWithEmailLink(String? emailLink) { + return super.noSuchMethod( + Invocation.method(#isSignInWithEmailLink, [emailLink]), + returnValue: false, + returnValueForMissingStub: false, + ); + } + + @override + Future sendPasswordResetEmail( + String? email, [ + ActionCodeSettings? actionCodeSettings, + ]) { + return super.noSuchMethod( + Invocation.method(#sendPasswordResetEmail, [email, actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future sendSignInLinkToEmail( + String? email, + ActionCodeSettings? actionCodeSettings, + ) { + return super.noSuchMethod( + Invocation.method(#sendSignInLinkToEmail, [email, actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setSettings({ + bool? appVerificationDisabledForTesting, + String? userAccessGroup, + String? phoneNumber, + String? smsCode, + bool? forceRecaptchaFlow, + }) { + return super.noSuchMethod( + Invocation.method(#setSettings, [ + appVerificationDisabledForTesting, + userAccessGroup, + phoneNumber, + smsCode, + forceRecaptchaFlow, + ]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future setPersistence(Persistence? persistence) { + return super.noSuchMethod( + Invocation.method(#setPersistence, [persistence]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future signOut() { + return super.noSuchMethod( + Invocation.method(#signOut, [signOut]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyPasswordResetCode(String? code) { + return super.noSuchMethod( + Invocation.method(#verifyPasswordResetCode, [code]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyPhoneNumber({ + String? phoneNumber, + PhoneMultiFactorInfo? multiFactorInfo, + MultiFactorSession? multiFactorSession, + Object? verificationCompleted, + Object? verificationFailed, + Object? codeSent, + Object? codeAutoRetrievalTimeout, + Duration? timeout = const Duration(seconds: 30), + int? forceResendingToken, + String? autoRetrievedSmsCodeForTesting, + }) { + return super.noSuchMethod( + Invocation.method(#verifyPhoneNumber, [], { + #phoneNumber: phoneNumber, + #verificationCompleted: verificationCompleted, + #verificationFailed: verificationFailed, + #codeSent: codeSent, + #codeAutoRetrievalTimeout: codeAutoRetrievalTimeout, + #timeout: timeout, + #forceResendingToken: forceResendingToken, + #autoRetrievedSmsCodeForTesting: autoRetrievedSmsCodeForTesting, + }), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future revokeAccessToken(String accessToken) { + return super.noSuchMethod( + Invocation.method(#revokeAccessToken, [accessToken]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } +} + +class FakeFirebaseAuthPlatform extends Fake + with MockPlatformInterfaceMixin + implements FirebaseAuthPlatform { + FakeFirebaseAuthPlatform({this.tenantId, this.customAuthDomain}); + + @override + String? tenantId; + + @override + String? customAuthDomain; + + @override + FirebaseAuthPlatform delegateFor( + {required FirebaseApp app, Persistence? persistence}) { + return this; + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class MockUserPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserPlatform { + MockUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails _user) { + TestUserPlatform(auth, multiFactor, _user); + } +} + +class MockUserCredentialPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserCredentialPlatform { + MockUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) { + TestUserCredentialPlatform( + auth, + additionalUserInfo, + credential, + userPlatform, + ); + } +} + +class MockConfirmationResultPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestConfirmationResultPlatform { + MockConfirmationResultPlatform() { + TestConfirmationResultPlatform(); + } +} + +class TestConfirmationResultPlatform extends ConfirmationResultPlatform { + TestConfirmationResultPlatform() : super('TEST'); +} + +class TestFirebaseAuthPlatform extends FirebaseAuthPlatform { + TestFirebaseAuthPlatform() : super(); + + void instanceFor({ + FirebaseApp? app, + Map? pluginConstants, + }) {} + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return this; + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class MockRecaptchaVerifier extends Mock + with MockPlatformInterfaceMixin + implements TestRecaptchaVerifier { + MockRecaptchaVerifier() { + TestRecaptchaVerifier(); + } + + RecaptchaVerifierFactoryPlatform get mockDelegate { + return MockRecaptchaVerifierFactoryPlatform(); + } + + @override + RecaptchaVerifierFactoryPlatform get delegate { + return super.noSuchMethod( + Invocation.getter(#delegate), + returnValue: MockRecaptchaVerifierFactoryPlatform(), + returnValueForMissingStub: MockRecaptchaVerifierFactoryPlatform(), + ); + } +} + +class MockRecaptchaVerifierFactoryPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestRecaptchaVerifierFactoryPlatform { + MockRecaptchaVerifierFactoryPlatform() { + TestRecaptchaVerifierFactoryPlatform(); + } +} + +class TestRecaptchaVerifier implements RecaptchaVerifier { + TestRecaptchaVerifier() : super(); + + @override + void clear() {} + + @override + RecaptchaVerifierFactoryPlatform get delegate => + TestRecaptchaVerifierFactoryPlatform(); + + @override + Future render() { + throw UnimplementedError(); + } + + @override + String get type => throw UnimplementedError(); + + @override + Future verify() { + throw UnimplementedError(); + } +} + +class TestRecaptchaVerifierFactoryPlatform + extends RecaptchaVerifierFactoryPlatform {} + +class TestAuthProvider extends AuthProvider { + TestAuthProvider() : super('TEST'); +} + +class TestUserPlatform extends UserPlatform { + TestUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails data) + : super(auth, multiFactor, data); +} + +class TestMultiFactorPlatform extends MultiFactorPlatform { + TestMultiFactorPlatform(FirebaseAuthPlatform auth) : super(auth); +} + +class TestUserCredentialPlatform extends UserCredentialPlatform { + TestUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) : super( + auth: auth, + additionalUserInfo: additionalUserInfo, + credential: credential, + user: userPlatform, + ); +} + +class EmptyUserCredentialPlatform extends UserCredentialPlatform { + EmptyUserCredentialPlatform() : super(auth: FirebaseAuthPlatform.instance); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/mock.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/mock.dart new file mode 100644 index 00000000..6dc416fb --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/mock.dart @@ -0,0 +1,40 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_core_platform_interface/test.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +typedef Callback = void Function(MethodCall call); + +void setupFirebaseAuthMocks([Callback? customHandlers]) { + TestWidgetsFlutterBinding.ensureInitialized(); + + setupFirebaseCoreMocks(); + TestFirebaseAppHostApi.setUp(MockFirebaseAppHostApi()); +} + +Future neverEndingFuture() async { + // ignore: literal_only_boolean_expressions + while (true) { + await Future.delayed(const Duration(minutes: 5)); + } +} + +class MockFirebaseAppHostApi implements TestFirebaseAppHostApi { + @override + Future delete(String appName) async {} + + @override + Future setAutomaticDataCollectionEnabled( + String appName, + bool enabled, + ) async {} + + @override + Future setAutomaticResourceManagementEnabled( + String appName, + bool enabled, + ) async {} +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/user_test.dart b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/user_test.dart new file mode 100644 index 00000000..967be866 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/test/user_test.dart @@ -0,0 +1,571 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart'; +import 'package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +// import 'package:mockito/annotations.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +// import './user_test.mocks.dart'; +import './mock.dart'; +import 'firebase_auth_test.dart'; + +Map kMockUser1 = { + 'isAnonymous': true, + 'emailVerified': false, + 'displayName': 'displayName', +}; + +// @GenerateMocks([], customMocks: [ +// MockSpec(as: #MockFirebaseAuthPlatform), +// MockSpec(as: #MockUserPlatform), +// ]) +void main() { + setupFirebaseAuthMocks(); + + late FirebaseAuth auth; + + final kMockIdTokenResult = InternalIdTokenResult( + token: '12345', + expirationTimestamp: 123456, + authTimestamp: 1234567, + issuedAtTimestamp: 12345678, + signInProvider: 'password', + claims: { + 'claim1': 'value1', + }, + ); + + final int kMockCreationTimestamp = + DateTime.now().subtract(const Duration(days: 2)).millisecondsSinceEpoch; + final int kMockLastSignInTimestamp = + DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; + + final kMockUser = InternalUserDetails( + userInfo: InternalUserInfo( + uid: '12345', + displayName: 'displayName', + creationTimestamp: kMockCreationTimestamp, + lastSignInTimestamp: kMockLastSignInTimestamp, + isAnonymous: true, + isEmailVerified: false, + ), + providerData: [ + { + 'providerId': 'firebase', + 'uid': '12345', + 'displayName': 'Flutter Test User', + 'photoUrl': null, + 'email': 'test@example.com', + 'isAnonymous': true, + 'isEmailVerified': false, + } + ], + ); + late MockUserPlatform mockUserPlatform; + late MockUserCredentialPlatform mockUserCredPlatform; + + AdditionalUserInfo mockAdditionalInfo = AdditionalUserInfo( + isNewUser: false, + username: 'flutterUser', + providerId: 'testProvider', + profile: {'foo': 'bar'}, + ); + + EmailAuthCredential mockCredential = + EmailAuthProvider.credential(email: 'test', password: 'test') + as EmailAuthCredential; + + var mockAuthPlatform = MockFirebaseAuth(); + + group('$User', () { + late InternalUserDetails user; + + // used to generate a unique application name for each test + var testCount = 0; + + setUp(() async { + FirebaseAuthPlatform.instance = mockAuthPlatform = MockFirebaseAuth(); + + // Each test uses a unique FirebaseApp instance to avoid sharing state + final app = await Firebase.initializeApp( + name: '$testCount', + options: const FirebaseOptions( + apiKey: '', + appId: '', + messagingSenderId: '', + projectId: '', + ), + ); + + auth = FirebaseAuth.instanceFor(app: app); + + user = kMockUser; + + mockUserPlatform = MockUserPlatform(mockAuthPlatform, user); + + mockUserCredPlatform = MockUserCredentialPlatform( + FirebaseAuthPlatform.instance, + mockAdditionalInfo, + mockCredential, + mockUserPlatform, + ); + + when(mockAuthPlatform.signInAnonymously()).thenAnswer( + (_) => Future.value(mockUserCredPlatform)); + + when(mockAuthPlatform.currentUser).thenReturn(mockUserPlatform); + + when(mockAuthPlatform.delegateFor( + app: anyNamed('app'), + )).thenAnswer((_) => mockAuthPlatform); + + when(mockAuthPlatform.setInitialValues( + currentUser: anyNamed('currentUser'), + languageCode: anyNamed('languageCode'), + )).thenAnswer((_) => mockAuthPlatform); + + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(MethodChannelFirebaseAuth.channel, + (call) async { + switch (call.method) { + default: + return {'user': user}; + } + }); + }); + + tearDown(() => testCount++); + + setUp(() async { + user = kMockUser; + await auth.signInAnonymously(); + }); + + test('delete()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.delete()).thenAnswer((i) async {}); + + await auth.currentUser!.delete(); + + verify(mockUserPlatform.delete()); + }); + + test('getIdToken()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.getIdToken(any)).thenAnswer((_) async => 'token'); + + final token = await auth.currentUser!.getIdToken(true); + + verify(mockUserPlatform.getIdToken(true)); + expect(token, isA()); + }); + + test('getIdTokenResult()', () async { + when(mockUserPlatform.getIdTokenResult(any)) + .thenAnswer((_) async => IdTokenResult(kMockIdTokenResult)); + + final idTokenResult = await auth.currentUser!.getIdTokenResult(true); + + verify(mockUserPlatform.getIdTokenResult(true)); + expect(idTokenResult, isA()); + }); + + group('linkWithCredential()', () { + setUp(() { + when(mockUserPlatform.linkWithCredential(any)) + .thenAnswer((_) async => mockUserCredPlatform); + }); + + test('should call linkWithCredential()', () async { + String newEmail = 'new@email.com'; + EmailAuthCredential credential = + EmailAuthProvider.credential(email: newEmail, password: 'test') + as EmailAuthCredential; + + await auth.currentUser!.linkWithCredential(credential); + + verify(mockUserPlatform.linkWithCredential(credential)); + }); + }); + + group('reauthenticateWithCredential()', () { + setUp(() { + when(mockUserPlatform.reauthenticateWithCredential(any)) + .thenAnswer((_) => Future.value(mockUserCredPlatform)); + }); + test('should call reauthenticateWithCredential()', () async { + String newEmail = 'new@email.com'; + EmailAuthCredential credential = + EmailAuthProvider.credential(email: newEmail, password: 'test') + as EmailAuthCredential; + + await auth.currentUser!.reauthenticateWithCredential(credential); + + verify(mockUserPlatform.reauthenticateWithCredential(credential)); + }); + }); + + test('reload()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.reload()).thenAnswer((i) async {}); + + await auth.currentUser!.reload(); + + verify(mockUserPlatform.reload()); + }); + + test('sendEmailVerification()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.sendEmailVerification(any)) + .thenAnswer((i) async {}); + + final ActionCodeSettings actionCodeSettings = + ActionCodeSettings(url: 'test'); + + await auth.currentUser!.sendEmailVerification(actionCodeSettings); + + verify(mockUserPlatform.sendEmailVerification(actionCodeSettings)); + }); + + group('unlink()', () { + setUp(() { + when(mockUserPlatform.unlink(any)) + .thenAnswer((_) => Future.value(mockUserPlatform)); + }); + test('should call unlink()', () async { + const String providerId = 'providerId'; + + await auth.currentUser!.unlink(providerId); + + verify(mockUserPlatform.unlink(providerId)); + }); + }); + + group('updatePassword()', () { + test('should call updatePassword()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updatePassword(any)).thenAnswer((i) async {}); + + const String newPassword = 'newPassword'; + + await auth.currentUser!.updatePassword(newPassword); + + verify(mockUserPlatform.updatePassword(newPassword)); + }); + }); + group('updatePhoneNumber()', () { + test('should call updatePhoneNumber()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updatePhoneNumber(any)).thenAnswer((i) async {}); + + PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.credential( + verificationId: 'test', + smsCode: 'test', + ); + + await auth.currentUser!.updatePhoneNumber(phoneAuthCredential); + + verify(mockUserPlatform.updatePhoneNumber(phoneAuthCredential)); + }); + }); + + test('updateProfile()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.updateProfile(any)).thenAnswer((i) async {}); + + const String displayName = 'updatedName'; + const String photoURL = 'testUrl'; + Map data = { + 'displayName': displayName, + 'photoURL': photoURL + }; + + await auth.currentUser! + // ignore: deprecated_member_use_from_same_package + .updateProfile(displayName: displayName, photoURL: photoURL); + + verify(mockUserPlatform.updateProfile(data)); + }); + + group('verifyBeforeUpdateEmail()', () { + test('should call verifyBeforeUpdateEmail()', () async { + // Necessary as we otherwise get a "null is not a Future" error + when(mockUserPlatform.verifyBeforeUpdateEmail(any, any)) + .thenAnswer((i) async {}); + + const newEmail = 'new@email.com'; + ActionCodeSettings actionCodeSettings = ActionCodeSettings(url: 'test'); + + await auth.currentUser! + .verifyBeforeUpdateEmail(newEmail, actionCodeSettings); + + verify(mockUserPlatform.verifyBeforeUpdateEmail( + newEmail, actionCodeSettings)); + }); + }); + + test('toString()', () async { + when(mockAuthPlatform.currentUser).thenReturn(TestUserPlatform( + mockAuthPlatform, TestMultiFactorPlatform(mockAuthPlatform), user)); + + const userInfo = 'UserInfo(' + 'displayName: Flutter Test User, ' + 'email: test@example.com, ' + 'phoneNumber: null, ' + 'photoURL: null, ' + 'providerId: firebase, ' + 'uid: 12345)'; + + final userMetadata = 'UserMetadata(' + 'creationTime: ${DateTime.fromMillisecondsSinceEpoch(kMockCreationTimestamp, isUtc: true)}, ' + 'lastSignInTime: ${DateTime.fromMillisecondsSinceEpoch(kMockLastSignInTimestamp, isUtc: true)})'; + + expect( + auth.currentUser.toString(), + 'User(' + 'displayName: displayName, ' + 'email: null, ' + 'isEmailVerified: false, ' + 'isAnonymous: true, ' + 'metadata: $userMetadata, ' + 'phoneNumber: null, ' + 'photoURL: null, ' + 'providerData, ' + '[$userInfo], ' + 'refreshToken: null, ' + 'tenantId: null, ' + 'uid: 12345)', + ); + }); + }); +} + +class MockFirebaseAuthPlatformBase = TestFirebaseAuthPlatform + with MockPlatformInterfaceMixin; + +class MockUserPlatformBase = TestUserPlatform with MockPlatformInterfaceMixin; + +class MockFirebaseAuth extends Mock + with MockPlatformInterfaceMixin + implements TestFirebaseAuthPlatform { + @override + Future signInAnonymously() { + return super.noSuchMethod( + Invocation.method(#signInAnonymously, const []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, const [], {#app: app}), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return super.noSuchMethod( + Invocation.method(#setInitialValues, const [], { + #currentUser: currentUser, + #languageCode: languageCode, + }), + returnValue: TestFirebaseAuthPlatform(), + returnValueForMissingStub: TestFirebaseAuthPlatform(), + ); + } +} + +class MockUserPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserPlatform { + MockUserPlatform(FirebaseAuthPlatform auth, InternalUserDetails _user) { + TestUserPlatform(auth, TestMultiFactorPlatform(auth), _user); + } + + @override + Future delete() { + return super.noSuchMethod( + Invocation.method(#delete, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future reload() { + return super.noSuchMethod( + Invocation.method(#reload, []), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future getIdToken(bool? forceRefresh) { + return super.noSuchMethod( + Invocation.method(#getIdToken, [forceRefresh]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future unlink(String? providerId) { + return super.noSuchMethod( + Invocation.method(#unlink, [providerId]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future getIdTokenResult(bool? forceRefresh) { + return super.noSuchMethod( + Invocation.method(#getIdTokenResult, [forceRefresh]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future reauthenticateWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#reauthenticateWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future linkWithCredential( + AuthCredential? credential, + ) { + return super.noSuchMethod( + Invocation.method(#linkWithCredential, [credential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future sendEmailVerification(ActionCodeSettings? actionCodeSettings) { + return super.noSuchMethod( + Invocation.method(#sendEmailVerification, [actionCodeSettings]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updatePassword(String? newPassword) { + return super.noSuchMethod( + Invocation.method(#updatePassword, [newPassword]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updatePhoneNumber(PhoneAuthCredential? phoneCredential) { + return super.noSuchMethod( + Invocation.method(#updatePhoneNumber, [phoneCredential]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future updateProfile(Map? profile) { + return super.noSuchMethod( + Invocation.method(#updateProfile, [profile]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } + + @override + Future verifyBeforeUpdateEmail( + String? newEmail, [ + ActionCodeSettings? actionCodeSettings, + ]) { + return super.noSuchMethod( + Invocation.method(#verifyBeforeUpdateEmail, [ + newEmail, + actionCodeSettings, + ]), + returnValue: neverEndingFuture(), + returnValueForMissingStub: neverEndingFuture(), + ); + } +} + +class MockUserCredentialPlatform extends Mock + with MockPlatformInterfaceMixin + implements TestUserCredentialPlatform { + MockUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) { + TestUserCredentialPlatform( + auth, + additionalUserInfo, + credential, + userPlatform, + ); + } +} + +class TestFirebaseAuthPlatform extends FirebaseAuthPlatform { + TestFirebaseAuthPlatform() : super(); + + @override + FirebaseAuthPlatform delegateFor( + {FirebaseApp? app, Persistence? persistence}) => + this; + + @override + FirebaseAuthPlatform setInitialValues({ + InternalUserDetails? currentUser, + String? languageCode, + }) { + return this; + } +} + +class TestUserPlatform extends UserPlatform { + TestUserPlatform(FirebaseAuthPlatform auth, MultiFactorPlatform multiFactor, + InternalUserDetails data) + : super(auth, multiFactor, data); +} + +class TestUserCredentialPlatform extends UserCredentialPlatform { + TestUserCredentialPlatform( + FirebaseAuthPlatform auth, + AdditionalUserInfo additionalUserInfo, + AuthCredential credential, + UserPlatform userPlatform, + ) : super( + auth: auth, + additionalUserInfo: additionalUserInfo, + credential: credential, + user: userPlatform); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt new file mode 100644 index 00000000..74c8f9ab --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/CMakeLists.txt @@ -0,0 +1,123 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "firebase_auth") +project(${PROJECT_NAME} LANGUAGES CXX) + +# This value is used when generating builds using this plugin, so it must +# not be changed +set(PLUGIN_NAME "firebase_auth_plugin") + +# Any new source files that you add to the plugin should be added here. +list(APPEND PLUGIN_SOURCES + "firebase_auth_plugin.cpp" + "firebase_auth_plugin.h" + "messages.g.cpp" + "messages.g.h" +) + +# Read version from pubspec.yaml +file(STRINGS "../pubspec.yaml" pubspec_content) +foreach(line ${pubspec_content}) + string(FIND ${line} "version: " has_version) + + if("${has_version}" STREQUAL "0") + string(FIND ${line} ": " version_start_pos) + math(EXPR version_start_pos "${version_start_pos} + 2") + string(LENGTH ${line} version_end_pos) + math(EXPR len "${version_end_pos} - ${version_start_pos}") + string(SUBSTRING ${line} ${version_start_pos} ${len} PLUGIN_VERSION) + break() + endif() +endforeach(line) + +configure_file(plugin_version.h.in ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +add_library(${PLUGIN_NAME} STATIC + "include/firebase_auth/firebase_auth_plugin_c_api.h" + "firebase_auth_plugin_c_api.cpp" + ${PLUGIN_SOURCES} + ${CMAKE_BINARY_DIR}/generated/firebase_auth/plugin_version.h +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PUBLIC FLUTTER_PLUGIN_IMPL) +# Enable firebase-cpp-sdk's platform logging api. +target_compile_definitions(${PLUGIN_NAME} PRIVATE -DINTERNAL_EXPERIMENTAL=1) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +set(MSVC_RUNTIME_MODE MD) +set(firebase_libs firebase_core_plugin firebase_auth) +target_link_libraries(${PLUGIN_NAME} PRIVATE "${firebase_libs}") + +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PUBLIC flutter flutter_wrapper_plugin) + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(firebase_auth_bundled_libraries + "" + PARENT_SCOPE +) + +# === Tests === +# These unit tests can be run from a terminal after building the example, or +# from Visual Studio after opening the generated solution file. + +# Only enable test builds when building the example (which sets this variable) +# so that plugin clients aren't building the tests. +if (${include_${PROJECT_NAME}_tests}) +set(TEST_RUNNER "${PROJECT_NAME}_test") +enable_testing() + +# Add the Google Test dependency. +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/release-1.11.0.zip +) +# Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +# Disable install commands for gtest so it doesn't end up in the bundle. +set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE) +FetchContent_MakeAvailable(googletest) + +# The plugin's C API is not very useful for unit testing, so build the sources +# directly into the test binary rather than using the DLL. +add_executable(${TEST_RUNNER} + test/firebase_auth_plugin_test.cpp + ${PLUGIN_SOURCES} +) +apply_standard_settings(${TEST_RUNNER}) +target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") +target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin) +target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock) +# flutter_wrapper_plugin has link dependencies on the Flutter DLL. +add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${FLUTTER_LIBRARY}" $ +) + +# Enable automatic test discovery. +include(GoogleTest) +gtest_discover_tests(${TEST_RUNNER}) +endif() diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp new file mode 100644 index 00000000..a931dac2 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.cpp @@ -0,0 +1,1341 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_auth_plugin.h" + +// This must be included before many other Windows headers. +#include + +#include +#include + +#include "firebase/app.h" +#include "firebase/auth.h" +#include "firebase/future.h" +#include "firebase/log.h" +#include "firebase/util.h" +#include "firebase/variant.h" +#include "firebase_auth/plugin_version.h" +#include "firebase_core/firebase_core_plugin_c_api.h" +#include "messages.g.h" + +// For getPlatformVersion; remove unless needed for your plugin implementation. +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::firebase::App; +using ::firebase::auth::Auth; + +namespace firebase_auth_windows { + +static std::string kLibraryName = "flutter-fire-auth"; +flutter::BinaryMessenger* FirebaseAuthPlugin::binaryMessenger = nullptr; + +// static +void FirebaseAuthPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarWindows* registrar) { + auto plugin = std::make_unique(); + + FirebaseAuthHostApi::SetUp(registrar->messenger(), plugin.get()); + FirebaseAuthUserHostApi::SetUp(registrar->messenger(), plugin.get()); + + RegisterFlutterFirebasePlugin("plugins.flutter.io/firebase_auth", + plugin.get()); + + registrar->AddPlugin(std::move(plugin)); + + binaryMessenger = registrar->messenger(); + + // Register for platform logging + App::RegisterLibrary(kLibraryName.c_str(), getPluginVersion().c_str(), + nullptr); +} + +FirebaseAuthPlugin::FirebaseAuthPlugin() { + firebase::SetLogLevel(firebase::kLogLevelVerbose); +} + +FirebaseAuthPlugin::~FirebaseAuthPlugin() = default; + +Auth* GetAuthFromPigeon(const AuthPigeonFirebaseApp& pigeonApp) { + App* app = App::GetInstance(pigeonApp.app_name().c_str()); + + Auth* auth = Auth::GetAuth(app); + + return auth; +} + +InternalUserCredential ParseAuthResult( + const firebase::auth::AuthResult* authResult) { + InternalUserCredential result = InternalUserCredential(); + result.set_user(FirebaseAuthPlugin::ParseUserDetails(authResult->user)); + result.set_additional_user_info(FirebaseAuthPlugin::ParseAdditionalUserInfo( + authResult->additional_user_info)); + return result; +} + +using flutter::EncodableMap; +using flutter::EncodableValue; + +flutter::EncodableMap +firebase_auth_windows::FirebaseAuthPlugin::ConvertToEncodableMap( + const std::map& originalMap) { + EncodableMap convertedMap; + for (const auto& kv : originalMap) { + EncodableValue key = ConvertToEncodableValue( + kv.first); // convert std::string to EncodableValue + EncodableValue value = ConvertToEncodableValue( + kv.second); // convert FieldValue to EncodableValue + convertedMap[key] = value; // insert into the new map + } + return convertedMap; +} + +flutter::EncodableValue +firebase_auth_windows::FirebaseAuthPlugin::ConvertToEncodableValue( + const firebase::Variant& variant) { + switch (variant.type()) { + case firebase::Variant::kTypeNull: + return EncodableValue(); + case firebase::Variant::kTypeInt64: + return EncodableValue(variant.int64_value()); + case firebase::Variant::kTypeDouble: + return EncodableValue(variant.double_value()); + case firebase::Variant::kTypeBool: + return EncodableValue(variant.bool_value()); + case firebase::Variant::kTypeStaticString: + return EncodableValue(variant.string_value()); + case firebase::Variant::kTypeMutableString: + return EncodableValue(variant.mutable_string()); + case firebase::Variant::kTypeMap: + return FirebaseAuthPlugin::ConvertToEncodableMap(variant.map()); + case firebase::Variant::kTypeStaticBlob: + return EncodableValue(flutter::CustomEncodableValue(variant.blob_data())); + case firebase::Variant::kTypeMutableBlob: + return EncodableValue( + flutter::CustomEncodableValue(variant.mutable_blob_data())); + default: + return EncodableValue(); + } +} + +InternalAdditionalUserInfo FirebaseAuthPlugin::ParseAdditionalUserInfo( + const firebase::auth::AdditionalUserInfo additionalUserInfo) { + // Cannot know if the user is new or not with current API + InternalAdditionalUserInfo result = InternalAdditionalUserInfo(false); + result.set_profile(ConvertToEncodableMap(additionalUserInfo.profile)); + result.set_provider_id(additionalUserInfo.provider_id); + result.set_username(additionalUserInfo.user_name); + return result; +} + +InternalUserDetails FirebaseAuthPlugin::ParseUserDetails( + const firebase::auth::User user) { + InternalUserDetails result = + InternalUserDetails(FirebaseAuthPlugin::ParseUserInfo(&user), + FirebaseAuthPlugin::ParseProviderData(&user)); + + return result; +} + +InternalUserInfo FirebaseAuthPlugin::ParseUserInfo( + const firebase::auth::User* user) { + InternalUserInfo result = InternalUserInfo(user->uid(), user->is_anonymous(), + user->is_email_verified()); + result.set_display_name(user->display_name()); + result.set_email(user->email()); + result.set_phone_number(user->phone_number()); + result.set_photo_url(user->photo_url()); + result.set_provider_id(user->provider_id()); + result.set_uid(user->uid()); + result.set_creation_timestamp(user->metadata().creation_timestamp); + result.set_last_sign_in_timestamp(user->metadata().last_sign_in_timestamp); + + return result; +} + +flutter::EncodableList FirebaseAuthPlugin::ParseProviderData( + const firebase::auth::User* user) { + flutter::EncodableList output; + + for (firebase::auth::UserInfoInterface userInfo : user->provider_data()) { + output.push_back(FirebaseAuthPlugin::ParseUserInfoToMap(&userInfo)); + } + + return flutter::EncodableList(output); +} + +flutter::EncodableValue FirebaseAuthPlugin::ParseUserInfoToMap( + firebase::auth::UserInfoInterface* userInfo) { + return flutter::EncodableValue(flutter::EncodableMap{ + {flutter::EncodableValue("displayName"), + flutter::EncodableValue(userInfo->display_name())}, + {flutter::EncodableValue("email"), + flutter::EncodableValue(userInfo->email())}, + {flutter::EncodableValue("isEmailVerified"), + flutter::EncodableValue(true)}, + {flutter::EncodableValue("phoneNumber"), + flutter::EncodableValue(userInfo->phone_number())}, + {flutter::EncodableValue("photoUrl"), + flutter::EncodableValue(userInfo->photo_url())}, + {flutter::EncodableValue("uid"), + flutter::EncodableValue(userInfo->uid().empty() ? std::string("") + : userInfo->uid())}, + {flutter::EncodableValue("providerId"), + flutter::EncodableValue(userInfo->provider_id())}, + {flutter::EncodableValue("isAnonymous"), + flutter::EncodableValue(false)}}); +} + +std::string FirebaseAuthPlugin::GetAuthErrorCode(AuthError authError) { + switch (authError) { + case firebase::auth::kAuthErrorInvalidCustomToken: + return "invalid-custom-token"; + case firebase::auth::kAuthErrorCustomTokenMismatch: + return "custom-token-mismatch"; + case firebase::auth::kAuthErrorInvalidEmail: + return "invalid-email"; + case firebase::auth::kAuthErrorInvalidCredential: + return "invalid-credential"; + case firebase::auth::kAuthErrorUserDisabled: + return "user-disabled"; + case firebase::auth::kAuthErrorEmailAlreadyInUse: + return "email-already-in-use"; + case firebase::auth::kAuthErrorWrongPassword: + return "wrong-password"; + case firebase::auth::kAuthErrorTooManyRequests: + return "too-many-requests"; + case firebase::auth::kAuthErrorAccountExistsWithDifferentCredentials: + return "account-exists-with-different-credentials"; + case firebase::auth::kAuthErrorRequiresRecentLogin: + return "requires-recent-login"; + case firebase::auth::kAuthErrorProviderAlreadyLinked: + return "provider-already-linked"; + case firebase::auth::kAuthErrorNoSuchProvider: + return "no-such-provider"; + case firebase::auth::kAuthErrorInvalidUserToken: + return "invalid-user-token"; + case firebase::auth::kAuthErrorUserTokenExpired: + return "user-token-expired"; + case firebase::auth::kAuthErrorUserNotFound: + return "user-not-found"; + case firebase::auth::kAuthErrorInvalidApiKey: + return "invalid-api-key"; + case firebase::auth::kAuthErrorCredentialAlreadyInUse: + return "credential-already-in-use"; + case firebase::auth::kAuthErrorOperationNotAllowed: + return "operation-not-allowed"; + case firebase::auth::kAuthErrorWeakPassword: + return "weak-password"; + case firebase::auth::kAuthErrorAppNotAuthorized: + return "app-not-authorized"; + case firebase::auth::kAuthErrorExpiredActionCode: + return "expired-action-code"; + case firebase::auth::kAuthErrorInvalidActionCode: + return "invalid-action-code"; + case firebase::auth::kAuthErrorInvalidMessagePayload: + return "invalid-message-payload"; + case firebase::auth::kAuthErrorInvalidSender: + return "invalid-sender"; + case firebase::auth::kAuthErrorInvalidRecipientEmail: + return "invalid-recipient-email"; + case firebase::auth::kAuthErrorUnauthorizedDomain: + return "unauthorized-domain"; + case firebase::auth::kAuthErrorInvalidContinueUri: + return "invalid-continue-uri"; + case firebase::auth::kAuthErrorMissingContinueUri: + return "missing-continue-uri"; + case firebase::auth::kAuthErrorMissingEmail: + return "missing-email"; + case firebase::auth::kAuthErrorMissingPhoneNumber: + return "missing-phone-number"; + case firebase::auth::kAuthErrorInvalidPhoneNumber: + return "invalid-phone-number"; + case firebase::auth::kAuthErrorMissingVerificationCode: + return "missing-verification-code"; + case firebase::auth::kAuthErrorInvalidVerificationCode: + return "invalid-verification-code"; + case firebase::auth::kAuthErrorMissingVerificationId: + return "missing-verification-id"; + case firebase::auth::kAuthErrorInvalidVerificationId: + return "invalid-verification-id"; + case firebase::auth::kAuthErrorSessionExpired: + return "session-expired"; + case firebase::auth::kAuthErrorQuotaExceeded: + return "quota-exceeded"; + case firebase::auth::kAuthErrorMissingAppCredential: + return "missing-app-credential"; + case firebase::auth::kAuthErrorInvalidAppCredential: + return "invalid-app-credential"; + case firebase::auth::kAuthErrorMissingClientIdentifier: + return "missing-client-identifier"; + case firebase::auth::kAuthErrorTenantIdMismatch: + return "tenant-id-mismatch"; + case firebase::auth::kAuthErrorUnsupportedTenantOperation: + return "unsupported-tenant-operation"; + case firebase::auth::kAuthErrorUserMismatch: + return "user-mismatch"; + case firebase::auth::kAuthErrorNetworkRequestFailed: + return "network-request-failed"; + case firebase::auth::kAuthErrorNoSignedInUser: + return "no-signed-in-user"; + case firebase::auth::kAuthErrorCancelled: + return "cancelled"; + + default: + return "unknown-error"; + } +} + +FlutterError FirebaseAuthPlugin::ParseError( + const firebase::FutureBase& completed_future) { + const AuthError errorCode = + static_cast(completed_future.error()); + + return FlutterError(FirebaseAuthPlugin::GetAuthErrorCode(errorCode), + completed_future.error_message()); +} + +std::string const kFLTFirebaseAuthChannelName = "firebase_auth_plugin"; + +class FlutterIdTokenListener : public firebase::auth::IdTokenListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnIdTokenChanged(Auth* auth) override { + // Generate your ID Token + firebase::auth::User user = auth->current_user(); + InternalUserDetails userDetails = + FirebaseAuthPlugin::ParseUserDetails(user); + + using flutter::EncodableList; + using flutter::EncodableMap; + using flutter::EncodableValue; + + if (event_sink_) { + if (user.is_valid()) { + EncodableList userDetailsList = EncodableList(); + userDetailsList.push_back(userDetails.user_info().ToEncodableList()); + userDetailsList.push_back(userDetails.provider_data()); + event_sink_->Success(EncodableValue( + EncodableMap{{EncodableValue("user"), userDetailsList}})); + } else { + event_sink_->Success(EncodableValue(EncodableMap{ + {EncodableValue("user"), EncodableValue(std::monostate{})}})); + } + } + } + + private: + std::unique_ptr> event_sink_; +}; + +class IdTokenStreamHandler + : public flutter::StreamHandler { + public: + IdTokenStreamHandler(Auth* auth) { + listener_ = nullptr; + auth_ = auth; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = new FlutterIdTokenListener(); + listener_->SetEventSink(std::move(events)); + auth_->AddIdTokenListener(listener_); + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + auth_->RemoveIdTokenListener(listener_); + listener_->SetEventSink(nullptr); + listener_ = nullptr; + return nullptr; + } + + private: + FlutterIdTokenListener* listener_; + firebase::auth::Auth* auth_; +}; + +void FirebaseAuthPlugin::RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + std::string name = + kFLTFirebaseAuthChannelName + "/id-token/" + app.app_name(); + + auto id_token_handler = std::make_unique(firebaseAuth); + + flutter::EventChannel channel( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + + channel.SetStreamHandler(std::move(id_token_handler)); + + result(ErrorOr(std::string(name))); +} + +class FlutterAuthStateListener : public firebase::auth::AuthStateListener { + public: + void SetEventSink( + std::unique_ptr> event_sink) { + event_sink_ = std::move(event_sink); + } + + void OnAuthStateChanged(Auth* auth) override { + // Generate your ID Token + firebase::auth::User user = auth->current_user(); + InternalUserDetails userDetails = + FirebaseAuthPlugin::ParseUserDetails(user); + + using flutter::EncodableList; + using flutter::EncodableMap; + using flutter::EncodableValue; + + if (event_sink_) { + if (user.is_valid()) { + EncodableList userDetailsList = EncodableList(); + userDetailsList.push_back(userDetails.user_info().ToEncodableList()); + userDetailsList.push_back(userDetails.provider_data()); + + event_sink_->Success(EncodableValue( + EncodableMap{{EncodableValue("user"), userDetailsList}})); + } else { + event_sink_->Success(EncodableValue(EncodableMap{ + {EncodableValue("user"), EncodableValue(std::monostate{})}})); + } + } + } + + private: + std::unique_ptr> event_sink_; +}; + +class AuthStateStreamHandler + : public flutter::StreamHandler { + public: + AuthStateStreamHandler(Auth* auth) { + listener_ = nullptr; + auth_ = auth; + } + + std::unique_ptr> + OnListenInternal( + const flutter::EncodableValue* arguments, + std::unique_ptr>&& events) + override { + listener_ = new FlutterAuthStateListener(); + listener_->SetEventSink(std::move(events)); + + auth_->AddAuthStateListener(listener_); + + return nullptr; + } + + std::unique_ptr> + OnCancelInternal(const flutter::EncodableValue* arguments) override { + auth_->RemoveAuthStateListener(listener_); + + listener_->SetEventSink(nullptr); + listener_ = nullptr; + return nullptr; + } + + private: + FlutterAuthStateListener* listener_; + firebase::auth::Auth* auth_; +}; + +void FirebaseAuthPlugin::RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + std::string name = + kFLTFirebaseAuthChannelName + "/auth-state/" + app.app_name(); + + auto auth_state_handler = + std::make_unique(firebaseAuth); + + flutter::EventChannel channel( + binaryMessenger, name, &flutter::StandardMethodCodec::GetInstance()); + + channel.SetStreamHandler(std::move(auth_state_handler)); + + result(ErrorOr(std::string(name))); +} + +void FirebaseAuthPlugin::UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebaseAuth->UseEmulator(host, static_cast(port)); + result(std::nullopt); +} + +void FirebaseAuthPlugin::ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError("unimplemented", + "ApplyActionCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError("unimplemented", + "CheckActionCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "ConfirmPasswordReset is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future createUserFuture = + firebaseAuth->CreateUserWithEmailAndPassword(email.c_str(), + password.c_str()); + + createUserFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInAnonymously(); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +// Provider type keys. +std::string const kSignInMethodPassword = "password"; +std::string const kSignInMethodEmailLink = "emailLink"; +std::string const kSignInMethodFacebook = "facebook.com"; +std::string const kSignInMethodGoogle = "google.com"; +std::string const kSignInMethodTwitter = "twitter.com"; +std::string const kSignInMethodGithub = "github.com"; +std::string const kSignInMethodApple = "apple.com"; +std::string const kSignInMethodPhone = "phone"; +std::string const kSignInMethodOAuth = "oauth"; + +// Credential argument keys. +std::string const kArgumentCredential = "credential"; +std::string const kArgumentProviderId = "providerId"; +std::string const kArgumentProviderScope = "scopes"; +std::string const kArgumentProviderCustomParameters = "customParameters"; +std::string const kArgumentSignInMethod = "signInMethod"; +std::string const kArgumentSecret = "secret"; +std::string const kArgumentIdToken = "idToken"; +std::string const kArgumentAccessToken = "accessToken"; +std::string const kArgumentRawNonce = "rawNonce"; +std::string const kArgumentEmail = "email"; +std::string const kArgumentCode = "code"; +std::string const kArgumentNewEmail = "newEmail"; +std::string const kArgumentEmailLink = kSignInMethodEmailLink; +std::string const kArgumentToken = "token"; +std::string const kArgumentVerificationId = "verificationId"; +std::string const kArgumentSmsCode = "smsCode"; +std::string const kArgumentActionCodeSettings = "actionCodeSettings"; + +// Emulating NSDictionary +typedef std::unordered_map Dictionary; + +firebase::auth::Credential getCredentialFromArguments( + flutter::EncodableMap arguments, const AuthPigeonFirebaseApp& app) { + std::string signInMethod = + std::get(arguments[kArgumentSignInMethod]); + + // Password Auth + if (signInMethod == kSignInMethodPassword) { + std::string email = std::get(arguments[kArgumentEmail]); + std::string secret = std::get(arguments[kArgumentSecret]); + return firebase::auth::EmailAuthProvider::GetCredential(email.c_str(), + secret.c_str()); + } + + // Email Link Auth + if (signInMethod == kSignInMethodEmailLink) { + // Firebase C++ SDK doesn't have email link authentication as of my + // knowledge cutoff in September 2021 + std::cout << "Email link authentication is not supported in Firebase C++ " + "SDK as of September 2021.\n"; + return firebase::auth::Credential(); + } + + // Lambda function to extract an optional string from the arguments map. This + // allows us to pass nullptr if no value exists + auto getStringOpt = + [&](const std::string& key) -> std::optional { + auto it = arguments.find(key); + if (it != arguments.end() && + std::holds_alternative(it->second)) { + return std::get(it->second); + } + return std::nullopt; + }; + + std::optional idToken = getStringOpt(kArgumentIdToken); + std::optional accessToken = getStringOpt(kArgumentAccessToken); + + // Facebook Auth + if (signInMethod == kSignInMethodFacebook) { + return firebase::auth::FacebookAuthProvider::GetCredential( + accessToken.value().c_str()); + } + + // Google Auth + if (signInMethod == kSignInMethodGoogle) { + // Both accessToken and idToken arguments can be null. You can use one or + // the other + return firebase::auth::GoogleAuthProvider::GetCredential( + idToken ? idToken.value().c_str() : nullptr, + accessToken ? accessToken.value().c_str() : nullptr); + } + + // Twitter Auth + if (signInMethod == kSignInMethodTwitter) { + std::string secret = std::get(arguments[kArgumentSecret]); + return firebase::auth::TwitterAuthProvider::GetCredential( + idToken.value().c_str(), secret.c_str()); + } + + // GitHub Auth + if (signInMethod == kSignInMethodGithub) { + return firebase::auth::GitHubAuthProvider::GetCredential( + accessToken.value().c_str()); + } + + // OAuth + if (signInMethod == kSignInMethodOAuth) { + std::string providerId = + std::get(arguments[kArgumentProviderId]); + std::optional rawNonce = getStringOpt(kArgumentRawNonce); + // If rawNonce provided use corresponding credential builder + // e.g. AppleID auth through the webView + if (rawNonce) { + return firebase::auth::OAuthProvider::GetCredential( + providerId.c_str(), idToken.value().c_str(), rawNonce.value().c_str(), + accessToken ? accessToken.value().c_str() : nullptr); + } else { + return firebase::auth::OAuthProvider::GetCredential( + providerId.c_str(), idToken.value().c_str(), + accessToken.value().c_str()); + } + } + + // If no known auth method matched + printf( + "Support for an auth provider with identifier '%s' is not implemented.\n", + signInMethod.c_str()); + return firebase::auth::Credential(); +} + +void FirebaseAuthPlugin::SignInWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithCredential( + getCredentialFromArguments(input, app)); + + signInFuture.OnCompletion( + [result](const firebase::Future& completed_future) { + if (completed_future.error() == 0) { + // TODO: not the right return type from C++ SDK + InternalUserInfo credential = + ParseUserInfo(completed_future.result()); + InternalUserCredential userCredential = InternalUserCredential(); + InternalUserDetails user = + InternalUserDetails(credential, flutter::EncodableList()); + userCredential.set_user(user); + result(userCredential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithCustomToken(token.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithEmailAndPassword(email.c_str(), password.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "SignInWithEmailLink is not available on this platform yet.", nullptr)); +} + +std::vector TransformEncodableList( + const flutter::EncodableList& encodable_list) { + std::vector transformed_list; + + for (const auto& value : encodable_list) { + if (std::holds_alternative(value)) { + transformed_list.push_back(std::get(value)); + } + } + + return transformed_list; +} + +std::map TransformEncodableMap( + const flutter::EncodableMap& encodable_map) { + std::map transformed_map; + + for (const auto& pair : encodable_map) { + if (std::holds_alternative(pair.first) && + std::holds_alternative(pair.second)) { + transformed_map[std::get(pair.first)] = + std::get(pair.second); + } + } + + return transformed_map; +} + +firebase::auth::FederatedOAuthProvider getProviderFromArguments( + const InternalSignInProvider& sign_in_provider) { + firebase::auth::FederatedOAuthProviderData federatedOAuthProviderData = + firebase::auth::FederatedOAuthProviderData( + sign_in_provider.provider_id().c_str(), + TransformEncodableList(*sign_in_provider.scopes()), + TransformEncodableMap(*sign_in_provider.custom_parameters())); + firebase::auth::FederatedOAuthProvider federatedAuthProvider = + firebase::auth::FederatedOAuthProvider(federatedOAuthProviderData); + + return federatedAuthProvider; +} + +void FirebaseAuthPlugin::SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SignInWithProvider( + &getProviderFromArguments(sign_in_provider)); + + signInFuture.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebaseAuth->SignOut(); + + result(std::nullopt); +} + +flutter::EncodableList TransformStringList( + const std::vector& string_list) { + flutter::EncodableList encodable_list; + + for (const auto& value : string_list) { + encodable_list.push_back(value); + } + + return encodable_list; +} + +void FirebaseAuthPlugin::FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->FetchProvidersForEmail(email.c_str()); + + signInFuture.OnCompletion( + [result]( + const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(TransformStringList(completed_future.result()->providers)); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + firebase::Future signInFuture = + firebaseAuth->SendPasswordResetEmail(email.c_str()); + + signInFuture.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "SendSignInLinkToEmail is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + + if (language_code == nullptr) { + firebaseAuth->UseAppLanguage(); + result(firebaseAuth->language_code()); + return; + } + + firebaseAuth->set_language_code(language_code->c_str()); + + result(*language_code); +} + +void FirebaseAuthPlugin::SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) { + result(FlutterError("unimplemented", + "SetSettings is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "VerifyPasswordResetCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "VerifyPhoneNumber is not available on this platform yet.", nullptr)); +} + +void FirebaseAuthPlugin::Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.Delete(); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.GetToken(force_refresh); + + future.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalIdTokenResult token_result; + std::string_view sv(*completed_future.result()); + token_result.set_token(sv); + result(token_result); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::LinkWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.LinkWithCredential(getCredentialFromArguments(input, app)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.LinkWithProvider(&getProviderFromArguments(sign_in_provider)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.Reauthenticate(getCredentialFromArguments(input, app)); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + // TODO: wrong return type + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.ReauthenticateWithProvider( + &getProviderFromArguments(sign_in_provider)); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.Reload(); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.SendEmailVerification(); + + future.OnCompletion([result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::Unlink( + const AuthPigeonFirebaseApp& app, const std::string& provider_id, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.Unlink(provider_id.c_str()); + + future.OnCompletion( + [result](const firebase::Future& + completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserCredential credential = + ParseAuthResult(completed_future.result()); + result(credential); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.SendEmailVerificationBeforeUpdatingEmail(new_email.c_str()); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = user.UpdatePassword(new_password.c_str()); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +firebase::auth::PhoneAuthCredential getPhoneCredentialFromArguments( + flutter::EncodableMap arguments, const AuthPigeonFirebaseApp& app) { + std::string signInMethod = + std::get(arguments[kArgumentSignInMethod]); + + if (signInMethod == kSignInMethodPhone) { + std::string verificationId = + std::get(arguments[kArgumentVerificationId]); + std::string smsCode = std::get(arguments[kArgumentSmsCode]); + + // TODO: we cannot construct a PhoneAuthCredential from the verificationId + return firebase::auth::PhoneAuthCredential::PhoneAuthCredential(); + } + // If no known auth method matched + printf( + "Support for an auth provider with identifier '%s' is not " + "implemented.\n", + signInMethod.c_str()); + throw; +} + +void FirebaseAuthPlugin::UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::Future future = + user.UpdatePhoneNumberCredential( + getPhoneCredentialFromArguments(input, app)); + + future.OnCompletion( + [result](const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = + ParseUserDetails(*completed_future.result()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + firebase::auth::User::UserProfile userProfile; + + if (profile.display_name_changed()) { + userProfile.display_name = profile.display_name()->c_str(); + } + if (profile.photo_url_changed()) { + userProfile.photo_url = profile.photo_url()->c_str(); + } + + firebase::Future future = user.UpdateUserProfile(userProfile); + + future.OnCompletion([result, firebaseAuth]( + const firebase::Future& completed_future) { + // We are probably in a different thread right now. + if (completed_future.error() == 0) { + InternalUserDetails user = ParseUserDetails(firebaseAuth->current_user()); + result(user); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) { + firebase::auth::Auth* firebaseAuth = GetAuthFromPigeon(app); + firebase::auth::User user = firebaseAuth->current_user(); + + if (action_code_settings != nullptr) { + printf( + "Firebase C++ SDK does not support using `ActionCodeSettings` for " + "`verifyBeforeUpdateEmail()` API currently"); + } + + firebase::Future future = + user.SendEmailVerificationBeforeUpdatingEmail(new_email.c_str()); + + future.OnCompletion( + [result, firebaseAuth](const firebase::Future& completed_future) { + if (completed_future.error() == 0) { + result(std::nullopt); + } else { + result(FirebaseAuthPlugin::ParseError(completed_future)); + } + }); +} + +void FirebaseAuthPlugin::RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "RevokeTokenWithAuthorizationCode is not available on this platform yet.", + nullptr)); +} + +void FirebaseAuthPlugin::RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) { + result(FlutterError("unimplemented", + "RevokeAccessToken is not available on this platform.", + nullptr)); +} + +void FirebaseAuthPlugin::InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) { + result(FlutterError( + "unimplemented", + "InitializeRecaptchaConfig is not available on this platform yet.", + nullptr)); +} + +flutter::EncodableMap FirebaseAuthPlugin::GetPluginConstantsForFirebaseApp( + const firebase::App& app) { + flutter::EncodableMap constants; + + Auth* auth = Auth::GetAuth(const_cast(&app)); + firebase::auth::User user = auth->current_user(); + + if (user.is_valid()) { + InternalUserDetails userDetails = ParseUserDetails(user); + flutter::EncodableList userDetailsList; + userDetailsList.push_back( + flutter::EncodableValue(userDetails.user_info().ToEncodableList())); + userDetailsList.push_back( + flutter::EncodableValue(userDetails.provider_data())); + constants[flutter::EncodableValue("APP_CURRENT_USER")] = + flutter::EncodableValue(userDetailsList); + } + + std::string lang = auth->language_code(); + if (!lang.empty()) { + constants[flutter::EncodableValue("APP_LANGUAGE_CODE")] = + flutter::EncodableValue(lang); + } + + return constants; +} + +void FirebaseAuthPlugin::DidReinitializeFirebaseCore() { + // No-op for now. Could be used to reset cached auth instances. +} + +} // namespace firebase_auth_windows diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h new file mode 100644 index 00000000..575e201f --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin.h @@ -0,0 +1,218 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ +#define FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ + +#include +#include + +#include + +#include "firebase/app.h" +#include "firebase/auth.h" +#include "firebase/auth/types.h" +#include "firebase/future.h" +#include "firebase_core/flutter_firebase_plugin.h" +#include "messages.g.h" + +using firebase::auth::AuthError; + +namespace firebase_auth_windows { + +class FirebaseAuthPlugin : public flutter::Plugin, + public FirebaseAuthHostApi, + public FirebaseAuthUserHostApi, + public FlutterFirebasePlugin { + public: + static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar); + + FirebaseAuthPlugin(); + + virtual ~FirebaseAuthPlugin(); + + // Disallow copy and assign. + FirebaseAuthPlugin(const FirebaseAuthPlugin&) = delete; + FirebaseAuthPlugin& operator=(const FirebaseAuthPlugin&) = delete; + + // Parser functions + static std::string GetAuthErrorCode(AuthError authError); + static FlutterError ParseError(const firebase::FutureBase& future); + + static InternalUserDetails ParseUserDetails(const firebase::auth::User user); + static InternalAdditionalUserInfo ParseAdditionalUserInfo( + const firebase::auth::AdditionalUserInfo user); + static flutter::EncodableMap ConvertToEncodableMap( + const std::map& originalMap); + static flutter::EncodableValue ConvertToEncodableValue( + const firebase::Variant& variant); + static InternalUserInfo ParseUserInfo(const firebase::auth::User* user); + static flutter::EncodableList ParseProviderData( + const firebase::auth::User* user); + static flutter::EncodableValue ParseUserInfoToMap( + firebase::auth::UserInfoInterface* userInfo); + + // FirebaseAuthHostApi methods. + virtual void RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) override; + virtual void ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) override; + virtual void CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) + override; + virtual void ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) override; + virtual void CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) + override; + virtual void SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) + override; + virtual void SignInWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) + override; + virtual void SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) + override; + virtual void SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) + override; + virtual void SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) + override; + virtual void SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + virtual void SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) override; + virtual void SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) override; + virtual void SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) override; + virtual void VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) override; + virtual void VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) override; + + // FirebaseAuthUserHostApi methods. + virtual void Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) + override; + virtual void LinkWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) + override; + virtual void ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) + override; + virtual void Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + virtual void SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + virtual void Unlink(const AuthPigeonFirebaseApp& app, + const std::string& provider_id, + std::function reply)> + result) override; + virtual void UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) override; + virtual void UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) override; + virtual void UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const flutter::EncodableMap& input, + std::function reply)> result) override; + virtual void UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) override; + virtual void VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) override; + + virtual void RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) override; + + virtual void RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) override; + + virtual void InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) override; + + // FlutterFirebasePlugin methods. + flutter::EncodableMap GetPluginConstantsForFirebaseApp( + const firebase::App& app) override; + void DidReinitializeFirebaseCore() override; + + private: + static flutter::BinaryMessenger* binaryMessenger; +}; + +} // namespace firebase_auth_windows + +#endif // FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp new file mode 100644 index 00000000..03d93038 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/firebase_auth_plugin_c_api.cpp @@ -0,0 +1,16 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "include/firebase_auth/firebase_auth_plugin_c_api.h" + +#include + +#include "firebase_auth_plugin.h" + +void FirebaseAuthPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + firebase_auth_windows::FirebaseAuthPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h new file mode 100644 index 00000000..1c73a633 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/include/firebase_auth/firebase_auth_plugin_c_api.h @@ -0,0 +1,29 @@ +/* + * Copyright 2023, the Chromium project authors. Please see the AUTHORS file + * for details. All rights reserved. Use of this source code is governed by a + * BSD-style license that can be found in the LICENSE file. + */ + +#ifndef FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void FirebaseAuthPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_PLUGIN_FIREBASE_AUTH_PLUGIN_C_API_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp new file mode 100644 index 00000000..ea2200e6 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.cpp @@ -0,0 +1,5562 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#undef _HAS_EXCEPTIONS + +#include "messages.g.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace firebase_auth_windows { +using ::flutter::BasicMessageChannel; +using ::flutter::CustomEncodableValue; +using ::flutter::EncodableList; +using ::flutter::EncodableMap; +using ::flutter::EncodableValue; + +FlutterError CreateConnectionError(const std::string channel_name) { + return FlutterError( + "channel-error", + "Unable to establish connection on channel: '" + channel_name + "'.", + EncodableValue("")); +} + +namespace { +template +bool PigeonInternalDeepEquals(const T& a, const T& b); + +bool PigeonInternalDeepEquals(const double& a, const double& b); + +template +bool PigeonInternalDeepEquals(const std::vector& a, const std::vector& b); + +template +bool PigeonInternalDeepEquals(const std::map& a, const std::map& b); + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b); + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b); + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b); + +template +bool PigeonInternalDeepEquals(const T& a, const T& b) { + return a == b; +} + +template +bool PigeonInternalDeepEquals(const std::vector& a, + const std::vector& b) { + if (a.size() != b.size()) { + return false; + } + for (size_t i = 0; i < a.size(); ++i) { + if (!PigeonInternalDeepEquals(a[i], b[i])) { + return false; + } + } + return true; +} + +template +bool PigeonInternalDeepEquals(const std::map& a, + const std::map& b) { + if (a.size() != b.size()) { + return false; + } + for (const auto& kv : a) { + bool found = false; + for (const auto& b_kv : b) { + if (PigeonInternalDeepEquals(kv.first, b_kv.first)) { + if (PigeonInternalDeepEquals(kv.second, b_kv.second)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; +} + +bool PigeonInternalDeepEquals(const double& a, const double& b) { + // Normalize -0.0 to 0.0 and handle NaN equality. + return (a == b) || (std::isnan(a) && std::isnan(b)); +} + +template +bool PigeonInternalDeepEquals(const std::optional& a, + const std::optional& b) { + if (!a && !b) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +template +bool PigeonInternalDeepEquals(const std::unique_ptr& a, + const std::unique_ptr& b) { + if (a.get() == b.get()) { + return true; + } + if (!a || !b) { + return false; + } + return PigeonInternalDeepEquals(*a, *b); +} + +bool PigeonInternalDeepEquals(const ::flutter::EncodableValue& a, + const ::flutter::EncodableValue& b) { + if (a.index() != b.index()) { + return false; + } + if (const double* da = std::get_if(&a)) { + return PigeonInternalDeepEquals(*da, std::get(b)); + } else if (const ::flutter::EncodableList* la = + std::get_if<::flutter::EncodableList>(&a)) { + return PigeonInternalDeepEquals(*la, std::get<::flutter::EncodableList>(b)); + } else if (const ::flutter::EncodableMap* ma = + std::get_if<::flutter::EncodableMap>(&a)) { + return PigeonInternalDeepEquals(*ma, std::get<::flutter::EncodableMap>(b)); + } + return a == b; +} + +template +size_t PigeonInternalDeepHash(const T& v); + +size_t PigeonInternalDeepHash(const double& v); + +template +size_t PigeonInternalDeepHash(const std::vector& v); + +template +size_t PigeonInternalDeepHash(const std::map& v); + +template +size_t PigeonInternalDeepHash(const std::optional& v); + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v); + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v); + +template +size_t PigeonInternalDeepHash(const T& v) { + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::vector& v) { + size_t result = 1; + for (const auto& item : v) { + result = result * 31 + PigeonInternalDeepHash(item); + } + return result; +} + +template +size_t PigeonInternalDeepHash(const std::map& v) { + size_t result = 0; + for (const auto& kv : v) { + result += ((PigeonInternalDeepHash(kv.first) * 31) ^ + PigeonInternalDeepHash(kv.second)); + } + return result; +} + +size_t PigeonInternalDeepHash(const double& v) { + if (std::isnan(v)) { + // Normalize NaN to a consistent hash. + return std::hash()(std::numeric_limits::quiet_NaN()); + } + if (v == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return std::hash()(0.0); + } + return std::hash()(v); +} + +template +size_t PigeonInternalDeepHash(const std::optional& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +template +size_t PigeonInternalDeepHash(const std::unique_ptr& v) { + return v ? PigeonInternalDeepHash(*v) : 0; +} + +size_t PigeonInternalDeepHash(const ::flutter::EncodableValue& v) { + size_t result = v.index(); + if (const double* dv = std::get_if(&v)) { + result = result * 31 + PigeonInternalDeepHash(*dv); + } else if (const ::flutter::EncodableList* lv = + std::get_if<::flutter::EncodableList>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*lv); + } else if (const ::flutter::EncodableMap* mv = + std::get_if<::flutter::EncodableMap>(&v)) { + result = result * 31 + PigeonInternalDeepHash(*mv); + } else { + std::visit( + [&result](const auto& val) { + using T = std::decay_t; + if constexpr (!std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v) { + result = result * 31 + PigeonInternalDeepHash(val); + } + }, + v); + } + return result; +} + +} // namespace +// InternalMultiFactorSession + +InternalMultiFactorSession::InternalMultiFactorSession(const std::string& id) + : id_(id) {} + +const std::string& InternalMultiFactorSession::id() const { return id_; } + +void InternalMultiFactorSession::set_id(std::string_view value_arg) { + id_ = value_arg; +} + +EncodableList InternalMultiFactorSession::ToEncodableList() const { + EncodableList list; + list.reserve(1); + list.push_back(EncodableValue(id_)); + return list; +} + +InternalMultiFactorSession InternalMultiFactorSession::FromEncodableList( + const EncodableList& list) { + InternalMultiFactorSession decoded(std::get(list[0])); + return decoded; +} + +bool InternalMultiFactorSession::operator==( + const InternalMultiFactorSession& other) const { + return PigeonInternalDeepEquals(id_, other.id_); +} + +bool InternalMultiFactorSession::operator!=( + const InternalMultiFactorSession& other) const { + return !(*this == other); +} + +size_t InternalMultiFactorSession::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(id_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalMultiFactorSession& v) { + return v.Hash(); +} + +// InternalPhoneMultiFactorAssertion + +InternalPhoneMultiFactorAssertion::InternalPhoneMultiFactorAssertion( + const std::string& verification_id, const std::string& verification_code) + : verification_id_(verification_id), + verification_code_(verification_code) {} + +const std::string& InternalPhoneMultiFactorAssertion::verification_id() const { + return verification_id_; +} + +void InternalPhoneMultiFactorAssertion::set_verification_id( + std::string_view value_arg) { + verification_id_ = value_arg; +} + +const std::string& InternalPhoneMultiFactorAssertion::verification_code() + const { + return verification_code_; +} + +void InternalPhoneMultiFactorAssertion::set_verification_code( + std::string_view value_arg) { + verification_code_ = value_arg; +} + +EncodableList InternalPhoneMultiFactorAssertion::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(EncodableValue(verification_id_)); + list.push_back(EncodableValue(verification_code_)); + return list; +} + +InternalPhoneMultiFactorAssertion +InternalPhoneMultiFactorAssertion::FromEncodableList( + const EncodableList& list) { + InternalPhoneMultiFactorAssertion decoded(std::get(list[0]), + std::get(list[1])); + return decoded; +} + +bool InternalPhoneMultiFactorAssertion::operator==( + const InternalPhoneMultiFactorAssertion& other) const { + return PigeonInternalDeepEquals(verification_id_, other.verification_id_) && + PigeonInternalDeepEquals(verification_code_, other.verification_code_); +} + +bool InternalPhoneMultiFactorAssertion::operator!=( + const InternalPhoneMultiFactorAssertion& other) const { + return !(*this == other); +} + +size_t InternalPhoneMultiFactorAssertion::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(verification_id_); + result = result * 31 + PigeonInternalDeepHash(verification_code_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalPhoneMultiFactorAssertion& v) { + return v.Hash(); +} + +// InternalMultiFactorInfo + +InternalMultiFactorInfo::InternalMultiFactorInfo(double enrollment_timestamp, + const std::string& uid) + : enrollment_timestamp_(enrollment_timestamp), uid_(uid) {} + +InternalMultiFactorInfo::InternalMultiFactorInfo( + const std::string* display_name, double enrollment_timestamp, + const std::string* factor_id, const std::string& uid, + const std::string* phone_number) + : display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + enrollment_timestamp_(enrollment_timestamp), + factor_id_(factor_id ? std::optional(*factor_id) + : std::nullopt), + uid_(uid), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt) {} + +const std::string* InternalMultiFactorInfo::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalMultiFactorInfo::set_display_name( + const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +double InternalMultiFactorInfo::enrollment_timestamp() const { + return enrollment_timestamp_; +} + +void InternalMultiFactorInfo::set_enrollment_timestamp(double value_arg) { + enrollment_timestamp_ = value_arg; +} + +const std::string* InternalMultiFactorInfo::factor_id() const { + return factor_id_ ? &(*factor_id_) : nullptr; +} + +void InternalMultiFactorInfo::set_factor_id(const std::string_view* value_arg) { + factor_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_factor_id(std::string_view value_arg) { + factor_id_ = value_arg; +} + +const std::string& InternalMultiFactorInfo::uid() const { return uid_; } + +void InternalMultiFactorInfo::set_uid(std::string_view value_arg) { + uid_ = value_arg; +} + +const std::string* InternalMultiFactorInfo::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalMultiFactorInfo::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalMultiFactorInfo::set_phone_number(std::string_view value_arg) { + phone_number_ = value_arg; +} + +EncodableList InternalMultiFactorInfo::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(EncodableValue(enrollment_timestamp_)); + list.push_back(factor_id_ ? EncodableValue(*factor_id_) : EncodableValue()); + list.push_back(EncodableValue(uid_)); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + return list; +} + +InternalMultiFactorInfo InternalMultiFactorInfo::FromEncodableList( + const EncodableList& list) { + InternalMultiFactorInfo decoded(std::get(list[1]), + std::get(list[3])); + auto& encodable_display_name = list[0]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_factor_id = list[2]; + if (!encodable_factor_id.IsNull()) { + decoded.set_factor_id(std::get(encodable_factor_id)); + } + auto& encodable_phone_number = list[4]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + return decoded; +} + +bool InternalMultiFactorInfo::operator==( + const InternalMultiFactorInfo& other) const { + return PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(enrollment_timestamp_, + other.enrollment_timestamp_) && + PigeonInternalDeepEquals(factor_id_, other.factor_id_) && + PigeonInternalDeepEquals(uid_, other.uid_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_); +} + +bool InternalMultiFactorInfo::operator!=( + const InternalMultiFactorInfo& other) const { + return !(*this == other); +} + +size_t InternalMultiFactorInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(enrollment_timestamp_); + result = result * 31 + PigeonInternalDeepHash(factor_id_); + result = result * 31 + PigeonInternalDeepHash(uid_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalMultiFactorInfo& v) { + return v.Hash(); +} + +// AuthPigeonFirebaseApp + +AuthPigeonFirebaseApp::AuthPigeonFirebaseApp(const std::string& app_name) + : app_name_(app_name) {} + +AuthPigeonFirebaseApp::AuthPigeonFirebaseApp( + const std::string& app_name, const std::string* tenant_id, + const std::string* custom_auth_domain) + : app_name_(app_name), + tenant_id_(tenant_id ? std::optional(*tenant_id) + : std::nullopt), + custom_auth_domain_(custom_auth_domain + ? std::optional(*custom_auth_domain) + : std::nullopt) {} + +const std::string& AuthPigeonFirebaseApp::app_name() const { return app_name_; } + +void AuthPigeonFirebaseApp::set_app_name(std::string_view value_arg) { + app_name_ = value_arg; +} + +const std::string* AuthPigeonFirebaseApp::tenant_id() const { + return tenant_id_ ? &(*tenant_id_) : nullptr; +} + +void AuthPigeonFirebaseApp::set_tenant_id(const std::string_view* value_arg) { + tenant_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void AuthPigeonFirebaseApp::set_tenant_id(std::string_view value_arg) { + tenant_id_ = value_arg; +} + +const std::string* AuthPigeonFirebaseApp::custom_auth_domain() const { + return custom_auth_domain_ ? &(*custom_auth_domain_) : nullptr; +} + +void AuthPigeonFirebaseApp::set_custom_auth_domain( + const std::string_view* value_arg) { + custom_auth_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void AuthPigeonFirebaseApp::set_custom_auth_domain(std::string_view value_arg) { + custom_auth_domain_ = value_arg; +} + +EncodableList AuthPigeonFirebaseApp::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(app_name_)); + list.push_back(tenant_id_ ? EncodableValue(*tenant_id_) : EncodableValue()); + list.push_back(custom_auth_domain_ ? EncodableValue(*custom_auth_domain_) + : EncodableValue()); + return list; +} + +AuthPigeonFirebaseApp AuthPigeonFirebaseApp::FromEncodableList( + const EncodableList& list) { + AuthPigeonFirebaseApp decoded(std::get(list[0])); + auto& encodable_tenant_id = list[1]; + if (!encodable_tenant_id.IsNull()) { + decoded.set_tenant_id(std::get(encodable_tenant_id)); + } + auto& encodable_custom_auth_domain = list[2]; + if (!encodable_custom_auth_domain.IsNull()) { + decoded.set_custom_auth_domain( + std::get(encodable_custom_auth_domain)); + } + return decoded; +} + +bool AuthPigeonFirebaseApp::operator==( + const AuthPigeonFirebaseApp& other) const { + return PigeonInternalDeepEquals(app_name_, other.app_name_) && + PigeonInternalDeepEquals(tenant_id_, other.tenant_id_) && + PigeonInternalDeepEquals(custom_auth_domain_, + other.custom_auth_domain_); +} + +bool AuthPigeonFirebaseApp::operator!=( + const AuthPigeonFirebaseApp& other) const { + return !(*this == other); +} + +size_t AuthPigeonFirebaseApp::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(app_name_); + result = result * 31 + PigeonInternalDeepHash(tenant_id_); + result = result * 31 + PigeonInternalDeepHash(custom_auth_domain_); + return result; +} + +size_t PigeonInternalDeepHash(const AuthPigeonFirebaseApp& v) { + return v.Hash(); +} + +// InternalActionCodeInfoData + +InternalActionCodeInfoData::InternalActionCodeInfoData() {} + +InternalActionCodeInfoData::InternalActionCodeInfoData( + const std::string* email, const std::string* previous_email) + : email_(email ? std::optional(*email) : std::nullopt), + previous_email_(previous_email + ? std::optional(*previous_email) + : std::nullopt) {} + +const std::string* InternalActionCodeInfoData::email() const { + return email_ ? &(*email_) : nullptr; +} + +void InternalActionCodeInfoData::set_email(const std::string_view* value_arg) { + email_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeInfoData::set_email(std::string_view value_arg) { + email_ = value_arg; +} + +const std::string* InternalActionCodeInfoData::previous_email() const { + return previous_email_ ? &(*previous_email_) : nullptr; +} + +void InternalActionCodeInfoData::set_previous_email( + const std::string_view* value_arg) { + previous_email_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeInfoData::set_previous_email( + std::string_view value_arg) { + previous_email_ = value_arg; +} + +EncodableList InternalActionCodeInfoData::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(email_ ? EncodableValue(*email_) : EncodableValue()); + list.push_back(previous_email_ ? EncodableValue(*previous_email_) + : EncodableValue()); + return list; +} + +InternalActionCodeInfoData InternalActionCodeInfoData::FromEncodableList( + const EncodableList& list) { + InternalActionCodeInfoData decoded; + auto& encodable_email = list[0]; + if (!encodable_email.IsNull()) { + decoded.set_email(std::get(encodable_email)); + } + auto& encodable_previous_email = list[1]; + if (!encodable_previous_email.IsNull()) { + decoded.set_previous_email(std::get(encodable_previous_email)); + } + return decoded; +} + +bool InternalActionCodeInfoData::operator==( + const InternalActionCodeInfoData& other) const { + return PigeonInternalDeepEquals(email_, other.email_) && + PigeonInternalDeepEquals(previous_email_, other.previous_email_); +} + +bool InternalActionCodeInfoData::operator!=( + const InternalActionCodeInfoData& other) const { + return !(*this == other); +} + +size_t InternalActionCodeInfoData::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(email_); + result = result * 31 + PigeonInternalDeepHash(previous_email_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeInfoData& v) { + return v.Hash(); +} + +// InternalActionCodeInfo + +InternalActionCodeInfo::InternalActionCodeInfo( + const ActionCodeInfoOperation& operation, + const InternalActionCodeInfoData& data) + : operation_(operation), + data_(std::make_unique(data)) {} + +InternalActionCodeInfo::InternalActionCodeInfo( + const InternalActionCodeInfo& other) + : operation_(other.operation_), + data_(std::make_unique(*other.data_)) {} + +InternalActionCodeInfo& InternalActionCodeInfo::operator=( + const InternalActionCodeInfo& other) { + operation_ = other.operation_; + data_ = std::make_unique(*other.data_); + return *this; +} + +const ActionCodeInfoOperation& InternalActionCodeInfo::operation() const { + return operation_; +} + +void InternalActionCodeInfo::set_operation( + const ActionCodeInfoOperation& value_arg) { + operation_ = value_arg; +} + +const InternalActionCodeInfoData& InternalActionCodeInfo::data() const { + return *data_; +} + +void InternalActionCodeInfo::set_data( + const InternalActionCodeInfoData& value_arg) { + data_ = std::make_unique(value_arg); +} + +EncodableList InternalActionCodeInfo::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(CustomEncodableValue(operation_)); + list.push_back(CustomEncodableValue(*data_)); + return list; +} + +InternalActionCodeInfo InternalActionCodeInfo::FromEncodableList( + const EncodableList& list) { + InternalActionCodeInfo decoded( + std::any_cast( + std::get(list[0])), + std::any_cast( + std::get(list[1]))); + return decoded; +} + +bool InternalActionCodeInfo::operator==( + const InternalActionCodeInfo& other) const { + return PigeonInternalDeepEquals(operation_, other.operation_) && + PigeonInternalDeepEquals(data_, other.data_); +} + +bool InternalActionCodeInfo::operator!=( + const InternalActionCodeInfo& other) const { + return !(*this == other); +} + +size_t InternalActionCodeInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(operation_); + result = result * 31 + PigeonInternalDeepHash(data_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeInfo& v) { + return v.Hash(); +} + +// InternalAdditionalUserInfo + +InternalAdditionalUserInfo::InternalAdditionalUserInfo(bool is_new_user) + : is_new_user_(is_new_user) {} + +InternalAdditionalUserInfo::InternalAdditionalUserInfo( + bool is_new_user, const std::string* provider_id, + const std::string* username, const std::string* authorization_code, + const EncodableMap* profile) + : is_new_user_(is_new_user), + provider_id_(provider_id ? std::optional(*provider_id) + : std::nullopt), + username_(username ? std::optional(*username) + : std::nullopt), + authorization_code_(authorization_code + ? std::optional(*authorization_code) + : std::nullopt), + profile_(profile ? std::optional(*profile) : std::nullopt) { +} + +bool InternalAdditionalUserInfo::is_new_user() const { return is_new_user_; } + +void InternalAdditionalUserInfo::set_is_new_user(bool value_arg) { + is_new_user_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::provider_id() const { + return provider_id_ ? &(*provider_id_) : nullptr; +} + +void InternalAdditionalUserInfo::set_provider_id( + const std::string_view* value_arg) { + provider_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::username() const { + return username_ ? &(*username_) : nullptr; +} + +void InternalAdditionalUserInfo::set_username( + const std::string_view* value_arg) { + username_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_username(std::string_view value_arg) { + username_ = value_arg; +} + +const std::string* InternalAdditionalUserInfo::authorization_code() const { + return authorization_code_ ? &(*authorization_code_) : nullptr; +} + +void InternalAdditionalUserInfo::set_authorization_code( + const std::string_view* value_arg) { + authorization_code_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_authorization_code( + std::string_view value_arg) { + authorization_code_ = value_arg; +} + +const EncodableMap* InternalAdditionalUserInfo::profile() const { + return profile_ ? &(*profile_) : nullptr; +} + +void InternalAdditionalUserInfo::set_profile(const EncodableMap* value_arg) { + profile_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAdditionalUserInfo::set_profile(const EncodableMap& value_arg) { + profile_ = value_arg; +} + +EncodableList InternalAdditionalUserInfo::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(EncodableValue(is_new_user_)); + list.push_back(provider_id_ ? EncodableValue(*provider_id_) + : EncodableValue()); + list.push_back(username_ ? EncodableValue(*username_) : EncodableValue()); + list.push_back(authorization_code_ ? EncodableValue(*authorization_code_) + : EncodableValue()); + list.push_back(profile_ ? EncodableValue(*profile_) : EncodableValue()); + return list; +} + +InternalAdditionalUserInfo InternalAdditionalUserInfo::FromEncodableList( + const EncodableList& list) { + InternalAdditionalUserInfo decoded(std::get(list[0])); + auto& encodable_provider_id = list[1]; + if (!encodable_provider_id.IsNull()) { + decoded.set_provider_id(std::get(encodable_provider_id)); + } + auto& encodable_username = list[2]; + if (!encodable_username.IsNull()) { + decoded.set_username(std::get(encodable_username)); + } + auto& encodable_authorization_code = list[3]; + if (!encodable_authorization_code.IsNull()) { + decoded.set_authorization_code( + std::get(encodable_authorization_code)); + } + auto& encodable_profile = list[4]; + if (!encodable_profile.IsNull()) { + decoded.set_profile(std::get(encodable_profile)); + } + return decoded; +} + +bool InternalAdditionalUserInfo::operator==( + const InternalAdditionalUserInfo& other) const { + return PigeonInternalDeepEquals(is_new_user_, other.is_new_user_) && + PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(username_, other.username_) && + PigeonInternalDeepEquals(authorization_code_, + other.authorization_code_) && + PigeonInternalDeepEquals(profile_, other.profile_); +} + +bool InternalAdditionalUserInfo::operator!=( + const InternalAdditionalUserInfo& other) const { + return !(*this == other); +} + +size_t InternalAdditionalUserInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(is_new_user_); + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(username_); + result = result * 31 + PigeonInternalDeepHash(authorization_code_); + result = result * 31 + PigeonInternalDeepHash(profile_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAdditionalUserInfo& v) { + return v.Hash(); +} + +// InternalAuthCredential + +InternalAuthCredential::InternalAuthCredential( + const std::string& provider_id, const std::string& sign_in_method, + int64_t native_id) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + native_id_(native_id) {} + +InternalAuthCredential::InternalAuthCredential( + const std::string& provider_id, const std::string& sign_in_method, + int64_t native_id, const std::string* access_token) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + native_id_(native_id), + access_token_(access_token ? std::optional(*access_token) + : std::nullopt) {} + +const std::string& InternalAuthCredential::provider_id() const { + return provider_id_; +} + +void InternalAuthCredential::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string& InternalAuthCredential::sign_in_method() const { + return sign_in_method_; +} + +void InternalAuthCredential::set_sign_in_method(std::string_view value_arg) { + sign_in_method_ = value_arg; +} + +int64_t InternalAuthCredential::native_id() const { return native_id_; } + +void InternalAuthCredential::set_native_id(int64_t value_arg) { + native_id_ = value_arg; +} + +const std::string* InternalAuthCredential::access_token() const { + return access_token_ ? &(*access_token_) : nullptr; +} + +void InternalAuthCredential::set_access_token( + const std::string_view* value_arg) { + access_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredential::set_access_token(std::string_view value_arg) { + access_token_ = value_arg; +} + +EncodableList InternalAuthCredential::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(EncodableValue(provider_id_)); + list.push_back(EncodableValue(sign_in_method_)); + list.push_back(EncodableValue(native_id_)); + list.push_back(access_token_ ? EncodableValue(*access_token_) + : EncodableValue()); + return list; +} + +InternalAuthCredential InternalAuthCredential::FromEncodableList( + const EncodableList& list) { + InternalAuthCredential decoded(std::get(list[0]), + std::get(list[1]), + std::get(list[2])); + auto& encodable_access_token = list[3]; + if (!encodable_access_token.IsNull()) { + decoded.set_access_token(std::get(encodable_access_token)); + } + return decoded; +} + +bool InternalAuthCredential::operator==( + const InternalAuthCredential& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(sign_in_method_, other.sign_in_method_) && + PigeonInternalDeepEquals(native_id_, other.native_id_) && + PigeonInternalDeepEquals(access_token_, other.access_token_); +} + +bool InternalAuthCredential::operator!=( + const InternalAuthCredential& other) const { + return !(*this == other); +} + +size_t InternalAuthCredential::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(sign_in_method_); + result = result * 31 + PigeonInternalDeepHash(native_id_); + result = result * 31 + PigeonInternalDeepHash(access_token_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAuthCredential& v) { + return v.Hash(); +} + +// InternalUserInfo + +InternalUserInfo::InternalUserInfo(const std::string& uid, bool is_anonymous, + bool is_email_verified) + : uid_(uid), + is_anonymous_(is_anonymous), + is_email_verified_(is_email_verified) {} + +InternalUserInfo::InternalUserInfo( + const std::string& uid, const std::string* email, + const std::string* display_name, const std::string* photo_url, + const std::string* phone_number, bool is_anonymous, bool is_email_verified, + const std::string* provider_id, const std::string* tenant_id, + const std::string* refresh_token, const int64_t* creation_timestamp, + const int64_t* last_sign_in_timestamp) + : uid_(uid), + email_(email ? std::optional(*email) : std::nullopt), + display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + photo_url_(photo_url ? std::optional(*photo_url) + : std::nullopt), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + is_anonymous_(is_anonymous), + is_email_verified_(is_email_verified), + provider_id_(provider_id ? std::optional(*provider_id) + : std::nullopt), + tenant_id_(tenant_id ? std::optional(*tenant_id) + : std::nullopt), + refresh_token_(refresh_token ? std::optional(*refresh_token) + : std::nullopt), + creation_timestamp_(creation_timestamp + ? std::optional(*creation_timestamp) + : std::nullopt), + last_sign_in_timestamp_( + last_sign_in_timestamp + ? std::optional(*last_sign_in_timestamp) + : std::nullopt) {} + +const std::string& InternalUserInfo::uid() const { return uid_; } + +void InternalUserInfo::set_uid(std::string_view value_arg) { uid_ = value_arg; } + +const std::string* InternalUserInfo::email() const { + return email_ ? &(*email_) : nullptr; +} + +void InternalUserInfo::set_email(const std::string_view* value_arg) { + email_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_email(std::string_view value_arg) { + email_ = value_arg; +} + +const std::string* InternalUserInfo::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalUserInfo::set_display_name(const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +const std::string* InternalUserInfo::photo_url() const { + return photo_url_ ? &(*photo_url_) : nullptr; +} + +void InternalUserInfo::set_photo_url(const std::string_view* value_arg) { + photo_url_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_photo_url(std::string_view value_arg) { + photo_url_ = value_arg; +} + +const std::string* InternalUserInfo::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalUserInfo::set_phone_number(const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_phone_number(std::string_view value_arg) { + phone_number_ = value_arg; +} + +bool InternalUserInfo::is_anonymous() const { return is_anonymous_; } + +void InternalUserInfo::set_is_anonymous(bool value_arg) { + is_anonymous_ = value_arg; +} + +bool InternalUserInfo::is_email_verified() const { return is_email_verified_; } + +void InternalUserInfo::set_is_email_verified(bool value_arg) { + is_email_verified_ = value_arg; +} + +const std::string* InternalUserInfo::provider_id() const { + return provider_id_ ? &(*provider_id_) : nullptr; +} + +void InternalUserInfo::set_provider_id(const std::string_view* value_arg) { + provider_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string* InternalUserInfo::tenant_id() const { + return tenant_id_ ? &(*tenant_id_) : nullptr; +} + +void InternalUserInfo::set_tenant_id(const std::string_view* value_arg) { + tenant_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_tenant_id(std::string_view value_arg) { + tenant_id_ = value_arg; +} + +const std::string* InternalUserInfo::refresh_token() const { + return refresh_token_ ? &(*refresh_token_) : nullptr; +} + +void InternalUserInfo::set_refresh_token(const std::string_view* value_arg) { + refresh_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_refresh_token(std::string_view value_arg) { + refresh_token_ = value_arg; +} + +const int64_t* InternalUserInfo::creation_timestamp() const { + return creation_timestamp_ ? &(*creation_timestamp_) : nullptr; +} + +void InternalUserInfo::set_creation_timestamp(const int64_t* value_arg) { + creation_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_creation_timestamp(int64_t value_arg) { + creation_timestamp_ = value_arg; +} + +const int64_t* InternalUserInfo::last_sign_in_timestamp() const { + return last_sign_in_timestamp_ ? &(*last_sign_in_timestamp_) : nullptr; +} + +void InternalUserInfo::set_last_sign_in_timestamp(const int64_t* value_arg) { + last_sign_in_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserInfo::set_last_sign_in_timestamp(int64_t value_arg) { + last_sign_in_timestamp_ = value_arg; +} + +EncodableList InternalUserInfo::ToEncodableList() const { + EncodableList list; + list.reserve(12); + list.push_back(EncodableValue(uid_)); + list.push_back(email_ ? EncodableValue(*email_) : EncodableValue()); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(photo_url_ ? EncodableValue(*photo_url_) : EncodableValue()); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(EncodableValue(is_anonymous_)); + list.push_back(EncodableValue(is_email_verified_)); + list.push_back(provider_id_ ? EncodableValue(*provider_id_) + : EncodableValue()); + list.push_back(tenant_id_ ? EncodableValue(*tenant_id_) : EncodableValue()); + list.push_back(refresh_token_ ? EncodableValue(*refresh_token_) + : EncodableValue()); + list.push_back(creation_timestamp_ ? EncodableValue(*creation_timestamp_) + : EncodableValue()); + list.push_back(last_sign_in_timestamp_ + ? EncodableValue(*last_sign_in_timestamp_) + : EncodableValue()); + return list; +} + +InternalUserInfo InternalUserInfo::FromEncodableList( + const EncodableList& list) { + InternalUserInfo decoded(std::get(list[0]), + std::get(list[5]), std::get(list[6])); + auto& encodable_email = list[1]; + if (!encodable_email.IsNull()) { + decoded.set_email(std::get(encodable_email)); + } + auto& encodable_display_name = list[2]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_photo_url = list[3]; + if (!encodable_photo_url.IsNull()) { + decoded.set_photo_url(std::get(encodable_photo_url)); + } + auto& encodable_phone_number = list[4]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_provider_id = list[7]; + if (!encodable_provider_id.IsNull()) { + decoded.set_provider_id(std::get(encodable_provider_id)); + } + auto& encodable_tenant_id = list[8]; + if (!encodable_tenant_id.IsNull()) { + decoded.set_tenant_id(std::get(encodable_tenant_id)); + } + auto& encodable_refresh_token = list[9]; + if (!encodable_refresh_token.IsNull()) { + decoded.set_refresh_token(std::get(encodable_refresh_token)); + } + auto& encodable_creation_timestamp = list[10]; + if (!encodable_creation_timestamp.IsNull()) { + decoded.set_creation_timestamp( + std::get(encodable_creation_timestamp)); + } + auto& encodable_last_sign_in_timestamp = list[11]; + if (!encodable_last_sign_in_timestamp.IsNull()) { + decoded.set_last_sign_in_timestamp( + std::get(encodable_last_sign_in_timestamp)); + } + return decoded; +} + +bool InternalUserInfo::operator==(const InternalUserInfo& other) const { + return PigeonInternalDeepEquals(uid_, other.uid_) && + PigeonInternalDeepEquals(email_, other.email_) && + PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(photo_url_, other.photo_url_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(is_anonymous_, other.is_anonymous_) && + PigeonInternalDeepEquals(is_email_verified_, + other.is_email_verified_) && + PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(tenant_id_, other.tenant_id_) && + PigeonInternalDeepEquals(refresh_token_, other.refresh_token_) && + PigeonInternalDeepEquals(creation_timestamp_, + other.creation_timestamp_) && + PigeonInternalDeepEquals(last_sign_in_timestamp_, + other.last_sign_in_timestamp_); +} + +bool InternalUserInfo::operator!=(const InternalUserInfo& other) const { + return !(*this == other); +} + +size_t InternalUserInfo::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(uid_); + result = result * 31 + PigeonInternalDeepHash(email_); + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(photo_url_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(is_anonymous_); + result = result * 31 + PigeonInternalDeepHash(is_email_verified_); + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(tenant_id_); + result = result * 31 + PigeonInternalDeepHash(refresh_token_); + result = result * 31 + PigeonInternalDeepHash(creation_timestamp_); + result = result * 31 + PigeonInternalDeepHash(last_sign_in_timestamp_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserInfo& v) { return v.Hash(); } + +// InternalUserDetails + +InternalUserDetails::InternalUserDetails(const InternalUserInfo& user_info, + const EncodableList& provider_data) + : user_info_(std::make_unique(user_info)), + provider_data_(provider_data) {} + +InternalUserDetails::InternalUserDetails(const InternalUserDetails& other) + : user_info_(std::make_unique(*other.user_info_)), + provider_data_(other.provider_data_) {} + +InternalUserDetails& InternalUserDetails::operator=( + const InternalUserDetails& other) { + user_info_ = std::make_unique(*other.user_info_); + provider_data_ = other.provider_data_; + return *this; +} + +const InternalUserInfo& InternalUserDetails::user_info() const { + return *user_info_; +} + +void InternalUserDetails::set_user_info(const InternalUserInfo& value_arg) { + user_info_ = std::make_unique(value_arg); +} + +const EncodableList& InternalUserDetails::provider_data() const { + return provider_data_; +} + +void InternalUserDetails::set_provider_data(const EncodableList& value_arg) { + provider_data_ = value_arg; +} + +EncodableList InternalUserDetails::ToEncodableList() const { + EncodableList list; + list.reserve(2); + list.push_back(CustomEncodableValue(*user_info_)); + list.push_back(EncodableValue(provider_data_)); + return list; +} + +InternalUserDetails InternalUserDetails::FromEncodableList( + const EncodableList& list) { + InternalUserDetails decoded(std::any_cast( + std::get(list[0])), + std::get(list[1])); + return decoded; +} + +bool InternalUserDetails::operator==(const InternalUserDetails& other) const { + return PigeonInternalDeepEquals(user_info_, other.user_info_) && + PigeonInternalDeepEquals(provider_data_, other.provider_data_); +} + +bool InternalUserDetails::operator!=(const InternalUserDetails& other) const { + return !(*this == other); +} + +size_t InternalUserDetails::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(user_info_); + result = result * 31 + PigeonInternalDeepHash(provider_data_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserDetails& v) { return v.Hash(); } + +// InternalUserCredential + +InternalUserCredential::InternalUserCredential() {} + +InternalUserCredential::InternalUserCredential( + const InternalUserDetails* user, + const InternalAdditionalUserInfo* additional_user_info, + const InternalAuthCredential* credential) + : user_(user ? std::make_unique(*user) : nullptr), + additional_user_info_(additional_user_info + ? std::make_unique( + *additional_user_info) + : nullptr), + credential_(credential + ? std::make_unique(*credential) + : nullptr) {} + +InternalUserCredential::InternalUserCredential( + const InternalUserCredential& other) + : user_(other.user_ ? std::make_unique(*other.user_) + : nullptr), + additional_user_info_(other.additional_user_info_ + ? std::make_unique( + *other.additional_user_info_) + : nullptr), + credential_(other.credential_ ? std::make_unique( + *other.credential_) + : nullptr) {} + +InternalUserCredential& InternalUserCredential::operator=( + const InternalUserCredential& other) { + user_ = other.user_ ? std::make_unique(*other.user_) + : nullptr; + additional_user_info_ = other.additional_user_info_ + ? std::make_unique( + *other.additional_user_info_) + : nullptr; + credential_ = + other.credential_ + ? std::make_unique(*other.credential_) + : nullptr; + return *this; +} + +const InternalUserDetails* InternalUserCredential::user() const { + return user_.get(); +} + +void InternalUserCredential::set_user(const InternalUserDetails* value_arg) { + user_ = + value_arg ? std::make_unique(*value_arg) : nullptr; +} + +void InternalUserCredential::set_user(const InternalUserDetails& value_arg) { + user_ = std::make_unique(value_arg); +} + +const InternalAdditionalUserInfo* InternalUserCredential::additional_user_info() + const { + return additional_user_info_.get(); +} + +void InternalUserCredential::set_additional_user_info( + const InternalAdditionalUserInfo* value_arg) { + additional_user_info_ = + value_arg ? std::make_unique(*value_arg) + : nullptr; +} + +void InternalUserCredential::set_additional_user_info( + const InternalAdditionalUserInfo& value_arg) { + additional_user_info_ = + std::make_unique(value_arg); +} + +const InternalAuthCredential* InternalUserCredential::credential() const { + return credential_.get(); +} + +void InternalUserCredential::set_credential( + const InternalAuthCredential* value_arg) { + credential_ = value_arg ? std::make_unique(*value_arg) + : nullptr; +} + +void InternalUserCredential::set_credential( + const InternalAuthCredential& value_arg) { + credential_ = std::make_unique(value_arg); +} + +EncodableList InternalUserCredential::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(user_ ? CustomEncodableValue(*user_) : EncodableValue()); + list.push_back(additional_user_info_ + ? CustomEncodableValue(*additional_user_info_) + : EncodableValue()); + list.push_back(credential_ ? CustomEncodableValue(*credential_) + : EncodableValue()); + return list; +} + +InternalUserCredential InternalUserCredential::FromEncodableList( + const EncodableList& list) { + InternalUserCredential decoded; + auto& encodable_user = list[0]; + if (!encodable_user.IsNull()) { + decoded.set_user(std::any_cast( + std::get(encodable_user))); + } + auto& encodable_additional_user_info = list[1]; + if (!encodable_additional_user_info.IsNull()) { + decoded.set_additional_user_info( + std::any_cast( + std::get(encodable_additional_user_info))); + } + auto& encodable_credential = list[2]; + if (!encodable_credential.IsNull()) { + decoded.set_credential(std::any_cast( + std::get(encodable_credential))); + } + return decoded; +} + +bool InternalUserCredential::operator==( + const InternalUserCredential& other) const { + return PigeonInternalDeepEquals(user_, other.user_) && + PigeonInternalDeepEquals(additional_user_info_, + other.additional_user_info_) && + PigeonInternalDeepEquals(credential_, other.credential_); +} + +bool InternalUserCredential::operator!=( + const InternalUserCredential& other) const { + return !(*this == other); +} + +size_t InternalUserCredential::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(user_); + result = result * 31 + PigeonInternalDeepHash(additional_user_info_); + result = result * 31 + PigeonInternalDeepHash(credential_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserCredential& v) { + return v.Hash(); +} + +// InternalAuthCredentialInput + +InternalAuthCredentialInput::InternalAuthCredentialInput( + const std::string& provider_id, const std::string& sign_in_method) + : provider_id_(provider_id), sign_in_method_(sign_in_method) {} + +InternalAuthCredentialInput::InternalAuthCredentialInput( + const std::string& provider_id, const std::string& sign_in_method, + const std::string* token, const std::string* access_token) + : provider_id_(provider_id), + sign_in_method_(sign_in_method), + token_(token ? std::optional(*token) : std::nullopt), + access_token_(access_token ? std::optional(*access_token) + : std::nullopt) {} + +const std::string& InternalAuthCredentialInput::provider_id() const { + return provider_id_; +} + +void InternalAuthCredentialInput::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const std::string& InternalAuthCredentialInput::sign_in_method() const { + return sign_in_method_; +} + +void InternalAuthCredentialInput::set_sign_in_method( + std::string_view value_arg) { + sign_in_method_ = value_arg; +} + +const std::string* InternalAuthCredentialInput::token() const { + return token_ ? &(*token_) : nullptr; +} + +void InternalAuthCredentialInput::set_token(const std::string_view* value_arg) { + token_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredentialInput::set_token(std::string_view value_arg) { + token_ = value_arg; +} + +const std::string* InternalAuthCredentialInput::access_token() const { + return access_token_ ? &(*access_token_) : nullptr; +} + +void InternalAuthCredentialInput::set_access_token( + const std::string_view* value_arg) { + access_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalAuthCredentialInput::set_access_token(std::string_view value_arg) { + access_token_ = value_arg; +} + +EncodableList InternalAuthCredentialInput::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(EncodableValue(provider_id_)); + list.push_back(EncodableValue(sign_in_method_)); + list.push_back(token_ ? EncodableValue(*token_) : EncodableValue()); + list.push_back(access_token_ ? EncodableValue(*access_token_) + : EncodableValue()); + return list; +} + +InternalAuthCredentialInput InternalAuthCredentialInput::FromEncodableList( + const EncodableList& list) { + InternalAuthCredentialInput decoded(std::get(list[0]), + std::get(list[1])); + auto& encodable_token = list[2]; + if (!encodable_token.IsNull()) { + decoded.set_token(std::get(encodable_token)); + } + auto& encodable_access_token = list[3]; + if (!encodable_access_token.IsNull()) { + decoded.set_access_token(std::get(encodable_access_token)); + } + return decoded; +} + +bool InternalAuthCredentialInput::operator==( + const InternalAuthCredentialInput& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(sign_in_method_, other.sign_in_method_) && + PigeonInternalDeepEquals(token_, other.token_) && + PigeonInternalDeepEquals(access_token_, other.access_token_); +} + +bool InternalAuthCredentialInput::operator!=( + const InternalAuthCredentialInput& other) const { + return !(*this == other); +} + +size_t InternalAuthCredentialInput::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(sign_in_method_); + result = result * 31 + PigeonInternalDeepHash(token_); + result = result * 31 + PigeonInternalDeepHash(access_token_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalAuthCredentialInput& v) { + return v.Hash(); +} + +// InternalActionCodeSettings + +InternalActionCodeSettings::InternalActionCodeSettings(const std::string& url, + bool handle_code_in_app, + bool android_install_app) + : url_(url), + handle_code_in_app_(handle_code_in_app), + android_install_app_(android_install_app) {} + +InternalActionCodeSettings::InternalActionCodeSettings( + const std::string& url, const std::string* dynamic_link_domain, + bool handle_code_in_app, const std::string* i_o_s_bundle_id, + const std::string* android_package_name, bool android_install_app, + const std::string* android_minimum_version, const std::string* link_domain) + : url_(url), + dynamic_link_domain_( + dynamic_link_domain ? std::optional(*dynamic_link_domain) + : std::nullopt), + handle_code_in_app_(handle_code_in_app), + i_o_s_bundle_id_(i_o_s_bundle_id + ? std::optional(*i_o_s_bundle_id) + : std::nullopt), + android_package_name_(android_package_name ? std::optional( + *android_package_name) + : std::nullopt), + android_install_app_(android_install_app), + android_minimum_version_( + android_minimum_version + ? std::optional(*android_minimum_version) + : std::nullopt), + link_domain_(link_domain ? std::optional(*link_domain) + : std::nullopt) {} + +const std::string& InternalActionCodeSettings::url() const { return url_; } + +void InternalActionCodeSettings::set_url(std::string_view value_arg) { + url_ = value_arg; +} + +const std::string* InternalActionCodeSettings::dynamic_link_domain() const { + return dynamic_link_domain_ ? &(*dynamic_link_domain_) : nullptr; +} + +void InternalActionCodeSettings::set_dynamic_link_domain( + const std::string_view* value_arg) { + dynamic_link_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_dynamic_link_domain( + std::string_view value_arg) { + dynamic_link_domain_ = value_arg; +} + +bool InternalActionCodeSettings::handle_code_in_app() const { + return handle_code_in_app_; +} + +void InternalActionCodeSettings::set_handle_code_in_app(bool value_arg) { + handle_code_in_app_ = value_arg; +} + +const std::string* InternalActionCodeSettings::i_o_s_bundle_id() const { + return i_o_s_bundle_id_ ? &(*i_o_s_bundle_id_) : nullptr; +} + +void InternalActionCodeSettings::set_i_o_s_bundle_id( + const std::string_view* value_arg) { + i_o_s_bundle_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_i_o_s_bundle_id( + std::string_view value_arg) { + i_o_s_bundle_id_ = value_arg; +} + +const std::string* InternalActionCodeSettings::android_package_name() const { + return android_package_name_ ? &(*android_package_name_) : nullptr; +} + +void InternalActionCodeSettings::set_android_package_name( + const std::string_view* value_arg) { + android_package_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_android_package_name( + std::string_view value_arg) { + android_package_name_ = value_arg; +} + +bool InternalActionCodeSettings::android_install_app() const { + return android_install_app_; +} + +void InternalActionCodeSettings::set_android_install_app(bool value_arg) { + android_install_app_ = value_arg; +} + +const std::string* InternalActionCodeSettings::android_minimum_version() const { + return android_minimum_version_ ? &(*android_minimum_version_) : nullptr; +} + +void InternalActionCodeSettings::set_android_minimum_version( + const std::string_view* value_arg) { + android_minimum_version_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_android_minimum_version( + std::string_view value_arg) { + android_minimum_version_ = value_arg; +} + +const std::string* InternalActionCodeSettings::link_domain() const { + return link_domain_ ? &(*link_domain_) : nullptr; +} + +void InternalActionCodeSettings::set_link_domain( + const std::string_view* value_arg) { + link_domain_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalActionCodeSettings::set_link_domain(std::string_view value_arg) { + link_domain_ = value_arg; +} + +EncodableList InternalActionCodeSettings::ToEncodableList() const { + EncodableList list; + list.reserve(8); + list.push_back(EncodableValue(url_)); + list.push_back(dynamic_link_domain_ ? EncodableValue(*dynamic_link_domain_) + : EncodableValue()); + list.push_back(EncodableValue(handle_code_in_app_)); + list.push_back(i_o_s_bundle_id_ ? EncodableValue(*i_o_s_bundle_id_) + : EncodableValue()); + list.push_back(android_package_name_ ? EncodableValue(*android_package_name_) + : EncodableValue()); + list.push_back(EncodableValue(android_install_app_)); + list.push_back(android_minimum_version_ + ? EncodableValue(*android_minimum_version_) + : EncodableValue()); + list.push_back(link_domain_ ? EncodableValue(*link_domain_) + : EncodableValue()); + return list; +} + +InternalActionCodeSettings InternalActionCodeSettings::FromEncodableList( + const EncodableList& list) { + InternalActionCodeSettings decoded(std::get(list[0]), + std::get(list[2]), + std::get(list[5])); + auto& encodable_dynamic_link_domain = list[1]; + if (!encodable_dynamic_link_domain.IsNull()) { + decoded.set_dynamic_link_domain( + std::get(encodable_dynamic_link_domain)); + } + auto& encodable_i_o_s_bundle_id = list[3]; + if (!encodable_i_o_s_bundle_id.IsNull()) { + decoded.set_i_o_s_bundle_id( + std::get(encodable_i_o_s_bundle_id)); + } + auto& encodable_android_package_name = list[4]; + if (!encodable_android_package_name.IsNull()) { + decoded.set_android_package_name( + std::get(encodable_android_package_name)); + } + auto& encodable_android_minimum_version = list[6]; + if (!encodable_android_minimum_version.IsNull()) { + decoded.set_android_minimum_version( + std::get(encodable_android_minimum_version)); + } + auto& encodable_link_domain = list[7]; + if (!encodable_link_domain.IsNull()) { + decoded.set_link_domain(std::get(encodable_link_domain)); + } + return decoded; +} + +bool InternalActionCodeSettings::operator==( + const InternalActionCodeSettings& other) const { + return PigeonInternalDeepEquals(url_, other.url_) && + PigeonInternalDeepEquals(dynamic_link_domain_, + other.dynamic_link_domain_) && + PigeonInternalDeepEquals(handle_code_in_app_, + other.handle_code_in_app_) && + PigeonInternalDeepEquals(i_o_s_bundle_id_, other.i_o_s_bundle_id_) && + PigeonInternalDeepEquals(android_package_name_, + other.android_package_name_) && + PigeonInternalDeepEquals(android_install_app_, + other.android_install_app_) && + PigeonInternalDeepEquals(android_minimum_version_, + other.android_minimum_version_) && + PigeonInternalDeepEquals(link_domain_, other.link_domain_); +} + +bool InternalActionCodeSettings::operator!=( + const InternalActionCodeSettings& other) const { + return !(*this == other); +} + +size_t InternalActionCodeSettings::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(url_); + result = result * 31 + PigeonInternalDeepHash(dynamic_link_domain_); + result = result * 31 + PigeonInternalDeepHash(handle_code_in_app_); + result = result * 31 + PigeonInternalDeepHash(i_o_s_bundle_id_); + result = result * 31 + PigeonInternalDeepHash(android_package_name_); + result = result * 31 + PigeonInternalDeepHash(android_install_app_); + result = result * 31 + PigeonInternalDeepHash(android_minimum_version_); + result = result * 31 + PigeonInternalDeepHash(link_domain_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalActionCodeSettings& v) { + return v.Hash(); +} + +// InternalFirebaseAuthSettings + +InternalFirebaseAuthSettings::InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing) + : app_verification_disabled_for_testing_( + app_verification_disabled_for_testing) {} + +InternalFirebaseAuthSettings::InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing, + const std::string* user_access_group, const std::string* phone_number, + const std::string* sms_code, const bool* force_recaptcha_flow) + : app_verification_disabled_for_testing_( + app_verification_disabled_for_testing), + user_access_group_(user_access_group + ? std::optional(*user_access_group) + : std::nullopt), + phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + sms_code_(sms_code ? std::optional(*sms_code) + : std::nullopt), + force_recaptcha_flow_(force_recaptcha_flow + ? std::optional(*force_recaptcha_flow) + : std::nullopt) {} + +bool InternalFirebaseAuthSettings::app_verification_disabled_for_testing() + const { + return app_verification_disabled_for_testing_; +} + +void InternalFirebaseAuthSettings::set_app_verification_disabled_for_testing( + bool value_arg) { + app_verification_disabled_for_testing_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::user_access_group() const { + return user_access_group_ ? &(*user_access_group_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_user_access_group( + const std::string_view* value_arg) { + user_access_group_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_user_access_group( + std::string_view value_arg) { + user_access_group_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_phone_number( + std::string_view value_arg) { + phone_number_ = value_arg; +} + +const std::string* InternalFirebaseAuthSettings::sms_code() const { + return sms_code_ ? &(*sms_code_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_sms_code( + const std::string_view* value_arg) { + sms_code_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_sms_code(std::string_view value_arg) { + sms_code_ = value_arg; +} + +const bool* InternalFirebaseAuthSettings::force_recaptcha_flow() const { + return force_recaptcha_flow_ ? &(*force_recaptcha_flow_) : nullptr; +} + +void InternalFirebaseAuthSettings::set_force_recaptcha_flow( + const bool* value_arg) { + force_recaptcha_flow_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalFirebaseAuthSettings::set_force_recaptcha_flow(bool value_arg) { + force_recaptcha_flow_ = value_arg; +} + +EncodableList InternalFirebaseAuthSettings::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(EncodableValue(app_verification_disabled_for_testing_)); + list.push_back(user_access_group_ ? EncodableValue(*user_access_group_) + : EncodableValue()); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(sms_code_ ? EncodableValue(*sms_code_) : EncodableValue()); + list.push_back(force_recaptcha_flow_ ? EncodableValue(*force_recaptcha_flow_) + : EncodableValue()); + return list; +} + +InternalFirebaseAuthSettings InternalFirebaseAuthSettings::FromEncodableList( + const EncodableList& list) { + InternalFirebaseAuthSettings decoded(std::get(list[0])); + auto& encodable_user_access_group = list[1]; + if (!encodable_user_access_group.IsNull()) { + decoded.set_user_access_group( + std::get(encodable_user_access_group)); + } + auto& encodable_phone_number = list[2]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_sms_code = list[3]; + if (!encodable_sms_code.IsNull()) { + decoded.set_sms_code(std::get(encodable_sms_code)); + } + auto& encodable_force_recaptcha_flow = list[4]; + if (!encodable_force_recaptcha_flow.IsNull()) { + decoded.set_force_recaptcha_flow( + std::get(encodable_force_recaptcha_flow)); + } + return decoded; +} + +bool InternalFirebaseAuthSettings::operator==( + const InternalFirebaseAuthSettings& other) const { + return PigeonInternalDeepEquals( + app_verification_disabled_for_testing_, + other.app_verification_disabled_for_testing_) && + PigeonInternalDeepEquals(user_access_group_, + other.user_access_group_) && + PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(sms_code_, other.sms_code_) && + PigeonInternalDeepEquals(force_recaptcha_flow_, + other.force_recaptcha_flow_); +} + +bool InternalFirebaseAuthSettings::operator!=( + const InternalFirebaseAuthSettings& other) const { + return !(*this == other); +} + +size_t InternalFirebaseAuthSettings::Hash() const { + size_t result = 1; + result = result * 31 + + PigeonInternalDeepHash(app_verification_disabled_for_testing_); + result = result * 31 + PigeonInternalDeepHash(user_access_group_); + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(sms_code_); + result = result * 31 + PigeonInternalDeepHash(force_recaptcha_flow_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalFirebaseAuthSettings& v) { + return v.Hash(); +} + +// InternalSignInProvider + +InternalSignInProvider::InternalSignInProvider(const std::string& provider_id) + : provider_id_(provider_id) {} + +InternalSignInProvider::InternalSignInProvider( + const std::string& provider_id, const EncodableList* scopes, + const EncodableMap* custom_parameters) + : provider_id_(provider_id), + scopes_(scopes ? std::optional(*scopes) : std::nullopt), + custom_parameters_(custom_parameters + ? std::optional(*custom_parameters) + : std::nullopt) {} + +const std::string& InternalSignInProvider::provider_id() const { + return provider_id_; +} + +void InternalSignInProvider::set_provider_id(std::string_view value_arg) { + provider_id_ = value_arg; +} + +const EncodableList* InternalSignInProvider::scopes() const { + return scopes_ ? &(*scopes_) : nullptr; +} + +void InternalSignInProvider::set_scopes(const EncodableList* value_arg) { + scopes_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalSignInProvider::set_scopes(const EncodableList& value_arg) { + scopes_ = value_arg; +} + +const EncodableMap* InternalSignInProvider::custom_parameters() const { + return custom_parameters_ ? &(*custom_parameters_) : nullptr; +} + +void InternalSignInProvider::set_custom_parameters( + const EncodableMap* value_arg) { + custom_parameters_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalSignInProvider::set_custom_parameters( + const EncodableMap& value_arg) { + custom_parameters_ = value_arg; +} + +EncodableList InternalSignInProvider::ToEncodableList() const { + EncodableList list; + list.reserve(3); + list.push_back(EncodableValue(provider_id_)); + list.push_back(scopes_ ? EncodableValue(*scopes_) : EncodableValue()); + list.push_back(custom_parameters_ ? EncodableValue(*custom_parameters_) + : EncodableValue()); + return list; +} + +InternalSignInProvider InternalSignInProvider::FromEncodableList( + const EncodableList& list) { + InternalSignInProvider decoded(std::get(list[0])); + auto& encodable_scopes = list[1]; + if (!encodable_scopes.IsNull()) { + decoded.set_scopes(std::get(encodable_scopes)); + } + auto& encodable_custom_parameters = list[2]; + if (!encodable_custom_parameters.IsNull()) { + decoded.set_custom_parameters( + std::get(encodable_custom_parameters)); + } + return decoded; +} + +bool InternalSignInProvider::operator==( + const InternalSignInProvider& other) const { + return PigeonInternalDeepEquals(provider_id_, other.provider_id_) && + PigeonInternalDeepEquals(scopes_, other.scopes_) && + PigeonInternalDeepEquals(custom_parameters_, other.custom_parameters_); +} + +bool InternalSignInProvider::operator!=( + const InternalSignInProvider& other) const { + return !(*this == other); +} + +size_t InternalSignInProvider::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(provider_id_); + result = result * 31 + PigeonInternalDeepHash(scopes_); + result = result * 31 + PigeonInternalDeepHash(custom_parameters_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalSignInProvider& v) { + return v.Hash(); +} + +// InternalVerifyPhoneNumberRequest + +InternalVerifyPhoneNumberRequest::InternalVerifyPhoneNumberRequest( + int64_t timeout) + : timeout_(timeout) {} + +InternalVerifyPhoneNumberRequest::InternalVerifyPhoneNumberRequest( + const std::string* phone_number, int64_t timeout, + const int64_t* force_resending_token, + const std::string* auto_retrieved_sms_code_for_testing, + const std::string* multi_factor_info_id, + const std::string* multi_factor_session_id) + : phone_number_(phone_number ? std::optional(*phone_number) + : std::nullopt), + timeout_(timeout), + force_resending_token_( + force_resending_token ? std::optional(*force_resending_token) + : std::nullopt), + auto_retrieved_sms_code_for_testing_( + auto_retrieved_sms_code_for_testing + ? std::optional(*auto_retrieved_sms_code_for_testing) + : std::nullopt), + multi_factor_info_id_(multi_factor_info_id ? std::optional( + *multi_factor_info_id) + : std::nullopt), + multi_factor_session_id_( + multi_factor_session_id + ? std::optional(*multi_factor_session_id) + : std::nullopt) {} + +const std::string* InternalVerifyPhoneNumberRequest::phone_number() const { + return phone_number_ ? &(*phone_number_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_phone_number( + const std::string_view* value_arg) { + phone_number_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_phone_number( + std::string_view value_arg) { + phone_number_ = value_arg; +} + +int64_t InternalVerifyPhoneNumberRequest::timeout() const { return timeout_; } + +void InternalVerifyPhoneNumberRequest::set_timeout(int64_t value_arg) { + timeout_ = value_arg; +} + +const int64_t* InternalVerifyPhoneNumberRequest::force_resending_token() const { + return force_resending_token_ ? &(*force_resending_token_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_force_resending_token( + const int64_t* value_arg) { + force_resending_token_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_force_resending_token( + int64_t value_arg) { + force_resending_token_ = value_arg; +} + +const std::string* +InternalVerifyPhoneNumberRequest::auto_retrieved_sms_code_for_testing() const { + return auto_retrieved_sms_code_for_testing_ + ? &(*auto_retrieved_sms_code_for_testing_) + : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_auto_retrieved_sms_code_for_testing( + const std::string_view* value_arg) { + auto_retrieved_sms_code_for_testing_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_auto_retrieved_sms_code_for_testing( + std::string_view value_arg) { + auto_retrieved_sms_code_for_testing_ = value_arg; +} + +const std::string* InternalVerifyPhoneNumberRequest::multi_factor_info_id() + const { + return multi_factor_info_id_ ? &(*multi_factor_info_id_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_info_id( + const std::string_view* value_arg) { + multi_factor_info_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_info_id( + std::string_view value_arg) { + multi_factor_info_id_ = value_arg; +} + +const std::string* InternalVerifyPhoneNumberRequest::multi_factor_session_id() + const { + return multi_factor_session_id_ ? &(*multi_factor_session_id_) : nullptr; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_session_id( + const std::string_view* value_arg) { + multi_factor_session_id_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalVerifyPhoneNumberRequest::set_multi_factor_session_id( + std::string_view value_arg) { + multi_factor_session_id_ = value_arg; +} + +EncodableList InternalVerifyPhoneNumberRequest::ToEncodableList() const { + EncodableList list; + list.reserve(6); + list.push_back(phone_number_ ? EncodableValue(*phone_number_) + : EncodableValue()); + list.push_back(EncodableValue(timeout_)); + list.push_back(force_resending_token_ + ? EncodableValue(*force_resending_token_) + : EncodableValue()); + list.push_back(auto_retrieved_sms_code_for_testing_ + ? EncodableValue(*auto_retrieved_sms_code_for_testing_) + : EncodableValue()); + list.push_back(multi_factor_info_id_ ? EncodableValue(*multi_factor_info_id_) + : EncodableValue()); + list.push_back(multi_factor_session_id_ + ? EncodableValue(*multi_factor_session_id_) + : EncodableValue()); + return list; +} + +InternalVerifyPhoneNumberRequest +InternalVerifyPhoneNumberRequest::FromEncodableList(const EncodableList& list) { + InternalVerifyPhoneNumberRequest decoded(std::get(list[1])); + auto& encodable_phone_number = list[0]; + if (!encodable_phone_number.IsNull()) { + decoded.set_phone_number(std::get(encodable_phone_number)); + } + auto& encodable_force_resending_token = list[2]; + if (!encodable_force_resending_token.IsNull()) { + decoded.set_force_resending_token( + std::get(encodable_force_resending_token)); + } + auto& encodable_auto_retrieved_sms_code_for_testing = list[3]; + if (!encodable_auto_retrieved_sms_code_for_testing.IsNull()) { + decoded.set_auto_retrieved_sms_code_for_testing( + std::get(encodable_auto_retrieved_sms_code_for_testing)); + } + auto& encodable_multi_factor_info_id = list[4]; + if (!encodable_multi_factor_info_id.IsNull()) { + decoded.set_multi_factor_info_id( + std::get(encodable_multi_factor_info_id)); + } + auto& encodable_multi_factor_session_id = list[5]; + if (!encodable_multi_factor_session_id.IsNull()) { + decoded.set_multi_factor_session_id( + std::get(encodable_multi_factor_session_id)); + } + return decoded; +} + +bool InternalVerifyPhoneNumberRequest::operator==( + const InternalVerifyPhoneNumberRequest& other) const { + return PigeonInternalDeepEquals(phone_number_, other.phone_number_) && + PigeonInternalDeepEquals(timeout_, other.timeout_) && + PigeonInternalDeepEquals(force_resending_token_, + other.force_resending_token_) && + PigeonInternalDeepEquals(auto_retrieved_sms_code_for_testing_, + other.auto_retrieved_sms_code_for_testing_) && + PigeonInternalDeepEquals(multi_factor_info_id_, + other.multi_factor_info_id_) && + PigeonInternalDeepEquals(multi_factor_session_id_, + other.multi_factor_session_id_); +} + +bool InternalVerifyPhoneNumberRequest::operator!=( + const InternalVerifyPhoneNumberRequest& other) const { + return !(*this == other); +} + +size_t InternalVerifyPhoneNumberRequest::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(phone_number_); + result = result * 31 + PigeonInternalDeepHash(timeout_); + result = result * 31 + PigeonInternalDeepHash(force_resending_token_); + result = result * 31 + + PigeonInternalDeepHash(auto_retrieved_sms_code_for_testing_); + result = result * 31 + PigeonInternalDeepHash(multi_factor_info_id_); + result = result * 31 + PigeonInternalDeepHash(multi_factor_session_id_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalVerifyPhoneNumberRequest& v) { + return v.Hash(); +} + +// InternalIdTokenResult + +InternalIdTokenResult::InternalIdTokenResult() {} + +InternalIdTokenResult::InternalIdTokenResult( + const std::string* token, const int64_t* expiration_timestamp, + const int64_t* auth_timestamp, const int64_t* issued_at_timestamp, + const std::string* sign_in_provider, const EncodableMap* claims, + const std::string* sign_in_second_factor) + : token_(token ? std::optional(*token) : std::nullopt), + expiration_timestamp_(expiration_timestamp + ? std::optional(*expiration_timestamp) + : std::nullopt), + auth_timestamp_(auth_timestamp ? std::optional(*auth_timestamp) + : std::nullopt), + issued_at_timestamp_(issued_at_timestamp + ? std::optional(*issued_at_timestamp) + : std::nullopt), + sign_in_provider_(sign_in_provider + ? std::optional(*sign_in_provider) + : std::nullopt), + claims_(claims ? std::optional(*claims) : std::nullopt), + sign_in_second_factor_(sign_in_second_factor ? std::optional( + *sign_in_second_factor) + : std::nullopt) {} + +const std::string* InternalIdTokenResult::token() const { + return token_ ? &(*token_) : nullptr; +} + +void InternalIdTokenResult::set_token(const std::string_view* value_arg) { + token_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_token(std::string_view value_arg) { + token_ = value_arg; +} + +const int64_t* InternalIdTokenResult::expiration_timestamp() const { + return expiration_timestamp_ ? &(*expiration_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_expiration_timestamp(const int64_t* value_arg) { + expiration_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_expiration_timestamp(int64_t value_arg) { + expiration_timestamp_ = value_arg; +} + +const int64_t* InternalIdTokenResult::auth_timestamp() const { + return auth_timestamp_ ? &(*auth_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_auth_timestamp(const int64_t* value_arg) { + auth_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_auth_timestamp(int64_t value_arg) { + auth_timestamp_ = value_arg; +} + +const int64_t* InternalIdTokenResult::issued_at_timestamp() const { + return issued_at_timestamp_ ? &(*issued_at_timestamp_) : nullptr; +} + +void InternalIdTokenResult::set_issued_at_timestamp(const int64_t* value_arg) { + issued_at_timestamp_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_issued_at_timestamp(int64_t value_arg) { + issued_at_timestamp_ = value_arg; +} + +const std::string* InternalIdTokenResult::sign_in_provider() const { + return sign_in_provider_ ? &(*sign_in_provider_) : nullptr; +} + +void InternalIdTokenResult::set_sign_in_provider( + const std::string_view* value_arg) { + sign_in_provider_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_sign_in_provider(std::string_view value_arg) { + sign_in_provider_ = value_arg; +} + +const EncodableMap* InternalIdTokenResult::claims() const { + return claims_ ? &(*claims_) : nullptr; +} + +void InternalIdTokenResult::set_claims(const EncodableMap* value_arg) { + claims_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_claims(const EncodableMap& value_arg) { + claims_ = value_arg; +} + +const std::string* InternalIdTokenResult::sign_in_second_factor() const { + return sign_in_second_factor_ ? &(*sign_in_second_factor_) : nullptr; +} + +void InternalIdTokenResult::set_sign_in_second_factor( + const std::string_view* value_arg) { + sign_in_second_factor_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalIdTokenResult::set_sign_in_second_factor( + std::string_view value_arg) { + sign_in_second_factor_ = value_arg; +} + +EncodableList InternalIdTokenResult::ToEncodableList() const { + EncodableList list; + list.reserve(7); + list.push_back(token_ ? EncodableValue(*token_) : EncodableValue()); + list.push_back(expiration_timestamp_ ? EncodableValue(*expiration_timestamp_) + : EncodableValue()); + list.push_back(auth_timestamp_ ? EncodableValue(*auth_timestamp_) + : EncodableValue()); + list.push_back(issued_at_timestamp_ ? EncodableValue(*issued_at_timestamp_) + : EncodableValue()); + list.push_back(sign_in_provider_ ? EncodableValue(*sign_in_provider_) + : EncodableValue()); + list.push_back(claims_ ? EncodableValue(*claims_) : EncodableValue()); + list.push_back(sign_in_second_factor_ + ? EncodableValue(*sign_in_second_factor_) + : EncodableValue()); + return list; +} + +InternalIdTokenResult InternalIdTokenResult::FromEncodableList( + const EncodableList& list) { + InternalIdTokenResult decoded; + auto& encodable_token = list[0]; + if (!encodable_token.IsNull()) { + decoded.set_token(std::get(encodable_token)); + } + auto& encodable_expiration_timestamp = list[1]; + if (!encodable_expiration_timestamp.IsNull()) { + decoded.set_expiration_timestamp( + std::get(encodable_expiration_timestamp)); + } + auto& encodable_auth_timestamp = list[2]; + if (!encodable_auth_timestamp.IsNull()) { + decoded.set_auth_timestamp(std::get(encodable_auth_timestamp)); + } + auto& encodable_issued_at_timestamp = list[3]; + if (!encodable_issued_at_timestamp.IsNull()) { + decoded.set_issued_at_timestamp( + std::get(encodable_issued_at_timestamp)); + } + auto& encodable_sign_in_provider = list[4]; + if (!encodable_sign_in_provider.IsNull()) { + decoded.set_sign_in_provider( + std::get(encodable_sign_in_provider)); + } + auto& encodable_claims = list[5]; + if (!encodable_claims.IsNull()) { + decoded.set_claims(std::get(encodable_claims)); + } + auto& encodable_sign_in_second_factor = list[6]; + if (!encodable_sign_in_second_factor.IsNull()) { + decoded.set_sign_in_second_factor( + std::get(encodable_sign_in_second_factor)); + } + return decoded; +} + +bool InternalIdTokenResult::operator==( + const InternalIdTokenResult& other) const { + return PigeonInternalDeepEquals(token_, other.token_) && + PigeonInternalDeepEquals(expiration_timestamp_, + other.expiration_timestamp_) && + PigeonInternalDeepEquals(auth_timestamp_, other.auth_timestamp_) && + PigeonInternalDeepEquals(issued_at_timestamp_, + other.issued_at_timestamp_) && + PigeonInternalDeepEquals(sign_in_provider_, other.sign_in_provider_) && + PigeonInternalDeepEquals(claims_, other.claims_) && + PigeonInternalDeepEquals(sign_in_second_factor_, + other.sign_in_second_factor_); +} + +bool InternalIdTokenResult::operator!=( + const InternalIdTokenResult& other) const { + return !(*this == other); +} + +size_t InternalIdTokenResult::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(token_); + result = result * 31 + PigeonInternalDeepHash(expiration_timestamp_); + result = result * 31 + PigeonInternalDeepHash(auth_timestamp_); + result = result * 31 + PigeonInternalDeepHash(issued_at_timestamp_); + result = result * 31 + PigeonInternalDeepHash(sign_in_provider_); + result = result * 31 + PigeonInternalDeepHash(claims_); + result = result * 31 + PigeonInternalDeepHash(sign_in_second_factor_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalIdTokenResult& v) { + return v.Hash(); +} + +// InternalUserProfile + +InternalUserProfile::InternalUserProfile(bool display_name_changed, + bool photo_url_changed) + : display_name_changed_(display_name_changed), + photo_url_changed_(photo_url_changed) {} + +InternalUserProfile::InternalUserProfile(const std::string* display_name, + const std::string* photo_url, + bool display_name_changed, + bool photo_url_changed) + : display_name_(display_name ? std::optional(*display_name) + : std::nullopt), + photo_url_(photo_url ? std::optional(*photo_url) + : std::nullopt), + display_name_changed_(display_name_changed), + photo_url_changed_(photo_url_changed) {} + +const std::string* InternalUserProfile::display_name() const { + return display_name_ ? &(*display_name_) : nullptr; +} + +void InternalUserProfile::set_display_name(const std::string_view* value_arg) { + display_name_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserProfile::set_display_name(std::string_view value_arg) { + display_name_ = value_arg; +} + +const std::string* InternalUserProfile::photo_url() const { + return photo_url_ ? &(*photo_url_) : nullptr; +} + +void InternalUserProfile::set_photo_url(const std::string_view* value_arg) { + photo_url_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalUserProfile::set_photo_url(std::string_view value_arg) { + photo_url_ = value_arg; +} + +bool InternalUserProfile::display_name_changed() const { + return display_name_changed_; +} + +void InternalUserProfile::set_display_name_changed(bool value_arg) { + display_name_changed_ = value_arg; +} + +bool InternalUserProfile::photo_url_changed() const { + return photo_url_changed_; +} + +void InternalUserProfile::set_photo_url_changed(bool value_arg) { + photo_url_changed_ = value_arg; +} + +EncodableList InternalUserProfile::ToEncodableList() const { + EncodableList list; + list.reserve(4); + list.push_back(display_name_ ? EncodableValue(*display_name_) + : EncodableValue()); + list.push_back(photo_url_ ? EncodableValue(*photo_url_) : EncodableValue()); + list.push_back(EncodableValue(display_name_changed_)); + list.push_back(EncodableValue(photo_url_changed_)); + return list; +} + +InternalUserProfile InternalUserProfile::FromEncodableList( + const EncodableList& list) { + InternalUserProfile decoded(std::get(list[2]), std::get(list[3])); + auto& encodable_display_name = list[0]; + if (!encodable_display_name.IsNull()) { + decoded.set_display_name(std::get(encodable_display_name)); + } + auto& encodable_photo_url = list[1]; + if (!encodable_photo_url.IsNull()) { + decoded.set_photo_url(std::get(encodable_photo_url)); + } + return decoded; +} + +bool InternalUserProfile::operator==(const InternalUserProfile& other) const { + return PigeonInternalDeepEquals(display_name_, other.display_name_) && + PigeonInternalDeepEquals(photo_url_, other.photo_url_) && + PigeonInternalDeepEquals(display_name_changed_, + other.display_name_changed_) && + PigeonInternalDeepEquals(photo_url_changed_, other.photo_url_changed_); +} + +bool InternalUserProfile::operator!=(const InternalUserProfile& other) const { + return !(*this == other); +} + +size_t InternalUserProfile::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(display_name_); + result = result * 31 + PigeonInternalDeepHash(photo_url_); + result = result * 31 + PigeonInternalDeepHash(display_name_changed_); + result = result * 31 + PigeonInternalDeepHash(photo_url_changed_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalUserProfile& v) { return v.Hash(); } + +// InternalTotpSecret + +InternalTotpSecret::InternalTotpSecret(const std::string& secret_key) + : secret_key_(secret_key) {} + +InternalTotpSecret::InternalTotpSecret( + const int64_t* code_interval_seconds, const int64_t* code_length, + const int64_t* enrollment_completion_deadline, + const std::string* hashing_algorithm, const std::string& secret_key) + : code_interval_seconds_( + code_interval_seconds ? std::optional(*code_interval_seconds) + : std::nullopt), + code_length_(code_length ? std::optional(*code_length) + : std::nullopt), + enrollment_completion_deadline_( + enrollment_completion_deadline + ? std::optional(*enrollment_completion_deadline) + : std::nullopt), + hashing_algorithm_(hashing_algorithm + ? std::optional(*hashing_algorithm) + : std::nullopt), + secret_key_(secret_key) {} + +const int64_t* InternalTotpSecret::code_interval_seconds() const { + return code_interval_seconds_ ? &(*code_interval_seconds_) : nullptr; +} + +void InternalTotpSecret::set_code_interval_seconds(const int64_t* value_arg) { + code_interval_seconds_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_code_interval_seconds(int64_t value_arg) { + code_interval_seconds_ = value_arg; +} + +const int64_t* InternalTotpSecret::code_length() const { + return code_length_ ? &(*code_length_) : nullptr; +} + +void InternalTotpSecret::set_code_length(const int64_t* value_arg) { + code_length_ = value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_code_length(int64_t value_arg) { + code_length_ = value_arg; +} + +const int64_t* InternalTotpSecret::enrollment_completion_deadline() const { + return enrollment_completion_deadline_ ? &(*enrollment_completion_deadline_) + : nullptr; +} + +void InternalTotpSecret::set_enrollment_completion_deadline( + const int64_t* value_arg) { + enrollment_completion_deadline_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_enrollment_completion_deadline(int64_t value_arg) { + enrollment_completion_deadline_ = value_arg; +} + +const std::string* InternalTotpSecret::hashing_algorithm() const { + return hashing_algorithm_ ? &(*hashing_algorithm_) : nullptr; +} + +void InternalTotpSecret::set_hashing_algorithm( + const std::string_view* value_arg) { + hashing_algorithm_ = + value_arg ? std::optional(*value_arg) : std::nullopt; +} + +void InternalTotpSecret::set_hashing_algorithm(std::string_view value_arg) { + hashing_algorithm_ = value_arg; +} + +const std::string& InternalTotpSecret::secret_key() const { + return secret_key_; +} + +void InternalTotpSecret::set_secret_key(std::string_view value_arg) { + secret_key_ = value_arg; +} + +EncodableList InternalTotpSecret::ToEncodableList() const { + EncodableList list; + list.reserve(5); + list.push_back(code_interval_seconds_ + ? EncodableValue(*code_interval_seconds_) + : EncodableValue()); + list.push_back(code_length_ ? EncodableValue(*code_length_) + : EncodableValue()); + list.push_back(enrollment_completion_deadline_ + ? EncodableValue(*enrollment_completion_deadline_) + : EncodableValue()); + list.push_back(hashing_algorithm_ ? EncodableValue(*hashing_algorithm_) + : EncodableValue()); + list.push_back(EncodableValue(secret_key_)); + return list; +} + +InternalTotpSecret InternalTotpSecret::FromEncodableList( + const EncodableList& list) { + InternalTotpSecret decoded(std::get(list[4])); + auto& encodable_code_interval_seconds = list[0]; + if (!encodable_code_interval_seconds.IsNull()) { + decoded.set_code_interval_seconds( + std::get(encodable_code_interval_seconds)); + } + auto& encodable_code_length = list[1]; + if (!encodable_code_length.IsNull()) { + decoded.set_code_length(std::get(encodable_code_length)); + } + auto& encodable_enrollment_completion_deadline = list[2]; + if (!encodable_enrollment_completion_deadline.IsNull()) { + decoded.set_enrollment_completion_deadline( + std::get(encodable_enrollment_completion_deadline)); + } + auto& encodable_hashing_algorithm = list[3]; + if (!encodable_hashing_algorithm.IsNull()) { + decoded.set_hashing_algorithm( + std::get(encodable_hashing_algorithm)); + } + return decoded; +} + +bool InternalTotpSecret::operator==(const InternalTotpSecret& other) const { + return PigeonInternalDeepEquals(code_interval_seconds_, + other.code_interval_seconds_) && + PigeonInternalDeepEquals(code_length_, other.code_length_) && + PigeonInternalDeepEquals(enrollment_completion_deadline_, + other.enrollment_completion_deadline_) && + PigeonInternalDeepEquals(hashing_algorithm_, + other.hashing_algorithm_) && + PigeonInternalDeepEquals(secret_key_, other.secret_key_); +} + +bool InternalTotpSecret::operator!=(const InternalTotpSecret& other) const { + return !(*this == other); +} + +size_t InternalTotpSecret::Hash() const { + size_t result = 1; + result = result * 31 + PigeonInternalDeepHash(code_interval_seconds_); + result = result * 31 + PigeonInternalDeepHash(code_length_); + result = + result * 31 + PigeonInternalDeepHash(enrollment_completion_deadline_); + result = result * 31 + PigeonInternalDeepHash(hashing_algorithm_); + result = result * 31 + PigeonInternalDeepHash(secret_key_); + return result; +} + +size_t PigeonInternalDeepHash(const InternalTotpSecret& v) { return v.Hash(); } + +PigeonInternalCodecSerializer::PigeonInternalCodecSerializer() {} + +EncodableValue PigeonInternalCodecSerializer::ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const { + switch (type) { + case 129: { + const auto& encodable_enum_arg = ReadValue(stream); + const int64_t enum_arg_value = + encodable_enum_arg.IsNull() ? 0 : encodable_enum_arg.LongValue(); + return encodable_enum_arg.IsNull() + ? EncodableValue() + : CustomEncodableValue( + static_cast(enum_arg_value)); + } + case 130: { + return CustomEncodableValue(InternalMultiFactorSession::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 131: { + return CustomEncodableValue( + InternalPhoneMultiFactorAssertion::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 132: { + return CustomEncodableValue(InternalMultiFactorInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 133: { + return CustomEncodableValue(AuthPigeonFirebaseApp::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 134: { + return CustomEncodableValue(InternalActionCodeInfoData::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 135: { + return CustomEncodableValue(InternalActionCodeInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 136: { + return CustomEncodableValue(InternalAdditionalUserInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 137: { + return CustomEncodableValue(InternalAuthCredential::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 138: { + return CustomEncodableValue(InternalUserInfo::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 139: { + return CustomEncodableValue(InternalUserDetails::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 140: { + return CustomEncodableValue(InternalUserCredential::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 141: { + return CustomEncodableValue( + InternalAuthCredentialInput::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 142: { + return CustomEncodableValue(InternalActionCodeSettings::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 143: { + return CustomEncodableValue( + InternalFirebaseAuthSettings::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 144: { + return CustomEncodableValue(InternalSignInProvider::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 145: { + return CustomEncodableValue( + InternalVerifyPhoneNumberRequest::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 146: { + return CustomEncodableValue(InternalIdTokenResult::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 147: { + return CustomEncodableValue(InternalUserProfile::FromEncodableList( + std::get(ReadValue(stream)))); + } + case 148: { + return CustomEncodableValue(InternalTotpSecret::FromEncodableList( + std::get(ReadValue(stream)))); + } + default: + return ::flutter::StandardCodecSerializer::ReadValueOfType(type, stream); + } +} + +void PigeonInternalCodecSerializer::WriteValue( + const EncodableValue& value, ::flutter::ByteStreamWriter* stream) const { + if (const CustomEncodableValue* custom_value = + std::get_if(&value)) { + if (custom_value->type() == typeid(ActionCodeInfoOperation)) { + stream->WriteByte(129); + WriteValue(EncodableValue(static_cast( + std::any_cast(*custom_value))), + stream); + return; + } + if (custom_value->type() == typeid(InternalMultiFactorSession)) { + stream->WriteByte(130); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalPhoneMultiFactorAssertion)) { + stream->WriteByte(131); + WriteValue( + EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalMultiFactorInfo)) { + stream->WriteByte(132); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(AuthPigeonFirebaseApp)) { + stream->WriteByte(133); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeInfoData)) { + stream->WriteByte(134); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeInfo)) { + stream->WriteByte(135); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAdditionalUserInfo)) { + stream->WriteByte(136); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAuthCredential)) { + stream->WriteByte(137); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserInfo)) { + stream->WriteByte(138); + WriteValue( + EncodableValue( + std::any_cast(*custom_value).ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserDetails)) { + stream->WriteByte(139); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserCredential)) { + stream->WriteByte(140); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalAuthCredentialInput)) { + stream->WriteByte(141); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalActionCodeSettings)) { + stream->WriteByte(142); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalFirebaseAuthSettings)) { + stream->WriteByte(143); + WriteValue(EncodableValue( + std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalSignInProvider)) { + stream->WriteByte(144); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalVerifyPhoneNumberRequest)) { + stream->WriteByte(145); + WriteValue(EncodableValue(std::any_cast( + *custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalIdTokenResult)) { + stream->WriteByte(146); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalUserProfile)) { + stream->WriteByte(147); + WriteValue( + EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + if (custom_value->type() == typeid(InternalTotpSecret)) { + stream->WriteByte(148); + WriteValue(EncodableValue(std::any_cast(*custom_value) + .ToEncodableList()), + stream); + return; + } + } + ::flutter::StandardCodecSerializer::WriteValue(value, stream); +} + +/// The codec used by FirebaseAuthHostApi. +const ::flutter::StandardMessageCodec& FirebaseAuthHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAuthHostApi` to handle messages through the +// `binary_messenger`. +void FirebaseAuthHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api) { + FirebaseAuthHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAuthHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.registerIdTokenListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->RegisterIdTokenListener( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.registerAuthStateListener" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->RegisterAuthStateListener( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.useEmulator" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_host_arg = args.at(1); + if (encodable_host_arg.IsNull()) { + reply(WrapError("host_arg unexpectedly null.")); + return; + } + const auto& host_arg = std::get(encodable_host_arg); + const auto& encodable_port_arg = args.at(2); + if (encodable_port_arg.IsNull()) { + reply(WrapError("port_arg unexpectedly null.")); + return; + } + const int64_t port_arg = encodable_port_arg.LongValue(); + api->UseEmulator(app_arg, host_arg, port_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.applyActionCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->ApplyActionCode( + app_arg, code_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.checkActionCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->CheckActionCode( + app_arg, code_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.confirmPasswordReset" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + const auto& encodable_new_password_arg = args.at(2); + if (encodable_new_password_arg.IsNull()) { + reply(WrapError("new_password_arg unexpectedly null.")); + return; + } + const auto& new_password_arg = + std::get(encodable_new_password_arg); + api->ConfirmPasswordReset( + app_arg, code_arg, new_password_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.createUserWithEmailAndPassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_password_arg = args.at(2); + if (encodable_password_arg.IsNull()) { + reply(WrapError("password_arg unexpectedly null.")); + return; + } + const auto& password_arg = + std::get(encodable_password_arg); + api->CreateUserWithEmailAndPassword( + app_arg, email_arg, password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInAnonymously" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->SignInAnonymously( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->SignInWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithCustomToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_token_arg = args.at(1); + if (encodable_token_arg.IsNull()) { + reply(WrapError("token_arg unexpectedly null.")); + return; + } + const auto& token_arg = + std::get(encodable_token_arg); + api->SignInWithCustomToken( + app_arg, token_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailAndPassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_password_arg = args.at(2); + if (encodable_password_arg.IsNull()) { + reply(WrapError("password_arg unexpectedly null.")); + return; + } + const auto& password_arg = + std::get(encodable_password_arg); + api->SignInWithEmailAndPassword( + app_arg, email_arg, password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithEmailLink" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_email_link_arg = args.at(2); + if (encodable_email_link_arg.IsNull()) { + reply(WrapError("email_link_arg unexpectedly null.")); + return; + } + const auto& email_link_arg = + std::get(encodable_email_link_arg); + api->SignInWithEmailLink( + app_arg, email_arg, email_link_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.signInWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->SignInWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.signOut" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->SignOut(app_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.fetchSignInMethodsForEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + api->FetchSignInMethodsForEmail( + app_arg, email_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.sendPasswordResetEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->SendPasswordResetEmail( + app_arg, email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.sendSignInLinkToEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_email_arg = args.at(1); + if (encodable_email_arg.IsNull()) { + reply(WrapError("email_arg unexpectedly null.")); + return; + } + const auto& email_arg = + std::get(encodable_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + if (encodable_action_code_settings_arg.IsNull()) { + reply(WrapError("action_code_settings_arg unexpectedly null.")); + return; + } + const auto& action_code_settings_arg = + std::any_cast( + std::get( + encodable_action_code_settings_arg)); + api->SendSignInLinkToEmail( + app_arg, email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.setLanguageCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_language_code_arg = args.at(1); + const auto* language_code_arg = + std::get_if(&encodable_language_code_arg); + api->SetLanguageCode(app_arg, language_code_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthHostApi.setSettings" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_settings_arg = args.at(1); + if (encodable_settings_arg.IsNull()) { + reply(WrapError("settings_arg unexpectedly null.")); + return; + } + const auto& settings_arg = + std::any_cast( + std::get(encodable_settings_arg)); + api->SetSettings(app_arg, settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.verifyPasswordResetCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_code_arg = args.at(1); + if (encodable_code_arg.IsNull()) { + reply(WrapError("code_arg unexpectedly null.")); + return; + } + const auto& code_arg = std::get(encodable_code_arg); + api->VerifyPasswordResetCode( + app_arg, code_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.verifyPhoneNumber" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_request_arg = args.at(1); + if (encodable_request_arg.IsNull()) { + reply(WrapError("request_arg unexpectedly null.")); + return; + } + const auto& request_arg = + std::any_cast( + std::get(encodable_request_arg)); + api->VerifyPhoneNumber( + app_arg, request_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeTokenWithAuthorizationCode" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_authorization_code_arg = args.at(1); + if (encodable_authorization_code_arg.IsNull()) { + reply(WrapError("authorization_code_arg unexpectedly null.")); + return; + } + const auto& authorization_code_arg = + std::get(encodable_authorization_code_arg); + api->RevokeTokenWithAuthorizationCode( + app_arg, authorization_code_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.revokeAccessToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_access_token_arg = args.at(1); + if (encodable_access_token_arg.IsNull()) { + reply(WrapError("access_token_arg unexpectedly null.")); + return; + } + const auto& access_token_arg = + std::get(encodable_access_token_arg); + api->RevokeAccessToken( + app_arg, access_token_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthHostApi.initializeRecaptchaConfig" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->InitializeRecaptchaConfig( + app_arg, [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAuthHostApi::WrapError(std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAuthHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by FirebaseAuthUserHostApi. +const ::flutter::StandardMessageCodec& FirebaseAuthUserHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through +// the `binary_messenger`. +void FirebaseAuthUserHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api) { + FirebaseAuthUserHostApi::SetUp(binary_messenger, api, ""); +} + +void FirebaseAuthUserHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, FirebaseAuthUserHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.delete" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->Delete(app_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.getIdToken" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_force_refresh_arg = args.at(1); + if (encodable_force_refresh_arg.IsNull()) { + reply(WrapError("force_refresh_arg unexpectedly null.")); + return; + } + const auto& force_refresh_arg = + std::get(encodable_force_refresh_arg); + api->GetIdToken(app_arg, force_refresh_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->LinkWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.linkWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->LinkWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithCredential" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->ReauthenticateWithCredential( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.reauthenticateWithProvider" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_sign_in_provider_arg = args.at(1); + if (encodable_sign_in_provider_arg.IsNull()) { + reply(WrapError("sign_in_provider_arg unexpectedly null.")); + return; + } + const auto& sign_in_provider_arg = + std::any_cast( + std::get( + encodable_sign_in_provider_arg)); + api->ReauthenticateWithProvider( + app_arg, sign_in_provider_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.reload" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->Reload( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.sendEmailVerification" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_action_code_settings_arg = args.at(1); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->SendEmailVerification( + app_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.FirebaseAuthUserHostApi.unlink" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_provider_id_arg = args.at(1); + if (encodable_provider_id_arg.IsNull()) { + reply(WrapError("provider_id_arg unexpectedly null.")); + return; + } + const auto& provider_id_arg = + std::get(encodable_provider_id_arg); + api->Unlink(app_arg, provider_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_email_arg = args.at(1); + if (encodable_new_email_arg.IsNull()) { + reply(WrapError("new_email_arg unexpectedly null.")); + return; + } + const auto& new_email_arg = + std::get(encodable_new_email_arg); + api->UpdateEmail(app_arg, new_email_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back(CustomEncodableValue( + std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePassword" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_password_arg = args.at(1); + if (encodable_new_password_arg.IsNull()) { + reply(WrapError("new_password_arg unexpectedly null.")); + return; + } + const auto& new_password_arg = + std::get(encodable_new_password_arg); + api->UpdatePassword( + app_arg, new_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updatePhoneNumber" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_input_arg = args.at(1); + if (encodable_input_arg.IsNull()) { + reply(WrapError("input_arg unexpectedly null.")); + return; + } + const auto& input_arg = + std::get(encodable_input_arg); + api->UpdatePhoneNumber( + app_arg, input_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.updateProfile" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_profile_arg = args.at(1); + if (encodable_profile_arg.IsNull()) { + reply(WrapError("profile_arg unexpectedly null.")); + return; + } + const auto& profile_arg = + std::any_cast( + std::get(encodable_profile_arg)); + api->UpdateProfile( + app_arg, profile_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "FirebaseAuthUserHostApi.verifyBeforeUpdateEmail" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_new_email_arg = args.at(1); + if (encodable_new_email_arg.IsNull()) { + reply(WrapError("new_email_arg unexpectedly null.")); + return; + } + const auto& new_email_arg = + std::get(encodable_new_email_arg); + const auto& encodable_action_code_settings_arg = args.at(2); + const auto* action_code_settings_arg = + encodable_action_code_settings_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_action_code_settings_arg))); + api->VerifyBeforeUpdateEmail( + app_arg, new_email_arg, action_code_settings_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue FirebaseAuthUserHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue FirebaseAuthUserHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorUserHostApi. +const ::flutter::StandardMessageCodec& MultiFactorUserHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorUserHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactorUserHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api) { + MultiFactorUserHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorUserHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollPhone" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_assertion_arg = args.at(1); + if (encodable_assertion_arg.IsNull()) { + reply(WrapError("assertion_arg unexpectedly null.")); + return; + } + const auto& assertion_arg = + std::any_cast( + std::get(encodable_assertion_arg)); + const auto& encodable_display_name_arg = args.at(2); + const auto* display_name_arg = + std::get_if(&encodable_display_name_arg); + api->EnrollPhone(app_arg, assertion_arg, display_name_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.enrollTotp" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_assertion_id_arg = args.at(1); + if (encodable_assertion_id_arg.IsNull()) { + reply(WrapError("assertion_id_arg unexpectedly null.")); + return; + } + const auto& assertion_id_arg = + std::get(encodable_assertion_id_arg); + const auto& encodable_display_name_arg = args.at(2); + const auto* display_name_arg = + std::get_if(&encodable_display_name_arg); + api->EnrollTotp(app_arg, assertion_id_arg, display_name_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getSession" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->GetSession( + app_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel(binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_" + "interface.MultiFactorUserHostApi.unenroll" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + const auto& encodable_factor_uid_arg = args.at(1); + if (encodable_factor_uid_arg.IsNull()) { + reply(WrapError("factor_uid_arg unexpectedly null.")); + return; + } + const auto& factor_uid_arg = + std::get(encodable_factor_uid_arg); + api->Unenroll(app_arg, factor_uid_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorUserHostApi.getEnrolledFactors" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_app_arg = args.at(0); + if (encodable_app_arg.IsNull()) { + reply(WrapError("app_arg unexpectedly null.")); + return; + } + const auto& app_arg = std::any_cast( + std::get(encodable_app_arg)); + api->GetEnrolledFactors( + app_arg, [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorUserHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorUserHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactoResolverHostApi. +const ::flutter::StandardMessageCodec& MultiFactoResolverHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactoResolverHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactoResolverHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api) { + MultiFactoResolverHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactoResolverHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api, const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactoResolverHostApi.resolveSignIn" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler([api](const EncodableValue& message, + const ::flutter::MessageReply< + EncodableValue>& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_resolver_id_arg = args.at(0); + if (encodable_resolver_id_arg.IsNull()) { + reply(WrapError("resolver_id_arg unexpectedly null.")); + return; + } + const auto& resolver_id_arg = + std::get(encodable_resolver_id_arg); + const auto& encodable_assertion_arg = args.at(1); + const auto* assertion_arg = + encodable_assertion_arg.IsNull() + ? nullptr + : &(std::any_cast( + std::get( + encodable_assertion_arg))); + const auto& encodable_totp_assertion_id_arg = args.at(2); + const auto* totp_assertion_id_arg = + std::get_if(&encodable_totp_assertion_id_arg); + api->ResolveSignIn( + resolver_id_arg, assertion_arg, totp_assertion_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactoResolverHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactoResolverHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorTotpHostApi. +const ::flutter::StandardMessageCodec& MultiFactorTotpHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorTotpHostApi` to handle messages through +// the `binary_messenger`. +void MultiFactorTotpHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api) { + MultiFactorTotpHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorTotpHostApi::SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.generateSecret" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_session_id_arg = args.at(0); + if (encodable_session_id_arg.IsNull()) { + reply(WrapError("session_id_arg unexpectedly null.")); + return; + } + const auto& session_id_arg = + std::get(encodable_session_id_arg); + api->GenerateSecret( + session_id_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + CustomEncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForEnrollment" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_one_time_password_arg = args.at(1); + if (encodable_one_time_password_arg.IsNull()) { + reply(WrapError("one_time_password_arg unexpectedly null.")); + return; + } + const auto& one_time_password_arg = + std::get(encodable_one_time_password_arg); + api->GetAssertionForEnrollment( + secret_key_arg, one_time_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpHostApi.getAssertionForSignIn" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_enrollment_id_arg = args.at(0); + if (encodable_enrollment_id_arg.IsNull()) { + reply(WrapError("enrollment_id_arg unexpectedly null.")); + return; + } + const auto& enrollment_id_arg = + std::get(encodable_enrollment_id_arg); + const auto& encodable_one_time_password_arg = args.at(1); + if (encodable_one_time_password_arg.IsNull()) { + reply(WrapError("one_time_password_arg unexpectedly null.")); + return; + } + const auto& one_time_password_arg = + std::get(encodable_one_time_password_arg); + api->GetAssertionForSignIn( + enrollment_id_arg, one_time_password_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorTotpHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorTotpHostApi::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by MultiFactorTotpSecretHostApi. +const ::flutter::StandardMessageCodec& +MultiFactorTotpSecretHostApi::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages +// through the `binary_messenger`. +void MultiFactorTotpSecretHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api) { + MultiFactorTotpSecretHostApi::SetUp(binary_messenger, api, ""); +} + +void MultiFactorTotpSecretHostApi::SetUp( + ::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.generateQrCodeUrl" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_account_name_arg = args.at(1); + const auto* account_name_arg = + std::get_if(&encodable_account_name_arg); + const auto& encodable_issuer_arg = args.at(2); + const auto* issuer_arg = + std::get_if(&encodable_issuer_arg); + api->GenerateQrCodeUrl( + secret_key_arg, account_name_arg, issuer_arg, + [reply](ErrorOr&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + wrapped.push_back( + EncodableValue(std::move(output).TakeValue())); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "MultiFactorTotpSecretHostApi.openInOtpApp" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_secret_key_arg = args.at(0); + if (encodable_secret_key_arg.IsNull()) { + reply(WrapError("secret_key_arg unexpectedly null.")); + return; + } + const auto& secret_key_arg = + std::get(encodable_secret_key_arg); + const auto& encodable_qr_code_url_arg = args.at(1); + if (encodable_qr_code_url_arg.IsNull()) { + reply(WrapError("qr_code_url_arg unexpectedly null.")); + return; + } + const auto& qr_code_url_arg = + std::get(encodable_qr_code_url_arg); + api->OpenInOtpApp(secret_key_arg, qr_code_url_arg, + [reply](std::optional&& output) { + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue MultiFactorTotpSecretHostApi::WrapError( + std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue MultiFactorTotpSecretHostApi::WrapError( + const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +/// The codec used by GenerateInterfaces. +const ::flutter::StandardMessageCodec& GenerateInterfaces::GetCodec() { + return ::flutter::StandardMessageCodec::GetInstance( + &PigeonInternalCodecSerializer::GetInstance()); +} + +// Sets up an instance of `GenerateInterfaces` to handle messages through the +// `binary_messenger`. +void GenerateInterfaces::SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api) { + GenerateInterfaces::SetUp(binary_messenger, api, ""); +} + +void GenerateInterfaces::SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api, + const std::string& message_channel_suffix) { + const std::string prepended_suffix = + message_channel_suffix.length() > 0 + ? std::string(".") + message_channel_suffix + : ""; + { + BasicMessageChannel<> channel( + binary_messenger, + "dev.flutter.pigeon.firebase_auth_platform_interface." + "GenerateInterfaces.pigeonInterface" + + prepended_suffix, + &GetCodec()); + if (api != nullptr) { + channel.SetMessageHandler( + [api](const EncodableValue& message, + const ::flutter::MessageReply& reply) { + try { + const auto& args = std::get(message); + const auto& encodable_info_arg = args.at(0); + if (encodable_info_arg.IsNull()) { + reply(WrapError("info_arg unexpectedly null.")); + return; + } + const auto& info_arg = + std::any_cast( + std::get(encodable_info_arg)); + std::optional output = + api->PigeonInterface(info_arg); + if (output.has_value()) { + reply(WrapError(output.value())); + return; + } + EncodableList wrapped; + wrapped.push_back(EncodableValue()); + reply(EncodableValue(std::move(wrapped))); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel.SetMessageHandler(nullptr); + } + } +} + +EncodableValue GenerateInterfaces::WrapError(std::string_view error_message) { + return EncodableValue( + EncodableList{EncodableValue(std::string(error_message)), + EncodableValue("Error"), EncodableValue()}); +} + +EncodableValue GenerateInterfaces::WrapError(const FlutterError& error) { + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), + error.details()}); +} + +} // namespace firebase_auth_windows diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h new file mode 100644 index 00000000..e1e1af02 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/messages.g.h @@ -0,0 +1,1531 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +#ifndef PIGEON_MESSAGES_G_H_ +#define PIGEON_MESSAGES_G_H_ +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_auth_windows { + +// Generated class from Pigeon. + +class FlutterError { + public: + explicit FlutterError(const std::string& code) : code_(code) {} + explicit FlutterError(const std::string& code, const std::string& message) + : code_(code), message_(message) {} + explicit FlutterError(const std::string& code, const std::string& message, + const ::flutter::EncodableValue& details) + : code_(code), message_(message), details_(details) {} + + const std::string& code() const { return code_; } + const std::string& message() const { return message_; } + const ::flutter::EncodableValue& details() const { return details_; } + + private: + std::string code_; + std::string message_; + ::flutter::EncodableValue details_; +}; + +template +class ErrorOr { + public: + ErrorOr(const T& rhs) : v_(rhs) {} + ErrorOr(const T&& rhs) : v_(std::move(rhs)) {} + ErrorOr(const FlutterError& rhs) : v_(rhs) {} + ErrorOr(const FlutterError&& rhs) : v_(std::move(rhs)) {} + + bool has_error() const { return std::holds_alternative(v_); } + const T& value() const { return std::get(v_); }; + const FlutterError& error() const { return std::get(v_); }; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + ErrorOr() = default; + T TakeValue() && { return std::get(std::move(v_)); } + + std::variant v_; +}; + +// The type of operation that generated the action code from calling +// [checkActionCode]. +enum class ActionCodeInfoOperation { + // Unknown operation. + kUnknown = 0, + // Password reset code generated via [sendPasswordResetEmail]. + kPasswordReset = 1, + // Email verification code generated via [User.sendEmailVerification]. + kVerifyEmail = 2, + // Email change revocation code generated via [User.updateEmail]. + kRecoverEmail = 3, + // Email sign in code generated via [sendSignInLinkToEmail]. + kEmailSignIn = 4, + // Verify and change email code generated via [User.verifyBeforeUpdateEmail]. + kVerifyAndChangeEmail = 5, + // Action code for reverting second factor addition. + kRevertSecondFactorAddition = 6 +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalMultiFactorSession { + public: + // Constructs an object setting all fields. + explicit InternalMultiFactorSession(const std::string& id); + + const std::string& id() const; + void set_id(std::string_view value_arg); + + bool operator==(const InternalMultiFactorSession& other) const; + bool operator!=(const InternalMultiFactorSession& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalMultiFactorSession FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string id_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalPhoneMultiFactorAssertion { + public: + // Constructs an object setting all fields. + explicit InternalPhoneMultiFactorAssertion( + const std::string& verification_id, const std::string& verification_code); + + const std::string& verification_id() const; + void set_verification_id(std::string_view value_arg); + + const std::string& verification_code() const; + void set_verification_code(std::string_view value_arg); + + bool operator==(const InternalPhoneMultiFactorAssertion& other) const; + bool operator!=(const InternalPhoneMultiFactorAssertion& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalPhoneMultiFactorAssertion FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string verification_id_; + std::string verification_code_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalMultiFactorInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalMultiFactorInfo(double enrollment_timestamp, + const std::string& uid); + + // Constructs an object setting all fields. + explicit InternalMultiFactorInfo(const std::string* display_name, + double enrollment_timestamp, + const std::string* factor_id, + const std::string& uid, + const std::string* phone_number); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + double enrollment_timestamp() const; + void set_enrollment_timestamp(double value_arg); + + const std::string* factor_id() const; + void set_factor_id(const std::string_view* value_arg); + void set_factor_id(std::string_view value_arg); + + const std::string& uid() const; + void set_uid(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + bool operator==(const InternalMultiFactorInfo& other) const; + bool operator!=(const InternalMultiFactorInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalMultiFactorInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional display_name_; + double enrollment_timestamp_; + std::optional factor_id_; + std::string uid_; + std::optional phone_number_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class AuthPigeonFirebaseApp { + public: + // Constructs an object setting all non-nullable fields. + explicit AuthPigeonFirebaseApp(const std::string& app_name); + + // Constructs an object setting all fields. + explicit AuthPigeonFirebaseApp(const std::string& app_name, + const std::string* tenant_id, + const std::string* custom_auth_domain); + + const std::string& app_name() const; + void set_app_name(std::string_view value_arg); + + const std::string* tenant_id() const; + void set_tenant_id(const std::string_view* value_arg); + void set_tenant_id(std::string_view value_arg); + + const std::string* custom_auth_domain() const; + void set_custom_auth_domain(const std::string_view* value_arg); + void set_custom_auth_domain(std::string_view value_arg); + + bool operator==(const AuthPigeonFirebaseApp& other) const; + bool operator!=(const AuthPigeonFirebaseApp& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static AuthPigeonFirebaseApp FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string app_name_; + std::optional tenant_id_; + std::optional custom_auth_domain_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeInfoData { + public: + // Constructs an object setting all non-nullable fields. + InternalActionCodeInfoData(); + + // Constructs an object setting all fields. + explicit InternalActionCodeInfoData(const std::string* email, + const std::string* previous_email); + + const std::string* email() const; + void set_email(const std::string_view* value_arg); + void set_email(std::string_view value_arg); + + const std::string* previous_email() const; + void set_previous_email(const std::string_view* value_arg); + void set_previous_email(std::string_view value_arg); + + bool operator==(const InternalActionCodeInfoData& other) const; + bool operator!=(const InternalActionCodeInfoData& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeInfoData FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalActionCodeInfo; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional email_; + std::optional previous_email_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeInfo { + public: + // Constructs an object setting all fields. + explicit InternalActionCodeInfo(const ActionCodeInfoOperation& operation, + const InternalActionCodeInfoData& data); + + ~InternalActionCodeInfo() = default; + InternalActionCodeInfo(const InternalActionCodeInfo& other); + InternalActionCodeInfo& operator=(const InternalActionCodeInfo& other); + InternalActionCodeInfo(InternalActionCodeInfo&& other) = default; + InternalActionCodeInfo& operator=(InternalActionCodeInfo&& other) noexcept = + default; + const ActionCodeInfoOperation& operation() const; + void set_operation(const ActionCodeInfoOperation& value_arg); + + const InternalActionCodeInfoData& data() const; + void set_data(const InternalActionCodeInfoData& value_arg); + + bool operator==(const InternalActionCodeInfo& other) const; + bool operator!=(const InternalActionCodeInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + ActionCodeInfoOperation operation_; + std::unique_ptr data_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAdditionalUserInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAdditionalUserInfo(bool is_new_user); + + // Constructs an object setting all fields. + explicit InternalAdditionalUserInfo(bool is_new_user, + const std::string* provider_id, + const std::string* username, + const std::string* authorization_code, + const ::flutter::EncodableMap* profile); + + bool is_new_user() const; + void set_is_new_user(bool value_arg); + + const std::string* provider_id() const; + void set_provider_id(const std::string_view* value_arg); + void set_provider_id(std::string_view value_arg); + + const std::string* username() const; + void set_username(const std::string_view* value_arg); + void set_username(std::string_view value_arg); + + const std::string* authorization_code() const; + void set_authorization_code(const std::string_view* value_arg); + void set_authorization_code(std::string_view value_arg); + + const ::flutter::EncodableMap* profile() const; + void set_profile(const ::flutter::EncodableMap* value_arg); + void set_profile(const ::flutter::EncodableMap& value_arg); + + bool operator==(const InternalAdditionalUserInfo& other) const; + bool operator!=(const InternalAdditionalUserInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAdditionalUserInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + bool is_new_user_; + std::optional provider_id_; + std::optional username_; + std::optional authorization_code_; + std::optional<::flutter::EncodableMap> profile_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAuthCredential { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAuthCredential(const std::string& provider_id, + const std::string& sign_in_method, + int64_t native_id); + + // Constructs an object setting all fields. + explicit InternalAuthCredential(const std::string& provider_id, + const std::string& sign_in_method, + int64_t native_id, + const std::string* access_token); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const std::string& sign_in_method() const; + void set_sign_in_method(std::string_view value_arg); + + int64_t native_id() const; + void set_native_id(int64_t value_arg); + + const std::string* access_token() const; + void set_access_token(const std::string_view* value_arg); + void set_access_token(std::string_view value_arg); + + bool operator==(const InternalAuthCredential& other) const; + bool operator!=(const InternalAuthCredential& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAuthCredential FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::string sign_in_method_; + int64_t native_id_; + std::optional access_token_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserInfo { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalUserInfo(const std::string& uid, bool is_anonymous, + bool is_email_verified); + + // Constructs an object setting all fields. + explicit InternalUserInfo( + const std::string& uid, const std::string* email, + const std::string* display_name, const std::string* photo_url, + const std::string* phone_number, bool is_anonymous, + bool is_email_verified, const std::string* provider_id, + const std::string* tenant_id, const std::string* refresh_token, + const int64_t* creation_timestamp, const int64_t* last_sign_in_timestamp); + + const std::string& uid() const; + void set_uid(std::string_view value_arg); + + const std::string* email() const; + void set_email(const std::string_view* value_arg); + void set_email(std::string_view value_arg); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + const std::string* photo_url() const; + void set_photo_url(const std::string_view* value_arg); + void set_photo_url(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + bool is_anonymous() const; + void set_is_anonymous(bool value_arg); + + bool is_email_verified() const; + void set_is_email_verified(bool value_arg); + + const std::string* provider_id() const; + void set_provider_id(const std::string_view* value_arg); + void set_provider_id(std::string_view value_arg); + + const std::string* tenant_id() const; + void set_tenant_id(const std::string_view* value_arg); + void set_tenant_id(std::string_view value_arg); + + const std::string* refresh_token() const; + void set_refresh_token(const std::string_view* value_arg); + void set_refresh_token(std::string_view value_arg); + + const int64_t* creation_timestamp() const; + void set_creation_timestamp(const int64_t* value_arg); + void set_creation_timestamp(int64_t value_arg); + + const int64_t* last_sign_in_timestamp() const; + void set_last_sign_in_timestamp(const int64_t* value_arg); + void set_last_sign_in_timestamp(int64_t value_arg); + + bool operator==(const InternalUserInfo& other) const; + bool operator!=(const InternalUserInfo& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserInfo FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserDetails; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string uid_; + std::optional email_; + std::optional display_name_; + std::optional photo_url_; + std::optional phone_number_; + bool is_anonymous_; + bool is_email_verified_; + std::optional provider_id_; + std::optional tenant_id_; + std::optional refresh_token_; + std::optional creation_timestamp_; + std::optional last_sign_in_timestamp_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserDetails { + public: + // Constructs an object setting all fields. + explicit InternalUserDetails(const InternalUserInfo& user_info, + const ::flutter::EncodableList& provider_data); + + ~InternalUserDetails() = default; + InternalUserDetails(const InternalUserDetails& other); + InternalUserDetails& operator=(const InternalUserDetails& other); + InternalUserDetails(InternalUserDetails&& other) = default; + InternalUserDetails& operator=(InternalUserDetails&& other) noexcept = + default; + const InternalUserInfo& user_info() const; + void set_user_info(const InternalUserInfo& value_arg); + + const ::flutter::EncodableList& provider_data() const; + void set_provider_data(const ::flutter::EncodableList& value_arg); + + bool operator==(const InternalUserDetails& other) const; + bool operator!=(const InternalUserDetails& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserDetails FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class InternalUserCredential; + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::unique_ptr user_info_; + ::flutter::EncodableList provider_data_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserCredential { + public: + // Constructs an object setting all non-nullable fields. + InternalUserCredential(); + + // Constructs an object setting all fields. + explicit InternalUserCredential( + const InternalUserDetails* user, + const InternalAdditionalUserInfo* additional_user_info, + const InternalAuthCredential* credential); + + ~InternalUserCredential() = default; + InternalUserCredential(const InternalUserCredential& other); + InternalUserCredential& operator=(const InternalUserCredential& other); + InternalUserCredential(InternalUserCredential&& other) = default; + InternalUserCredential& operator=(InternalUserCredential&& other) noexcept = + default; + const InternalUserDetails* user() const; + void set_user(const InternalUserDetails* value_arg); + void set_user(const InternalUserDetails& value_arg); + + const InternalAdditionalUserInfo* additional_user_info() const; + void set_additional_user_info(const InternalAdditionalUserInfo* value_arg); + void set_additional_user_info(const InternalAdditionalUserInfo& value_arg); + + const InternalAuthCredential* credential() const; + void set_credential(const InternalAuthCredential* value_arg); + void set_credential(const InternalAuthCredential& value_arg); + + bool operator==(const InternalUserCredential& other) const; + bool operator!=(const InternalUserCredential& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserCredential FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::unique_ptr user_; + std::unique_ptr additional_user_info_; + std::unique_ptr credential_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalAuthCredentialInput { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalAuthCredentialInput(const std::string& provider_id, + const std::string& sign_in_method); + + // Constructs an object setting all fields. + explicit InternalAuthCredentialInput(const std::string& provider_id, + const std::string& sign_in_method, + const std::string* token, + const std::string* access_token); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const std::string& sign_in_method() const; + void set_sign_in_method(std::string_view value_arg); + + const std::string* token() const; + void set_token(const std::string_view* value_arg); + void set_token(std::string_view value_arg); + + const std::string* access_token() const; + void set_access_token(const std::string_view* value_arg); + void set_access_token(std::string_view value_arg); + + bool operator==(const InternalAuthCredentialInput& other) const; + bool operator!=(const InternalAuthCredentialInput& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalAuthCredentialInput FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::string sign_in_method_; + std::optional token_; + std::optional access_token_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalActionCodeSettings { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalActionCodeSettings(const std::string& url, + bool handle_code_in_app, + bool android_install_app); + + // Constructs an object setting all fields. + explicit InternalActionCodeSettings( + const std::string& url, const std::string* dynamic_link_domain, + bool handle_code_in_app, const std::string* i_o_s_bundle_id, + const std::string* android_package_name, bool android_install_app, + const std::string* android_minimum_version, + const std::string* link_domain); + + const std::string& url() const; + void set_url(std::string_view value_arg); + + const std::string* dynamic_link_domain() const; + void set_dynamic_link_domain(const std::string_view* value_arg); + void set_dynamic_link_domain(std::string_view value_arg); + + bool handle_code_in_app() const; + void set_handle_code_in_app(bool value_arg); + + const std::string* i_o_s_bundle_id() const; + void set_i_o_s_bundle_id(const std::string_view* value_arg); + void set_i_o_s_bundle_id(std::string_view value_arg); + + const std::string* android_package_name() const; + void set_android_package_name(const std::string_view* value_arg); + void set_android_package_name(std::string_view value_arg); + + bool android_install_app() const; + void set_android_install_app(bool value_arg); + + const std::string* android_minimum_version() const; + void set_android_minimum_version(const std::string_view* value_arg); + void set_android_minimum_version(std::string_view value_arg); + + const std::string* link_domain() const; + void set_link_domain(const std::string_view* value_arg); + void set_link_domain(std::string_view value_arg); + + bool operator==(const InternalActionCodeSettings& other) const; + bool operator!=(const InternalActionCodeSettings& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalActionCodeSettings FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string url_; + std::optional dynamic_link_domain_; + bool handle_code_in_app_; + std::optional i_o_s_bundle_id_; + std::optional android_package_name_; + bool android_install_app_; + std::optional android_minimum_version_; + std::optional link_domain_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalFirebaseAuthSettings { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing); + + // Constructs an object setting all fields. + explicit InternalFirebaseAuthSettings( + bool app_verification_disabled_for_testing, + const std::string* user_access_group, const std::string* phone_number, + const std::string* sms_code, const bool* force_recaptcha_flow); + + bool app_verification_disabled_for_testing() const; + void set_app_verification_disabled_for_testing(bool value_arg); + + const std::string* user_access_group() const; + void set_user_access_group(const std::string_view* value_arg); + void set_user_access_group(std::string_view value_arg); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + const std::string* sms_code() const; + void set_sms_code(const std::string_view* value_arg); + void set_sms_code(std::string_view value_arg); + + const bool* force_recaptcha_flow() const; + void set_force_recaptcha_flow(const bool* value_arg); + void set_force_recaptcha_flow(bool value_arg); + + bool operator==(const InternalFirebaseAuthSettings& other) const; + bool operator!=(const InternalFirebaseAuthSettings& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalFirebaseAuthSettings FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + bool app_verification_disabled_for_testing_; + std::optional user_access_group_; + std::optional phone_number_; + std::optional sms_code_; + std::optional force_recaptcha_flow_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalSignInProvider { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalSignInProvider(const std::string& provider_id); + + // Constructs an object setting all fields. + explicit InternalSignInProvider( + const std::string& provider_id, const ::flutter::EncodableList* scopes, + const ::flutter::EncodableMap* custom_parameters); + + const std::string& provider_id() const; + void set_provider_id(std::string_view value_arg); + + const ::flutter::EncodableList* scopes() const; + void set_scopes(const ::flutter::EncodableList* value_arg); + void set_scopes(const ::flutter::EncodableList& value_arg); + + const ::flutter::EncodableMap* custom_parameters() const; + void set_custom_parameters(const ::flutter::EncodableMap* value_arg); + void set_custom_parameters(const ::flutter::EncodableMap& value_arg); + + bool operator==(const InternalSignInProvider& other) const; + bool operator!=(const InternalSignInProvider& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalSignInProvider FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::string provider_id_; + std::optional<::flutter::EncodableList> scopes_; + std::optional<::flutter::EncodableMap> custom_parameters_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalVerifyPhoneNumberRequest { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalVerifyPhoneNumberRequest(int64_t timeout); + + // Constructs an object setting all fields. + explicit InternalVerifyPhoneNumberRequest( + const std::string* phone_number, int64_t timeout, + const int64_t* force_resending_token, + const std::string* auto_retrieved_sms_code_for_testing, + const std::string* multi_factor_info_id, + const std::string* multi_factor_session_id); + + const std::string* phone_number() const; + void set_phone_number(const std::string_view* value_arg); + void set_phone_number(std::string_view value_arg); + + int64_t timeout() const; + void set_timeout(int64_t value_arg); + + const int64_t* force_resending_token() const; + void set_force_resending_token(const int64_t* value_arg); + void set_force_resending_token(int64_t value_arg); + + const std::string* auto_retrieved_sms_code_for_testing() const; + void set_auto_retrieved_sms_code_for_testing( + const std::string_view* value_arg); + void set_auto_retrieved_sms_code_for_testing(std::string_view value_arg); + + const std::string* multi_factor_info_id() const; + void set_multi_factor_info_id(const std::string_view* value_arg); + void set_multi_factor_info_id(std::string_view value_arg); + + const std::string* multi_factor_session_id() const; + void set_multi_factor_session_id(const std::string_view* value_arg); + void set_multi_factor_session_id(std::string_view value_arg); + + bool operator==(const InternalVerifyPhoneNumberRequest& other) const; + bool operator!=(const InternalVerifyPhoneNumberRequest& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalVerifyPhoneNumberRequest FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional phone_number_; + int64_t timeout_; + std::optional force_resending_token_; + std::optional auto_retrieved_sms_code_for_testing_; + std::optional multi_factor_info_id_; + std::optional multi_factor_session_id_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalIdTokenResult { + public: + // Constructs an object setting all non-nullable fields. + InternalIdTokenResult(); + + // Constructs an object setting all fields. + explicit InternalIdTokenResult(const std::string* token, + const int64_t* expiration_timestamp, + const int64_t* auth_timestamp, + const int64_t* issued_at_timestamp, + const std::string* sign_in_provider, + const ::flutter::EncodableMap* claims, + const std::string* sign_in_second_factor); + + const std::string* token() const; + void set_token(const std::string_view* value_arg); + void set_token(std::string_view value_arg); + + const int64_t* expiration_timestamp() const; + void set_expiration_timestamp(const int64_t* value_arg); + void set_expiration_timestamp(int64_t value_arg); + + const int64_t* auth_timestamp() const; + void set_auth_timestamp(const int64_t* value_arg); + void set_auth_timestamp(int64_t value_arg); + + const int64_t* issued_at_timestamp() const; + void set_issued_at_timestamp(const int64_t* value_arg); + void set_issued_at_timestamp(int64_t value_arg); + + const std::string* sign_in_provider() const; + void set_sign_in_provider(const std::string_view* value_arg); + void set_sign_in_provider(std::string_view value_arg); + + const ::flutter::EncodableMap* claims() const; + void set_claims(const ::flutter::EncodableMap* value_arg); + void set_claims(const ::flutter::EncodableMap& value_arg); + + const std::string* sign_in_second_factor() const; + void set_sign_in_second_factor(const std::string_view* value_arg); + void set_sign_in_second_factor(std::string_view value_arg); + + bool operator==(const InternalIdTokenResult& other) const; + bool operator!=(const InternalIdTokenResult& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalIdTokenResult FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional token_; + std::optional expiration_timestamp_; + std::optional auth_timestamp_; + std::optional issued_at_timestamp_; + std::optional sign_in_provider_; + std::optional<::flutter::EncodableMap> claims_; + std::optional sign_in_second_factor_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalUserProfile { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalUserProfile(bool display_name_changed, + bool photo_url_changed); + + // Constructs an object setting all fields. + explicit InternalUserProfile(const std::string* display_name, + const std::string* photo_url, + bool display_name_changed, + bool photo_url_changed); + + const std::string* display_name() const; + void set_display_name(const std::string_view* value_arg); + void set_display_name(std::string_view value_arg); + + const std::string* photo_url() const; + void set_photo_url(const std::string_view* value_arg); + void set_photo_url(std::string_view value_arg); + + bool display_name_changed() const; + void set_display_name_changed(bool value_arg); + + bool photo_url_changed() const; + void set_photo_url_changed(bool value_arg); + + bool operator==(const InternalUserProfile& other) const; + bool operator!=(const InternalUserProfile& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalUserProfile FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional display_name_; + std::optional photo_url_; + bool display_name_changed_; + bool photo_url_changed_; +}; + +// Generated class from Pigeon that represents data sent in messages. +class InternalTotpSecret { + public: + // Constructs an object setting all non-nullable fields. + explicit InternalTotpSecret(const std::string& secret_key); + + // Constructs an object setting all fields. + explicit InternalTotpSecret(const int64_t* code_interval_seconds, + const int64_t* code_length, + const int64_t* enrollment_completion_deadline, + const std::string* hashing_algorithm, + const std::string& secret_key); + + const int64_t* code_interval_seconds() const; + void set_code_interval_seconds(const int64_t* value_arg); + void set_code_interval_seconds(int64_t value_arg); + + const int64_t* code_length() const; + void set_code_length(const int64_t* value_arg); + void set_code_length(int64_t value_arg); + + const int64_t* enrollment_completion_deadline() const; + void set_enrollment_completion_deadline(const int64_t* value_arg); + void set_enrollment_completion_deadline(int64_t value_arg); + + const std::string* hashing_algorithm() const; + void set_hashing_algorithm(const std::string_view* value_arg); + void set_hashing_algorithm(std::string_view value_arg); + + const std::string& secret_key() const; + void set_secret_key(std::string_view value_arg); + + bool operator==(const InternalTotpSecret& other) const; + bool operator!=(const InternalTotpSecret& other) const; + /// Returns a hash code value for the object. This method is supported for the + /// benefit of hash tables. + size_t Hash() const; + + private: + static InternalTotpSecret FromEncodableList( + const ::flutter::EncodableList& list); + + public: + ::flutter::EncodableList ToEncodableList() const; + + private: + friend class FirebaseAuthHostApi; + friend class FirebaseAuthUserHostApi; + friend class MultiFactorUserHostApi; + friend class MultiFactoResolverHostApi; + friend class MultiFactorTotpHostApi; + friend class MultiFactorTotpSecretHostApi; + friend class GenerateInterfaces; + friend class PigeonInternalCodecSerializer; + std::optional code_interval_seconds_; + std::optional code_length_; + std::optional enrollment_completion_deadline_; + std::optional hashing_algorithm_; + std::string secret_key_; +}; + +class PigeonInternalCodecSerializer + : public ::flutter::StandardCodecSerializer { + public: + PigeonInternalCodecSerializer(); + inline static PigeonInternalCodecSerializer& GetInstance() { + static PigeonInternalCodecSerializer sInstance; + return sInstance; + } + + void WriteValue(const ::flutter::EncodableValue& value, + ::flutter::ByteStreamWriter* stream) const override; + + protected: + ::flutter::EncodableValue ReadValueOfType( + uint8_t type, ::flutter::ByteStreamReader* stream) const override; +}; + +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAuthHostApi { + public: + FirebaseAuthHostApi(const FirebaseAuthHostApi&) = delete; + FirebaseAuthHostApi& operator=(const FirebaseAuthHostApi&) = delete; + virtual ~FirebaseAuthHostApi() {} + virtual void RegisterIdTokenListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void RegisterAuthStateListener( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void UseEmulator( + const AuthPigeonFirebaseApp& app, const std::string& host, int64_t port, + std::function reply)> result) = 0; + virtual void ApplyActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void CheckActionCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void ConfirmPasswordReset( + const AuthPigeonFirebaseApp& app, const std::string& code, + const std::string& new_password, + std::function reply)> result) = 0; + virtual void CreateUserWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) = 0; + virtual void SignInAnonymously( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void SignInWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void SignInWithCustomToken( + const AuthPigeonFirebaseApp& app, const std::string& token, + std::function reply)> result) = 0; + virtual void SignInWithEmailAndPassword( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& password, + std::function reply)> result) = 0; + virtual void SignInWithEmailLink( + const AuthPigeonFirebaseApp& app, const std::string& email, + const std::string& email_link, + std::function reply)> result) = 0; + virtual void SignInWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void SignOut( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void FetchSignInMethodsForEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + std::function reply)> result) = 0; + virtual void SendPasswordResetEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + virtual void SendSignInLinkToEmail( + const AuthPigeonFirebaseApp& app, const std::string& email, + const InternalActionCodeSettings& action_code_settings, + std::function reply)> result) = 0; + virtual void SetLanguageCode( + const AuthPigeonFirebaseApp& app, const std::string* language_code, + std::function reply)> result) = 0; + virtual void SetSettings( + const AuthPigeonFirebaseApp& app, + const InternalFirebaseAuthSettings& settings, + std::function reply)> result) = 0; + virtual void VerifyPasswordResetCode( + const AuthPigeonFirebaseApp& app, const std::string& code, + std::function reply)> result) = 0; + virtual void VerifyPhoneNumber( + const AuthPigeonFirebaseApp& app, + const InternalVerifyPhoneNumberRequest& request, + std::function reply)> result) = 0; + virtual void RevokeTokenWithAuthorizationCode( + const AuthPigeonFirebaseApp& app, const std::string& authorization_code, + std::function reply)> result) = 0; + virtual void RevokeAccessToken( + const AuthPigeonFirebaseApp& app, const std::string& access_token, + std::function reply)> result) = 0; + virtual void InitializeRecaptchaConfig( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + + // The codec used by FirebaseAuthHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAuthHostApi` to handle messages through the + // `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAuthHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class FirebaseAuthUserHostApi { + public: + FirebaseAuthUserHostApi(const FirebaseAuthUserHostApi&) = delete; + FirebaseAuthUserHostApi& operator=(const FirebaseAuthUserHostApi&) = delete; + virtual ~FirebaseAuthUserHostApi() {} + virtual void Delete( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void GetIdToken( + const AuthPigeonFirebaseApp& app, bool force_refresh, + std::function reply)> result) = 0; + virtual void LinkWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void LinkWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void ReauthenticateWithCredential( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void ReauthenticateWithProvider( + const AuthPigeonFirebaseApp& app, + const InternalSignInProvider& sign_in_provider, + std::function reply)> result) = 0; + virtual void Reload( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + virtual void SendEmailVerification( + const AuthPigeonFirebaseApp& app, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + virtual void Unlink( + const AuthPigeonFirebaseApp& app, const std::string& provider_id, + std::function reply)> result) = 0; + virtual void UpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + std::function reply)> result) = 0; + virtual void UpdatePassword( + const AuthPigeonFirebaseApp& app, const std::string& new_password, + std::function reply)> result) = 0; + virtual void UpdatePhoneNumber( + const AuthPigeonFirebaseApp& app, const ::flutter::EncodableMap& input, + std::function reply)> result) = 0; + virtual void UpdateProfile( + const AuthPigeonFirebaseApp& app, const InternalUserProfile& profile, + std::function reply)> result) = 0; + virtual void VerifyBeforeUpdateEmail( + const AuthPigeonFirebaseApp& app, const std::string& new_email, + const InternalActionCodeSettings* action_code_settings, + std::function reply)> result) = 0; + + // The codec used by FirebaseAuthUserHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `FirebaseAuthUserHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + FirebaseAuthUserHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + FirebaseAuthUserHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorUserHostApi { + public: + MultiFactorUserHostApi(const MultiFactorUserHostApi&) = delete; + MultiFactorUserHostApi& operator=(const MultiFactorUserHostApi&) = delete; + virtual ~MultiFactorUserHostApi() {} + virtual void EnrollPhone( + const AuthPigeonFirebaseApp& app, + const InternalPhoneMultiFactorAssertion& assertion, + const std::string* display_name, + std::function reply)> result) = 0; + virtual void EnrollTotp( + const AuthPigeonFirebaseApp& app, const std::string& assertion_id, + const std::string* display_name, + std::function reply)> result) = 0; + virtual void GetSession( + const AuthPigeonFirebaseApp& app, + std::function reply)> + result) = 0; + virtual void Unenroll( + const AuthPigeonFirebaseApp& app, const std::string& factor_uid, + std::function reply)> result) = 0; + virtual void GetEnrolledFactors( + const AuthPigeonFirebaseApp& app, + std::function reply)> result) = 0; + + // The codec used by MultiFactorUserHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorUserHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorUserHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorUserHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactoResolverHostApi { + public: + MultiFactoResolverHostApi(const MultiFactoResolverHostApi&) = delete; + MultiFactoResolverHostApi& operator=(const MultiFactoResolverHostApi&) = + delete; + virtual ~MultiFactoResolverHostApi() {} + virtual void ResolveSignIn( + const std::string& resolver_id, + const InternalPhoneMultiFactorAssertion* assertion, + const std::string* totp_assertion_id, + std::function reply)> result) = 0; + + // The codec used by MultiFactoResolverHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactoResolverHostApi` to handle messages + // through the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactoResolverHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactoResolverHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorTotpHostApi { + public: + MultiFactorTotpHostApi(const MultiFactorTotpHostApi&) = delete; + MultiFactorTotpHostApi& operator=(const MultiFactorTotpHostApi&) = delete; + virtual ~MultiFactorTotpHostApi() {} + virtual void GenerateSecret( + const std::string& session_id, + std::function reply)> result) = 0; + virtual void GetAssertionForEnrollment( + const std::string& secret_key, const std::string& one_time_password, + std::function reply)> result) = 0; + virtual void GetAssertionForSignIn( + const std::string& enrollment_id, const std::string& one_time_password, + std::function reply)> result) = 0; + + // The codec used by MultiFactorTotpHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorTotpHostApi` to handle messages through + // the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorTotpHostApi() = default; +}; +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class MultiFactorTotpSecretHostApi { + public: + MultiFactorTotpSecretHostApi(const MultiFactorTotpSecretHostApi&) = delete; + MultiFactorTotpSecretHostApi& operator=(const MultiFactorTotpSecretHostApi&) = + delete; + virtual ~MultiFactorTotpSecretHostApi() {} + virtual void GenerateQrCodeUrl( + const std::string& secret_key, const std::string* account_name, + const std::string* issuer, + std::function reply)> result) = 0; + virtual void OpenInOtpApp( + const std::string& secret_key, const std::string& qr_code_url, + std::function reply)> result) = 0; + + // The codec used by MultiFactorTotpSecretHostApi. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `MultiFactorTotpSecretHostApi` to handle messages + // through the `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + MultiFactorTotpSecretHostApi* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + MultiFactorTotpSecretHostApi() = default; +}; +// Only used to generate the object interface that are use outside of the Pigeon +// interface +// +// Generated interface from Pigeon that represents a handler of messages from +// Flutter. +class GenerateInterfaces { + public: + GenerateInterfaces(const GenerateInterfaces&) = delete; + GenerateInterfaces& operator=(const GenerateInterfaces&) = delete; + virtual ~GenerateInterfaces() {} + virtual std::optional PigeonInterface( + const InternalMultiFactorInfo& info) = 0; + + // The codec used by GenerateInterfaces. + static const ::flutter::StandardMessageCodec& GetCodec(); + // Sets up an instance of `GenerateInterfaces` to handle messages through the + // `binary_messenger`. + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api); + static void SetUp(::flutter::BinaryMessenger* binary_messenger, + GenerateInterfaces* api, + const std::string& message_channel_suffix); + static ::flutter::EncodableValue WrapError(std::string_view error_message); + static ::flutter::EncodableValue WrapError(const FlutterError& error); + + protected: + GenerateInterfaces() = default; +}; +} // namespace firebase_auth_windows +#endif // PIGEON_MESSAGES_G_H_ diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in new file mode 100644 index 00000000..3a8915c4 --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/plugin_version.h.in @@ -0,0 +1,13 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#ifndef PLUGIN_VERSION_CONFIG_H +#define PLUGIN_VERSION_CONFIG_H + +namespace firebase_auth_windows { + +std::string getPluginVersion() { return "@PLUGIN_VERSION@"; } +} // namespace firebase_auth_windows + +#endif // PLUGIN_VERSION_CONFIG_H diff --git a/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp new file mode 100644 index 00000000..7c8110cf --- /dev/null +++ b/mih_ui/android/build/macos/SourcePackages/firebase_auth-6.5.4/windows/test/firebase_auth_plugin_test.cpp @@ -0,0 +1,47 @@ +// Copyright 2023, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#include "firebase_auth_plugin.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace firebase_auth { +namespace test { + +namespace { + +using flutter::EncodableMap; +using flutter::EncodableValue; +using flutter::MethodCall; +using flutter::MethodResultFunctions; + +} // namespace + +TEST(FirebaseAuthPlugin, GetPlatformVersion) { + FirebaseAuthPlugin plugin; + // Save the reply value from the success callback. + std::string result_string; + plugin.HandleMethodCall( + MethodCall("getPlatformVersion", std::make_unique()), + std::make_unique>( + [&result_string](const EncodableValue* result) { + result_string = std::get(*result); + }, + nullptr, nullptr)); + + // Since the exact string varies by host, just ensure that it's a string + // with the expected format. + EXPECT_TRUE(result_string.rfind("Windows ", 0) == 0); +} + +} // namespace test +} // namespace firebase_auth diff --git a/mih_ui/android/build/reports/problems/problems-report.html b/mih_ui/android/build/reports/problems/problems-report.html index 0784829f..d88b7854 100644 --- a/mih_ui/android/build/reports/problems/problems-report.html +++ b/mih_ui/android/build/reports/problems/problems-report.html @@ -650,12 +650,12 @@ code + .copy-button { diff --git a/mih_ui/android/gradle/wrapper/gradle-wrapper.properties b/mih_ui/android/gradle/wrapper/gradle-wrapper.properties index ac3b4792..e4ef43fb 100644 --- a/mih_ui/android/gradle/wrapper/gradle-wrapper.properties +++ b/mih_ui/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/mih_ui/android/settings.gradle.kts b/mih_ui/android/settings.gradle.kts index bd7522f7..4960023a 100644 --- a/mih_ui/android/settings.gradle.kts +++ b/mih_ui/android/settings.gradle.kts @@ -18,11 +18,11 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.7.3" apply false + id("com.android.application") version "8.11.1" apply false // START: FlutterFire Configuration - id("com.google.gms.google-services") version("4.3.15") apply false + id("com.google.gms.google-services") version("4.4.2") apply false // END: FlutterFire Configuration - id("org.jetbrains.kotlin.android") version "2.1.0" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false } include(":app") diff --git a/mih_ui/android_build_logs.txt b/mih_ui/android_build_logs.txt new file mode 100644 index 00000000..8fe410f7 --- /dev/null +++ b/mih_ui/android_build_logs.txt @@ -0,0 +1,399 @@ + +Launching lib/main_dev.dart on sdk gphone64 arm64 in debug mode... +Running Gradle task 'assembleDebug'... +Checking the license for package NDK (Side by side) 28.2.13676358 in /Users/yaso_meth/Library/Android/sdk/licenses +License for package NDK (Side by side) 28.2.13676358 accepted. +Preparing "Install NDK (Side by side) 28.2.13676358 v.28.2.13676358". +Warning: An error occurred while preparing SDK package NDK (Side by side) 28.2.13676358: No space left on device.: +java.io.IOException: No space left on device + at java.base/sun.nio.ch.UnixFileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.UnixFileDispatcherImpl.write(Unknown Source) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source) + at java.base/sun.nio.ch.IOUtil.write(Unknown Source) + at java.base/sun.nio.ch.IOUtil.write(Unknown Source) + at java.base/sun.nio.ch.FileChannelImpl.write(Unknown Source) + at java.base/sun.nio.ch.ChannelOutputStream.writeFully(Unknown Source) + at java.base/sun.nio.ch.ChannelOutputStream.write(Unknown Source) + at java.base/java.io.BufferedOutputStream.implWrite(Unknown Source) + at java.base/java.io.BufferedOutputStream.write(Unknown Source) + at com.android.repository.util.InstallerUtil.readZipEntry(InstallerUtil.java:192) + at com.android.repository.util.InstallerUtil.unzip(InstallerUtil.java:148) + at com.android.repository.impl.installer.BasicInstaller.doPrepare(BasicInstaller.java:91) + at com.android.repository.impl.installer.AbstractPackageOperation.prepare(AbstractPackageOperation.java:340) + at com.android.builder.sdk.DefaultSdkLoader.installRemotePackages(DefaultSdkLoader.java:365) + at com.android.builder.sdk.DefaultSdkLoader.installSdkTool(DefaultSdkLoader.java:454) + at com.android.build.gradle.internal.SdkHandler.installNdk(SdkHandler.java:329) + at com.android.build.gradle.internal.cxx.configure.NdkLocatorKt.findNdkPathImpl(NdkLocator.kt:242) + at com.android.build.gradle.internal.cxx.configure.NdkLocator.findNdkPath(NdkLocator.kt:425) + at com.android.build.gradle.internal.ndk.NdkHandler.getNdkStatus(NdkHandler.kt:83) + at com.android.build.gradle.internal.ndk.NdkHandler.getNdkPlatform(NdkHandler.kt:96) + at com.android.build.gradle.internal.cxx.gradle.generator.CxxConfigurationModelKt.tryCreateConfigurationParameters(CxxConfigurationModel.kt:213) + at com.android.build.gradle.internal.cxx.configure.CxxCreateGradleTasksKt.createCxxTasks(CxxCreateGradleTasks.kt:89) + at com.android.build.gradle.internal.VariantTaskManager.createTopLevelTasks(VariantTaskManager.kt:217) + at com.android.build.gradle.internal.VariantTaskManager.createTasks(VariantTaskManager.kt:141) + at com.android.build.gradle.internal.plugins.BasePlugin.createAndroidTasks(BasePlugin.kt:770) + at com.android.build.gradle.internal.plugins.BasePlugin$createTasks$2$1.call(BasePlugin.kt:612) + at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:69) + at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:54) + at com.android.build.gradle.internal.profile.AnalyticsResourceManager.recordBlockAtConfiguration(AnalyticsResourceManager.kt:222) + at com.android.build.gradle.internal.profile.AnalyticsConfiguratorService.recordBlock(AnalyticsConfiguratorService.kt:111) + at com.android.build.gradle.internal.plugins.BasePlugin$createTasks$2.accept(BasePlugin.kt:607) + at com.android.build.gradle.internal.plugins.BasePlugin$createTasks$2.accept(BasePlugin.kt:604) + at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt:37) + at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt:35) + at org.gradle.internal.code.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:124) + at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:173) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) + at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:170) + at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:99) + at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:87) + at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44) + at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:268) + at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:170) + at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:84) + at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:70) + at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:380) + at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:272) + at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:160) + at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy78.afterEvaluate(Unknown Source) + at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:247) + at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:244) + at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1603) + at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:253) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) + at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:114) + at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$1(DefaultProjectStateRegistry.java:435) + at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$2(DefaultProjectStateRegistry.java:458) + at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:359) + at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:458) + at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:434) + at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:100) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) + at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:72) + at org.gradle.api.internal.project.DefaultProject.evaluateUnchecked(DefaultProject.java:827) + at org.gradle.api.internal.project.ProjectLifecycleController.lambda$ensureSelfConfigured$2(ProjectLifecycleController.java:88) + at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) + at org.gradle.internal.model.StateTransitionController.lambda$maybeTransitionIfNotCurrentlyTransitioning$10(StateTransitionController.java:199) + at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) + at org.gradle.internal.model.StateTransitionController.maybeTransitionIfNotCurrentlyTransitioning(StateTransitionController.java:195) + at org.gradle.api.internal.project.ProjectLifecycleController.ensureSelfConfigured(ProjectLifecycleController.java:88) + at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.ensureConfigured(DefaultProjectStateRegistry.java:400) + at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:70) + at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:86) + at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:50) + at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:65) + at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) + at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) + at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40) + at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$2(VintageBuildModelController.java:84) + at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) + at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$11(StateTransitionController.java:213) + at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) + at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:209) + at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:84) + at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:71) + at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$6(DefaultBuildLifecycleController.java:175) + at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) + at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$9(StateTransitionController.java:190) + at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) + at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:186) + at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:173) + at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:36) + at org.gradle.internal.cc.impl.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:36) + at org.gradle.internal.cc.impl.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:35) + at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:112) + at org.gradle.internal.cc.impl.VintageBuildTreeWorkController.scheduleAndRunRequestedTasks(VintageBuildTreeWorkController.kt:35) + at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$scheduleAndRunTasks$1(DefaultBuildTreeLifecycleController.java:77) + at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:120) + at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:169) + at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) + at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:169) + at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46) + at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:169) + at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:117) + at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:77) + at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:72) + at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31) + at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) + at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49) + at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:71) + at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:135) + at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41) + at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:54) + at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:130) + at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:54) + at org.gradle.internal.buildtree.InitDeprecationLoggingActionExecutor.execute(InitDeprecationLoggingActionExecutor.java:62) + at org.gradle.internal.buildtree.InitProblems.execute(InitProblems.java:36) + at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40) + at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:71) + at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:60) + at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:71) + at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:67) + at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:63) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) + at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:63) + at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36) + at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110) + at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64) + at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46) + at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:92) + at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:80) + at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:73) + at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:62) + at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:41) + at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:64) + at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:32) + at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:51) + at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:39) + at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:47) + at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:31) + at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:70) + at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.ForwardClientInput.lambda$execute$0(ForwardClientInput.java:40) + at org.gradle.internal.daemon.clientinput.ClientInputForwarder.forwardInput(ClientInputForwarder.java:80) + at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:37) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:64) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63) + at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84) + at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) + at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) + at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52) + at org.gradle.launcher.daemon.server.DaemonStateCoordinator.lambda$runCommand$0(DaemonStateCoordinator.java:321) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +"Install NDK (Side by side) 28.2.13676358 v.28.2.13676358" failed. + +FAILURE: Build completed with 4 failures. + +1: Task failed with an exception. +----------- +* What went wrong: +A problem occurred configuring project ':jni'. +> java.lang.RuntimeException: com.android.builder.sdk.InstallFailedException: Failed to install the following SDK components: + ndk;28.2.13676358 NDK (Side by side) 28.2.13676358 + Install the missing components using the SDK manager in Android Studio. + + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +2: Task failed with an exception. +----------- +* What went wrong: +java.io.FileNotFoundException: /Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.kotlin/errors/errors-cfe3ff1f-8e73-4358-83a4-d984868e3a0f-1782895248380.log (No such file or directory) +> /Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.kotlin/errors/errors-cfe3ff1f-8e73-4358-83a4-d984868e3a0f-1782895248380.log (No such file or directory) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +3: Task failed with an exception. +----------- +* What went wrong: +java.io.FileNotFoundException: /Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.kotlin/errors/errors-8942e788-d3b6-4d60-a7ca-9e186e964ac2-1782895248413.log (No such file or directory) +> /Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.kotlin/errors/errors-8942e788-d3b6-4d60-a7ca-9e186e964ac2-1782895248413.log (No such file or directory) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +4: Task failed with an exception. +----------- +* What went wrong: +java.io.IOException: No space left on device + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +BUILD FAILED in 3m 38s + +FAILURE: Build failed with an exception. + +* What went wrong: +Could not stop all services. +> Failed to release lock on Build Output Cleanup Cache (/Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.gradle/buildOutputCleanup) +> Could not stop all services. + > Failed to release lock on cache directory md-supplier (/Users/yaso_meth/.gradle/caches/8.14/md-supplier) + > Could not stop all services. + > Failed to release lock on Build Output Cleanup Cache (/Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.gradle/buildOutputCleanup) + > Failed to release lock on execution history cache (/Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.gradle/8.14/executionHistory) + > Failed to release lock on cache directory md-rule (/Users/yaso_meth/.gradle/caches/8.14/md-rule) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. + +BUILD FAILED in 3m 38s +Running Gradle task 'assembleDebug'... 218,7s +[!] Gradle threw an error while downloading artifacts from the network. +Retrying Gradle Build: #1, wait time: 100ms +Running Gradle task 'assembleDebug'... +OpenJDK 64-Bit Server VM warning: Insufficient space for shared memory file: + 6368 +Try using the -Djava.io.tmpdir= option to select an alternate temp location. + + +FAILURE: Build completed with 4 failures. + +1: Task failed with an exception. +----------- +* What went wrong: +A problem occurred configuring project ':file_saver'. +> Could not resolve all dependencies for configuration 'classpath'. + > Problems writing to Binary store in /Users/yaso_meth/.gradle/.tmp/gradle14945273148192102443.bin (exist: true) +> Failed to notify project evaluation listener. + > java.lang.NullPointerException (no error message) + > java.lang.NullPointerException (no error message) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +2: Task failed with an exception. +----------- +* What went wrong: +java.io.FileNotFoundException: /Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.kotlin/errors/errors-b524f85e-ee83-40c2-b330-d89a3d4ac323-1782895250713.log (No such file or directory) +> /Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.kotlin/errors/errors-b524f85e-ee83-40c2-b330-d89a3d4ac323-1782895250713.log (No such file or directory) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +3: Task failed with an exception. +----------- +* What went wrong: +java.io.FileNotFoundException: /Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.kotlin/errors/errors-96cad8c6-4794-43ef-b397-a9bd8ca89b67-1782895250715.log (No such file or directory) +> /Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.kotlin/errors/errors-96cad8c6-4794-43ef-b397-a9bd8ca89b67-1782895250715.log (No such file or directory) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +4: Task failed with an exception. +----------- +* What went wrong: +java.io.IOException: No space left on device + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. +============================================================================== + +BUILD FAILED in 1s + +FAILURE: Build failed with an exception. + +* What went wrong: +Could not stop all services. +> Failed to release lock on Build Output Cleanup Cache (/Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/.gradle/buildOutputCleanup) +> Could not stop all services. + > Failed to release lock on cache directory md-supplier (/Users/yaso_meth/.gradle/caches/8.14/md-supplier) + > Could not stop all services. + > Failed to release lock on Build Output Cleanup Cache (/Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.gradle/buildOutputCleanup) + > Failed to release lock on execution history cache (/Users/yaso_meth/Git/flutter/packages/flutter_tools/gradle/.gradle/8.14/executionHistory) + > Failed to release lock on cache directory md-rule (/Users/yaso_meth/.gradle/caches/8.14/md-rule) + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. + +BUILD FAILED in 1s +Running Gradle task 'assembleDebug'... 1 649ms + +┌─ Flutter Fix ────────────────────────────────────────────────────────────────────────┐ +│ [!] Starting AGP 9+, only the new DSL interface will be read. │ +│ This results in a build failure when applying the Flutter Gradle plugin at │ +│ /Users/yaso_meth/Git/mih_main/mih-project/mih_ui/android/app/build.gradle.kts. │ +│ │ +│ To resolve this update flutter or opt out of `android.newDsl`. │ +│ For instructions on how to opt out, see: │ +│ https://developer.android.com/build/releases/agp-9-0-0-release-notes │ +│ │ +│ If you are not upgrading to AGP 9+, run `flutter analyze --suggestions` to check for │ +│ incompatible dependencies. │ +└──────────────────────────────────────────────────────────────────────────────────────┘ +Error: Gradle task assembleDebug failed with exit code 1 diff --git a/mih_ui/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/ios/Runner.xcodeproj/project.pbxproj index 107db2fa..6e608c2c 100644 --- a/mih_ui/ios/Runner.xcodeproj/project.pbxproj +++ b/mih_ui/ios/Runner.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; BB6B9D1B18FA0FA6EA8CED1C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A290F9A90D1B4F51A7E7DD19 /* Pods_RunnerTests.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -68,6 +69,7 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9885C899E803B0DD96117EDD /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; A290F9A90D1B4F51A7E7DD19 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,6 +77,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 71E3C54FEF20104FD7A5C7E5 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -123,6 +126,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -192,6 +196,9 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -218,6 +225,9 @@ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; @@ -773,6 +783,18 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/mih_ui/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/mih_ui/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..e2607570 --- /dev/null +++ b/mih_ui/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,149 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "bb4002485ff867768dec13bf904a2ddb050bd1b1", + "version" : "11.3.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "42e81d245e30e49ea6a5830cf2842d44a1591270", + "version" : "12.15.0" + } + }, + { + "identity" : "google-ads-on-device-conversion-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", + "state" : { + "revision" : "dc39082d8881109d35b94b1c122164c0e8d08a55", + "version" : "3.6.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "144855f40d8668927f256a3045f7fdc4c3f4338b", + "version" : "12.15.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "9f183ae842be978784f2963a343682e0c46d8fb3", + "version" : "8.1.2" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", + "version" : "1.69.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "c0ac7575d70050c2973ba2318bd5af47f8e8153a", + "version" : "5.3.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "3851d94a41890dea16dc3db34caf60e585cb4163", + "version" : "2.30910.1" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "f4a19a3c313dc2616c70bb49d29a799fb16be837", + "version" : "2.4.1" + } + }, + { + "identity" : "recaptcha-enterprise-mobile-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk.git", + "state" : { + "revision" : "85588690041e63784be7bcb4b631c32565127ba2", + "version" : "18.9.1" + } + }, + { + "identity" : "swift-package-manager-google-mobile-ads", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads", + "state" : { + "revision" : "7651abff585dc8dacd1744222d5f03bdd2a8532a", + "version" : "13.6.0" + } + }, + { + "identity" : "swift-package-manager-google-user-messaging-platform", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git", + "state" : { + "revision" : "13b248eaa73b7826f0efb1bcf455e251d65ecb1b", + "version" : "3.1.0" + } + } + ], + "version" : 2 +} diff --git a/mih_ui/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mih_ui/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d42..c3fedb29 100644 --- a/mih_ui/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/mih_ui/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + ('user_box'); + await Hive.openBox('business_box'); + await Hive.openBox('business_user_box'); + await Hive.openBox('user_consent_box'); + await Hive.openBox('image_urls_box'); + await Hive.openBox('personal_profile_links_box'); + await Hive.openBox('business_profile_links_box'); + await Hive.openBox('business_employees_box'); + // Mzansi Wallet Data + await Hive.openBox('loyalty_card_box'); + await Hive.openBox('fav_loyalty_card_box'); + await Hive.openBox('wallet_modifications_queue'); + // About MIH Data + await Hive.openBox('about_mih_box'); + // Mih Calendar Data + await Hive.openBox('personal_calendar_box'); + await Hive.openBox('business_calendar_box'); + // await Firebase.initializeApp( - // options: DefaultFirebaseOptions.currentPlatform, + // // options: DefaultFirebaseOptions.currentPlatform, + // options: (Platform.isLinux) + // ? DefaultFirebaseOptions.web // Forces Linux to use the Web config + // : DefaultFirebaseOptions.currentPlatform, // ); if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) { + const List testDeviceIds = ['733d4c68-9b54-453a-9622-2df407310f40']; + MobileAds.instance.updateRequestConfiguration( + RequestConfiguration( + testDeviceIds: testDeviceIds, + ), + ); MobileAds.instance.initialize(); } else { usePathUrlStrategy(); @@ -33,7 +74,7 @@ void main() async { debugPrint('APP INSTALLED!'); }); final GoRouter appRouter = MihGoRouter().mihRouter; - (MzansiInnovationHub( + runApp(MzansiInnovationHub( router: appRouter, )); } diff --git a/mih_ui/lib/mih_package_components/mih_circle_avatar.dart b/mih_ui/lib/mih_package_components/mih_circle_avatar.dart index e00a2493..51b41329 100644 --- a/mih_ui/lib/mih_package_components/mih_circle_avatar.dart +++ b/mih_ui/lib/mih_package_components/mih_circle_avatar.dart @@ -129,8 +129,7 @@ class _MihCircleAvatarState extends State { ), onPressed: () async { try { - FilePickerResult? result = - await FilePicker.platform.pickFiles( + FilePickerResult? result = await FilePicker.pickFiles( type: FileType.image, ); // print("Here 1"); diff --git a/mih_ui/lib/mih_package_components/mih_image_display.dart b/mih_ui/lib/mih_package_components/mih_image_display.dart index f8ad1f09..aafbfd58 100644 --- a/mih_ui/lib/mih_package_components/mih_image_display.dart +++ b/mih_ui/lib/mih_package_components/mih_image_display.dart @@ -98,8 +98,7 @@ class _MihImageDisplayState extends State { color: MihColors.primary(), onPressed: () async { try { - FilePickerResult? result = - await FilePicker.platform.pickFiles( + FilePickerResult? result = await FilePicker.pickFiles( type: FileType.image, ); // print("Here 1"); diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart index f2939170..97057c06 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart @@ -75,14 +75,13 @@ class _MihBusinessQrCodeState extends State { } else if (defaultTargetPlatform == TargetPlatform.linux || defaultTargetPlatform == TargetPlatform.windows) { // Use File Picker to get a save path on Desktop - String? outputFile = await FilePicker.platform.saveFile( + String? outputFile = await FilePicker.saveFile( dialogTitle: 'Please select where to save your QR Code:', fileName: filename, + bytes: imageBytes, ); if (outputFile != null) { - final file = File(outputFile); - await file.writeAsBytes(imageBytes); KenLogger.success("Saved to $outputFile"); } } else { diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart index c01110ef..55814fec 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:file_picker/file_picker.dart'; import 'package:file_saver/file_saver.dart'; @@ -75,13 +74,14 @@ class _MihPersonalQrCodeState extends State { } else if (defaultTargetPlatform == TargetPlatform.linux || defaultTargetPlatform == TargetPlatform.windows) { // Use File Picker to get a save path on Desktop - String? outputFile = await FilePicker.platform.saveFile( + String? outputFile = await FilePicker.saveFile( dialogTitle: 'Please select where to save your QR Code:', fileName: filename, + bytes: imageBytes, ); if (outputFile != null) { - final file = File(outputFile); - await file.writeAsBytes(imageBytes); + // final file = File(outputFile); + // await file.writeAsBytes(imageBytes); KenLogger.success("Saved to $outputFile"); } } else { diff --git a/mih_ui/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart b/mih_ui/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart index c8b83d01..603b7ba0 100644 --- a/mih_ui/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart +++ b/mih_ui/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart @@ -164,11 +164,9 @@ class _PatientDocumentsState extends State { const SizedBox(width: 10), MihButton( onPressed: () async { - FilePickerResult? result = - await FilePicker.platform.pickFiles( + FilePickerResult? result = await FilePicker.pickFiles( type: FileType.custom, allowedExtensions: ['jpg', 'png', 'pdf'], - withData: true, ); if (result == null) return; final selectedFile = result.files.first; diff --git a/mih_ui/lib/mih_providers/ollama_provider.dart b/mih_ui/lib/mih_providers/ollama_provider.dart index 31e7dc78..5b9bdf9b 100644 --- a/mih_ui/lib/mih_providers/ollama_provider.dart +++ b/mih_ui/lib/mih_providers/ollama_provider.dart @@ -1,41 +1,43 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:flutter_ai_toolkit/flutter_ai_toolkit.dart'; +import 'package:flutter_ai_toolkit/flutter_ai_toolkit.dart' as ai_toolkit; import 'package:ken_logger/ken_logger.dart'; -import 'package:ollama_dart/ollama_dart.dart'; +import 'package:ollama_dart/ollama_dart.dart' as ollama; import 'package:cross_file/cross_file.dart'; -class OllamaProvider extends LlmProvider with ChangeNotifier { +class OllamaProvider extends ai_toolkit.LlmProvider with ChangeNotifier { OllamaProvider({ - String? baseUrl, - Map? headers, - Map? queryParams, + required String baseUrl, + // required Map headers, + // required Map queryParams, required String model, String? systemPrompt, bool? think, - }) : _client = OllamaClient( - baseUrl: baseUrl, - headers: headers, - queryParams: queryParams, + }) : _client = ollama.OllamaClient( + config: ollama.OllamaConfig( + baseUrl: baseUrl, + // defaultHeaders: headers, + // defaultQueryParams: queryParams, + ), ), _model = model, _systemPrompt = systemPrompt, _think = think, _history = []; - final OllamaClient _client; + final ollama.OllamaClient _client; final String _model; - final List _history; + final List _history; final String? _systemPrompt; final bool? _think; @override Stream generateStream( String prompt, { - Iterable attachments = const [], + Iterable attachments = const [], }) async* { final messages = _mapToOllamaMessages([ - ChatMessage.user(prompt, attachments), + ai_toolkit.ChatMessage.user(prompt, attachments), ]); yield* _generateStream(messages); } @@ -43,7 +45,7 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { Stream speechToText(XFile audioFile) async* { KenLogger.success("Inside Custom speechToText funtion"); // 1. Convert the XFile to the attachment format needed for the LLM. - final attachments = [await FileAttachment.fromFile(audioFile)]; + final attachments = [await ai_toolkit.FileAttachment.fromFile(audioFile)]; KenLogger.success("added attachment for audio file"); // 2. Define the transcription prompt, mirroring the logic from LlmChatView. @@ -66,11 +68,11 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { @override Stream sendMessageStream( String prompt, { - Iterable attachments = const [], + Iterable attachments = const [], }) async* { KenLogger.success("sendMessageStream called with: $prompt"); - final userMessage = ChatMessage.user(prompt, attachments); - final llmMessage = ChatMessage.llm(); + final userMessage = ai_toolkit.ChatMessage.user(prompt, attachments); + final llmMessage = ai_toolkit.ChatMessage.llm(); _history.addAll([userMessage, llmMessage]); notifyListeners(); KenLogger.success("History after adding messages: ${_history.length}"); @@ -86,7 +88,7 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { } @override - Iterable get history => _history; + Iterable get history => _history; void resetChat() { _history.clear(); @@ -94,48 +96,41 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { } @override - set history(Iterable history) { + set history(Iterable history) { _history.clear(); _history.addAll(history); notifyListeners(); } - Stream _generateStream(List messages) async* { - final allMessages = []; + Stream _generateStream(List messages) async* { + final allMessages = []; if (_systemPrompt != null && _systemPrompt.isNotEmpty) { KenLogger.success("Adding system prompt to the conversation"); - allMessages.add(Message( - role: MessageRole.system, - content: _systemPrompt, + allMessages.add(ollama.ChatMessage.system( + _systemPrompt, )); } allMessages.addAll(messages); - final stream = _client.generateChatCompletionStream( - request: GenerateChatCompletionRequest( + final stream = _client.chat.createStream( + request: ollama.ChatRequest( model: _model, messages: allMessages, - think: _think ?? false, + think: ollama.ThinkValue.enabled(_think ?? false), ), ); - // final stream = _client.generateChatCompletionStream( - // request: GenerateChatCompletionRequest( - // model: _model, - // messages: messages, - // ), - // ); - yield* stream.map((res) => res.message.content); + yield* stream.map((res) => res.message?.content ?? ''); } - List _mapToOllamaMessages(List messages) { + List _mapToOllamaMessages( + List messages) { return messages.map((message) { switch (message.origin) { - case MessageOrigin.user: + case ai_toolkit.MessageOrigin.user: if (message.attachments.isEmpty) { - return Message( - role: MessageRole.user, - content: message.text ?? '', + return ollama.ChatMessage.user( + message.text ?? '', ); } final imageAttachments = []; @@ -144,32 +139,30 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { docAttachments.add(message.text!); } for (final attachment in message.attachments) { - if (attachment is FileAttachment) { + if (attachment is ai_toolkit.FileAttachment) { final mimeType = attachment.mimeType.toLowerCase(); if (mimeType.startsWith('image/')) { imageAttachments.add(base64Encode(attachment.bytes)); } else if (mimeType == 'application/pdf' || mimeType.startsWith('text/')) { - throw LlmFailureException( + throw ai_toolkit.LlmFailureException( "\n\nAww, that file is a little too advanced for us right now ($mimeType)! We're still learning, but we'll get there! Please try sending us a different file type.\n\nHint: We can handle images quite well!", ); } } else { - throw LlmFailureException( + throw ai_toolkit.LlmFailureException( 'Unsupported attachment type: $attachment', ); } } - return Message( - role: MessageRole.user, - content: docAttachments.join(' '), + return ollama.ChatMessage.user( + docAttachments.join(' '), images: imageAttachments, ); - case MessageOrigin.llm: - return Message( - role: MessageRole.assistant, - content: message.text ?? '', + case ai_toolkit.MessageOrigin.llm: + return ollama.ChatMessage.assistant( + message.text ?? '', ); } }).toList(growable: false); @@ -177,7 +170,7 @@ class OllamaProvider extends LlmProvider with ChangeNotifier { @override void dispose() { - _client.endSession(); + _client.close(); super.dispose(); } } diff --git a/mih_ui/linux/flutter/generated_plugin_registrant.cc b/mih_ui/linux/flutter/generated_plugin_registrant.cc index 4f4c5872..6c9fa3d1 100644 --- a/mih_ui/linux/flutter/generated_plugin_registrant.cc +++ b/mih_ui/linux/flutter/generated_plugin_registrant.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { @@ -25,6 +26,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) record_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) syncfusion_pdfviewer_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "SyncfusionPdfviewerLinuxPlugin"); + syncfusion_pdfviewer_linux_plugin_register_with_registrar(syncfusion_pdfviewer_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/mih_ui/linux/flutter/generated_plugins.cmake b/mih_ui/linux/flutter/generated_plugins.cmake index 1061886b..18ac4ce6 100644 --- a/mih_ui/linux/flutter/generated_plugins.cmake +++ b/mih_ui/linux/flutter/generated_plugins.cmake @@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux printing record_linux + syncfusion_pdfviewer_linux url_launcher_linux ) diff --git a/mih_ui/pubspec.lock b/mih_ui/pubspec.lock index a180a0cf..9f3c1832 100644 --- a/mih_ui/pubspec.lock +++ b/mih_ui/pubspec.lock @@ -297,14 +297,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.1" + cross_cache: + dependency: transitive + description: + name: cross_cache + sha256: "4983a16603cc99b0a14de6a772fa8ee4533411f46f3c423f1386fea7566049c5" + url: "https://pub.dev" + source: hosted + version: "1.1.0" cross_file: dependency: "direct main" description: name: cross_file - sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + sha256: d687bec93342bf6a764a116d15c8694ebeff10e633dc28a39dd3144f7195024e url: "https://pub.dev" source: hosted - version: "0.3.5+2" + version: "0.3.5+3" crypto: dependency: transitive description: @@ -349,26 +357,26 @@ packages: dependency: transitive description: name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" + sha256: "792974a4007974fbc5c1b5433eb2330a9db3e368c3f906253af4c007d0f49a91" url: "https://pub.dev" source: hosted - version: "0.7.14" + version: "0.7.13" device_info_plus: dependency: transitive description: name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + sha256: "0891702f96b2e465fe567b7ec448380e6b1c14f60af552a8536d9f583b6b8442" url: "https://pub.dev" source: hosted - version: "11.5.0" + version: "13.2.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + sha256: "04b173a92e2d9161dfead145667037c8d834db725ce2e7b942bfe18fd2f45a46" url: "https://pub.dev" source: hosted - version: "7.0.3" + version: "8.1.0" diacritic: dependency: transitive description: @@ -389,18 +397,18 @@ packages: dependency: transitive description: name: dio - sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + sha256: ea2bad3c89a27635ce2d85cce4d6b199da49a5a48ec77b03e45b65a3b90922b0 url: "https://pub.dev" source: hosted - version: "5.9.2" + version: "5.10.0" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + sha256: dd58dc3861eb36edb13b217efc006a1c21e5bbc341de8c229b85634fa5e362e4 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.2.0" equatable: dependency: transitive description: @@ -425,6 +433,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + ffi_leak_tracker: + dependency: transitive + description: + name: ffi_leak_tracker + sha256: "4093d4ef9ca06ffe2786e73bfb25e22aa92112b9bb4ec941f11e3e6b61489a97" + url: "https://pub.dev" + source: hosted + version: "0.1.2" file: dependency: transitive description: @@ -437,18 +453,18 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" + sha256: fdc6a37f715d19f35b131decf1ce39242eeed5ddae18c0818c3eccb731ab76be url: "https://pub.dev" source: hosted - version: "10.3.10" + version: "12.0.0-beta.7" file_saver: dependency: "direct main" description: name: file_saver - sha256: "9d93db09bd4da9e43238f9dd485360fc51a5c138eea5ef5f407ec56e58079ac0" + sha256: "68c9a085d9bb4546e0a31d1e583a48d7c17a6987d538788ea064f0043b1fc02d" url: "https://pub.dev" source: hosted - version: "0.3.1" + version: "0.4.0" file_selector: dependency: transitive description: @@ -618,10 +634,10 @@ packages: dependency: "direct main" description: name: flutter_ai_toolkit - sha256: b653814f9aac05d84f15db0daf1bf90e9bd9177abeba378c6f1d4a75bb2099a5 + sha256: "070a27e5ceb7154d15dffd165b3f7d60ec12d0a78b4d7a4063466c5657e13843" url: "https://pub.dev" source: hosted - version: "0.10.0" + version: "1.0.0" flutter_cache_manager: dependency: transitive description: @@ -630,6 +646,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.1" + flutter_chat_core: + dependency: transitive + description: + name: flutter_chat_core + sha256: "8c46790f64f106bf6e610e2a7324b3844320e9e295867c06d45d9deb134d848d" + url: "https://pub.dev" + source: hosted + version: "2.9.0" flutter_chat_types: dependency: "direct main" description: @@ -642,18 +666,18 @@ packages: dependency: "direct main" description: name: flutter_chat_ui - sha256: "168a4231464ad00a17ea5f0813f1b58393bdd4035683ea4dc37bbe26be62891e" + sha256: cfbaac38f429beb33d9cc1ca920ae7ccbadbed282c99335d590d61306d3a3d0f url: "https://pub.dev" source: hosted - version: "1.6.15" + version: "2.11.1" flutter_context_menu: dependency: transitive description: name: flutter_context_menu - sha256: "79fe00cd7e3ac3840a552cb3e653d8eb61d827b6c04c559e219973a1dc769165" + sha256: "7040c03fb9cb2a113282d836edadf32b6cdff67cccdf3d158e7411ecc15d7712" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.4.2" flutter_launcher_icons: dependency: "direct main" description: @@ -662,22 +686,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.14.4" - flutter_link_previewer: - dependency: transitive - description: - name: flutter_link_previewer - sha256: "007069e60f42419fb59872beb7a3cc3ea21e9f1bdff5d40239f376fa62ca9f20" - url: "https://pub.dev" - source: hosted - version: "3.2.2" - flutter_linkify: - dependency: transitive - description: - name: flutter_linkify - sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" - url: "https://pub.dev" - source: hosted - version: "6.0.0" flutter_lints: dependency: "direct dev" description: @@ -702,14 +710,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.8" - flutter_parsed_text: - dependency: transitive - description: - name: flutter_parsed_text - sha256: "529cf5793b7acdf16ee0f97b158d0d4ba0bf06e7121ef180abe1a5b59e32c1e2" - url: "https://pub.dev" - source: hosted - version: "2.2.1" flutter_picture_taker: dependency: transitive description: @@ -788,10 +788,10 @@ packages: dependency: "direct main" description: name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" + sha256: e146a6d63776582651e97a79cbe459f8e1211b100101fadcd84db83361fa599f url: "https://pub.dev" source: hosted - version: "14.0.2" + version: "14.0.3" geolocator_android: dependency: transitive description: @@ -812,10 +812,10 @@ packages: dependency: "direct main" description: name: geolocator_linux - sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 + sha256: "3da7420f11c3496511a5bd3c18fd67b88e5659f12e46b7ce00a788f6996e850a" url: "https://pub.dev" source: hosted - version: "0.2.4" + version: "0.2.6" geolocator_platform_interface: dependency: transitive description: @@ -852,18 +852,18 @@ packages: dependency: "direct main" description: name: gma_mediation_meta - sha256: "765367719c81043ee9cde12c854fae9c8de00c619bb0811fd8ce63541d962710" + sha256: d65dd79c51f6161aaac8c9b07f9a921f73a560d275a15106f440be2016c766bc url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.2" go_router: dependency: "direct main" description: name: go_router - sha256: d8f590a69729f719177ea68eb1e598295e8dbc41bbc247fed78b2c8a25660d7c + sha256: "5922b2861e2235a3504896f0d6fa07d84141b480cf52eecd2f42cd25585a9e8a" url: "https://pub.dev" source: hosted - version: "16.3.0" + version: "17.3.0" google_fonts: dependency: transitive description: @@ -876,10 +876,10 @@ packages: dependency: "direct main" description: name: google_mobile_ads - sha256: a4f59019f2c32769fb6c60ed8aa321e9c21a36297e2c4f23452b3e779a3e7a26 + sha256: "50549f6c945d7a445d53c04f34d025b1a1723fbd02719de9e67de432e2597f40" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "8.0.0" graphs: dependency: transitive description: @@ -960,22 +960,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + idb_shim: + dependency: transitive + description: + name: idb_shim + sha256: a3b70c0c49c90dfbb3ffcaf6a1e376a83d542dc59124e6f29b1e84487c481c30 + url: "https://pub.dev" + source: hosted + version: "2.9.6" image: dependency: transitive description: name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.1" image_picker: dependency: transitive description: name: image_picker - sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" + sha256: d8402284df184bc05f4a2210c6c23983b0720f4cd87cbd05c5390a78af602667 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.3" image_picker_android: dependency: transitive description: @@ -1120,14 +1128,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" - linkify: - dependency: transitive - description: - name: linkify - sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" - url: "https://pub.dev" - source: hosted - version: "5.0.0" lints: dependency: transitive description: @@ -1212,10 +1212,10 @@ packages: dependency: "direct main" description: name: math_expressions - sha256: e32d803d758ace61cc6c4bdfed1226ff60a6a23646b35685670d28b5616139f8 + sha256: "2e1ceb974c2b1893c809a68c7005f1b63f7324db0add800a0e792b1ac8ff9f03" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "3.1.0" measure_size: dependency: transitive description: @@ -1292,10 +1292,10 @@ packages: dependency: "direct main" description: name: ollama_dart - sha256: "55a45e381f3cf24791df510e287f353e776d376f556d34ba49b09bc918eee319" + sha256: ec1ed4d10ca53ca5014b50db2c189fe88634e3ba4203b328cb436562f884fe17 url: "https://pub.dev" source: hosted - version: "0.2.5" + version: "2.3.0" os_detect: dependency: transitive description: @@ -1316,18 +1316,18 @@ packages: dependency: transitive description: name: package_info_plus - sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad url: "https://pub.dev" source: hosted - version: "9.0.1" + version: "10.2.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + sha256: db762cb2f4f25ee60fb6359773861b0f199e00b90d237bd85a76a1e806b46ef4 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "4.1.0" path: dependency: transitive description: @@ -1396,10 +1396,10 @@ packages: dependency: transitive description: name: pdf - sha256: e47a275b267873d5944ad5f5ff0dcc7ac2e36c02b3046a0ffac9b72fd362c44b + sha256: "517df47af468734a23c8b513c0c6a8a62357403ab1b8ab7fad1606576a9dbdd0" url: "https://pub.dev" source: hosted - version: "3.12.0" + version: "3.13.0" pdf_widget_wrapper: dependency: transitive description: @@ -1416,14 +1416,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.2" - photo_view: - dependency: transitive - description: - name: photo_view - sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" - url: "https://pub.dev" - source: hosted - version: "0.15.0" platform: dependency: transitive description: @@ -1460,10 +1452,10 @@ packages: dependency: "direct main" description: name: printing - sha256: "689170c9ddb1bda85826466ba80378aa8993486d3c959a71cd7d2d80cb606692" + sha256: f6cd14c768c1352dd37a958a3ee351aa9ce305b398218d3acd86389d5f7ecad1 url: "https://pub.dev" source: hosted - version: "5.14.3" + version: "5.15.0" protobuf: dependency: transitive description: @@ -1704,30 +1696,38 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" - scroll_to_index: + scrollview_observer: dependency: transitive description: - name: scroll_to_index - sha256: b707546e7500d9f070d63e5acf74fd437ec7eeeb68d3412ef7b0afada0b4f176 + name: scrollview_observer + sha256: "5ce907c5757d0805de974de8b17c0185f982dfe805dde22a0acb016b39182ece" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "1.27.0" + sembast: + dependency: transitive + description: + name: sembast + sha256: a58b26925e23071cf0f4754d8449aabe829e9a9930a872fb18e6ae4c2c88e025 + url: "https://pub.dev" + source: hosted + version: "3.8.9+1" share_plus: dependency: "direct main" description: name: share_plus - sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 + sha256: "9eee8283462d91a7a1c8bdb67d08874abd75a2f8fae3bc0ca033035e375fb3d8" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "13.2.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + sha256: "7f7ae28cf400d13f811e297ff37742dba83b79e0a6f5dce14eec0248274e6ce9" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "7.1.0" shared_preferences: dependency: transitive description: @@ -1929,66 +1929,74 @@ packages: dependency: "direct main" description: name: syncfusion_flutter_core - sha256: bee87cdfe527b31705190162e3bd27bf468d591ae7c68182244bdfd94e21f737 + sha256: f054f5636c618dbf1a155409d0b5f3e70f8e9beb7ac7a8fdc870653968875e7d url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_flutter_pdf: dependency: transitive description: name: syncfusion_flutter_pdf - sha256: "08fc998934dab953e980ab3b98482e994beda2e736b88c9fec99cdcf04036509" + sha256: "63ebe5bb3261e83c586a9105c12ae55d8b70863c7f7bb867048f081b9bf46d6e" url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_flutter_pdfviewer: dependency: "direct main" description: name: syncfusion_flutter_pdfviewer - sha256: "240c3c50e5a9a0ed2ca9d0449414f83ddcb09dafc798362bf8d8db11dabffdfe" + sha256: ac0c2bfe233ab1253746de72a46d32c69b1f13267e245989e13dc55970fbb50a url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_flutter_signaturepad: dependency: transitive description: name: syncfusion_flutter_signaturepad - sha256: "903dcd8a6afcd94488be296f9e45c28e2ea6634849eccb70066e310db4198edc" + sha256: f127af6fcb7de2dae74a0856f005747d27869fb176c8b92346136fe2254d73dc url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" + syncfusion_pdfviewer_linux: + dependency: transitive + description: + name: syncfusion_pdfviewer_linux + sha256: "8f24e911178b126f9ed65158880ebb1478519e351f45b2a6da87ea1d4e66c8b8" + url: "https://pub.dev" + source: hosted + version: "33.2.15" syncfusion_pdfviewer_macos: dependency: transitive description: name: syncfusion_pdfviewer_macos - sha256: "529befb03610bc5f647ddba84150355bea18a25f5ce8329f3065971a498b89d1" + sha256: ca72847813956eb01a0f580827fdb7784eeff1bbbb2565d4253bf32325c911da url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_pdfviewer_platform_interface: dependency: transitive description: name: syncfusion_pdfviewer_platform_interface - sha256: e27a16b987b7b0d241a153ac96119c2bf753075cae93301e0143ebf7c139503b + sha256: f4dc6151e9f5a8ca1a385773ada3f23e1a5f96ece867045620f7e7600653717b url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_pdfviewer_web: dependency: transitive description: name: syncfusion_pdfviewer_web - sha256: "1cf1d8f8871fd421e454e7e38f1044b6b170bb0201a5bee8634210d27aa79e2e" + sha256: b3a455f0806bee6de2d0d6a13b12bb2d3fa598111b36927a5c8dcbb2a6f316ef url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" syncfusion_pdfviewer_windows: dependency: transitive description: name: syncfusion_pdfviewer_windows - sha256: cc6826cdae73657d010bd4480b5c6f06a78589e86185eeec9f6ec931c4c4276a + sha256: "983ae0f6b3a0682692a4050f82a52fb61187454cdd3322e67494db16731bc74d" url: "https://pub.dev" source: hosted - version: "29.2.11" + version: "33.2.15" synchronized: dependency: transitive description: @@ -2057,10 +2065,10 @@ packages: dependency: "direct main" description: name: upgrader - sha256: "3fae4eb861c7e8567f91412d9ca4a287e024e58d6f79f98da79e3f6d78da74ba" + sha256: "6282524d4b664e48e24736ce343eedd115dcc1ce79198fc0bd46f14692e1f05e" url: "https://pub.dev" source: hosted - version: "12.5.0" + version: "13.5.0" url_launcher: dependency: "direct main" description: @@ -2173,14 +2181,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" - visibility_detector: - dependency: transitive - description: - name: visibility_detector - sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 - url: "https://pub.dev" - source: hosted - version: "0.4.0+2" vm_service: dependency: transitive description: @@ -2273,18 +2273,18 @@ packages: dependency: transitive description: name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + sha256: ba6f4bba816c8d7e3c1580e170f3786d216951cc6b94babc3b814c08d2cb2738 url: "https://pub.dev" source: hosted - version: "5.15.0" + version: "6.3.0" win32_registry: dependency: transitive description: name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + sha256: "73b1d78920a9d6e03f8b4e43e612b87bf3152a0e5c5e5150267762b7c4116904" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.3" xdg_directories: dependency: transitive description: @@ -2297,10 +2297,10 @@ packages: dependency: transitive description: name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "7.0.1" yaml: dependency: transitive description: diff --git a/mih_ui/pubspec.yaml b/mih_ui/pubspec.yaml index b90b2080..5867089b 100644 --- a/mih_ui/pubspec.yaml +++ b/mih_ui/pubspec.yaml @@ -1,7 +1,7 @@ name: mzansi_innovation_hub description: "" publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 1.4.0+134 +version: 1.4.0+135 environment: sdk: ">=3.5.3 <4.0.0" @@ -16,10 +16,10 @@ dependencies: font_awesome_flutter: ^11.0.0 # firebase_core: ^4.4.0 # firebase_core_desktop: ^1.0.2 - syncfusion_flutter_core: ^29.2.10 - syncfusion_flutter_pdfviewer: ^29.2.10 + syncfusion_flutter_core: ^33.2.15 + syncfusion_flutter_pdfviewer: ^33.2.15 universal_html: ^2.2.4 - file_picker: ^10.1.9 + file_picker: ^12.0.0-beta.7 supertokens_flutter: ^0.6.3 http: ^1.2.1 # args: ^2.7.0 @@ -35,30 +35,30 @@ dependencies: url_launcher: ^6.3.1 fl_downloader: ^2.0.2 local_auth: ^2.3.0 - math_expressions: ^2.6.0 - ollama_dart: ^0.2.2+1 - flutter_chat_ui: ^1.6.15 + math_expressions: ^3.1.0 + ollama_dart: ^2.3.0 + flutter_chat_ui: ^2.11.1 flutter_chat_types: ^3.6.2 uuid: ^4.5.1 flutter_tts: ^4.2.3 flutter_speed_dial: ^7.0.0 - share_plus: ^11.0.0 + share_plus: ^13.2.0 #app_settings: ^6.1.1 pwa_install: ^0.0.6 - google_mobile_ads: ^6.0.0 + google_mobile_ads: ^8.0.0 gma_mediation_meta: ^1.4.1 redacted: ^1.0.13 custom_rating_bar: ^3.0.0 country_code_picker: ^3.3.0 ken_logger: ^0.0.3 - go_router: ^16.1.0 + go_router: ^17.3.0 screen_brightness: ^2.1.6 cached_network_image: ^3.4.1 - upgrader: ^12.0.0 + upgrader: ^13.5.0 screenshot: ^3.0.0 - file_saver: ^0.3.1 + file_saver: ^0.4.0 provider: ^6.1.5+1 - flutter_ai_toolkit: ^0.10.0 + flutter_ai_toolkit: ^1.0.0 flutter_markdown_plus: ^1.0.5 cross_file: ^0.3.5+1 quick_actions: ^1.1.0 From 62eafaf7660ae90219b304d36764c07d8e516311 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 2 Jul 2026 09:59:35 +0200 Subject: [PATCH 12/14] ios build update, about mih count fix & new get file api --- mih_api_hub/Minio_Storage/minioConnection.py | 14 +- mih_api_hub/routers/fileStorage.py | 22 +- mih_ui/ios/Podfile.lock | 334 +----------------- mih_ui/ios/Runner.xcodeproj/project.pbxproj | 29 +- .../xcshareddata/swiftpm/Package.resolved | 149 ++++++++ .../about_mih/package_tools/mih_info.dart | 2 +- .../lib/mih_services/mih_file_services.dart | 55 ++- mih_ui/pubspec.yaml | 2 +- 8 files changed, 236 insertions(+), 371 deletions(-) create mode 100644 mih_ui/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/mih_api_hub/Minio_Storage/minioConnection.py b/mih_api_hub/Minio_Storage/minioConnection.py index 106d0010..25a848df 100644 --- a/mih_api_hub/Minio_Storage/minioConnection.py +++ b/mih_api_hub/Minio_Storage/minioConnection.py @@ -5,21 +5,21 @@ from dotenv import load_dotenv load_dotenv() minioAccess = os.getenv("MINIO_ACCESS_KEY") minioSecret = os.getenv("MINIO_SECRET_KEY") +minioEndpoint = os.getenv("MINIO_ENDPOINT", "mih-minio:9000") +minioSecure = os.getenv("MINIO_SECURE", "False") in ("True") def minioConnect(env): if(env == "Dev"): return Minio( - endpoint="mih-minio:9000", - # "minio.mzansi-innovation-hub.co.za", + endpoint=minioEndpoint, access_key=minioAccess, secret_key=minioSecret, - secure=False + secure=minioSecure, ) else: return Minio( - # endpoint="mih-minio:9000", - endpoint="minio.mzansi-innovation-hub.co.za", + endpoint=minioEndpoint, access_key=minioAccess, secret_key=minioSecret, - secure=True - ) \ No newline at end of file + secure=minioSecure, + ) diff --git a/mih_api_hub/routers/fileStorage.py b/mih_api_hub/routers/fileStorage.py index 60ddd6a7..a515f515 100644 --- a/mih_api_hub/routers/fileStorage.py +++ b/mih_api_hub/routers/fileStorage.py @@ -5,7 +5,7 @@ from typing import List import requests from fastapi import APIRouter, HTTPException, File, UploadFile, Form -from fastapi.responses import FileResponse, JSONResponse +from fastapi.responses import FileResponse, JSONResponse, StreamingResponse from pydantic import BaseModel @@ -108,6 +108,26 @@ class claimStatementUploud(BaseModel): logo_path: str sig_path: str +@router.get("/v2/minio/pull/file/{env}/{app_id}/{folder}/{file_name}", tags=["Minio"]) +async def pullFileFromMinioV2(app_id: str, folder: str, file_name: str, env: str): + object_path = f"{app_id}/{folder}/{file_name}" + try: + client = Minio_Storage.minioConnection.minioConnect(env) + + response = client.get_object(bucket_name="mih", object_name=object_path) + + ext = file_name.split(".")[-1].lower() + content_type = f"image/{ext}" if ext in ["png", "jpg", "jpeg", "gif", "webp"] else "application/octet-stream" + + return StreamingResponse( + io.BytesIO(response.read()), + media_type=content_type, + headers={"Cache-Control": "public, max-age=31536000"} + ) + + except Exception as error: + raise HTTPException(status_code=404, detail=f"File not found or MinIO connection failed: {str(error)}") + @router.get("/minio/pull/file/{env}/{app_id}/{folder}/{file_name}", tags=["Minio"]) async def pull_File_from_user(app_id: str, folder: str, file_name: str, env: str): #, session: SessionContainer = Depends(verify_session()) path = app_id + "/" + folder + "/" + file_name diff --git a/mih_ui/ios/Podfile.lock b/mih_ui/ios/Podfile.lock index 3d76d0db..c32a40ff 100644 --- a/mih_ui/ios/Podfile.lock +++ b/mih_ui/ios/Podfile.lock @@ -1,360 +1,52 @@ PODS: - - app_settings (6.1.2): - - Flutter - - AppCheckCore (11.2.0): - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - camera_avfoundation (0.0.1): - - Flutter - - device_info_plus (0.0.1): - - Flutter - - DKImagePickerController/Core (4.3.9): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.9) - - DKImagePickerController/PhotoGallery (4.3.9): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.9) - - DKPhotoGallery (0.0.19): - - DKPhotoGallery/Core (= 0.0.19) - - DKPhotoGallery/Model (= 0.0.19) - - DKPhotoGallery/Preview (= 0.0.19) - - DKPhotoGallery/Resource (= 0.0.19) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.19): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.19): - - SDWebImage - - SwiftyGif - - FBAudienceNetwork (6.20.1) - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - file_saver (0.0.1): - - Flutter - - file_selector_ios (0.0.1): - - Flutter - - Firebase/Auth (12.8.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 12.8.0) - - Firebase/CoreOnly (12.8.0): - - FirebaseCore (~> 12.8.0) - - firebase_app_check (0.4.1-2): - - Firebase/CoreOnly (~> 12.8.0) - - firebase_core - - FirebaseAppCheck (~> 12.8.0) - - Flutter - - firebase_auth (6.1.2): - - Firebase/Auth (= 12.8.0) - - firebase_core - - Flutter - - firebase_core (4.4.0): - - Firebase/CoreOnly (= 12.8.0) - - Flutter - - FirebaseAppCheck (12.8.0): - - AppCheckCore (~> 11.0) - - FirebaseAppCheckInterop (~> 12.8.0) - - FirebaseCore (~> 12.8.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - FirebaseAppCheckInterop (12.8.0) - - FirebaseAuth (12.8.0): - - FirebaseAppCheckInterop (~> 12.8.0) - - FirebaseAuthInterop (~> 12.8.0) - - FirebaseCore (~> 12.8.0) - - FirebaseCoreExtension (~> 12.8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GTMSessionFetcher/Core (< 6.0, >= 3.4) - - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (12.8.0) - - FirebaseCore (12.8.0): - - FirebaseCoreInternal (~> 12.8.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.8.0): - - FirebaseCore (~> 12.8.0) - - FirebaseCoreInternal (12.8.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FBAudienceNetwork (6.21.1) - fl_downloader (0.0.1): - Flutter - Flutter (1.0.0) - - flutter_native_splash (2.4.3): - - Flutter - flutter_tts (0.0.1): - Flutter - - geolocator_apple (1.2.0): + - gma_mediation_meta (1.5.2): - Flutter - - FlutterMacOS - - gma_mediation_meta (1.4.1): - - Flutter - - GoogleMobileAdsMediationFacebook (~> 6.20.1.0) - - Google-Mobile-Ads-SDK (12.2.0): + - GoogleMobileAdsMediationFacebook (~> 6.21.1.0) + - Google-Mobile-Ads-SDK (13.6.0): - GoogleUserMessagingPlatform (>= 1.1) - - google_mobile_ads (6.0.0): - - Flutter - - Google-Mobile-Ads-SDK (~> 12.2.0) - - webview_flutter_wkwebview - - GoogleMobileAdsMediationFacebook (6.20.1.0): - - FBAudienceNetwork (= 6.20.1) - - Google-Mobile-Ads-SDK (~> 12.0) + - GoogleMobileAdsMediationFacebook (6.21.1.1.1): + - FBAudienceNetwork (= 6.21.1) + - Google-Mobile-Ads-SDK (~> 13.4) - GoogleUserMessagingPlatform (3.1.0) - - 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 - - GTMSessionFetcher/Core (5.0.0) - - image_picker_ios (0.0.1): - - Flutter - - local_auth_darwin (0.0.1): - - Flutter - - FlutterMacOS - - mobile_scanner (7.0.0): - - Flutter - - FlutterMacOS - - package_info_plus (0.4.5): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - printing (1.0.0): - - Flutter - - PromisesObjC (2.4.0) - - quick_actions_ios (0.0.1): - - Flutter - - RecaptchaInterop (101.0.0) - - record_ios (1.1.0): - - Flutter - - screen_brightness_ios (0.1.0): - - Flutter - - SDWebImage (5.21.5): - - SDWebImage/Core (= 5.21.5) - - SDWebImage/Core (5.21.5) - - share_plus (0.0.1): - - Flutter - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - SwiftyGif (5.4.5) - - syncfusion_flutter_pdfviewer (0.0.1): - - Flutter - - url_launcher_ios (0.0.1): - - Flutter - - webview_flutter_wkwebview (0.0.1): - - Flutter - - FlutterMacOS DEPENDENCIES: - - app_settings (from `.symlinks/plugins/app_settings/ios`) - - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - file_saver (from `.symlinks/plugins/file_saver/ios`) - - file_selector_ios (from `.symlinks/plugins/file_selector_ios/ios`) - - firebase_app_check (from `.symlinks/plugins/firebase_app_check/ios`) - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - fl_downloader (from `.symlinks/plugins/fl_downloader/ios`) - Flutter (from `Flutter`) - - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - gma_mediation_meta (from `.symlinks/plugins/gma_mediation_meta/ios`) - - google_mobile_ads (from `.symlinks/plugins/google_mobile_ads/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - printing (from `.symlinks/plugins/printing/ios`) - - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - - record_ios (from `.symlinks/plugins/record_ios/ios`) - - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - - syncfusion_flutter_pdfviewer (from `.symlinks/plugins/syncfusion_flutter_pdfviewer/ios`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) SPEC REPOS: trunk: - - AppCheckCore - - DKImagePickerController - - DKPhotoGallery - FBAudienceNetwork - - Firebase - - FirebaseAppCheck - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - Google-Mobile-Ads-SDK - GoogleMobileAdsMediationFacebook - GoogleUserMessagingPlatform - - GoogleUtilities - - GTMSessionFetcher - - PromisesObjC - - RecaptchaInterop - - SDWebImage - - SwiftyGif EXTERNAL SOURCES: - app_settings: - :path: ".symlinks/plugins/app_settings/ios" - camera_avfoundation: - :path: ".symlinks/plugins/camera_avfoundation/ios" - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - file_saver: - :path: ".symlinks/plugins/file_saver/ios" - file_selector_ios: - :path: ".symlinks/plugins/file_selector_ios/ios" - firebase_app_check: - :path: ".symlinks/plugins/firebase_app_check/ios" - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" fl_downloader: :path: ".symlinks/plugins/fl_downloader/ios" Flutter: :path: Flutter - flutter_native_splash: - :path: ".symlinks/plugins/flutter_native_splash/ios" flutter_tts: :path: ".symlinks/plugins/flutter_tts/ios" - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/darwin" gma_mediation_meta: :path: ".symlinks/plugins/gma_mediation_meta/ios" - google_mobile_ads: - :path: ".symlinks/plugins/google_mobile_ads/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - local_auth_darwin: - :path: ".symlinks/plugins/local_auth_darwin/darwin" - mobile_scanner: - :path: ".symlinks/plugins/mobile_scanner/darwin" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - printing: - :path: ".symlinks/plugins/printing/ios" - quick_actions_ios: - :path: ".symlinks/plugins/quick_actions_ios/ios" - record_ios: - :path: ".symlinks/plugins/record_ios/ios" - screen_brightness_ios: - :path: ".symlinks/plugins/screen_brightness_ios/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - sqflite_darwin: - :path: ".symlinks/plugins/sqflite_darwin/darwin" - syncfusion_flutter_pdfviewer: - :path: ".symlinks/plugins/syncfusion_flutter_pdfviewer/ios" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - webview_flutter_wkwebview: - :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: - app_settings: 0341ec6daa4f0c50f5a421bf0ad7c36084db6e90 - AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f - camera_avfoundation: be3be85408cd4126f250386828e9b1dfa40ab436 - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c - DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - FBAudienceNetwork: 08e86d63a05b3a5a59414af12e4af8d756943c80 - file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6 - file_selector_ios: f92e583d43608aebc2e4a18daac30b8902845502 - Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d - firebase_app_check: 9756167f67afd4844027314bea522e42599631b5 - firebase_auth: 2ebdb4dbe0da3a75585694dcba711f7a8a926601 - firebase_core: ee30637e6744af8e0c12a6a1e8a9718506ec2398 - FirebaseAppCheck: 11da425929a45c677d537adfff3520ccd57c1690 - FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d - FirebaseAuth: 4c289b1a43f5955283244a55cf6bd616de344be5 - FirebaseAuthInterop: 95363fe96493cb4f106656666a0768b420cba090 - FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c - FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2 - FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21 - fl_downloader: dc99aa8dd303f862cccb830087f37acc9b0156ee + FBAudienceNetwork: 85d18a65c9e35bc426bd4664cf3ae2a1172d7b60 + fl_downloader: e9913c2722a6819ac7f5c08de5e7b59ada200ca9 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf - flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833 - geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e - gma_mediation_meta: 44defcf3b61414cdca65c0f897360e31b9332a09 - Google-Mobile-Ads-SDK: 1dfb0c3cb46c7e2b00b0f4de74a1e06d9ea25d67 - google_mobile_ads: 535223588a6791b7a3cc3513a1bc7b89d12f3e62 - GoogleMobileAdsMediationFacebook: b11a92ae3bfdae19853b882252b7e62791c18162 + flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113 + gma_mediation_meta: cfa5493a4d585032e7789848190d320090c71709 + Google-Mobile-Ads-SDK: 6e501ace4af8d63e967bd45497c8b2b05821163d + GoogleMobileAdsMediationFacebook: 4420c648e278f6821001048d1f152dd74245f759 GoogleUserMessagingPlatform: befe603da6501006420c206222acd449bba45a9c - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - GTMSessionFetcher: 02d6e866e90bc236f48a703a041dfe43e6221a29 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a - local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 - mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - printing: 54ff03f28fe9ba3aa93358afb80a8595a071dd07 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - quick_actions_ios: 4b07fb49d8d8f3518d7565fbb7a91014067a7d82 - RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba - record_ios: f75fa1d57f840012775c0e93a38a7f3ceea1a374 - screen_brightness_ios: 9953fd7da5bd480f1a93990daeec2eb42d4f3b52 - SDWebImage: e9c98383c7572d713c1a0d7dd2783b10599b9838 - share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 - sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - syncfusion_flutter_pdfviewer: 90dc48305d2e33d4aa20681d1e98ddeda891bc14 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d - webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 PODFILE CHECKSUM: 1057d7c44bf0ab9d1ed8a78d57b4ebda5272e992 diff --git a/mih_ui/ios/Runner.xcodeproj/project.pbxproj b/mih_ui/ios/Runner.xcodeproj/project.pbxproj index 6e608c2c..de4811ed 100644 --- a/mih_ui/ios/Runner.xcodeproj/project.pbxproj +++ b/mih_ui/ios/Runner.xcodeproj/project.pbxproj @@ -13,11 +13,11 @@ 71E3C54FEF20104FD7A5C7E5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 277EDD110F2042FAAC4E5333 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 75DB4569FB42001E83B22FC4 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 486D5A0EDC898EC440394271 /* GoogleService-Info.plist */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; BB6B9D1B18FA0FA6EA8CED1C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A290F9A90D1B4F51A7E7DD19 /* Pods_RunnerTests.framework */; }; - 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -59,6 +59,7 @@ 52DEBFF4174C303DD5BF01CA /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -69,7 +70,6 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9885C899E803B0DD96117EDD /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; A290F9A90D1B4F51A7E7DD19 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -196,9 +196,6 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { - packageProductDependencies = ( - 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, - ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -217,6 +214,9 @@ dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -225,9 +225,6 @@ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { - packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, - ); isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; @@ -253,6 +250,9 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -488,7 +488,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -515,6 +515,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = MIH; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -626,7 +627,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -678,7 +679,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -707,6 +708,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = MIH; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -737,6 +739,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = MIH; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -783,12 +786,14 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + /* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; /* End XCLocalSwiftPackageReference section */ + /* Begin XCSwiftPackageProductDependency section */ 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { isa = XCSwiftPackageProductDependency; diff --git a/mih_ui/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/mih_ui/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..e2607570 --- /dev/null +++ b/mih_ui/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,149 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "bb4002485ff867768dec13bf904a2ddb050bd1b1", + "version" : "11.3.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "42e81d245e30e49ea6a5830cf2842d44a1591270", + "version" : "12.15.0" + } + }, + { + "identity" : "google-ads-on-device-conversion-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", + "state" : { + "revision" : "dc39082d8881109d35b94b1c122164c0e8d08a55", + "version" : "3.6.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "144855f40d8668927f256a3045f7fdc4c3f4338b", + "version" : "12.15.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "9f183ae842be978784f2963a343682e0c46d8fb3", + "version" : "8.1.2" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", + "version" : "1.69.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "c0ac7575d70050c2973ba2318bd5af47f8e8153a", + "version" : "5.3.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "3851d94a41890dea16dc3db34caf60e585cb4163", + "version" : "2.30910.1" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "f4a19a3c313dc2616c70bb49d29a799fb16be837", + "version" : "2.4.1" + } + }, + { + "identity" : "recaptcha-enterprise-mobile-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk.git", + "state" : { + "revision" : "85588690041e63784be7bcb4b631c32565127ba2", + "version" : "18.9.1" + } + }, + { + "identity" : "swift-package-manager-google-mobile-ads", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads", + "state" : { + "revision" : "7651abff585dc8dacd1744222d5f03bdd2a8532a", + "version" : "13.6.0" + } + }, + { + "identity" : "swift-package-manager-google-user-messaging-platform", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git", + "state" : { + "revision" : "13b248eaa73b7826f0efb1bcf455e251d65ecb1b", + "version" : "3.1.0" + } + } + ], + "version" : 2 +} diff --git a/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart b/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart index 9f24529b..9ef71ae5 100644 --- a/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart +++ b/mih_ui/lib/mih_packages/about_mih/package_tools/mih_info.dart @@ -67,7 +67,7 @@ class _MihInfoState extends State { children: [ SizedBox( child: Text( - "${aboutProvider.businessCount}", + "${aboutProvider.userCount}", style: TextStyle( fontWeight: FontWeight.bold, fontSize: 23, diff --git a/mih_ui/lib/mih_services/mih_file_services.dart b/mih_ui/lib/mih_services/mih_file_services.dart index ac9f11c1..7b7138a1 100644 --- a/mih_ui/lib/mih_services/mih_file_services.dart +++ b/mih_ui/lib/mih_services/mih_file_services.dart @@ -17,23 +17,7 @@ class MihFileApi { static Future getMinioFileUrl( String filePath, ) async { - // loadingPopUp(context); - // print("here"); - // var url = - // "${AppEnviroment.baseApiUrl}/minio/pull/file/${AppEnviroment.getEnv()}/$filePath"; - // var response = await http.get(Uri.parse(url)); String fileUrl = ""; - // print(response.statusCode); - // if (response.statusCode == 200) { - // String body = response.body; - // var decodedData = jsonDecode(body); - - // fileUrl = decodedData['minioURL']; - // } else { - // fileUrl = ""; - // } - // Navigator.of(context).pop(); // Pop loading dialog - // return fileUrl; try { var url = "${AppEnviroment.baseApiUrl}/minio/pull/file/${AppEnviroment.getEnv()}/$filePath"; @@ -41,19 +25,35 @@ class MihFileApi { if (response.statusCode == 200) { var decodedData = jsonDecode(response.body); fileUrl = decodedData['minioURL']; - } else { - // internetConnectionPopUp(context); - // KenLogger.error("Get File Error: $url"); - // KenLogger.error("Get File Error: ${response.statusCode}"); - // KenLogger.error("Get File Error: ${response.body}"); - } + } else {} } catch (e) { - // internetConnectionPopUp(context); KenLogger.error("Error getting url"); - } finally { - // Navigator.of(context).pop(); // Always pop loading dialog - } - // KenLogger.success("File URL: $fileUrl"); + } finally {} + if (AppEnviroment.getEnv() == "Dev" && kIsWeb) { + fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); + } else if (AppEnviroment.getEnv() == "Dev" && Platform.isIOS) { + fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); + } else if (AppEnviroment.getEnv() == "Dev" && Platform.isLinux) { + fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); + } + return fileUrl; + } + + static Future getMinioFileUrlV2( + String filePath, + ) async { + String fileUrl = ""; + try { + var url = + "${AppEnviroment.baseApiUrl}/minio/pull/file/${AppEnviroment.getEnv()}/$filePath"; + var response = await http.get(Uri.parse(url)); + if (response.statusCode == 200) { + var decodedData = jsonDecode(response.body); + fileUrl = decodedData['minioURL']; + } else {} + } catch (e) { + KenLogger.error("Error getting url"); + } finally {} if (AppEnviroment.getEnv() == "Dev" && kIsWeb) { fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); } else if (AppEnviroment.getEnv() == "Dev" && Platform.isIOS) { @@ -61,7 +61,6 @@ class MihFileApi { } else if (AppEnviroment.getEnv() == "Dev" && Platform.isLinux) { fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); } - // KenLogger.success("File URL: $fileUrl"); return fileUrl; } diff --git a/mih_ui/pubspec.yaml b/mih_ui/pubspec.yaml index 5867089b..505f1e82 100644 --- a/mih_ui/pubspec.yaml +++ b/mih_ui/pubspec.yaml @@ -46,7 +46,7 @@ dependencies: #app_settings: ^6.1.1 pwa_install: ^0.0.6 google_mobile_ads: ^8.0.0 - gma_mediation_meta: ^1.4.1 + gma_mediation_meta: ^1.5.2 redacted: ^1.0.13 custom_rating_bar: ^3.0.0 country_code_picker: ^3.3.0 From 1438dd6b5a19b199f845cf210dc33cafb6239e2b Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 2 Jul 2026 11:01:59 +0200 Subject: [PATCH 13/14] fix user counter and optimise profile picture getting --- mih_api_hub/Minio_Storage/minioConnection.py | 10 +----- mih_api_hub/routers/fileStorage.py | 24 +++++++------- mih_ui/lib/main_dev.dart | 1 - mih_ui/lib/main_prod.dart | 1 - mih_ui/lib/mih_hive/about_mih_hive_data.dart | 4 +-- .../mih_hive/mzansi_profile_hive_data.dart | 32 ++++--------------- .../mzansi_profile_provider.dart | 26 ++++++++------- .../lib/mih_services/mih_file_services.dart | 26 +++------------ 8 files changed, 39 insertions(+), 85 deletions(-) diff --git a/mih_api_hub/Minio_Storage/minioConnection.py b/mih_api_hub/Minio_Storage/minioConnection.py index 25a848df..919bccd4 100644 --- a/mih_api_hub/Minio_Storage/minioConnection.py +++ b/mih_api_hub/Minio_Storage/minioConnection.py @@ -8,15 +8,7 @@ minioSecret = os.getenv("MINIO_SECRET_KEY") minioEndpoint = os.getenv("MINIO_ENDPOINT", "mih-minio:9000") minioSecure = os.getenv("MINIO_SECURE", "False") in ("True") -def minioConnect(env): - if(env == "Dev"): - return Minio( - endpoint=minioEndpoint, - access_key=minioAccess, - secret_key=minioSecret, - secure=minioSecure, - ) - else: +def minioConnect(): return Minio( endpoint=minioEndpoint, access_key=minioAccess, diff --git a/mih_api_hub/routers/fileStorage.py b/mih_api_hub/routers/fileStorage.py index a515f515..23901464 100644 --- a/mih_api_hub/routers/fileStorage.py +++ b/mih_api_hub/routers/fileStorage.py @@ -108,11 +108,11 @@ class claimStatementUploud(BaseModel): logo_path: str sig_path: str -@router.get("/v2/minio/pull/file/{env}/{app_id}/{folder}/{file_name}", tags=["Minio"]) -async def pullFileFromMinioV2(app_id: str, folder: str, file_name: str, env: str): +@router.get("/v2/minio/pull/file/{app_id}/{folder}/{file_name}", tags=["Minio"]) +async def pullFileFromMinioV2(app_id: str, folder: str, file_name: str,): object_path = f"{app_id}/{folder}/{file_name}" try: - client = Minio_Storage.minioConnection.minioConnect(env) + client = Minio_Storage.minioConnection.minioConnect() response = client.get_object(bucket_name="mih", object_name=object_path) @@ -136,7 +136,7 @@ async def pull_File_from_user(app_id: str, folder: str, file_name: str, env: str # print(f"env: {env}") # uploudFile(app_id, file.filename, extension[1], content) - client = Minio_Storage.minioConnection.minioConnect(env) + client = Minio_Storage.minioConnection.minioConnect() # buckets = client.list_buckets() # print("Connected to MinIO successfully!") # print("Available buckets:", [bucket.name for bucket in buckets]) @@ -188,7 +188,7 @@ async def delete_File_of_user(requestItem: minioDeleteRequest, session: SessionC path = requestItem.file_path try: # uploudFile(app_id, file.filename, extension[1], content) - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() minioError = client.remove_object( bucket_name="mih", @@ -222,7 +222,7 @@ async def upload_perscription_to_user(requestItem: claimStatementUploud, session return {"message": "Successfully Generated File"} def uploudFile(app_id, env, folder, fileName, extension, content): - client = Minio_Storage.minioConnection.minioConnect(env) + client = Minio_Storage.minioConnection.minioConnect() found = client.bucket_exists(bucket_name="mih") if not found: client.make_bucket(bucket_name="mih") @@ -238,7 +238,7 @@ def uploudFile(app_id, env, folder, fileName, extension, content): content_type=f"application/{extension}") def uploudMedCert(requestItem: medCertUploud): - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() generateMedCertPDF(requestItem) today = datetime.today().strftime('%Y-%m-%d') found = client.bucket_exists(bucket_name="mih") @@ -250,7 +250,7 @@ def uploudMedCert(requestItem: medCertUploud): client.fput_object("mih", fileName, "temp-med-cert.pdf") def generateMedCertPDF(requestItem: medCertUploud): - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() new_logo_path = requestItem.logo_path.replace(" ","-") new_sig_path = requestItem.sig_path.replace(" ","-") minioLogo = client.get_object("mih", new_logo_path).read() @@ -315,7 +315,7 @@ def generateMedCertPDF(requestItem: medCertUploud): myCanvas.save() def uploudPerscription(requestItem: perscriptionList): - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() generatePerscriptionPDF(requestItem) today = datetime.today().strftime('%Y-%m-%d') found = client.bucket_exists(bucket_name="mih") @@ -327,7 +327,7 @@ def uploudPerscription(requestItem: perscriptionList): client.fput_object("mih", fileName, "temp-perscription.pdf") def generatePerscriptionPDF(requestItem: perscriptionList): - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() new_logo_path = requestItem.logo_path.replace(" ","-") new_sig_path = requestItem.sig_path.replace(" ","-") minioLogo = client.get_object("mih", new_logo_path).read() @@ -417,7 +417,7 @@ def generatePerscriptionPDF(requestItem: perscriptionList): def uploudClaimStatement(requestItem: claimStatementUploud): try: - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() print("connected") except Exception: print("error") @@ -433,7 +433,7 @@ def uploudClaimStatement(requestItem: claimStatementUploud): client.fput_object("mih", fileName, "temp-claim-statement.pdf") def generateClaimStatementPDF(requestItem: claimStatementUploud): - client = Minio_Storage.minioConnection.minioConnect(requestItem.env) + client = Minio_Storage.minioConnection.minioConnect() # print("buckets: " + client.list_buckets) new_logo_path = requestItem.logo_path.replace(" ","-") new_sig_path = requestItem.sig_path.replace(" ","-") diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index e11b0b37..1bc5b571 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -39,7 +39,6 @@ void main() async { await Hive.openBox('business_box'); await Hive.openBox('business_user_box'); await Hive.openBox('user_consent_box'); - await Hive.openBox('image_urls_box'); await Hive.openBox('personal_profile_links_box'); await Hive.openBox('business_profile_links_box'); await Hive.openBox('business_employees_box'); diff --git a/mih_ui/lib/main_prod.dart b/mih_ui/lib/main_prod.dart index ab41de28..87a7a40b 100644 --- a/mih_ui/lib/main_prod.dart +++ b/mih_ui/lib/main_prod.dart @@ -39,7 +39,6 @@ void main() async { await Hive.openBox('business_box'); await Hive.openBox('business_user_box'); await Hive.openBox('user_consent_box'); - await Hive.openBox('image_urls_box'); await Hive.openBox('personal_profile_links_box'); await Hive.openBox('business_profile_links_box'); await Hive.openBox('business_employees_box'); diff --git a/mih_ui/lib/mih_hive/about_mih_hive_data.dart b/mih_ui/lib/mih_hive/about_mih_hive_data.dart index 3429c7b8..f8b89357 100644 --- a/mih_ui/lib/mih_hive/about_mih_hive_data.dart +++ b/mih_ui/lib/mih_hive/about_mih_hive_data.dart @@ -7,7 +7,7 @@ class AboutMihHiveData { final Box _mihUserBusinessCountBox = Hive.box('about_mih_box'); static const String kUserCountKey = 'current_user_count'; - static const String kBusinessCountKey = 'current_user_count'; + static const String kBusinessCountKey = 'current_business_count'; // Get Data from local storage int? getcachedUserCount() => _mihUserBusinessCountBox.get(kUserCountKey); @@ -21,7 +21,7 @@ class AboutMihHiveData { } Future cacheBusinessCount(int remoteBusinessCount) async { - await _mihUserBusinessCountBox.put(kUserCountKey, remoteBusinessCount); + await _mihUserBusinessCountBox.put(kBusinessCountKey, remoteBusinessCount); KenLogger.success("MIH Business Count Cached"); } diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index a6b5318a..69451223 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -8,7 +8,6 @@ import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_employee_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_my_business_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_profile_links_service.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart'; @@ -27,7 +26,6 @@ class MzansiProfileHiveData { Hive.box('business_profile_links_box'); final Box _businessEmployeesBox = Hive.box('business_Employees_box'); - final Box _resolvedUrlsBox = Hive.box('image_urls_box'); static const String kUserKey = 'current_user'; static const String kBusinessKey = 'current_business'; @@ -43,9 +41,6 @@ class MzansiProfileHiveData { BusinessUser? getCachedBusinessUser() => _businessUserBox.get(kBusinessUserKey); UserConsent? getCachedConsent() => _userConsentBox.get(kConsentKey); - String? getCachedUserPicUrl() => _resolvedUrlsBox.get(kUserPicUrlKey); - String? getCachedBusinessPicUrl() => _resolvedUrlsBox.get(kBusinessPicUrlKey); - String? getCachedSignatureUrl() => _resolvedUrlsBox.get(kSignatureUrlKey); List getCachedPersonalProfileLinks() { final links = _personalProfileLinksBox.values.toList(); @@ -68,11 +63,6 @@ class MzansiProfileHiveData { // Caching Data to local storage Future cacheUserData(AppUser remoteUser) async { await _userBox.put(kUserKey, remoteUser); - if (remoteUser.pro_pic_path.isNotEmpty) { - String userPicUrl = - await MihFileApi.getMinioFileUrl(remoteUser.pro_pic_path); - await _resolvedUrlsBox.put(kUserPicUrlKey, userPicUrl); - } KenLogger.success("User Profile Cached"); } @@ -83,26 +73,11 @@ class MzansiProfileHiveData { Future cacheBusinessData(Business remoteBusiness) async { await _businessBox.put(kBusinessKey, remoteBusiness); - if (remoteBusiness.logo_path.isNotEmpty) { - String logoUrl = - await MihFileApi.getMinioFileUrl(remoteBusiness.logo_path); - await _resolvedUrlsBox.put(kBusinessPicUrlKey, logoUrl); - } - BusinessUser? remoteBizUser = - await MihMyBusinessUserServices().getBusinessUserV2(); - if (remoteBizUser != null) { - cacheBusinessUserData(remoteBizUser); - } KenLogger.success("Busines Profile Cached"); } Future cacheBusinessUserData(BusinessUser remoteBizUser) async { await _businessUserBox.put(kBusinessUserKey, remoteBizUser); - if (remoteBizUser.sig_path.isNotEmpty) { - String signatureUrl = - await MihFileApi.getMinioFileUrl(remoteBizUser.sig_path); - await _resolvedUrlsBox.put(kSignatureUrlKey, signatureUrl); - } KenLogger.success("Busines User Profile Cached"); } @@ -146,8 +121,13 @@ class MzansiProfileHiveData { Business? remoteBusiness = await MihBusinessDetailsServices().getBusinessDetailsByUserV2(); if (remoteBusiness != null) { - cacheBusinessData(remoteBusiness); + await cacheBusinessData(remoteBusiness); + BusinessUser? remoteBizUser = + await MihMyBusinessUserServices().getBusinessUserV2(); + if (remoteBizUser != null) { + cacheBusinessUserData(remoteBizUser); + } final remoteBusinessEmployeeList = await MihBusinessEmployeeServices() .fetchEmployeesV2(remoteBusiness.business_id); cacheBusinessEmployeesData(remoteBusinessEmployeeList); diff --git a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart index 9e2c7455..cc1505e6 100644 --- a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart @@ -8,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; class MzansiProfileProvider extends ChangeNotifier { final MzansiProfileHiveData _hiveData; @@ -46,20 +47,21 @@ class MzansiProfileProvider extends ChangeNotifier { userConsent = _hiveData.getCachedConsent(); business = _hiveData.getCachedBusiness(); businessUser = _hiveData.getCachedBusinessUser(); - String? cachedUserUrl = _hiveData.getCachedUserPicUrl(); - if (cachedUserUrl != null && cachedUserUrl.isNotEmpty) { - userProfilePicUrl = cachedUserUrl; - userProfilePicture = CachedNetworkImageProvider(cachedUserUrl); + if (user != null && user!.pro_pic_path.isNotEmpty) { + KenLogger.success("proPicPath: ${user!.pro_pic_path}| THis is it"); + userProfilePicUrl = MihFileApi.getMinioFileUrlV2(user!.pro_pic_path); + userProfilePicture = CachedNetworkImageProvider(userProfilePicUrl!); } - String? cachedBizUrl = _hiveData.getCachedBusinessPicUrl(); - if (cachedBizUrl != null && cachedBizUrl.isNotEmpty) { - businessProfilePicUrl = cachedBizUrl; - businessProfilePicture = CachedNetworkImageProvider(cachedBizUrl); + if (business != null && business!.logo_path.isNotEmpty) { + businessProfilePicUrl = MihFileApi.getMinioFileUrlV2(business!.logo_path); + businessProfilePicture = + CachedNetworkImageProvider(businessProfilePicUrl!); } - String? cachedSigUrl = _hiveData.getCachedSignatureUrl(); - if (cachedSigUrl != null && cachedSigUrl.isNotEmpty) { - businessUserSignatureUrl = cachedSigUrl; - businessUserSignature = CachedNetworkImageProvider(cachedSigUrl); + if (businessUser != null && businessUser!.sig_path.isNotEmpty) { + businessUserSignatureUrl = + MihFileApi.getMinioFileUrlV2(businessUser!.sig_path); + businessUserSignature = + CachedNetworkImageProvider(businessUserSignatureUrl!); } employeeList = _hiveData.getCachedBusinessEmployees(); diff --git a/mih_ui/lib/mih_services/mih_file_services.dart b/mih_ui/lib/mih_services/mih_file_services.dart index 7b7138a1..4cb5a083 100644 --- a/mih_ui/lib/mih_services/mih_file_services.dart +++ b/mih_ui/lib/mih_services/mih_file_services.dart @@ -39,29 +39,11 @@ class MihFileApi { return fileUrl; } - static Future getMinioFileUrlV2( + static String getMinioFileUrlV2( String filePath, - ) async { - String fileUrl = ""; - try { - var url = - "${AppEnviroment.baseApiUrl}/minio/pull/file/${AppEnviroment.getEnv()}/$filePath"; - var response = await http.get(Uri.parse(url)); - if (response.statusCode == 200) { - var decodedData = jsonDecode(response.body); - fileUrl = decodedData['minioURL']; - } else {} - } catch (e) { - KenLogger.error("Error getting url"); - } finally {} - if (AppEnviroment.getEnv() == "Dev" && kIsWeb) { - fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); - } else if (AppEnviroment.getEnv() == "Dev" && Platform.isIOS) { - fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); - } else if (AppEnviroment.getEnv() == "Dev" && Platform.isLinux) { - fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1"); - } - return fileUrl; + ) { + if (filePath.isEmpty) return ""; + return "${AppEnviroment.baseApiUrl}/v2/minio/pull/file/$filePath"; } static Future uploadFile( From 48b434dad9871583926f25900ca75b6fe47ca660 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 2 Jul 2026 11:33:27 +0200 Subject: [PATCH 14/14] First Load Fix & beginers guide button change --- mih_ui/lib/mih_hive/about_mih_hive_data.dart | 4 ++-- mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart | 10 +++++----- mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart | 4 ++-- .../about_mih/components/call_to_action_buttons.dart | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mih_ui/lib/mih_hive/about_mih_hive_data.dart b/mih_ui/lib/mih_hive/about_mih_hive_data.dart index f8b89357..d1410266 100644 --- a/mih_ui/lib/mih_hive/about_mih_hive_data.dart +++ b/mih_ui/lib/mih_hive/about_mih_hive_data.dart @@ -29,10 +29,10 @@ class AboutMihHiveData { Future syncAboutMihDataWithServer() async { try { int remoteUserCount = await MihUserServices().fetchUserCount(); - cacheUserCount(remoteUserCount); + await cacheUserCount(remoteUserCount); int remoteBusinessCount = await MihBusinessDetailsServices().fetchBusinessCount(); - cacheBusinessCount(remoteBusinessCount); + await cacheBusinessCount(remoteBusinessCount); return true; } catch (error) { KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused"); diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index 69451223..39416e9e 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -111,12 +111,12 @@ class MzansiProfileHiveData { UserConsent? remoteConsent = await MihUserConsentServices().getUserConsentStatusV2(); if (remoteConsent != null) { - cacheUserConsentData(remoteConsent); + await cacheUserConsentData(remoteConsent); } final remotePersonalLinks = await MihProfileLinksServices.getUserProfileLinksV2( remoteUser.app_id); - cachePersonalProfileLinksData(remotePersonalLinks); + await cachePersonalProfileLinksData(remotePersonalLinks); } Business? remoteBusiness = await MihBusinessDetailsServices().getBusinessDetailsByUserV2(); @@ -126,16 +126,16 @@ class MzansiProfileHiveData { BusinessUser? remoteBizUser = await MihMyBusinessUserServices().getBusinessUserV2(); if (remoteBizUser != null) { - cacheBusinessUserData(remoteBizUser); + await cacheBusinessUserData(remoteBizUser); } final remoteBusinessEmployeeList = await MihBusinessEmployeeServices() .fetchEmployeesV2(remoteBusiness.business_id); - cacheBusinessEmployeesData(remoteBusinessEmployeeList); + await cacheBusinessEmployeesData(remoteBusinessEmployeeList); final remoteBusinessLinks = await MihProfileLinksServices.getBusinessProfileLinksV2( remoteBusiness.business_id); - cacheBusinessProfileLinksData(remoteBusinessLinks); + await cacheBusinessProfileLinksData(remoteBusinessLinks); } return true; } catch (error) { diff --git a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart index d5bb5dfe..d7e767b8 100644 --- a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart @@ -153,11 +153,11 @@ class MzansiWalletHiveData { try { final remoteLoyaltyCards = await MIHMzansiWalletApis.getLoyaltyCardsV2( profileProvider.user!.app_id); - cacheLoyaltyCardsData(remoteLoyaltyCards); + await cacheLoyaltyCardsData(remoteLoyaltyCards); final remoteFavLoyaltyCards = await MIHMzansiWalletApis.getFavouriteLoyaltyCardsV2( profileProvider.user!.app_id); - cacheFavLoyaltyCardsData(remoteFavLoyaltyCards); + await cacheFavLoyaltyCardsData(remoteFavLoyaltyCards); return true; } catch (error) { KenLogger.warning("MIH App Operating in Offline Mode. Sync Paused."); diff --git a/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart b/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart index 326453ca..a5c187d3 100644 --- a/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart +++ b/mih_ui/lib/mih_packages/about_mih/components/call_to_action_buttons.dart @@ -189,7 +189,7 @@ class _CallToActionButtonsState extends State { ), const SizedBox(width: 10), Text( - "MIH Beginners Guide", + "Beginners Guide", style: TextStyle( color: MihColors.primary(), fontSize: 20,