diff --git a/appcheck/firebase-appcheck/firebase-appcheck.gradle b/appcheck/firebase-appcheck/firebase-appcheck.gradle index 8bb131495f3..0133ce3ae0a 100644 --- a/appcheck/firebase-appcheck/firebase-appcheck.gradle +++ b/appcheck/firebase-appcheck/firebase-appcheck.gradle @@ -70,7 +70,6 @@ dependencies { testImplementation libs.junit testImplementation libs.junit testImplementation libs.mockito.core - testImplementation libs.mockito.mockito.inline testImplementation libs.robolectric androidTestImplementation project(':appcheck:firebase-appcheck') @@ -85,5 +84,4 @@ dependencies { androidTestImplementation libs.truth androidTestImplementation libs.junit androidTestImplementation libs.mockito.core - androidTestImplementation libs.mockito.mockito.inline } diff --git a/firebase-appdistribution-api/firebase-appdistribution-api.gradle b/firebase-appdistribution-api/firebase-appdistribution-api.gradle index ed9f7d9f63c..71416c85e58 100644 --- a/firebase-appdistribution-api/firebase-appdistribution-api.gradle +++ b/firebase-appdistribution-api/firebase-appdistribution-api.gradle @@ -69,7 +69,6 @@ dependencies { testImplementation libs.truth testImplementation libs.junit testImplementation libs.mockito.core - testImplementation libs.mockito.mockito.inline testImplementation libs.robolectric androidTestImplementation libs.androidx.test.core diff --git a/firebase-appdistribution/firebase-appdistribution.gradle b/firebase-appdistribution/firebase-appdistribution.gradle index 55a5a09884e..a6333aff391 100644 --- a/firebase-appdistribution/firebase-appdistribution.gradle +++ b/firebase-appdistribution/firebase-appdistribution.gradle @@ -98,7 +98,7 @@ dependencies { testImplementation libs.androidx.test.core testImplementation libs.truth testImplementation libs.junit - testImplementation libs.mockito.mockito.inline + testImplementation libs.mockito.core testImplementation libs.robolectric androidTestImplementation(project(":integ-testing")){ @@ -111,5 +111,4 @@ dependencies { androidTestImplementation libs.truth androidTestImplementation libs.junit androidTestImplementation libs.mockito.core - androidTestImplementation libs.mockito.mockito.inline } diff --git a/firebase-installations/firebase-installations.gradle b/firebase-installations/firebase-installations.gradle index 4765c720fc9..47d5ee852ea 100644 --- a/firebase-installations/firebase-installations.gradle +++ b/firebase-installations/firebase-installations.gradle @@ -73,7 +73,6 @@ dependencies { testImplementation libs.truth testImplementation libs.junit testImplementation libs.mockito.core - testImplementation libs.mockito.mockito.inline testImplementation libs.robolectric androidTestImplementation(project(":integ-testing")){ @@ -86,5 +85,4 @@ dependencies { androidTestImplementation libs.truth androidTestImplementation libs.junit androidTestImplementation libs.mockito.core - androidTestImplementation libs.mockito.mockito.inline } diff --git a/firebase-messaging/firebase-messaging.gradle b/firebase-messaging/firebase-messaging.gradle index f014b9eaa7c..4321ffc653d 100644 --- a/firebase-messaging/firebase-messaging.gradle +++ b/firebase-messaging/firebase-messaging.gradle @@ -155,5 +155,4 @@ dependencies { androidTestImplementation libs.truth androidTestImplementation libs.junit androidTestImplementation libs.mockito.core - androidTestImplementation libs.mockito.mockito.inline } diff --git a/firebase-messaging/src/test/java/com/google/firebase/messaging/shadows/ShadowMessenger.java b/firebase-messaging/src/test/java/com/google/firebase/messaging/shadows/ShadowMessenger.java index ef946522750..c3de6854ba9 100644 --- a/firebase-messaging/src/test/java/com/google/firebase/messaging/shadows/ShadowMessenger.java +++ b/firebase-messaging/src/test/java/com/google/firebase/messaging/shadows/ShadowMessenger.java @@ -13,13 +13,16 @@ // limitations under the License. package com.google.firebase.messaging.shadows; +import static org.robolectric.util.reflector.Reflector.reflector; + import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.RealObject; -import org.robolectric.shadow.api.Shadow; +import org.robolectric.util.reflector.Direct; +import org.robolectric.util.reflector.ForType; @Implements(Messenger.class) public class ShadowMessenger { @@ -28,12 +31,18 @@ public class ShadowMessenger { private static RemoteException sendException = null; + @ForType(Messenger.class) + interface MessengerReflector { + @Direct + void send(Messenger messenger, Message message) throws RemoteException; + } + @Implementation protected void send(Message message) throws RemoteException { if (sendException != null) { throw sendException; } else { - Shadow.directlyOn(realMessenger, Messenger.class).send(message); + reflector(Messenger.class, realMessenger).send(message); } } diff --git a/firebase-perf/firebase-perf.gradle b/firebase-perf/firebase-perf.gradle index c0fd6df6056..4c49ed6aad6 100644 --- a/firebase-perf/firebase-perf.gradle +++ b/firebase-perf/firebase-perf.gradle @@ -136,6 +136,5 @@ dependencies { testImplementation libs.androidx.test.rules testImplementation libs.junit testImplementation libs.mockito.core - testImplementation libs.mockito.mockito.inline testImplementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6' } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java index 36d8c272aef..8065997974d 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java @@ -363,7 +363,7 @@ private void triggerFirebaseRemoteConfigFetchAndActivateOnSuccessfulFetch() { @VisibleForTesting protected void syncConfigValues(Map newlyFetchedMap) { allRcConfigMap.putAll(newlyFetchedMap); - for (String existingKey : allRcConfigMap.keySet()) { + for (String existingKey : ((Map) allRcConfigMap).keySet()) { if (!newlyFetchedMap.containsKey(existingKey)) { allRcConfigMap.remove(existingKey); } diff --git a/firebase-sessions/firebase-sessions.gradle.kts b/firebase-sessions/firebase-sessions.gradle.kts index b136a281660..f912236f2f2 100644 --- a/firebase-sessions/firebase-sessions.gradle.kts +++ b/firebase-sessions/firebase-sessions.gradle.kts @@ -52,7 +52,10 @@ android { targetSdk = targetSdkVersion unitTests { isIncludeAndroidResources = true } } - lint { targetSdk = targetSdkVersion } + lint { + baseline = file("lint-baseline.xml") + targetSdk = targetSdkVersion + } } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs::class.java).configureEach { diff --git a/firebase-sessions/lint-baseline.xml b/firebase-sessions/lint-baseline.xml new file mode 100644 index 00000000000..ea2cac1e638 --- /dev/null +++ b/firebase-sessions/lint-baseline.xml @@ -0,0 +1,4 @@ + + + + diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/InstallationId.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/InstallationId.kt index 0df42fda953..b8c164c0355 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/InstallationId.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/InstallationId.kt @@ -37,7 +37,7 @@ internal class InstallationId private constructor(val fid: String, val authToken } val fid: String = try { - firebaseInstallations.id.await() + firebaseInstallations.id.await() ?: "" } catch (ex: Exception) { Log.w(TAG, "Error getting Firebase installation id .", ex) "" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64682610bd7..bbcc56cf29c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,8 +17,8 @@ cardview = "1.0.0" checkerQual = "2.5.2" constraintlayout = "2.1.4" coreKtx = "1.12.0" -coroutines = "1.7.3" -dagger = "2.43.2" +coroutines = "1.9.0" +dagger = "2.51" # Don't bump above 2.51 as it causes a bug in AppDistro FeedbackSender JPEG code datastore = "1.1.3" dexmaker = "2.28.1" dexmakerVersion = "1.2" @@ -45,16 +45,16 @@ javalite = "3.25.5" jsonassert = "1.5.0" kotest = "5.9.0" # Do not use 5.9.1 because it reverts the fix for https://github.com/kotest/kotest/issues/3981 kotestAssertionsCore = "5.8.1" -kotlin = "1.8.22" -ktorVersion = "2.3.2" +kotlin = "2.0.21" +ktorVersion = "3.0.3" legacySupportV4 = "1.0.0" lifecycleProcess = "2.3.1" material = "1.12.0" mavenResolverApi = "1.9.23" mavenResolverProvider = "3.9.9" -mockito = "5.2.0" +mockito = "5.16.0" mockitoAndroid = "3.4.0" -mockk = "1.13.11" +mockk = "1.14.0" # Do not use 1.14.2 or above due to a bug in spyK and bumps kotlin to 2.1.x playServicesCloudMessaging = "17.2.0" playServicesStats = "17.0.2" playServicesVision = "20.1.3" @@ -68,7 +68,7 @@ robolectric = "4.12" runner = "1.0.2" rxandroid = "2.0.2" rxjava = "2.1.14" -serialization = "1.5.1" +serialization = "1.7.3" slf4jNop = "2.0.9" spotless = "7.0.4" testServices = "1.2.0" @@ -195,7 +195,6 @@ kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-te mockito-android = { module = "org.mockito:mockito-android", version.ref = "mockitoAndroid" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mockito-dexmaker = { module = "com.linkedin.dexmaker:dexmaker-mockito", version = "2.28.3" } -mockito-mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockito" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" } mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" } protobuf-java-util = { module = "com.google.protobuf:protobuf-java-util", version.ref = "protobufjavautil" } diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt index 88cd9927045..90d4e3fc50b 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt @@ -22,6 +22,8 @@ import java.io.BufferedOutputStream import java.io.File import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task @@ -39,7 +41,6 @@ import org.gradle.kotlin.dsl.apply import org.gradle.workers.WorkAction import org.gradle.workers.WorkParameters import org.gradle.workers.WorkQueue -import org.jetbrains.kotlin.gradle.utils.provider /** * Creates a file at the buildDir for the given [Project]. @@ -307,3 +308,15 @@ val Provider.nestedFile: Provider */ val Directory.nestedFile: File get() = asFileTree.single { it.isFile } + +/** + * Creates a delegated provider. + * + * Useful to expose a provide via delegated properties. See [tempFile] for a reference usage. + */ +internal fun provider(provider: () -> T) = + object : ReadOnlyProperty { + override operator fun getValue(thisRef: Any?, property: KProperty<*>): T { + return provider() + } + } diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/ci/Coverage.java b/plugins/src/main/java/com/google/firebase/gradle/plugins/ci/Coverage.java index a785420ab0f..e1ce2758093 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/ci/Coverage.java +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/ci/Coverage.java @@ -36,7 +36,7 @@ public static void apply(FirebaseLibraryExtension firebaseLibrary) { File reportsDir = new File(project.getBuildDir(), "/reports/jacoco"); JacocoPluginExtension jacoco = project.getExtensions().getByType(JacocoPluginExtension.class); - jacoco.setToolVersion("0.8.8"); + jacoco.setToolVersion("0.8.13"); jacoco.getReportsDirectory().set(reportsDir); project .getTasks() diff --git a/smoke-tests/build.gradle b/smoke-tests/build.gradle index 0df93b49a47..572c52cdff8 100644 --- a/smoke-tests/build.gradle +++ b/smoke-tests/build.gradle @@ -23,10 +23,10 @@ buildscript { } dependencies { - classpath "com.android.tools.build:gradle:8.3.2" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" - classpath "com.google.gms:google-services:4.3.14" - classpath "com.google.firebase:firebase-crashlytics-gradle:2.8.1" + classpath "com.android.tools.build:gradle:8.6.1" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21" + classpath "com.google.gms:google-services:4.4.3" + classpath "com.google.firebase:firebase-crashlytics-gradle:3.0.4" } } @@ -69,33 +69,33 @@ apply from: "configure.gradle" dependencies { implementation libs.androidx.test.core // Common utilities (application side) - implementation "androidx.test:rules:1.4.0" - implementation "androidx.test:runner:1.4.0" + implementation "androidx.test:rules:1.5.0" + implementation "androidx.test:runner:1.6.2" // Firebase implementation "com.google.firebase:firebase-analytics" implementation "com.google.firebase:firebase-annotations" - implementation "com.google.firebase:firebase-appdistribution:16.0.0-beta03" - implementation "com.google.firebase:firebase-appdistribution-api:16.0.0-beta03" + implementation "com.google.firebase:firebase-appdistribution:16.0.0-beta15" + implementation "com.google.firebase:firebase-appdistribution-api:16.0.0-beta15" implementation "com.google.firebase:firebase-auth" implementation "com.google.firebase:firebase-common" implementation "com.google.firebase:firebase-config" - implementation "com.google.firebase:firebase-crashlytics:18.6.4" + implementation "com.google.firebase:firebase-crashlytics:19.4.4" implementation "com.google.firebase:firebase-database" implementation "com.google.firebase:firebase-firestore" implementation "com.google.firebase:firebase-functions" // TODO(yifany): remove after the issue is fixed // https://github.com/firebase/firebase-android-sdk/issues/4206 - implementation "com.google.firebase:firebase-iid:21.1.0" + implementation "com.google.firebase:firebase-iid" implementation "com.google.firebase:firebase-inappmessaging" implementation "com.google.firebase:firebase-messaging" - implementation "com.google.firebase:firebase-ml-modeldownloader:24.2.3" + implementation "com.google.firebase:firebase-ml-modeldownloader:25.0.1" implementation "com.google.firebase:firebase-perf" implementation "com.google.firebase:firebase-storage" - implementation "com.google.truth:truth:1.0.1" + implementation "com.google.truth:truth:1.4.4" implementation libs.junit // Common utilities (instrumentation side) - androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation "androidx.test:runner:1.6.2" androidTestImplementation libs.junit // Desugaring library diff --git a/smoke-tests/configure.gradle b/smoke-tests/configure.gradle index 65e5aac2690..44fee11f4f8 100644 --- a/smoke-tests/configure.gradle +++ b/smoke-tests/configure.gradle @@ -14,7 +14,7 @@ def configurePlatform() { - def bom = "com.google.firebase:firebase-bom:20.0.0" + def bom = "com.google.firebase:firebase-bom:33.16.0" if (project.hasProperty("firebase-bom")) { bom = project.getProperty("firebase-bom") } diff --git a/smoke-tests/gradle.properties b/smoke-tests/gradle.properties index 372e31337a0..21666b332ee 100644 --- a/smoke-tests/gradle.properties +++ b/smoke-tests/gradle.properties @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -android.enableR8=true android.useAndroidX=true org.gradle.jvmargs=-Xmx8g diff --git a/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt b/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt index 535c9c2befa..48c1f958d81 100644 --- a/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt +++ b/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt @@ -120,7 +120,7 @@ class FirebaseAppGetDetectorTests : LintDetectorTest() { val instance = FirebaseApp.getInstance().get(Foo::class.java) @JvmStatic - fun getInstance(app: FirebaseApp) = app.get(Foo::class.java) + fun getInstance(app: FirebaseApp): Foo = app.get(Foo::class.java) } } """ @@ -145,7 +145,7 @@ class FirebaseAppGetDetectorTests : LintDetectorTest() { val instance = FirebaseApp.getInstance().get(FooImpl::class.java) @JvmStatic - fun getInstance(app: FirebaseApp) = app.get(FooImpl::class.java) + fun getInstance(app: FirebaseApp): Foo = app.get(FooImpl::class.java) } } class FooImpl : Foo()