diff --git a/CMakeLists.txt b/CMakeLists.txt index ae49de720..25ec1dd1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,8 +42,6 @@ option(FIREBASE_INCLUDE_DYNAMIC_LINKS "Include the Firebase Dynamic Links library." ON) option(FIREBASE_INCLUDE_FUNCTIONS "Include the Cloud Functions for Firebase library." ON) -option(FIREBASE_INCLUDE_INSTANCE_ID - "Include the Firebase Instance ID library." ON) option(FIREBASE_INCLUDE_MESSAGING "Include the Firebase Cloud Messaging library." ON) option(FIREBASE_INCLUDE_REMOTE_CONFIG @@ -244,11 +242,6 @@ if (FIREBASE_INCLUDE_FUNCTIONS) list(APPEND TARGET_LINK_LIB_NAMES "firebase_functions" "firebase_functions_swig") list(APPEND PROJECT_LIST_HEADER " X(Functions)") endif() -if (FIREBASE_INCLUDE_INSTANCE_ID) - add_subdirectory(instance_id) - list(APPEND TARGET_LINK_LIB_NAMES "firebase_instance_id" "firebase_instance_id_swig") - list(APPEND PROJECT_LIST_HEADER " X(InstanceId)") -endif() if (FIREBASE_INCLUDE_MESSAGING) add_subdirectory(messaging) list(APPEND TARGET_LINK_LIB_NAMES "firebase_messaging" "firebase_messaging_swig") diff --git a/app/src/swig/app.i b/app/src/swig/app.i index c7cf699df..7dd3f0f3d 100644 --- a/app/src/swig/app.i +++ b/app/src/swig/app.i @@ -651,10 +651,6 @@ static firebase::AppOptions* AppOptionsLoadFromJsonConfig(const char* config) { "Firebase.Installations.FirebaseInstallations, Firebase.Installations", "installations" ), - new EnableModuleParams( - "Firebase.InstanceId.FirebaseInstanceId, Firebase.InstanceId", - "instance_id" - ), new EnableModuleParams( "Firebase.Invites.FirebaseInvites, Firebase.Invites", "invites" diff --git a/app/src/swig/future.i b/app/src/swig/future.i index 2c3a2f3c6..77ca6adb9 100644 --- a/app/src/swig/future.i +++ b/app/src/swig/future.i @@ -181,6 +181,15 @@ namespace firebase { System.Threading.Tasks.TaskCompletionSource tcs = new System.Threading.Tasks.TaskCompletionSource(); #endif // TYPE_## %mangle(CTYPE) + + // Check if an exception has occurred previously and propagate it if it has. + // This has to be done before accessing the future because the future object + // might be invalid. + if ($imclassname.SWIGPendingException.Pending) { + tcs.SetException($imclassname.SWIGPendingException.Retrieve()); + return tcs.Task; + } + if (fu.status() == FutureStatus.Invalid) { tcs.SetException( new FirebaseException(0, "Asynchronous operation was not started.")); diff --git a/app/src/unity_main.cpp b/app/src/unity_main.cpp index 7079af60f..9481ed7e5 100644 --- a/app/src/unity_main.cpp +++ b/app/src/unity_main.cpp @@ -20,6 +20,7 @@ // the C++ module. #include + #include "app/src/util.h" #include "app/src/util_android.h" @@ -110,7 +111,6 @@ jint JNI_OnLoad(JavaVM *jvm, void *reserved) { {"com/google/firebase/dynamiclinks/FirebaseDynamicLinks", "dynamic_links"}, {"com/google/firebase/functions/FirebaseFunctions", "functions"}, - {"com/google/firebase/iid/FirebaseInstanceId", "instance_id"}, {"com/google/firebase/installations/FirebaseInstallations", "installations"}, {"com/google/android/gms/appinvite/AppInvite", "invites"}, diff --git a/auth/src/swig/auth.i b/auth/src/swig/auth.i index 1b951a54a..15d9f4a24 100644 --- a/auth/src/swig/auth.i +++ b/auth/src/swig/auth.i @@ -956,7 +956,7 @@ static CppInstanceManager g_auth_instances; %typemap(csclassmodifiers) firebase::auth::FederatedOAuthProvider "public sealed class"; -// Provider classes declared in auth/client/cpp/src/included/credential.h +// Provider classes declared in third_party/firebase/cpp/auth/src/included/credential.h // Rename the kProviderId string constant for all of our AuthProviders. %rename(ProviderId) firebase::auth::EmailAuthProvider::kProviderId; %rename(ProviderId) firebase::auth::FacebookAuthProvider::kProviderId; diff --git a/cmake/android_dependencies.cmake b/cmake/android_dependencies.cmake index b29f75928..65f919199 100644 --- a/cmake/android_dependencies.cmake +++ b/cmake/android_dependencies.cmake @@ -16,49 +16,49 @@ set(FIREBASE_APP_ANDROID_DEPS "com.google.firebase:firebase-common:19.5.0" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_ANALYTICS_ANDROID_DEPS - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_AUTH_ANDROID_DEPS - "com.google.firebase:firebase-auth:20.0.2" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-auth:20.0.4" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_DATABASE_ANDROID_DEPS - "com.google.firebase:firebase-database:19.6.0" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-database:19.7.0" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_DYNAMIC_LINKS_ANDROID_DEPS "com.google.android.gms:play-services-appinvite:18.0.0" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_FUNCTIONS_ANDROID_DEPS "com.google.firebase:firebase-functions:19.2.0" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_INSTANCE_ID_ANDROID_DEPS - "com.google.firebase:firebase-iid:21.0.1" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-iid:21.1.0" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_MESSAGING_ANDROID_DEPS - "com.google.firebase:firebase-messaging:21.0.1" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-messaging:21.1.0" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_REMOTE_CONFIG_ANDROID_DEPS - "com.google.firebase:firebase-config:20.0.3" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-config:20.0.4" + "com.google.firebase:firebase-analytics:18.0.3" ) set(FIREBASE_STORAGE_ANDROID_DEPS - "com.google.firebase:firebase-storage:19.2.1" - "com.google.firebase:firebase-analytics:18.0.2" + "com.google.firebase:firebase-storage:19.2.2" + "com.google.firebase:firebase-analytics:18.0.3" ) \ No newline at end of file diff --git a/cmake/swig_fix.py b/cmake/swig_fix.py index a51054eba..90ba9e3ad 100644 --- a/cmake/swig_fix.py +++ b/cmake/swig_fix.py @@ -139,7 +139,8 @@ def get_transformations(namespace): 'csharp': [ swig_post_process.SWIGEnumPostProcessing(), NamespaceCMethodsCMake(namespace), - swig_post_process.ReplaceExceptionChecks('AppUtil'), + swig_post_process.ReplaceExceptionChecks( + 'AppUtil', ['firebase/firestore/client/unity']), swig_post_process.FixSealedClasses(), swig_post_process.InternalMethodsToInternalVisibility(), swig_post_process.RenameAsyncMethods(), diff --git a/crashlytics/src/AndroidImpl.cs b/crashlytics/src/AndroidImpl.cs index 246d30439..a74d97e12 100644 --- a/crashlytics/src/AndroidImpl.cs +++ b/crashlytics/src/AndroidImpl.cs @@ -55,6 +55,8 @@ internal AndroidImpl() { "Unable to create FirebaseCrashlytics instance."); return; } + + SetCustomKey(MetadataBuilder.METADATA_KEY, MetadataBuilder.GenerateMetadataJSON()); } ~AndroidImpl() { diff --git a/crashlytics/src/IOSImpl.cs b/crashlytics/src/IOSImpl.cs index 9711fb5c3..2144e635e 100644 --- a/crashlytics/src/IOSImpl.cs +++ b/crashlytics/src/IOSImpl.cs @@ -49,6 +49,9 @@ internal class IOSImpl : Impl [DllImport("__Internal")] private static extern void CLUSetKeyValue(string key, string value); + [DllImport("__Internal")] + private static extern void CLUSetInternalKeyValue(string key, string value); + [DllImport("__Internal")] private static extern void CLUSetUserIdentifier(string identifier); @@ -68,6 +71,7 @@ private static extern void CLURecordCustomException(string name, string reason, public IOSImpl() { CLUSetDevelopmentPlatform("Unity", Application.unityVersion); + CLUSetInternalKeyValue(MetadataBuilder.METADATA_KEY, MetadataBuilder.GenerateMetadataJSON()); } public override bool IsSDKInitialized() { diff --git a/crashlytics/src/Metadata.cs b/crashlytics/src/Metadata.cs new file mode 100644 index 000000000..3604e9236 --- /dev/null +++ b/crashlytics/src/Metadata.cs @@ -0,0 +1,104 @@ +/* + * 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. + */ + +namespace Firebase.Crashlytics { + using System; + using System; + using UnityEngine; + + /// + /// Represents the Unity-specific metadata object that is transformed into JSON. + /// + /// Metadata keys are acronyms to save space as there are limits to the maximum size of Keys in + /// the Android and iOS SDK. + /// + internal class Metadata { + // unityVersion: Version of Unity Engine + public string uv; + // isDebugBuild: Whether "Development Build" is checked + public bool idb; + + // processorType + public string pt; + // processorCount: Number of cores + public int pc; + // processorFrequency + public int pf; + + // systemMemorySize: RAM size + public int sms; + + // graphicsMemorySize + public int gms; + // graphicsDeviceID + public int gdid; + // graphicsDeviceVendorID + public int gdvid; + // graphicsDeviceName + public string gdn; + // graphicsDeviceVendor + public string gdv; + // graphicsDeviceVersion + public string gdver; + // graphicsDeviceType + public UnityEngine.Rendering.GraphicsDeviceType gdt; + + // graphicsShaderLevel + // https://docs.unity3d.com/540/Documentation/ScriptReference/SystemInfo-graphicsShaderLevel.html + public int gsl; + // graphicsRenderTargetCount + public int grtc; + // graphicsCopyTextureSupport + public UnityEngine.Rendering.CopyTextureSupport gcts; + // graphicsMaxTextureSize + public int gmts; + + // screenSize + public string ss; + // screenDPI + public float sdpi; + // screenRefreshRate + public int srr; + + public Metadata() { + uv = Application.unityVersion; + idb = Debug.isDebugBuild; + + pt = SystemInfo.processorType; + pc = SystemInfo.processorCount; + pf = SystemInfo.processorFrequency; + + sms = SystemInfo.systemMemorySize; + + gms = SystemInfo.graphicsMemorySize; + gdid = SystemInfo.graphicsDeviceID; + gdvid = SystemInfo.graphicsDeviceVendorID; + gdn = SystemInfo.graphicsDeviceName; + gdv = SystemInfo.graphicsDeviceVendor; + gdver = SystemInfo.graphicsDeviceVersion; + gdt = SystemInfo.graphicsDeviceType; + + gsl = SystemInfo.graphicsShaderLevel; + grtc = SystemInfo.supportedRenderTargetCount; + gcts = SystemInfo.copyTextureSupport; + gmts = SystemInfo.maxTextureSize; + + ss = String.Format("{0}x{1}", Screen.width, Screen.height); + sdpi = Screen.dpi; + srr = Screen.currentResolution.refreshRate; + } + } +} diff --git a/crashlytics/src/MetadataBuilder.cs b/crashlytics/src/MetadataBuilder.cs new file mode 100644 index 000000000..aed82da57 --- /dev/null +++ b/crashlytics/src/MetadataBuilder.cs @@ -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 + * + * 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. + */ + +namespace Firebase.Crashlytics { + using System; + using UnityEngine; + + /// + /// Automatically collects metadata and serializes to JSON in a space-efficient way. + /// + internal class MetadataBuilder { + public static string METADATA_KEY = "com.crashlytics.metadata.unity"; + + public static string GenerateMetadataJSON() { + try { + Metadata metadata = new Metadata(); + return JsonUtility.ToJson(metadata); + } catch (Exception e) { + UnityEngine.Debug.LogError( + "Failed to generate Unity-specific metadata for Crashlytics due to: " + e.ToString()); + return ""; + } + } + } +} diff --git a/crashlytics/src/cpp/android/crashlytics_android.h b/crashlytics/src/cpp/android/crashlytics_android.h index 8590add8c..a288260ee 100644 --- a/crashlytics/src/cpp/android/crashlytics_android.h +++ b/crashlytics/src/cpp/android/crashlytics_android.h @@ -16,14 +16,16 @@ #define FIREBASE_CRASHLYTICS_CLIENT_CPP_SRC_ANDROID_CRASHLYTICS_ANDROID_H_ #include + #include #include + +#include "crashlytics/src/cpp/include/firebase/crashlytics.h" #include "app/src/future_manager.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/internal/common.h" #include "app/src/mutex.h" #include "app/src/util_android.h" -#include "crashlytics/src/cpp/include/firebase/crashlytics.h" namespace firebase { namespace crashlytics { diff --git a/crashlytics/src/cpp/common/crashlytics.cc b/crashlytics/src/cpp/common/crashlytics.cc index 4fca677ca..a355d08e6 100644 --- a/crashlytics/src/cpp/common/crashlytics.cc +++ b/crashlytics/src/cpp/common/crashlytics.cc @@ -22,13 +22,13 @@ #include "app/src/cleanup_notifier.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/version.h" -#include "app/src/mutex.h" #include "app/src/log.h" +#include "app/src/mutex.h" #include "app/src/util.h" #if defined(__ANDROID__) -#include "app/src/util_android.h" #include "crashlytics/src/cpp/android/crashlytics_android.h" +#include "app/src/util_android.h" #else #include "crashlytics/src/cpp/stub/crashlytics_stub.h" #endif // defined(__ANDROID__) diff --git a/crashlytics/src/cpp/ios/Crashlytics_PrivateHeaders/Crashlytics_Platform.h b/crashlytics/src/cpp/ios/Crashlytics_PrivateHeaders/Crashlytics_Platform.h index a7266f678..09f394f4e 100644 --- a/crashlytics/src/cpp/ios/Crashlytics_PrivateHeaders/Crashlytics_Platform.h +++ b/crashlytics/src/cpp/ios/Crashlytics_PrivateHeaders/Crashlytics_Platform.h @@ -26,3 +26,5 @@ @property(nonatomic, strong, nullable) NSString* developmentPlatformVersion; @end + +void FIRCLSUserLoggingRecordInternalKeyValue(NSString* key, id value); diff --git a/crashlytics/src/cpp/ios/CrashlyticsiOSWrapper.m b/crashlytics/src/cpp/ios/CrashlyticsiOSWrapper.m index 80cad74a3..15ec34a59 100644 --- a/crashlytics/src/cpp/ios/CrashlyticsiOSWrapper.m +++ b/crashlytics/src/cpp/ios/CrashlyticsiOSWrapper.m @@ -69,6 +69,10 @@ void CLUSetKeyValue(const char *key, const char *value) { forKey:safeCharToNSString(key)]; } +void CLUSetInternalKeyValue(const char *key, const char *value) { + FIRCLSUserLoggingRecordInternalKeyValue(safeCharToNSString(key), safeCharToNSString(value)); +} + void CLULog(const char *msg) { [[FIRCrashlytics crashlytics] log:safeCharToNSString(msg)]; } void CLUSetUserIdentifier(const char *identifier) { diff --git a/crashlytics/src/cpp/stub/crashlytics_stub.h b/crashlytics/src/cpp/stub/crashlytics_stub.h index cfc03718e..d343968b4 100644 --- a/crashlytics/src/cpp/stub/crashlytics_stub.h +++ b/crashlytics/src/cpp/stub/crashlytics_stub.h @@ -17,12 +17,13 @@ #include #include + +#include "crashlytics/src/cpp/include/firebase/crashlytics.h" #include "app/src/cleanup_notifier.h" #include "app/src/future_manager.h" #include "app/src/include/firebase/app.h" #include "app/src/include/firebase/internal/common.h" #include "app/src/mutex.h" -#include "crashlytics/src/cpp/include/firebase/crashlytics.h" namespace firebase { namespace crashlytics { diff --git a/fis/src/swig/installations.SWIG b/fis/src/swig/installations.SWIG index 73a3cf6f1..a87928681 100644 --- a/fis/src/swig/installations.SWIG +++ b/fis/src/swig/installations.SWIG @@ -15,7 +15,7 @@ %{ #include "app/src/cpp_instance_manager.h" -#include "fis/src/include/firebase/installations.h" +#include "third_party/firebase/cpp/installations/src/include/firebase/installations.h" %} %import "app/src/swig/app.i" @@ -197,4 +197,4 @@ static CppInstanceManager g_installations_instances; // exceptions. We know that *all* methods can potentially throw exceptions. %warnfilter(314,844); -%include "fis/src/include/firebase/installations.h" +%include "third_party/firebase/cpp/installations/src/include/firebase/installations.h" diff --git a/instance_id/CMakeLists.txt b/instance_id/CMakeLists.txt deleted file mode 100644 index 70ab31943..000000000 --- a/instance_id/CMakeLists.txt +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2019 Google -# -# 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. - -# CMake file for the firebase instance_id library - -include(build_shared) - -# Firebase InstanceId Swig input files -set(firebase_instance_id_swig - src/swig/instance_id.i -) - -# Firebase InstanceId CSharp files -set(firebase_instance_id_src -) - -if(NOT FIREBASE_UNI_LIBRARY AND APPLE AND NOT IOS) - set(EXTERNAL_LIB_NAMES - "-framework Foundation" - "-framework Security" - ) -else() - set(EXTERNAL_LIB_NAMES) -endif() - -firebase_swig_add_library(firebase_instance_id_swig - NAMESPACE - Firebase.InstanceId - MODULE - FirebaseCppInstanceId - SOURCES - ${firebase_instance_id_swig} - DEPENDS - firebase_instance_id - SYSTEM_DEPS - ${EXTERNAL_LIB_NAMES} -) - -mono_add_library(firebase_instance_id_cs - MODULE - Firebase.InstanceId - SOURCES - ${firebase_instance_id_src} - ${firebase_instance_id_swig_gen_src} - REFERENCES - unity_compat_cs - unity_tasks_cs - ${FIREBASE_PLATFORM_REF} - DEPENDS - firebase_instance_id_swig -) - -build_firebase_shared( - instance_id - instance-id - FirebaseCppInstanceId -) - -unity_pack_native(firebase_instance_id_swig) -unity_pack_cs(firebase_instance_id_cs) - -if (FIREBASE_INCLUDE_UNITY) - generate_dependencies_xml(InstanceId - IOS_DEPS - "FirebaseInstanceId,${FIREBASE_INSTANCE_ID_POD_VERSION}" - ANDROID_DEPS - ${FIREBASE_INSTANCE_ID_ANDROID_DEPS} - ANDROID_SPEC - "instance-id" - ) -endif() - -set_property(TARGET firebase_instance_id_cs - PROPERTY FOLDER - "Firebase ${FIREBASE_PLATFORM_NAME}" -) diff --git a/instance_id/empty.cc b/instance_id/empty.cc deleted file mode 100644 index e69de29bb..000000000 diff --git a/instance_id/src/swig/instance_id.i b/instance_id/src/swig/instance_id.i deleted file mode 100644 index 5ac5fd82c..000000000 --- a/instance_id/src/swig/instance_id.i +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. - -%module FirebaseInstanceIdUtil - -#ifdef USE_EXPORT_FIX -// Generate a function that we can reference to force linker -// to include the generated swig library symbols correctly -// see export_fix.cc for more details -%include "app/src/export_fix.h" -%{#include "app/src/export_fix.h"%} -#endif - -%pragma(csharp) moduleclassmodifiers="internal sealed class" -%feature("flatnested"); - -%{ -#include "app/src/cpp_instance_manager.h" -#include "instance_id/src/include/firebase/instance_id.h" -%} - -%import "app/src/swig/app.i" -%include "app/src/swig/future.i" -%include "app/src/swig/init_result.i" -%include "app/src/swig/null_check_this.i" -%include "app/src/swig/serial_dispose.i" - -// Give the error a name that is less likely to clash with end user's code -// when the module is imported. -%rename(InstanceIdError) firebase::instance_id::Error; -// Give the class a name that is less likely to clash with end user's code -// when the module is imported. -%rename(FirebaseInstanceId) firebase::instance_id::InstanceId; -// Hide GetInstanceId() as this is wrapped in GetInstanceIdInternal() in -// order to properly handle reference count. -%ignore firebase::instance_id::InstanceId::GetInstanceId; -// The C# proxy maintains a reference to the C# app proxy instead. -%ignore firebase::instance_id::InstanceId::app; -// Rename all methods that need null checks. -%rename(GetIdInternal) firebase::instance_id::InstanceId::GetId; -%rename(DeleteIdInternal) firebase::instance_id::InstanceId::DeleteId; -%rename(GetTokenInternal) firebase::instance_id::InstanceId::GetToken; -%rename(DeleteTokenInternal) firebase::instance_id::InstanceId::DeleteToken; - -%{ -namespace firebase { -namespace instance_id { -// Reference count manager for C++ Instance Id instance, using pointer as the -// key for searching. -static CppInstanceManager g_instance_id_instances; -} // namespace instance_id -} // namespace firebase -%} - -%extend firebase::instance_id::InstanceId { - %csmethodmodifiers GetInstanceIdInternal(App* app, InitResult* init_result_out) "internal"; - static InstanceId* GetInstanceIdInternal( - App* app, InitResult* init_result_out) { - // This is to protect from the race condition after - // InstanceId::GetInstanceId() is called and before the pointer is added to - // g_instance_id_instances. - ::firebase::MutexLock lock( - ::firebase::instance_id::g_instance_id_instances.mutex()); - firebase::instance_id::InstanceId* instance = - firebase::instance_id::InstanceId::GetInstanceId(app, init_result_out); - ::firebase::instance_id::g_instance_id_instances.AddReference(instance); - return instance; - } - - %csmethodmodifiers ReleaseReferenceInternal(firebase::instance_id::InstanceId* instance) "internal"; - static void ReleaseReferenceInternal( - firebase::instance_id::InstanceId* instance) { - ::firebase::instance_id::g_instance_id_instances.ReleaseReference( - instance); - } -} - -%typemap(cscode) firebase::instance_id::InstanceId %{ - // Holds a reference to the FirebaseApp proxy object so that it isn't - // deallocated when Dispose() or Finalize() is called on the FirebaseApp - // instance referenced by this object. - private FirebaseApp appProxy; - - // Enables Instance ID objects to be found based upon the C++ App pointer. - private static System.Collections.Generic.Dictionary - instanceIdByAppCPtr = new System.Collections.Generic.Dictionary< - System.IntPtr, FirebaseInstanceId>(); - - // Retrieve a reference to an instance ID object from a C pointer. - private static FirebaseInstanceId ProxyFromAppCPtr(System.IntPtr appCPtr) { - lock (instanceIdByAppCPtr) { - FirebaseInstanceId iid = null; - if (instanceIdByAppCPtr.TryGetValue(appCPtr, out iid)) { - return iid; - } - return null; - } - } - - /// @brief App object associated with this instance ID. - public FirebaseApp App { get { return appProxy; } } - - // Throw a NullReferenceException if this proxy references a deleted object. - private void ThrowIfNull() { - if (swigCPtr.Handle == System.IntPtr.Zero) { - throw new System.NullReferenceException(); - } - } - - /// @brief Returns a stable identifier that uniquely identifies the app - /// instance. - /// - /// @returns Unique identifier for the app instance. - [System.Obsolete("InstanceId is deprecated and will be removed in future release. Use Installations GetIdAsync() instead.")] - public System.Threading.Tasks.Task GetIdAsync() { - ThrowIfNull(); - return GetIdInternalAsync(); - } - - /// @brief Delete the ID associated with the app, revoke all tokens and - /// allocate a new ID. - [System.Obsolete("InstanceId is deprecated and will be removed in future release. Use Installations DeleteAsync() instead.")] - public System.Threading.Tasks.Task DeleteIdAsync() { - ThrowIfNull(); - return DeleteIdInternalAsync(); - } - - /// @brief Returns a token that authorizes an Entity to perform an action on - /// behalf of the application identified by Instance ID. - /// - /// This is similar to an OAuth2 token except, it applies to the - /// application instance instead of a user. - /// - /// For example, to get a token that can be used to send messages to an - /// application via Firebase Messaging, set entity to the - /// sender ID, and set scope to "FCM". - /// - /// @returns A token that can identify and authorize the instance of the - /// application on the device. - [System.Obsolete("InstanceId is deprecated and will be removed in future release. For Firebase Messaging, use Messaging GetToken(), otherwise use Installations GetToken() instead.")] - public System.Threading.Tasks.Task GetTokenAsync() { - ThrowIfNull(); - return GetTokenInternalAsync(); - } - - /// @brief Revokes access to a scope (action) - [System.Obsolete("InstanceId is deprecated and will be removed in future release. For Firebase Messaging, use Messaging DeleteTokenAsync(), otherwise use Installations DeleteAsync() instead.")] - public System.Threading.Tasks.Task DeleteTokenAsync() { - ThrowIfNull(); - return DeleteTokenInternalAsync(); - } - - /// @brief Returns the `InstanceId` object for an `App` creating the - /// `InstanceId` if required. - /// - /// @param[in] app The `App` to create an `InstanceId` object from. On - /// **iOS** this must be the default Firebase `App`. - /// - /// @returns InstanceId object if successful, null otherwise. - [System.Obsolete("InstanceId is deprecated and will be removed in future release. Use Installations GetInstance() instead.")] - public static FirebaseInstanceId GetInstanceId(FirebaseApp app) { - FirebaseInstanceId instanceId = null; - lock (instanceIdByAppCPtr) { - System.IntPtr appCPtr = FirebaseApp.getCPtr(app).Handle; - instanceId = ProxyFromAppCPtr(appCPtr); - if (instanceId != null) return instanceId; - FirebaseApp.TranslateDllNotFoundException(() => { - InitResult initResult; - instanceId = GetInstanceIdInternal(app, out initResult); - if (initResult != InitResult.Success) { - throw new Firebase.InitializationException(initResult); - } - }); - if (instanceId != null) { - instanceId.appProxy = app; - app.AppDisposed += instanceId.OnAppDisposed; - instanceIdByAppCPtr[appCPtr] = instanceId; - } - } - return instanceId; - } - - /// @brief InstanceId associated with the default Firebase App. - /// - /// @returns An InstanceId object associated with the default Firebase App. - [System.Obsolete("InstanceId is deprecated and will be removed in future release. Use Installations DefaultInstance instead.")] - public static FirebaseInstanceId DefaultInstance { - get { - var app = FirebaseApp.DefaultInstance; - return app != null ? GetInstanceId(app) : null; - } - } - - private void OnAppDisposed(object sender, System.EventArgs eventArgs) { - Dispose(); - } -%} - -// Replace the default Dispose() method to remove references to this instance -// from the map of FirebaseInstanceId instances. -%typemap(csdestruct, methodname="Dispose", methodmodifiers="public") - firebase::instance_id::InstanceId { - lock (instanceIdByAppCPtr) { - if (appProxy != null) { - instanceIdByAppCPtr.Remove(FirebaseApp.getCPtr(appProxy).Handle); - appProxy.AppDisposed -= OnAppDisposed; - appProxy = null; - } - ReleaseReferenceInternal(this); - swigCMemOwn = false; - swigCPtr = new System.Runtime.InteropServices.HandleRef( - null, System.IntPtr.Zero); - } - System.GC.SuppressFinalize(this); -} - -// 314: Ignore warnings about the internal namespace being renamed to -// _internal as we flatten everything in the target namespace. -// 844: Globally disable warnings about methods potentially throwing -// exceptions. We know that *all* methods can potentially throw exceptions. -%warnfilter(314,844); - -%include "instance_id/src/include/firebase/instance_id.h" diff --git a/remote_config/src/ConfigSettings.cs b/remote_config/src/ConfigSettings.cs index 87fe4108d..6f001143f 100644 --- a/remote_config/src/ConfigSettings.cs +++ b/remote_config/src/ConfigSettings.cs @@ -32,16 +32,6 @@ public struct ConfigSettings { /// fetch. Default is 12 hours. public ulong MinimumFetchInternalInMilliseconds { get; set; } - /// @brief Enable / disable developer mode. - /// - /// During app development, you might want to refresh the cache very - /// frequently (many times per hour) to let you rapidly iterate as you - /// develop and test your app. To accommodate rapid iteration on a project - /// with up to 10 developers, you can set isDeveloperModeEnabled to true, - /// changing the caching settings of the FirebaseRemoteConfig object. - [System.Obsolete("This property is no longer used")] - public bool IsDeveloperMode { get; set; } - internal static ConfigSettings FromInternal(ConfigSettingsInternal csInternal) { return new ConfigSettings { FetchTimeoutInMilliseconds = csInternal.fetch_timeout_in_milliseconds, diff --git a/remote_config/src/FirebaseRemoteConfigDeprecated.cs b/remote_config/src/FirebaseRemoteConfigDeprecated.cs deleted file mode 100644 index d77166162..000000000 --- a/remote_config/src/FirebaseRemoteConfigDeprecated.cs +++ /dev/null @@ -1,152 +0,0 @@ -/* - * 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. - */ - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Firebase.RemoteConfig { - - /// @brief Entry point for the old version of the Firebase C# SDK for Remote Config. - public sealed class FirebaseRemoteConfigDeprecated { - - /// @brief The default cache expiration used by FetchAsync(), equal to 12 hours. - [Obsolete("Use the property FirebaseRemoteConfig.DefaultCacheExpiration instead.")] - public static TimeSpan DefaultCacheExpiration { - get { return FirebaseRemoteConfig.DefaultCacheExpiration; } - } - - /// @brief The default timeout used when Fetching, equal to 30 seconds, - /// in milliseconds. - [Obsolete("Use the property FirebaseRemoteConfig.DefaultTimeoutInMilliseconds instead.")] - public static ulong kDefaultTimeoutInMilliseconds { - get { return FirebaseRemoteConfig.DefaultTimeoutInMilliseconds; } - } - - /// @brief Returns information about the last fetch request, in the form - /// of a @ref ConfigInfo struct. - [Obsolete("Use the instance property Info instead.")] - public static ConfigInfo Info { - get { return FirebaseRemoteConfig.DefaultInstance.Info; } - } - - /// @brief Gets the set of all Remote Config parameter keys. - [Obsolete("Use the instance property Keys instead.")] - public static IEnumerable Keys { - get { return FirebaseRemoteConfig.DefaultInstance.Keys; } - } - - /// @brief Gets and sets the configuration settings for operations. - /// - /// Get returns a copy of the current settings; to change the settings - /// a ConfigSettings with the new settings needs to be set. - [Obsolete( - "Use the instance property ConfigSettings and method SetConfigSettingsAsync instead.")] - public static ConfigSettings Settings { - get { return FirebaseRemoteConfig.DefaultInstance.ConfigSettings; } - set { FirebaseRemoteConfig.DefaultInstance.SetConfigSettingsAsync(value); } - } - - /// @brief Applies the most recently fetched data, so that its values can be - /// accessed. - /// - /// Calls to @ref GetLong(), @ref GetDouble(), @ref GetString() and - /// @ref GetData() will not reflect the new data retrieved by @ref Fetch() - /// until @ref ActivateFetched() is called. This gives the developer control - /// over when newly fetched data is visible to their application. - /// - /// @return true if a previously fetch configuration was activated, false - /// if a fetched configuration wasn't found or the configuration was previously - /// activated. - [Obsolete("Use the instance method ActivateAsync instead.")] - public static bool ActivateFetched() { - LogUtil.LogMessage(LogLevel.Warning, - "Deprecated ActivateFetched called. This method is now asynchronous. " + - "Use the instance method ActivateAsync for better control."); - FirebaseRemoteConfig.DefaultInstance.ActivateAsync(); - return false; - } - - /// @brief Fetches config data from the server. - /// - /// @note This does not actually apply the data or make it accessible, - /// it merely retrieves it and caches it. To accept and access the newly - /// retrieved values, you must call @ref ActivateFetched(). - /// Note that this function is asynchronous, and will normally take an - /// unspecified amount of time before completion. - /// - /// @returns A Task which can be used to determine when the fetch is - /// complete. - [Obsolete("Use the instance method FetchAsync instead.")] - public static Task FetchAsync() { - return FirebaseRemoteConfig.DefaultInstance.FetchAsync(); - } - - /// @brief Fetches config data from the server. - /// - /// @note This does not actually apply the data or make it accessible, - /// it merely retrieves it and caches it. To accept and access the newly - /// retrieved values, you must call @ref ActivateFetched(). - /// Note that this function is asynchronous, and will normally take an - /// unspecified amount of time before completion. - /// - /// @param[in] cacheExpiration The time to keep previously fetch data - /// available. If cached data is available that is newer than - /// cacheExpiration, then the function returns immediately and does not - /// fetch any data. A cacheExpiration of zero seconds will always - /// cause a fetch. - /// - /// @returns A Task which can be used to determine when the fetch is - /// complete. - [Obsolete("Use the instance method FetchAsync instead.")] - public static Task FetchAsync(System.TimeSpan cacheExpiration) { - return FirebaseRemoteConfig.DefaultInstance.FetchAsync(cacheExpiration); - } - - /// @brief The set of all Remote Config parameter keys in the - /// default namespace with prefix. - [Obsolete("Use the instance method GetKeysByPrefix instead.")] - public static IEnumerable GetKeysByPrefix(string prefix) { - return FirebaseRemoteConfig.DefaultInstance.GetKeysByPrefix(prefix); - } - - /// @brief Gets the ConfigValue corresponding to the specified key. - /// - /// @param[in] key Key of the value to be retrieved. - /// - /// @returns The ConfigValue associated with the specified key. - [Obsolete("Use the instance method GetValue instead.")] - public static ConfigValue GetValue(string key) { - return FirebaseRemoteConfig.DefaultInstance.GetValue(key); - } - - /// @brief Sets the default values based on a string dictionary. - /// - /// @note This completely overrides all previous values. - /// - /// @param defaults IDictionary of string keys to values, representing the new - /// set of defaults to apply. If the same key is specified multiple times, the - /// value associated with the last duplicate key is applied. - [Obsolete("Use the instance method SetDefaultsAsync instead.")] - public static void SetDefaults(IDictionary defaults) { - LogUtil.LogMessage(LogLevel.Warning, - "Deprecated SetDefaults called. This method is now asynchronous. " + - "Use the instance method SetDefaultsAsync for better control."); - FirebaseRemoteConfig.DefaultInstance.SetDefaultsAsync(defaults); - } - } - -} // namespace Firebase.RemoteConfig diff --git a/swig_post_process.py b/swig_post_process.py index b9d8336ad..8a1c8c021 100644 --- a/swig_post_process.py +++ b/swig_post_process.py @@ -39,6 +39,9 @@ 'Prefix to add to generated C methods.') flags.DEFINE_string('exception_module_name', None, 'Name of the module to check for pending exceptions.') +flags.DEFINE_list('exception_ignore_path_prefixes', [], + 'List of file path prefixes to ignore when replacing the ' + 'name of the module that checks for pending exceptions.') flags.DEFINE_boolean('fix_sealed_classes', True, 'Remove the virtual modifier from sealed class methods ' 'and make protected members private.') @@ -194,13 +197,15 @@ def __call__(self, file_str, filename, iteration): class ReplaceExceptionChecks(SWIGPostProcessingInterface): """Redirect module local exception checks to a global module.""" - def __init__(self, module_name): + def __init__(self, module_name, ignore_paths): """Initialize the instance. Args: module_name: Name of the module to redirect exceptions to. + ignore_paths: List of path prefixes to ignore when doing the replacement. """ self.module_name = module_name + self.ignore_paths = ignore_paths self.replace_regexp = re.compile( r'[A-Za-z]+(PINVOKE\.SWIGPendingException\.Pending.*throw *)' r'[A-Za-z]+(PINVOKE\.SWIGPendingException\.Retrieve)') @@ -219,6 +224,11 @@ def __call__(self, file_str, filename, iteration): """ if filename.endswith('PINVOKE.cs'): return file_str + + for path in self.ignore_paths: + if path in filename: + return file_str + return self.replace_regexp.sub( r'{module_name}\g<1>{module_name}\g<2>'.format( module_name=self.module_name), file_str) @@ -509,6 +519,8 @@ def __init__(self): self.search_strings = [ ('ExceptionArgumentDelegate', re.compile('static void SetPendingArgument.*string paramName\\)')), + ('FirestoreExceptionDelegate', + re.compile('static void SetPendingFirestoreException.*string message')), ('ExceptionDelegate', re.compile('static void SetPending.*string message')), ('SWIGStringDelegate', @@ -640,7 +652,8 @@ def main(unused_argv): if FLAGS.module_name_prefix: post_processes += [NamespaceCMethods(FLAGS.module_name_prefix)] if FLAGS.exception_module_name: - post_processes += [ReplaceExceptionChecks(FLAGS.exception_module_name)] + post_processes += [ReplaceExceptionChecks(FLAGS.exception_module_name, + FLAGS.exception_ignore_path_prefixes)] if FLAGS.fix_sealed_classes: post_processes += [FixSealedClasses()] if FLAGS.internal_visibility: diff --git a/unity_packer/exports.json b/unity_packer/exports.json index bd5a4fe9d..dd85c3097 100644 --- a/unity_packer/exports.json +++ b/unity_packer/exports.json @@ -187,7 +187,7 @@ "manifest" : { "unity": "2017.1", "dependencies": { - "com.google.external-dependency-manager" : "1.2.164" + "com.google.external-dependency-manager" : "1.2.165" } } } @@ -1141,89 +1141,6 @@ } } }, - { - "name": "FirebaseInstanceId.unitypackage", - "imports": [ - { - "importer": "PluginImporter", - "platforms": ["Editor", "Standalone", "Android"], - "cpu": "AnyCPU", - "paths": [ - "Firebase/Plugins/Firebase.InstanceId.dll", - "Firebase/Plugins/Firebase.InstanceId.dll.mdb" - ] - }, - { - "importer": "PluginImporter", - "platforms": ["iOS"], - "cpu": "AnyCPU", - "paths": [ - "Plugins/iOS/Firebase/libFirebaseCppInstanceId.a", - "Firebase/Plugins/iOS/Firebase.InstanceId.dll", - "Firebase/Plugins/iOS/Firebase.InstanceId.dll.mdb" - ] - }, - { - "importer": "DefaultImporter", - "paths": [ - "Firebase/Editor/InstanceIdDependencies.xml", - "Firebase/m2repository/com/google/firebase/firebase-instance-id-unity/" - ] - }, - { - "importer": "PluginImporter", - "platforms": ["Editor", "Standalone"], - "cpu": "x86_64", - "paths": [ - "Firebase/Plugins/x86_64/FirebaseCppInstanceId*" - ] - }, - { - "importer": "DefaultImporter", - "sections": ["samples"], - "paths": [ - "Firebase/Sample/InstanceId/" - ] - }, - { - "importer": "DefaultImporter", - "sections": ["samples", "documentation"], - "paths": [ - "Firebase/Editor/InstanceIdReadme.md" - ] - } - ], - "includes": [ - "FirebaseApp.unitypackage", - "SampleCommon.unitypackage" - ], - "manifest_path": "Firebase/Editor", - "readme": "Firebase/Editor/InstanceIdReadme.md", - "changelog" : "Firebase/Editor/readme.md", - "license" : "Firebase/Editor/LICENSE", - "documentation" : "Firebase/Editor/InstanceIdReadme.md", - "common_manifest" : { - "name": "com.google.firebase.instance-id", - "display_name": "Firebase Instance ID", - "description": [ - "You can use Instance ID to test Firebase A/B Testing or provide a ", - "unique identifier for each app instance and a mechanism to ", - "authenticate and authorize actions like sending a message via ", - "Cloud Messaging." - ], - "keywords": ["Google", "Firebase", "InstanceId"], - "author": { - "name" : "Google LLC", - "url": "https://firebase.google.com/docs/reference/unity/namespace/firebase/instance-id" - } - }, - "export_upm": 1, - "upm_package_config" : { - "manifest" : { - "unity": "2017.1" - } - } - }, { "name": "FirebasePerformance.unitypackage", "sections": ["eap"], diff --git a/unity_packer/guids.json b/unity_packer/guids.json index 6b3916b59..b34efc3e7 100644 --- a/unity_packer/guids.json +++ b/unity_packer/guids.json @@ -3515,5 +3515,61 @@ "com.google.firebase.messaging/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/7.1.0": "8a8d834103eb4060a962196c785b3e32", "com.google.firebase.remote-config/Firebase/m2repository/com/google/firebase/firebase-config-unity/7.1.0": "bb20c9e62e2e43dbb4b8058ae7d953e0", "com.google.firebase.storage/Firebase/m2repository/com/google/firebase/firebase-storage-unity/7.1.0": "2e0507b9f152495ba15790524055eb38" + }, + "7.2.0": { + "Firebase/Editor/FirebaseAnalytics_version-7.2.0_manifest.txt": "b7a2d6b6752b4bcf8214a5aaa8fc0805", + "Firebase/Editor/FirebaseAuth_version-7.2.0_manifest.txt": "b8f4a4310af54b38b51e1db933e9cd25", + "Firebase/Editor/FirebaseCrashlytics_version-7.2.0_manifest.txt": "c65d35eabba74130a03c09c00be2871f", + "Firebase/Editor/FirebaseDatabase_version-7.2.0_manifest.txt": "b008e6c496444dccaae930945b8892e4", + "Firebase/Editor/FirebaseDynamicLinks_version-7.2.0_manifest.txt": "695fd1fa629549bb8043c2a6d96f37eb", + "Firebase/Editor/FirebaseFirestore_version-7.2.0_manifest.txt": "8fa4e58f133f4cc488fd640582e59b49", + "Firebase/Editor/FirebaseFunctions_version-7.2.0_manifest.txt": "08017b3cd349409fb470d457b6779ec3", + "Firebase/Editor/FirebaseInstallations_version-7.2.0_manifest.txt": "15e41395690746469904c42a16cf2fa2", + "Firebase/Editor/FirebaseInstanceId_version-7.2.0_manifest.txt": "0e448e0e775c4cae958d7039ad7cee15", + "Firebase/Editor/FirebaseMessaging_version-7.2.0_manifest.txt": "d4e33016f45e487dae5b58f4dd483dca", + "Firebase/Editor/FirebaseRemoteConfig_version-7.2.0_manifest.txt": "4964d4c7ffd04078862ebd2232a1fcae", + "Firebase/Editor/FirebaseStorage_version-7.2.0_manifest.txt": "343e4492b4a44b69a89746959c3b7819", + "Firebase/Plugins/x86_64/FirebaseCppApp-7_2_0.bundle": "574f13d8129e4e21befaf6c8f6e87b0b", + "Firebase/Plugins/x86_64/FirebaseCppApp-7_2_0.dll": "36df390f69994a86a6db44990b2e7f8b", + "Firebase/Plugins/x86_64/FirebaseCppApp-7_2_0.so": "65b7f62227434ea0ba5511f3c304eb7e", + "Firebase/m2repository/com/google/firebase/firebase-analytics-unity/7.2.0/firebase-analytics-unity-7.2.0.pom": "da70047d3c5e44aca27a5d4cf2e81be7", + "Firebase/m2repository/com/google/firebase/firebase-analytics-unity/7.2.0/firebase-analytics-unity-7.2.0.srcaar": "dc73005d76c54060b301597ee97d1a0e", + "Firebase/m2repository/com/google/firebase/firebase-app-unity/7.2.0/firebase-app-unity-7.2.0.pom": "838b848b470f4ad58f4511daadd0edcc", + "Firebase/m2repository/com/google/firebase/firebase-app-unity/7.2.0/firebase-app-unity-7.2.0.srcaar": "24c50778ead24cf0a7d240951b49806e", + "Firebase/m2repository/com/google/firebase/firebase-auth-unity/7.2.0/firebase-auth-unity-7.2.0.pom": "9f8c40da00ba4eb09d6cc8bb705197b5", + "Firebase/m2repository/com/google/firebase/firebase-auth-unity/7.2.0/firebase-auth-unity-7.2.0.srcaar": "8a927774a81d4f9989ebf3f8be2523c9", + "Firebase/m2repository/com/google/firebase/firebase-config-unity/7.2.0/firebase-config-unity-7.2.0.pom": "bfbd7cb8ba044372b746e41564dbd326", + "Firebase/m2repository/com/google/firebase/firebase-config-unity/7.2.0/firebase-config-unity-7.2.0.srcaar": "40e9795d17b74e6fa0849c170be18dc4", + "Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/7.2.0/firebase-crashlytics-unity-7.2.0.pom": "2449b8f394584b499cd66fbf0796f3aa", + "Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/7.2.0/firebase-crashlytics-unity-7.2.0.srcaar": "3918101fc5754e1aacd2ad50fb2d00c4", + "Firebase/m2repository/com/google/firebase/firebase-database-unity/7.2.0/firebase-database-unity-7.2.0.pom": "6ee5f810b7484bd693f72c7107670277", + "Firebase/m2repository/com/google/firebase/firebase-database-unity/7.2.0/firebase-database-unity-7.2.0.srcaar": "f3b09d5f087c455cac3791cbfd521596", + "Firebase/m2repository/com/google/firebase/firebase-dynamic-links-unity/7.2.0/firebase-dynamic-links-unity-7.2.0.pom": "6dae39c5dd62455b8810735c9b24454c", + "Firebase/m2repository/com/google/firebase/firebase-dynamic-links-unity/7.2.0/firebase-dynamic-links-unity-7.2.0.srcaar": "bcc2339d18b247f3bdace009a3973b54", + "Firebase/m2repository/com/google/firebase/firebase-firestore-unity/7.2.0/firebase-firestore-unity-7.2.0.pom": "a78a301790054be69dba45f0108b8094", + "Firebase/m2repository/com/google/firebase/firebase-firestore-unity/7.2.0/firebase-firestore-unity-7.2.0.srcaar": "2df47fc3ff284cc3b0e39fe7e951583e", + "Firebase/m2repository/com/google/firebase/firebase-functions-unity/7.2.0/firebase-functions-unity-7.2.0.pom": "da8586bb1074468e8bf49abe7c6431a5", + "Firebase/m2repository/com/google/firebase/firebase-functions-unity/7.2.0/firebase-functions-unity-7.2.0.srcaar": "9dc6b5945f954b3b81ca9fd2e01909da", + "Firebase/m2repository/com/google/firebase/firebase-installations-unity/7.2.0/firebase-installations-unity-7.2.0.pom": "dcae4ba1a9df4c65bed09df3b5594fa8", + "Firebase/m2repository/com/google/firebase/firebase-installations-unity/7.2.0/firebase-installations-unity-7.2.0.srcaar": "f809fb4b92634301a2626715271e71af", + "Firebase/m2repository/com/google/firebase/firebase-instance-id-unity/7.2.0/firebase-instance-id-unity-7.2.0.pom": "f427f65129e2405d8660206186f138a8", + "Firebase/m2repository/com/google/firebase/firebase-instance-id-unity/7.2.0/firebase-instance-id-unity-7.2.0.srcaar": "6fc5712c191a4471bd5cc0759f504601", + "Firebase/m2repository/com/google/firebase/firebase-messaging-unity/7.2.0/firebase-messaging-unity-7.2.0.pom": "b10217d8194b40539b7d5c6e7ab06806", + "Firebase/m2repository/com/google/firebase/firebase-messaging-unity/7.2.0/firebase-messaging-unity-7.2.0.srcaar": "0c4067105d664eb59fc0e9b3fc3d5933", + "Firebase/m2repository/com/google/firebase/firebase-storage-unity/7.2.0/firebase-storage-unity-7.2.0.pom": "9e45fec5ad9d4df084976ef175149908", + "Firebase/m2repository/com/google/firebase/firebase-storage-unity/7.2.0/firebase-storage-unity-7.2.0.srcaar": "7f1e0fd600a24a85b24270522a53a663", + "com.google.firebase.analytics/Firebase/m2repository/com/google/firebase/firebase-analytics-unity/7.2.0": "b0c6044ae5c04a8a912abc10724d380e", + "com.google.firebase.app/Firebase/m2repository/com/google/firebase/firebase-app-unity/7.2.0": "1b37cf4a880d495fa1b2101e421cc410", + "com.google.firebase.auth/Firebase/m2repository/com/google/firebase/firebase-auth-unity/7.2.0": "e06a2f2ddf114b2dbe55f75db3e93f19", + "com.google.firebase.crashlytics/Firebase/m2repository/com/google/firebase/firebase-crashlytics-unity/7.2.0": "de6dc03ef4ae46a484c9331661ac3fe2", + "com.google.firebase.database/Firebase/m2repository/com/google/firebase/firebase-database-unity/7.2.0": "fbaf160d274c416c9bf2ca7e01e7835b", + "com.google.firebase.dynamic-links/Firebase/m2repository/com/google/firebase/firebase-dynamic-links-unity/7.2.0": "d647abdbe29a4ce6854153679355093c", + "com.google.firebase.firestore/Firebase/m2repository/com/google/firebase/firebase-firestore-unity/7.2.0": "ac7d36acdc9c490c953101e944ab6291", + "com.google.firebase.functions/Firebase/m2repository/com/google/firebase/firebase-functions-unity/7.2.0": "4779f1c94eb94348a022facb2ffb59e9", + "com.google.firebase.installations/Firebase/m2repository/com/google/firebase/firebase-installations-unity/7.2.0": "9454c127a37e4939b56447be1bbb10dd", + "com.google.firebase.instance-id/Firebase/m2repository/com/google/firebase/firebase-instance-id-unity/7.2.0": "612de1d71d5c46d68c3ba8438c4f3000", + "com.google.firebase.messaging/Firebase/m2repository/com/google/firebase/firebase-messaging-unity/7.2.0": "5411c331f88c46db86047f1d91538b2d", + "com.google.firebase.remote-config/Firebase/m2repository/com/google/firebase/firebase-config-unity/7.2.0": "f25624d599e847b9be878c2ff1b32639", + "com.google.firebase.storage/Firebase/m2repository/com/google/firebase/firebase-storage-unity/7.2.0": "67a55124dd0a4612b5e8d6b162e949b9" } }