From 1d5800b4f89003f72c7f3481cb74fa505a587f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 14:53:14 +0200 Subject: [PATCH 01/11] feat: add navigation flavor to demo for SDK 7.x reproduction --- demo/build.gradle.kts | 18 ++++++++++- .../android/utils/demo/BaseDemoActivity.java | 29 +++++++++-------- .../utils/demo/MapFragmentProvider.java | 31 +++++++++++++++++++ .../utils/demo/MapFragmentProvider.java | 31 +++++++++++++++++++ gradle/libs.versions.toml | 2 ++ 5 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java create mode 100644 demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 8148ff11c..2e325d742 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -60,13 +60,29 @@ android { } namespace = "com.google.maps.android.utils.demo" + + flavorDimensions += "sdk" + productFlavors { + create("standard") { + dimension = "sdk" + } + create("navigation") { + dimension = "sdk" + minSdk = 24 // Navigation SDK 7.x requires API 24+ + } + } } // [START maps_android_utils_install_snippet] dependencies { // [START_EXCLUDE silent] - implementation(project(":library")) + "standardImplementation"(project(":library")) + "navigationImplementation"(project(":library")) { + exclude(group = "com.google.android.gms", module = "play-services-maps") + } + "navigationImplementation"(libs.navigation.sdk) + implementation(libs.appcompat) implementation(libs.lifecycle.extensions) implementation(libs.lifecycle.viewmodel.ktx) diff --git a/demo/src/main/java/com/google/maps/android/utils/demo/BaseDemoActivity.java b/demo/src/main/java/com/google/maps/android/utils/demo/BaseDemoActivity.java index 079eca2a6..228493d71 100644 --- a/demo/src/main/java/com/google/maps/android/utils/demo/BaseDemoActivity.java +++ b/demo/src/main/java/com/google/maps/android/utils/demo/BaseDemoActivity.java @@ -23,12 +23,12 @@ import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMapOptions; import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.SupportMapFragment; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; @@ -97,19 +97,16 @@ private void setUpMap(Bundle savedInstanceState) { // 2. Call the getMapId() method String mapId = app.getMapId(); - // Create a new SupportMapFragment instance - SupportMapFragment mapFragment; - - if (mapId == null) { - mapFragment = SupportMapFragment.newInstance(); - } else { - // Create the map options - GoogleMapOptions mapOptions = new GoogleMapOptions(); + // Create the map options + GoogleMapOptions mapOptions = null; + if (mapId != null) { + mapOptions = new GoogleMapOptions(); mapOptions.mapId(mapId); - // Create a new SupportMapFragment instance - mapFragment = SupportMapFragment.newInstance(mapOptions); } + // Use the provider to get the correct fragment for the current flavor + Fragment mapFragment = MapFragmentProvider.getFragment(mapOptions); + // Add the fragment to the container (R.id.map) // Check savedInstanceState to prevent re-adding on rotation if (savedInstanceState == null) { @@ -119,8 +116,14 @@ private void setUpMap(Bundle savedInstanceState) { .commit(); } - // Get the map - mapFragment.getMapAsync(this); + // Get the map asynchronously. We use reflection because the fragment type + // depends on the build flavor (SupportMapFragment or SupportNavigationFragment). + try { + mapFragment.getClass().getMethod("getMapAsync", OnMapReadyCallback.class) + .invoke(mapFragment, this); + } catch (Exception e) { + e.printStackTrace(); + } } /** diff --git a/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java b/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java new file mode 100644 index 000000000..03db9cb54 --- /dev/null +++ b/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.maps.android.utils.demo; + +import androidx.fragment.app.Fragment; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.libraries.navigation.SupportNavigationFragment; + +public class MapFragmentProvider { + public static Fragment getFragment(GoogleMapOptions options) { + if (options == null) { + return SupportNavigationFragment.newInstance(); + } else { + return SupportNavigationFragment.newInstance(options); + } + } +} diff --git a/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java b/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java new file mode 100644 index 000000000..3f123ba3b --- /dev/null +++ b/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.maps.android.utils.demo; + +import androidx.fragment.app.Fragment; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.gms.maps.SupportMapFragment; + +public class MapFragmentProvider { + public static Fragment getFragment(GoogleMapOptions options) { + if (options == null) { + return SupportMapFragment.newInstance(); + } else { + return SupportMapFragment.newInstance(options); + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index be822d6ae..119f1696a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,6 +30,7 @@ compose-bom = "2026.02.00" # --- Google Services (Maps) --- # Versions for Google Play Services libraries essential for map functionality. play-services-maps = "20.0.0" +navigation-sdk = "7.4.0" # --- Testing --- # Versions for unit and instrumented testing libraries. @@ -84,6 +85,7 @@ material-icons-core = { group = "androidx.compose.material", name = "material-ic # --- Google Services (Maps) --- # Key libraries for integrating Google Maps and related services. play-services-maps = { module = "com.google.android.gms:play-services-maps", version.ref = "play-services-maps" } +navigation-sdk = { module = "com.google.android.libraries.navigation:navigation", version.ref = "navigation-sdk" } # --- Testing --- # Tools for running implementation validation and user interface tests. From b54c8a745a1ae52593339cafc8d000aea6024e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 15:21:14 +0200 Subject: [PATCH 02/11] docs: header --- .../com/google/maps/android/utils/demo/MapFragmentProvider.java | 2 +- .../com/google/maps/android/utils/demo/MapFragmentProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java b/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java index 03db9cb54..e860541d5 100644 --- a/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java +++ b/demo/src/navigation/java/com/google/maps/android/utils/demo/MapFragmentProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java b/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java index 3f123ba3b..5f133da80 100644 --- a/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java +++ b/demo/src/standard/java/com/google/maps/android/utils/demo/MapFragmentProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From da06b71a1984652d8cd4305018b690e4c5409385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 15:25:17 +0200 Subject: [PATCH 03/11] fix: enable core library desugaring for navigation flavor --- demo/build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 2e325d742..ae05cc9b8 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -52,6 +52,12 @@ android { compose = true } + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) @@ -75,6 +81,7 @@ android { // [START maps_android_utils_install_snippet] dependencies { + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.3") // [START_EXCLUDE silent] "standardImplementation"(project(":library")) "navigationImplementation"(project(":library")) { From 874117913c8f8bb73205ca12431c9b460687f7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 15:34:56 +0200 Subject: [PATCH 04/11] fix: move GMS version meta-data to standard flavor manifest --- demo/src/main/AndroidManifest.xml | 4 ---- demo/src/standard/AndroidManifest.xml | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 demo/src/standard/AndroidManifest.xml diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 5b9ce9fa9..5b43e03f7 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -42,10 +42,6 @@ android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - - + + + + + From 243e6bf745557a4efe569b2e571aaa80de139ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 15:36:57 +0200 Subject: [PATCH 05/11] docs: header --- demo/src/standard/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/src/standard/AndroidManifest.xml b/demo/src/standard/AndroidManifest.xml index 9a5c3599a..a21a476de 100644 --- a/demo/src/standard/AndroidManifest.xml +++ b/demo/src/standard/AndroidManifest.xml @@ -1,6 +1,6 @@ - - Date: Thu, 23 Apr 2026 15:54:54 +0200 Subject: [PATCH 07/11] fix: update CI SARIF paths after adding flavors --- .github/workflows/lint-report.yml | 2 +- demo/build.gradle.kts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/lint-report.yml b/.github/workflows/lint-report.yml index 5f6938051..14653d538 100644 --- a/.github/workflows/lint-report.yml +++ b/.github/workflows/lint-report.yml @@ -48,5 +48,5 @@ jobs: - name: Upload SARIF for demo uses: github/codeql-action/upload-sarif@v3 with: - sarif_file: demo/build/reports/lint-results-debug.sarif + sarif_file: demo/build/reports/lint-results-standardDebug.sarif category: demo diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index ae05cc9b8..0cffb2c7e 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -25,7 +25,6 @@ plugins { android { lint { - sarifOutput = layout.buildDirectory.file("reports/lint-results.sarif").get().asFile } defaultConfig { From cff516b074e587d8cf3d485b424cd4c3b171baee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 16:23:19 +0200 Subject: [PATCH 08/11] fix: explicit lint tasks and default flavor to resolve CI paths --- .github/workflows/lint-report.yml | 2 +- demo/build.gradle.kts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint-report.yml b/.github/workflows/lint-report.yml index 14653d538..44d15b064 100644 --- a/.github/workflows/lint-report.yml +++ b/.github/workflows/lint-report.yml @@ -37,7 +37,7 @@ jobs: uses: gradle/actions/setup-gradle@v4 - name: Run Android Lint - run: ./gradlew lint + run: ./gradlew :library:lintDebug :demo:lintStandardDebug - name: Upload SARIF for library uses: github/codeql-action/upload-sarif@v3 diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 0cffb2c7e..004c15bad 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -70,6 +70,7 @@ android { productFlavors { create("standard") { dimension = "sdk" + isDefault = true } create("navigation") { dimension = "sdk" From ee8f424ddc322cc31743e5efd8a6a6b4be0ad164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 17:18:48 +0200 Subject: [PATCH 09/11] fix: use consistent lint-results.sarif paths in CI --- .github/workflows/lint-report.yml | 4 ++-- demo/build.gradle.kts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint-report.yml b/.github/workflows/lint-report.yml index 44d15b064..da812752e 100644 --- a/.github/workflows/lint-report.yml +++ b/.github/workflows/lint-report.yml @@ -42,11 +42,11 @@ jobs: - name: Upload SARIF for library uses: github/codeql-action/upload-sarif@v3 with: - sarif_file: library/build/reports/lint-results-debug.sarif + sarif_file: library/build/reports/lint-results.sarif category: library - name: Upload SARIF for demo uses: github/codeql-action/upload-sarif@v3 with: - sarif_file: demo/build/reports/lint-results-standardDebug.sarif + sarif_file: demo/build/reports/lint-results.sarif category: demo diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 004c15bad..f40a98365 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -25,6 +25,7 @@ plugins { android { lint { + sarifOutput = layout.buildDirectory.file("reports/lint-results.sarif").get().asFile } defaultConfig { From 13fa76d1aabfa3c03eb6d323728ae7326c3ee6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 17:33:52 +0200 Subject: [PATCH 10/11] fix: update navigation SDK and use version catalog for desugaring --- demo/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index f40a98365..62eea31a0 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -82,7 +82,7 @@ android { // [START maps_android_utils_install_snippet] dependencies { - coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.3") + coreLibraryDesugaring(libs.desugar.jdk.libs) // [START_EXCLUDE silent] "standardImplementation"(project(":library")) "navigationImplementation"(project(":library")) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 119f1696a..1c476424d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,8 @@ compose-bom = "2026.02.00" # --- Google Services (Maps) --- # Versions for Google Play Services libraries essential for map functionality. play-services-maps = "20.0.0" -navigation-sdk = "7.4.0" +navigation-sdk = "7.6.0" +desugar-jdk-libs = "2.0.3" # --- Testing --- # Versions for unit and instrumented testing libraries. @@ -86,6 +87,7 @@ material-icons-core = { group = "androidx.compose.material", name = "material-ic # Key libraries for integrating Google Maps and related services. play-services-maps = { module = "com.google.android.gms:play-services-maps", version.ref = "play-services-maps" } navigation-sdk = { module = "com.google.android.libraries.navigation:navigation", version.ref = "navigation-sdk" } +desugar-jdk-libs = { module = "com.android.tools:desugar_jdk_libs_nio", version.ref = "desugar-jdk-libs" } # --- Testing --- # Tools for running implementation validation and user interface tests. From 4f0df46b5ca76e07d0d42971b85155879e9e924c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Thu, 23 Apr 2026 18:21:59 +0200 Subject: [PATCH 11/11] fix: update desugar-jdk-libs to 2.1.5 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1c476424d..1f8b6319d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,7 +31,7 @@ compose-bom = "2026.02.00" # Versions for Google Play Services libraries essential for map functionality. play-services-maps = "20.0.0" navigation-sdk = "7.6.0" -desugar-jdk-libs = "2.0.3" +desugar-jdk-libs = "2.1.5" # --- Testing --- # Versions for unit and instrumented testing libraries.