diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index b653e9a4df..d402382fb5 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -19,13 +19,14 @@ jobs: with: distribution: 'zulu' java-version: 17 + - name: Install Node to use the Firebase CLI + uses: actions/setup-node@v6 + with: + node-version: 24 - name: Setup Gradle uses: gradle/gradle-build-action@v2 - name: Check Snippets run: python scripts/checksnippets.py - # TODO(thatfiredev): remove this once github.com/firebase/quickstart-android/issues/1672 is fixed - - name: Remove Firebase Data Connect from CI - run: python scripts/ci_remove_fdc.py - name: Copy mock google_services.json run: ./copy_mock_google_services_json.sh - name: Build with Gradle (Pull Request) diff --git a/admob/app/build.gradle.kts b/admob/app/build.gradle.kts index ae2abe3def..1a1c031306 100644 --- a/admob/app/build.gradle.kts +++ b/admob/app/build.gradle.kts @@ -1,9 +1,8 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") + alias(libs.plugins.android.application) + alias(libs.plugins.google.services) } tasks { @@ -16,7 +15,7 @@ android { defaultConfig { applicationId = "com.google.samples.quickstart.admobexample" - minSdk = 21 + minSdk = 23 targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -28,7 +27,7 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } packaging { @@ -38,9 +37,6 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } buildFeatures { viewBinding = true } @@ -50,23 +46,23 @@ dependencies { implementation(project(":internal:lintchecks")) implementation(project(":internal:chooserx")) implementation("androidx.appcompat:appcompat:1.7.1") - implementation("com.google.android.material:material:1.12.0") + implementation("com.google.android.material:material:1.13.0") implementation("androidx.browser:browser:1.5.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.2") - implementation("androidx.navigation:navigation-ui-ktx:2.9.2") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") implementation("com.google.android.gms:play-services-ads:23.3.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // For an optimal experience using AdMob, add the Firebase SDK // for Google Analytics. This is recommended, but not required. implementation("com.google.firebase:firebase-analytics") - debugImplementation("androidx.fragment:fragment-testing:1.8.8") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") + debugImplementation("androidx.fragment:fragment-testing:1.8.9") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test:runner:1.7.0") + androidTestImplementation("androidx.test.ext:junit:1.3.0") } diff --git a/admob/build.gradle.kts b/admob/build.gradle.kts index c0926a87e2..09575b4178 100644 --- a/admob/build.gradle.kts +++ b/admob/build.gradle.kts @@ -1,10 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.0" apply false - id("com.google.gms.google-services") version "4.4.3" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.google.services) apply false } allprojects { diff --git a/admob/gradle/wrapper/gradle-wrapper.properties b/admob/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..5dc98dbcf3 100644 --- a/admob/gradle/wrapper/gradle-wrapper.properties +++ b/admob/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/analytics/app/build.gradle.kts b/analytics/app/build.gradle.kts index 6363217ea6..a393f2a39e 100644 --- a/analytics/app/build.gradle.kts +++ b/analytics/app/build.gradle.kts @@ -1,9 +1,8 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") + alias(libs.plugins.android.application) + alias(libs.plugins.google.services) } tasks { @@ -16,7 +15,7 @@ android { defaultConfig { applicationId = "com.google.firebase.quickstart.analytics" - minSdk = 21 + minSdk = 23 targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -27,7 +26,7 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } @@ -36,10 +35,6 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } - buildFeatures { viewBinding = true } @@ -49,20 +44,20 @@ dependencies { implementation(project(":internal:lintchecks")) implementation(project(":internal:chooserx")) - implementation("com.google.android.material:material:1.12.0") + implementation("com.google.android.material:material:1.13.0") implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.preference:preference-ktx:1.2.1") // Needed to override the version used by preference-ktx - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.2") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // Firebase Analytics implementation("com.google.firebase:firebase-analytics") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test:runner:1.7.0") + androidTestImplementation("androidx.test.ext:junit:1.3.0") } diff --git a/analytics/build.gradle.kts b/analytics/build.gradle.kts index a29e9add2d..013f300b72 100644 --- a/analytics/build.gradle.kts +++ b/analytics/build.gradle.kts @@ -1,10 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.0" apply false - id("com.google.gms.google-services") version "4.4.3" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.google.services) apply false } allprojects { diff --git a/analytics/gradle/wrapper/gradle-wrapper.properties b/analytics/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..5dc98dbcf3 100644 --- a/analytics/gradle/wrapper/gradle-wrapper.properties +++ b/analytics/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/appdistribution/app/build.gradle.kts b/appdistribution/app/build.gradle.kts index 7e30e7b47e..9a9632e83c 100644 --- a/appdistribution/app/build.gradle.kts +++ b/appdistribution/app/build.gradle.kts @@ -1,6 +1,6 @@ + plugins { id("com.android.application") - id("kotlin-android") id("com.google.gms.google-services") } @@ -10,7 +10,7 @@ android { defaultConfig { applicationId = "com.google.firebase.appdistributionquickstart" - minSdk = 21 + minSdk = 23 targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -22,16 +22,13 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } buildFeatures { viewBinding = true } @@ -48,22 +45,21 @@ dependencies { implementation(project(":internal:lintchecks")) implementation(project(":internal:chooserx")) - implementation("com.google.android.material:material:1.12.0") + implementation("com.google.android.material:material:1.13.0") implementation("androidx.constraintlayout:constraintlayout:2.2.1") - implementation("androidx.multidex:multidex:2.0.1") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // ADD the SDK to the "prerelease" variant only (example) - implementation("com.google.firebase:firebase-appdistribution:16.0.0-beta15") + implementation("com.google.firebase:firebase-appdistribution:16.0.0-beta17") // For an optimal experience using App Distribution, add the Firebase SDK // for Google Analytics. This is recommended, but not required. implementation("com.google.firebase:firebase-analytics") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") + androidTestImplementation("androidx.test:runner:1.7.0") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0") } diff --git a/appdistribution/app/src/main/AndroidManifest.xml b/appdistribution/app/src/main/AndroidManifest.xml index a29b19adf7..a5455f3394 100644 --- a/appdistribution/app/src/main/AndroidManifest.xml +++ b/appdistribution/app/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@ ("ktlintCheck") { - val outputDir = "${project.buildDir}/reports/ktlint/" + val outputDir = "${project.layout.buildDirectory}/reports/ktlint/" val inputFiles = project.fileTree("src").include("**/*.kt") val outputFile = "${outputDir}ktlint-checkstyle-report.xml" @@ -49,7 +48,8 @@ tasks.register("ktlintCheck") { "--code-style=android_studio", "--reporter=plain", "--reporter=checkstyle,output=${outputFile}", - "**/*.kt" + "**/*.kt", + "!**/build/**" ) jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") @@ -68,10 +68,10 @@ fun isNonStable(candidate: ModuleComponentIdentifier): Boolean { fun isBlockListed(candidate: ModuleComponentIdentifier): Boolean { return listOf( "androidx.browser:browser", + "androidx.webkit:webkit", "com.facebook.android", "com.google.guava", - "com.github.bumptech.glide", - "com.google.android.gms" + "com.github.bumptech.glide" ).any { keyword -> keyword in candidate.toString().lowercase() } @@ -85,6 +85,6 @@ tasks.withType { tasks { register("clean", Delete::class) { - delete(rootProject.buildDir) + delete(rootProject.layout.buildDirectory) } } diff --git a/config/app/build.gradle.kts b/config/app/build.gradle.kts index ae548e4656..a2a492fe42 100644 --- a/config/app/build.gradle.kts +++ b/config/app/build.gradle.kts @@ -1,9 +1,8 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") + alias(libs.plugins.android.application) + alias(libs.plugins.google.services) } tasks { @@ -16,7 +15,7 @@ android { defaultConfig { applicationId = "com.google.samples.quickstart.config" - minSdk = 21 + minSdk = 23 targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -27,16 +26,13 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } buildFeatures { viewBinding = true @@ -47,10 +43,10 @@ dependencies { implementation(project(":internal:lintchecks")) implementation(project(":internal:chooserx")) - implementation("com.google.android.material:material:1.12.0") + implementation("com.google.android.material:material:1.13.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // Firebase Remote Config implementation("com.google.firebase:firebase-config") @@ -59,8 +55,8 @@ dependencies { // for Google Analytics. This is recommended, but not required. implementation("com.google.firebase:firebase-analytics") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test:runner:1.7.0") + androidTestImplementation("androidx.test.ext:junit:1.3.0") } diff --git a/config/build.gradle.kts b/config/build.gradle.kts index c0926a87e2..09575b4178 100644 --- a/config/build.gradle.kts +++ b/config/build.gradle.kts @@ -1,10 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.0" apply false - id("com.google.gms.google-services") version "4.4.3" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.google.services) apply false } allprojects { diff --git a/config/gradle/wrapper/gradle-wrapper.properties b/config/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..5dc98dbcf3 100644 --- a/config/gradle/wrapper/gradle-wrapper.properties +++ b/config/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/copy_mock_google_services_json.sh b/copy_mock_google_services_json.sh index 51f1bcabe2..54e013b8a4 100755 --- a/copy_mock_google_services_json.sh +++ b/copy_mock_google_services_json.sh @@ -13,7 +13,6 @@ cp mock-google-services.json config/app/google-services.json cp mock-google-services.json crash/app/google-services.json cp mock-google-services.json database/app/google-services.json cp mock-google-services.json dataconnect/app/google-services.json -cp mock-google-services.json dynamiclinks/app/google-services.json cp mock-google-services.json firebase-ai/app/google-services.json cp mock-google-services.json firestore/app/google-services.json cp mock-google-services.json functions/app/google-services.json diff --git a/crash/app/build.gradle.kts b/crash/app/build.gradle.kts index 0c9122af80..920dc73dcd 100644 --- a/crash/app/build.gradle.kts +++ b/crash/app/build.gradle.kts @@ -1,10 +1,9 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") - id("com.google.firebase.crashlytics") + alias(libs.plugins.android.application) + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) } tasks { @@ -17,7 +16,7 @@ android { defaultConfig { applicationId = "com.google.samples.quickstart.crash" - minSdk = 21 + minSdk = 23 targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -28,21 +27,18 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } getByName("debug") { isMinifyEnabled = false - testProguardFiles(getDefaultProguardFile("proguard-android.txt"), "test-proguard-rules.pro") - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + testProguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "test-proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } buildFeatures { viewBinding = true @@ -52,11 +48,11 @@ android { dependencies { implementation(project(":internal:lintchecks")) implementation(project(":internal:chooserx")) - implementation("com.google.android.material:material:1.12.0") - implementation("androidx.activity:activity-ktx:1.10.1") + implementation("com.google.android.material:material:1.13.0") + implementation("androidx.activity:activity-ktx:1.12.1") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // Firebase Crashlytics implementation("com.google.firebase:firebase-crashlytics") @@ -69,8 +65,8 @@ dependencies { implementation("com.google.android.gms:play-services-base:18.5.0") testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test:runner:1.7.0") + androidTestImplementation("androidx.test.ext:junit:1.3.0") } diff --git a/crash/build.gradle.kts b/crash/build.gradle.kts index 280a85f351..40b3246d65 100644 --- a/crash/build.gradle.kts +++ b/crash/build.gradle.kts @@ -1,11 +1,10 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.0" apply false - id("com.google.gms.google-services") version "4.4.3" apply false - id("com.google.firebase.crashlytics") version "3.0.4" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.google.services) apply false + alias(libs.plugins.firebase.crashlytics) apply false } allprojects { @@ -18,6 +17,6 @@ allprojects { tasks { register("clean", Delete::class) { - delete(rootProject.buildDir) + delete(rootProject.layout.buildDirectory) } } diff --git a/crash/gradle/wrapper/gradle-wrapper.properties b/crash/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..5dc98dbcf3 100644 --- a/crash/gradle/wrapper/gradle-wrapper.properties +++ b/crash/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/database/app/build.gradle.kts b/database/app/build.gradle.kts index c5cbf3ac0c..bd877f9edb 100644 --- a/database/app/build.gradle.kts +++ b/database/app/build.gradle.kts @@ -1,9 +1,8 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") + alias(libs.plugins.android.application) + alias(libs.plugins.google.services) } tasks { @@ -27,7 +26,7 @@ android { buildTypes { getByName("release") { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") signingConfig = signingConfigs.getByName("debug") } } @@ -35,9 +34,6 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } buildFeatures { viewBinding = true @@ -50,12 +46,12 @@ dependencies { implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.recyclerview:recyclerview:1.4.0") - implementation("com.google.android.material:material:1.12.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.2") - implementation("androidx.navigation:navigation-ui-ktx:2.9.2") + implementation("com.google.android.material:material:1.13.0") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) + implementation(platform("com.google.firebase:firebase-bom:34.7.0")) // Firebase Realtime Database implementation("com.google.firebase:firebase-database") @@ -63,13 +59,13 @@ dependencies { // Firebase Authentication implementation("com.google.firebase:firebase-auth") - implementation("com.firebaseui:firebase-ui-database:9.0.0") + implementation("com.firebaseui:firebase-ui-database:9.1.1") // Needed to fix a dependency conflict with FirebaseUI' implementation("androidx.arch.core:core-runtime:2.2.0") testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test:runner:1.7.0") } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index e1a62482c1..81a82fd0d4 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -1,10 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.0" apply false - id("com.google.gms.google-services") version "4.4.3" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.google.services) apply false } allprojects { @@ -17,6 +16,6 @@ allprojects { tasks { register("clean", Delete::class) { - delete(rootProject.buildDir) + delete(rootProject.layout.buildDirectory) } } diff --git a/database/gradle/wrapper/gradle-wrapper.properties b/database/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..5dc98dbcf3 100644 --- a/database/gradle/wrapper/gradle-wrapper.properties +++ b/database/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/dataconnect/app/build.gradle.kts b/dataconnect/app/build.gradle.kts index 67dde06181..6c32450d26 100644 --- a/dataconnect/app/build.gradle.kts +++ b/dataconnect/app/build.gradle.kts @@ -1,6 +1,5 @@ plugins { alias(libs.plugins.android.application) - alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.google.services) alias(libs.plugins.compose.compiler) @@ -36,9 +35,6 @@ android { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } - kotlinOptions { - jvmTarget = "1.8" - } buildFeatures { compose = true } @@ -51,7 +47,7 @@ android { } } sourceSets.getByName("main") { - java.srcDirs("build/generated/sources") + kotlin.directories.add("build/generated/sources") } } @@ -66,6 +62,7 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.compose.material.icons) implementation(libs.compose.navigation) implementation(libs.androidx.lifecycle.runtime.compose.android) implementation(libs.coil.compose) diff --git a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/actordetail/ActorDetailScreen.kt b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/actordetail/ActorDetailScreen.kt index e1a9baa90e..8164f69675 100644 --- a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/actordetail/ActorDetailScreen.kt +++ b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/actordetail/ActorDetailScreen.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import coil.compose.AsyncImage +import coil3.compose.AsyncImage import com.google.firebase.dataconnect.movies.GetActorByIdQuery import com.google.firebase.example.dataconnect.R import com.google.firebase.example.dataconnect.ui.components.ErrorCard diff --git a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/MovieDetailScreen.kt b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/MovieDetailScreen.kt index 148293f348..cc56757bfe 100644 --- a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/MovieDetailScreen.kt +++ b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/MovieDetailScreen.kt @@ -38,7 +38,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import coil.compose.AsyncImage +import coil3.compose.AsyncImage import com.google.firebase.dataconnect.movies.GetMovieByIdQuery import com.google.firebase.example.dataconnect.R import com.google.firebase.example.dataconnect.ui.components.Actor diff --git a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/ActorsList.kt b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/ActorsList.kt index 9e783df8df..b60b271c2c 100644 --- a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/ActorsList.kt +++ b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/ActorsList.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage +import coil3.compose.AsyncImage val ACTOR_CARD_SIZE = 64.dp diff --git a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/MoviesList.kt b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/MoviesList.kt index 0be44d7abd..620910ab47 100644 --- a/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/MoviesList.kt +++ b/dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/ui/components/MoviesList.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage +import coil3.compose.AsyncImage /** * Used to represent a movie in a list UI diff --git a/dataconnect/build.gradle.kts b/dataconnect/build.gradle.kts index 8e1379dd6a..11467f73d9 100644 --- a/dataconnect/build.gradle.kts +++ b/dataconnect/build.gradle.kts @@ -1,7 +1,23 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.android.application) apply false - alias(libs.plugins.jetbrains.kotlin.android) apply false alias(libs.plugins.google.services) apply false alias(libs.plugins.compose.compiler) apply false } + +tasks { + register("dataconnectCompile") { + workingDir = project.file("./dataconnect") + if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) { + commandLine("npx.cmd", "-y", "firebase-tools@latest", "dataconnect:compile") + } else { + commandLine("npx", "-y", "firebase-tools@latest", "dataconnect:compile") + } + isIgnoreExitValue = true + } + + register("clean", Delete::class) { + delete(rootProject.layout.buildDirectory) + finalizedBy("dataconnectCompile") + } +} \ No newline at end of file diff --git a/dataconnect/dataconnect/movie-connector/connector.yaml b/dataconnect/dataconnect/movie-connector/connector.yaml index 2ba51749dc..21099bb852 100644 --- a/dataconnect/dataconnect/movie-connector/connector.yaml +++ b/dataconnect/dataconnect/movie-connector/connector.yaml @@ -10,4 +10,4 @@ generate: package: com.google.firebase.dataconnect.movies # Specify where to store the generated SDK # We're using the build/ directory so that generated code doesn't get checked into git - outputDir: ../../app/build/generated/sources/com/google/firebase/dataconnect/movies + outputDir: ../../app/build/generated/sources diff --git a/dataconnect/dataconnect/movie-connector/queries.gql b/dataconnect/dataconnect/movie-connector/queries.gql index 5e05b17e22..4e0229e98a 100644 --- a/dataconnect/dataconnect/movie-connector/queries.gql +++ b/dataconnect/dataconnect/movie-connector/queries.gql @@ -1,5 +1,5 @@ # List subset of fields for movies -query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirection, $limit: Int) @auth(level: PUBLIC) { +query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirection, $limit: Int) @auth(level: PUBLIC, insecureReason: "Test Mode") { movies( orderBy: [ { rating: $orderByRating }, @@ -19,7 +19,7 @@ query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirec } # Get movie by id -query GetMovieById($id: UUID!) @auth(level: PUBLIC) { +query GetMovieById($id: UUID!) @auth(level: PUBLIC, insecureReason: "Test Mode") { movie(id: $id) { id title @@ -58,7 +58,7 @@ query GetMovieById($id: UUID!) @auth(level: PUBLIC) { } # Get actor by id -query GetActorById($id: UUID!) @auth(level: PUBLIC) { +query GetActorById($id: UUID!) @auth(level: PUBLIC, insecureReason: "Test Mode") { actor(id: $id) { id name @@ -130,7 +130,7 @@ query SearchAll( $minRating: Float! $maxRating: Float! $genre: String! -) @auth(level: PUBLIC) { +) @auth(level: PUBLIC, insecureReason: "Test Mode") { moviesMatchingTitle: movies( where: { _and: [ diff --git a/dataconnect/gradle/wrapper/gradle-wrapper.properties b/dataconnect/gradle/wrapper/gradle-wrapper.properties index 34ddbf468f..2e00545d63 100644 --- a/dataconnect/gradle/wrapper/gradle-wrapper.properties +++ b/dataconnect/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed May 08 19:29:05 BST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/dynamiclinks/.gitignore b/dynamiclinks/.gitignore deleted file mode 100644 index d46cccfd2b..0000000000 --- a/dynamiclinks/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.gradle -/local.properties -.DS_Store -build/ -google-services.json - -# Android Studio -.idea -*.iml diff --git a/dynamiclinks/README.md b/dynamiclinks/README.md index f7223fd50c..ef7cb88371 100644 --- a/dynamiclinks/README.md +++ b/dynamiclinks/README.md @@ -6,54 +6,3 @@ Firebase Dynamic Links Quickstart > > Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance. -Introduction ------------- - -- [Read more about Firebase Dynamic Links](https://firebase.google.com/docs/dynamic-links) - -Getting Started ---------------- - -- [Add Firebase to your Android Project](https://firebase.google.com/docs/android/setup). -- Follow the [quickstart guide](https://firebase.google.com/docs/android/setup) to set up your project. -- Configure the sample: - - Replace the `app_code` value in `app/build.gradle` with your personal - [app code](https://firebase.google.com/docs/dynamic-links/android/create#set-up-firebase-and-the-dynamic-links-sdk). - - Replace the **applicationId** in `app/build.gradle` with the package name that matches your app code. -- Run the sample on your Android device or emulator. -- Using the sample: - - When the application is started, a deep link will be generated using your app code. - - Click **Share** - to share this deep link to another application. - - The application checks if it was launched from a deep link. If so, the link data will be displayed under the **Receive** heading. - - Try sharing the deep link from the application and use that deep link to re-launch the application. - -Result ------------ - - -Support -------- - -- [Stack Overflow](https://stackoverflow.com/questions/tagged/firebase-dynamic-links) -- [Firebase Support](https://firebase.google.com/support/) - -License -------- - -Copyright 2016 Google, Inc. - -Licensed to the Apache Software Foundation (ASF) under one or more contributor -license agreements. See the NOTICE file distributed with this work for -additional information regarding copyright ownership. The ASF licenses this -file to you 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/dynamiclinks/app/.gitignore b/dynamiclinks/app/.gitignore deleted file mode 100644 index 796b96d1c4..0000000000 --- a/dynamiclinks/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/dynamiclinks/app/build.gradle.kts b/dynamiclinks/app/build.gradle.kts deleted file mode 100644 index 75308067f9..0000000000 --- a/dynamiclinks/app/build.gradle.kts +++ /dev/null @@ -1,78 +0,0 @@ -import com.android.build.gradle.internal.tasks.factory.dependsOn - -plugins { - id("com.android.application") - id("kotlin-android") - id("com.google.gms.google-services") -} - -tasks { - check.dependsOn("assembleMainFlavorDebugAndroidTest") -} - -android { - namespace = "com.google.firebase.quickstart.deeplinks" - compileSdk = 36 - - defaultConfig { - applicationId = "com.google.firebase.quickstart.deeplinks" - minSdk = 21 - targetSdk = 36 - versionCode = 1 - versionName = "1.0" - multiDexEnabled = true - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } - } - - flavorDimensions += "all" - - productFlavors { - create("mainFlavor") { - dimension = "all" - - // TODO(developer): Replace this with your Dynamic Links URI prefix - // See: https://firebase.google.com/docs/dynamic-links/android/create#set-up-firebase-and-the-dynamic-links-sdk - resValue("string", "dynamic_links_uri_prefix", "https://YOUR_APP.page.link") - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = "17" - } - - buildFeatures { - viewBinding = true - } -} - -dependencies { - implementation(project(":internal:lintchecks")) - implementation(project(":internal:chooserx")) - - implementation("com.google.android.material:material:1.12.0") - - // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:33.16.0")) - - // Firebase Dynamic Links - implementation("com.google.firebase:firebase-dynamic-links") - - // For an optimal experience using Dynamic Links, add the Firebase SDK - // for Google Analytics. This is recommended, but not required. - implementation("com.google.firebase:firebase-analytics") - - androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") - androidTestImplementation("androidx.test:rules:1.6.1") - androidTestImplementation("androidx.test:runner:1.6.2") - androidTestImplementation("androidx.test.ext:junit:1.2.1") -} diff --git a/dynamiclinks/app/proguard-rules.pro b/dynamiclinks/app/proguard-rules.pro deleted file mode 100644 index 58708ab1fa..0000000000 --- a/dynamiclinks/app/proguard-rules.pro +++ /dev/null @@ -1,20 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle.kts. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - --keepattributes EnclosingMethod --keepattributes InnerClasses diff --git a/dynamiclinks/app/src/androidTest/java/com/google/firebase/quickstart/deeplinks/MainActivityTest.java b/dynamiclinks/app/src/androidTest/java/com/google/firebase/quickstart/deeplinks/MainActivityTest.java deleted file mode 100644 index 7304ddd76f..0000000000 --- a/dynamiclinks/app/src/androidTest/java/com/google/firebase/quickstart/deeplinks/MainActivityTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.google.firebase.quickstart.deeplinks; - - -import android.content.Intent; -import android.net.Uri; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.rule.ActivityTestRule; - -import com.google.firebase.quickstart.deeplinks.java.MainActivity; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.containsString; - -/** - * NOTE: This test will fail if R.string.app_code is not set in the build.gradle file - */ -@RunWith(AndroidJUnit4.class) -public class MainActivityTest { - - @Rule - public ActivityTestRule rule = new ActivityTestRule<>( - MainActivity.class); - - @Test - public void testDeepLinkReceive() { - // Build a deep link - Uri linkUri = Uri.parse("https://example.com/12345"); - Uri uri = rule.getActivity().buildDeepLink(linkUri, 0); - - // Launch an intent to view the deep link - Intent intent = new Intent() - .setAction(Intent.ACTION_VIEW) - .setClass(rule.getActivity().getApplicationContext(), MainActivity.class) - .setData(uri); - rule.getActivity().startActivity(intent); - - // Confirm the deep link content is displayed - onView(withId(R.id.linkViewReceive)) - .check(matches(allOf( - withText(containsString(linkUri.toString())), - isDisplayed()))); - } - -} diff --git a/dynamiclinks/app/src/main/AndroidManifest.xml b/dynamiclinks/app/src/main/AndroidManifest.xml deleted file mode 100644 index 615a7f5e9b..0000000000 --- a/dynamiclinks/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/EntryChoiceActivity.kt b/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/EntryChoiceActivity.kt deleted file mode 100644 index 535651215f..0000000000 --- a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/EntryChoiceActivity.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.google.firebase.quickstart.deeplinks - -import android.content.Intent -import com.firebase.example.internal.BaseEntryChoiceActivity -import com.firebase.example.internal.Choice - -class EntryChoiceActivity : BaseEntryChoiceActivity() { - - override fun getChoices(): List { - return listOf( - Choice( - "Java", - "Run the Firebase Dynamic Links quickstart written in Java.", - Intent(this, com.google.firebase.quickstart.deeplinks.java.MainActivity::class.java), - ), - Choice( - "Kotlin", - "Run the Firebase Dynamic Links quickstart written in Kotlin.", - Intent(this, com.google.firebase.quickstart.deeplinks.kotlin.MainActivity::class.java), - ), - ) - } -} diff --git a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/java/MainActivity.java b/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/java/MainActivity.java deleted file mode 100644 index bde97fc687..0000000000 --- a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/java/MainActivity.java +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Copyright 2016 Google Inc. All Rights Reserved. - * - * 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.firebase.quickstart.deeplinks.java; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.widget.Button; -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.android.material.snackbar.Snackbar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import android.util.Log; -import android.view.View; -import android.widget.TextView; - -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.dynamiclinks.DynamicLink; -import com.google.firebase.dynamiclinks.DynamicLink.AndroidParameters; -import com.google.firebase.dynamiclinks.FirebaseDynamicLinks; -import com.google.firebase.dynamiclinks.PendingDynamicLinkData; -import com.google.firebase.dynamiclinks.ShortDynamicLink; -import com.google.firebase.quickstart.deeplinks.R; -import com.google.firebase.quickstart.deeplinks.databinding.ActivityMainBinding; - -public class MainActivity extends AppCompatActivity { - - private static final String TAG = "MainActivity"; - private static final String DEEP_LINK_URL = "https://example.com/deeplinks"; - - // [START on_create] - @Override - protected void onCreate(Bundle savedInstanceState) { - // [START_EXCLUDE] - super.onCreate(savedInstanceState); - ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - TextView linkSendTextView = binding.linkViewSend; - final TextView linkReceiveTextView = binding.linkViewReceive; - - // Validate that the developer has set the app code. - validateAppCode(); - - // Create a deep link and display it in the UI - final Uri deepLink = buildDeepLink(Uri.parse(DEEP_LINK_URL), 0); - linkSendTextView.setText(deepLink.toString()); - - // Share button click listener - binding.buttonShare.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - shareDeepLink(deepLink.toString()); - } - }); - - // create a short link and display it in the UI - binding.buttonShareShortLink.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - TextView shortLinkTextView = findViewById(R.id.shortLinkViewSend); - String shortDynamicLink = shortLinkTextView.getText().toString(); - shareDeepLink(shortDynamicLink); - } - }); - - binding.buttonGenerateShortLink.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Uri deepLink = Uri.parse(DEEP_LINK_URL); - buildShortLinkFromParams(deepLink, 0); - } - }); - // [END_EXCLUDE] - - // [START get_deep_link] - FirebaseDynamicLinks.getInstance() - .getDynamicLink(getIntent()) - .addOnSuccessListener(this, new OnSuccessListener() { - @Override - public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { - // Get deep link from result (may be null if no link is found) - Uri deepLink = null; - if (pendingDynamicLinkData != null) { - deepLink = pendingDynamicLinkData.getLink(); - } - - - // Handle the deep link. For example, open the linked - // content, or apply promotional credit to the user's - // account. - // ... - - // [START_EXCLUDE] - // Display deep link in the UI - if (deepLink != null) { - Snackbar.make(findViewById(android.R.id.content), - "Found deep link!", Snackbar.LENGTH_LONG).show(); - - linkReceiveTextView.setText(deepLink.toString()); - } else { - Log.d(TAG, "getDynamicLink: no link found"); - } - // [END_EXCLUDE] - } - }) - .addOnFailureListener(this, new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - Log.w(TAG, "getDynamicLink:onFailure", e); - } - }); - // [END get_deep_link] - } - // [END on_create] - - /** - * Build a Firebase Dynamic Link. - * https://firebase.google.com/docs/dynamic-links/android/create#create-a-dynamic-link-from-parameters - * - * @param deepLink the deep link your app will open. This link must be a valid URL and use the - * HTTP or HTTPS scheme. - * @param minVersion the {@code versionCode} of the minimum version of your app that can open - * the deep link. If the installed app is an older version, the user is taken - * to the Play store to upgrade the app. Pass 0 if you do not - * require a minimum version. - * @return a {@link Uri} representing a properly formed deep link. - */ - @VisibleForTesting - public Uri buildDeepLink(@NonNull Uri deepLink, int minVersion) { - String uriPrefix = getString(R.string.dynamic_links_uri_prefix); - - // Set dynamic link parameters: - // * URI prefix (required) - // * Android Parameters (required) - // * Deep link - // [START build_dynamic_link] - DynamicLink.Builder builder = FirebaseDynamicLinks.getInstance() - .createDynamicLink() - .setDomainUriPrefix(uriPrefix) - .setAndroidParameters(new DynamicLink.AndroidParameters.Builder() - .setMinimumVersion(minVersion) - .build()) - .setLink(deepLink); - - // Build the dynamic link - DynamicLink link = builder.buildDynamicLink(); - // [END build_dynamic_link] - - // Return the dynamic link as a URI - return link.getUri(); - } - - private void shareDeepLink(String deepLink) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_SUBJECT, "Firebase Deep Link"); - intent.putExtra(Intent.EXTRA_TEXT,deepLink); - - startActivity(intent); - } - - private void validateAppCode() { - String uriPrefix = getString(R.string.dynamic_links_uri_prefix); - if (uriPrefix.contains("YOUR_APP")) { - new AlertDialog.Builder(this) - .setTitle("Invalid Configuration") - .setMessage("Please set your Dynamic Links domain in app/build.gradle") - .setPositiveButton(android.R.string.ok, null) - .create().show(); - } - } - - public void generateShortLink() { - Uri deepLink = Uri.parse(DEEP_LINK_URL); - buildShortLinkFromParams(deepLink, 0); - } - - @VisibleForTesting - public void buildShortLinkFromParams(@NonNull Uri deepLink, int minVersion) { - String uriPrefix = getString(R.string.dynamic_links_uri_prefix); - - // Set dynamic link parameters: - // * URI prefix (required) - // * Android Parameters (required) - // * Deep link - FirebaseDynamicLinks.getInstance() - .createDynamicLink() - .setDomainUriPrefix(uriPrefix) - .setAndroidParameters( - new AndroidParameters.Builder() - .setMinimumVersion(minVersion) - .build()) - .setLink(deepLink) - .buildShortDynamicLink() - .addOnCompleteListener(this, new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - // Short link created - Uri shortDynamicLink = task.getResult().getShortLink(); - TextView shortLinkTextView = findViewById(R.id.shortLinkViewSend); - shortLinkTextView.setText(shortDynamicLink.toString()); - } else { - // Error - Log.e(TAG, task.getException().getMessage()); - } - } - }); - } -} diff --git a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/kotlin/MainActivity.kt b/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/kotlin/MainActivity.kt deleted file mode 100644 index e3f48ce6e9..0000000000 --- a/dynamiclinks/app/src/main/java/com/google/firebase/quickstart/deeplinks/kotlin/MainActivity.kt +++ /dev/null @@ -1,173 +0,0 @@ -package com.google.firebase.quickstart.deeplinks.kotlin - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import android.widget.TextView -import androidx.annotation.VisibleForTesting -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.snackbar.Snackbar -import com.google.firebase.dynamiclinks.PendingDynamicLinkData -import com.google.firebase.dynamiclinks.androidParameters -import com.google.firebase.dynamiclinks.component1 -import com.google.firebase.dynamiclinks.component2 -import com.google.firebase.dynamiclinks.dynamicLink -import com.google.firebase.dynamiclinks.dynamicLinks -import com.google.firebase.dynamiclinks.shortLinkAsync -import com.google.firebase.Firebase -import com.google.firebase.quickstart.deeplinks.R -import com.google.firebase.quickstart.deeplinks.databinding.ActivityMainBinding - -class MainActivity : AppCompatActivity() { - // [START on_create] - override fun onCreate(savedInstanceState: Bundle?) { - // [START_EXCLUDE] - super.onCreate(savedInstanceState) - val binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - val linkSendTextView = binding.linkViewSend - val linkReceiveTextView = binding.linkViewReceive - - // Validate that the developer has set the app code. - validateAppCode() - - // Create a deep link and display it in the UI - val newDeepLink = buildDeepLink(Uri.parse(DEEP_LINK_URL), 0) - linkSendTextView.text = newDeepLink.toString() - - // Share button click listener - binding.buttonShare.setOnClickListener { shareDeepLink(newDeepLink.toString()) } - // [END_EXCLUDE] - - binding.buttonShareShortLink.setOnClickListener { - val shortLinkTextView = findViewById(R.id.shortLinkViewSend) - val shortDynamicLink = shortLinkTextView.text - shareDeepLink(shortDynamicLink.toString()) - } - - binding.buttonGenerateShortLink.setOnClickListener { - val deepLink = Uri.parse(DEEP_LINK_URL) - buildShortLinkFromParams(deepLink, 0) - } - - // [START get_deep_link] - Firebase.dynamicLinks - .getDynamicLink(intent) - .addOnSuccessListener(this) { pendingDynamicLinkData: PendingDynamicLinkData? -> - // Get deep link from result (may be null if no link is found) - var deepLink: Uri? = null - if (pendingDynamicLinkData != null) { - deepLink = pendingDynamicLinkData.link - } - - // Handle the deep link. For example, open the linked - // content, or apply promotional credit to the user's - // account. - // ... - - // [START_EXCLUDE] - // Display deep link in the UI - if (deepLink != null) { - Snackbar.make( - findViewById(android.R.id.content), - "Found deep link!", - Snackbar.LENGTH_LONG, - ).show() - - linkReceiveTextView.text = deepLink.toString() - } else { - Log.d(TAG, "getDynamicLink: no link found") - } - // [END_EXCLUDE] - } - .addOnFailureListener(this) { e -> Log.w(TAG, "getDynamicLink:onFailure", e) } - // [END get_deep_link] - } - // [END on_create] - - /** - * Build a Firebase Dynamic Link. - * https://firebase.google.com/docs/dynamic-links/android/create#create-a-dynamic-link-from-parameters - * - * @param deepLink the deep link your app will open. This link must be a valid URL and use the - * HTTP or HTTPS scheme. - * @param minVersion the `versionCode` of the minimum version of your app that can open - * the deep link. If the installed app is an older version, the user is taken - * to the Play store to upgrade the app. Pass 0 if you do not - * require a minimum version. - * @return a [Uri] representing a properly formed deep link. - */ - @VisibleForTesting - fun buildDeepLink(deepLink: Uri, minVersion: Int): Uri { - val uriPrefix = getString(R.string.dynamic_links_uri_prefix) - - // Set dynamic link parameters: - // * URI prefix (required) - // * Android Parameters (required) - // * Deep link - // [START build_dynamic_link] - // Build the dynamic link - val link = Firebase.dynamicLinks.dynamicLink { - domainUriPrefix = uriPrefix - androidParameters { - minimumVersion = minVersion - } - link = deepLink - } - // [END build_dynamic_link] - - // Return the dynamic link as a URI - return link.uri - } - - @VisibleForTesting - fun buildShortLinkFromParams(deepLink: Uri, minVersion: Int) { - val uriPrefix = getString(R.string.dynamic_links_uri_prefix) - - // Set dynamic link parameters: - // * URI prefix (required) - // * Android Parameters (required) - // * Deep link - Firebase.dynamicLinks.shortLinkAsync { - link = deepLink - domainUriPrefix = uriPrefix - androidParameters { - minimumVersion = minVersion - } - }.addOnSuccessListener { (shortLink, flowchartLink) -> - val shortLinkTextView = findViewById(R.id.shortLinkViewSend) - shortLinkTextView.text = shortLink.toString() - }.addOnFailureListener(this) { e -> - Log.e(TAG, e.toString()) - } - } - - private fun shareDeepLink(deepLink: String) { - val intent = Intent(Intent.ACTION_SEND) - intent.type = "text/plain" - intent.putExtra(Intent.EXTRA_SUBJECT, "Firebase Deep Link") - intent.putExtra(Intent.EXTRA_TEXT, deepLink) - - startActivity(intent) - } - - private fun validateAppCode() { - val uriPrefix = getString(R.string.dynamic_links_uri_prefix) - if (uriPrefix.contains("YOUR_APP")) { - AlertDialog.Builder(this) - .setTitle("Invalid Configuration") - .setMessage("Please set your Dynamic Links domain in app/build.gradle") - .setPositiveButton(android.R.string.ok, null) - .create().show() - } - } - - companion object { - - private const val TAG = "MainActivity" - private const val DEEP_LINK_URL = "https://kotlin.example.com/deeplinks" - } -} diff --git a/dynamiclinks/app/src/main/res/drawable-hdpi/firebase_lockup_400.png b/dynamiclinks/app/src/main/res/drawable-hdpi/firebase_lockup_400.png deleted file mode 100644 index 2eb21fecd1..0000000000 Binary files a/dynamiclinks/app/src/main/res/drawable-hdpi/firebase_lockup_400.png and /dev/null differ diff --git a/dynamiclinks/app/src/main/res/drawable-mdpi/firebase_lockup_400.png b/dynamiclinks/app/src/main/res/drawable-mdpi/firebase_lockup_400.png deleted file mode 100644 index ffed5b1825..0000000000 Binary files a/dynamiclinks/app/src/main/res/drawable-mdpi/firebase_lockup_400.png and /dev/null differ diff --git a/dynamiclinks/app/src/main/res/drawable-xhdpi/firebase_lockup_400.png b/dynamiclinks/app/src/main/res/drawable-xhdpi/firebase_lockup_400.png deleted file mode 100644 index 78a4a2780f..0000000000 Binary files a/dynamiclinks/app/src/main/res/drawable-xhdpi/firebase_lockup_400.png and /dev/null differ diff --git a/dynamiclinks/app/src/main/res/drawable-xxhdpi/firebase_lockup_400.png b/dynamiclinks/app/src/main/res/drawable-xxhdpi/firebase_lockup_400.png deleted file mode 100644 index 4380835f6a..0000000000 Binary files a/dynamiclinks/app/src/main/res/drawable-xxhdpi/firebase_lockup_400.png and /dev/null differ diff --git a/dynamiclinks/app/src/main/res/layout/activity_main.xml b/dynamiclinks/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b5e0094841..0000000000 --- a/dynamiclinks/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - -