@@ -18,6 +18,7 @@ internal data class FidEnvSnapshot(
1818 val googleServices : Boolean ,
1919 val agpVersion : String? ,
2020 val fidFlag : Boolean ,
21+ val fidRegisterApi : Boolean ,
2122 val defaultFirebaseApp : Boolean ,
2223 val firebaseInitProvider : Boolean ,
2324 val minSdk : Int? ,
@@ -29,6 +30,7 @@ internal data class FidEnvSnapshot(
2930 " gs=${googleServices.toBit()} " ,
3031 " agp=${agpVersion.sanitized()} " ,
3132 " flag=${fidFlag.toBit()} " ,
33+ " reg=${fidRegisterApi.toBit()} " ,
3234 " def=${defaultFirebaseApp.toBit()} " ,
3335 " prov=${firebaseInitProvider.toBit()} " ,
3436 " min=${minSdk?.toString() ? : " -" } " ,
@@ -69,6 +71,16 @@ internal fun dashboardSenderForCensus(
6971): String? =
7072 if (hydrated && senderAppId == appId) sender else null
7173
74+ @Suppress(" TooGenericExceptionCaught" )
75+ internal fun hasPublicNoArgMethod (className : String , methodName : String ): Boolean {
76+ return try {
77+ Class .forName(className).getMethod(methodName)
78+ true
79+ } catch (_: Throwable ) {
80+ false
81+ }
82+ }
83+
7284internal class AndroidFidEnvReader (
7385 private val context : Context ,
7486) {
@@ -89,7 +101,8 @@ internal class AndroidFidEnvReader(
89101 return FidEnvSnapshot (
90102 googleServices = ! googleAppId.isNullOrBlank(),
91103 agpVersion = readApkEntry(AGP_METADATA_PATH )?.let { parseAgpVersion(it) },
92- fidFlag = AndroidUtils .getManifestMetaBoolean(context, FID_FLAG ),
104+ fidFlag = fidFlagFromMetadata(),
105+ fidRegisterApi = hasFirebaseMessagingRegisterApi(),
93106 defaultFirebaseApp = false ,
94107 firebaseInitProvider = hasFirebaseInitProvider(),
95108 minSdk = minSdk(),
@@ -127,6 +140,24 @@ internal class AndroidFidEnvReader(
127140 }
128141 }
129142
143+ // 25.1+ exposes register(); older libraries ignore the metadata and keep getToken().
144+ private fun hasFirebaseMessagingRegisterApi (): Boolean =
145+ hasPublicNoArgMethod(FIREBASE_MESSAGING , " register" )
146+
147+ @Suppress(" TooGenericExceptionCaught" )
148+ private fun fidFlagFromMetadata (): Boolean {
149+ return try {
150+ val meta =
151+ context.packageManager.getApplicationInfo(
152+ context.packageName,
153+ PackageManager .GET_META_DATA ,
154+ ).metaData ? : return false
155+ meta.containsKey(FID_FLAG ) && meta.getBoolean(FID_FLAG )
156+ } catch (_: Throwable ) {
157+ false
158+ }
159+ }
160+
130161 @Suppress(" TooGenericExceptionCaught" , " UNCHECKED_CAST" )
131162 private fun hasDefaultFirebaseApp (): Boolean {
132163 return try {
@@ -170,6 +201,7 @@ internal class AndroidFidEnvReader(
170201 private const val FIREBASE_INIT_PROVIDER = " com.google.firebase.provider.FirebaseInitProvider"
171202 private const val AGP_METADATA_PATH = " META-INF/com/android/build/gradle/app-metadata.properties"
172203 private const val FIREBASE_APP = " com.google.firebase.FirebaseApp"
204+ private const val FIREBASE_MESSAGING = " com.google.firebase.messaging.FirebaseMessaging"
173205 private const val DEFAULT_APP_NAME = " [DEFAULT]"
174206 }
175207}
0 commit comments