* feat(test): Add tests and refactor demos to use ViewBinding
This commit introduces a suite of Espresso tests for several demo activities and refactors numerous activities to use ViewBinding, eliminating `findViewById` and `onClick` XML attributes.
- **Testing Infrastructure:**
- Adds `MapIdlingResource` for both Java and Kotlin test sources to synchronize Espresso tests with map camera movements, preventing flaky tests.
- Introduces custom Truth subjects (`LatLngSubject`, `LatLngBoundsSubject`) for more readable and precise assertions on map-related objects, with built-in tolerance for floating-point comparisons.
- Adds new dependencies for testing: `espresso-idling-resource`, `truth`, and `uiautomator`.
- Increases Gradle daemon heap size to support test execution.
- **New Espresso Tests:**
- Adds comprehensive tests for `GroundOverlayDemoActivity`, `CameraClampingDemoActivity`, `IndoorDemoActivity`, `CameraDemoActivity`, and `VisibleRegionDemoActivity` in both Java and Kotlin modules.
- Tests verify UI interactions, camera behavior, and state changes within the demo activities.
- **Code Refactoring:**
- Enables ViewBinding in the `java-app`, `kotlin-app`, and `common-ui` modules.
- Refactors all major demo activities (e.g., `GroundOverlayDemoActivity`, `MarkerDemoActivity`, `CircleDemoActivity`, `UiSettingsDemoActivity`) to use ViewBinding.
- Replaces `android:onClick` XML attributes with programmatic `setOnClickListener` calls, improving code organization and maintainability.
- Enhances Javadoc and KDoc in `GroundOverlayDemoActivity` to better explain the concepts and implementation details, improving its educational value.
* feat(androidTest): Refactor GroundOverlayDemoActivityTest and add MapProvider
Refactors the GroundOverlayDemoActivityTest to improve reliability and readability. This commit introduces a `MapProvider` interface and a base `MapDemoActivityTest` class to abstract away common map initialization logic.
Key changes include:
- Add a `MapProvider` interface to ensure activities provide a `GoogleMap` object.
- Create an abstract `MapDemoActivityTest` to handle common test setup, including map initialization and idling resources (WIP).
- Update `GroundOverlayDemoActivityTest` to extend `MapDemoActivityTest`, simplifying its setup logic.
- Replace `Thread.sleep()` calls with `idlingResource.waitForIdle()`.
- Update `GroundOverlayDemoActivity` to use `lateinit` for overlays, preventing nullable types.
- Add `maps-utils-ktx` dependency for idiomatic spherical offset calculations.
* fix(test): Improve CircleDemoActivityTest readability and precision
Enhances the `testLongClickAddsNewCircle` in `CircleDemoActivityTest` by adding
detailed comments that explain the test's flow and the critical reason for
camera movements: to minimize precision loss during LatLng to screen coordinate
conversion for accurate click event simulation.
This commit also includes the necessary `LatLngSubject` extension, introducing
a `isWith(tolerance).of(target)` assertion. This new assertion allows for
more precise and readable verification of spherical distances between `LatLng`
objects, directly supporting the improved test logic in `CircleDemoActivityTest`.
* feat(java): Align CircleDemoActivity and tests with Kotlin version
* refactor(test): Extend MapDemoActivityTest and improve synchronization
Refactors the java version of `GroundOverlayDemoActivityTest` to extend the common `MapDemoActivityTest` base class. This change centralizes test setup, teardown, and map interaction logic, removing redundant code and improving maintainability.
- `GroundOverlayDemoActivity` now implements the `MapProvider` interface to correctly expose the map instance and its ready state to the test framework.
- Replaces `Thread.sleep()` calls in `CircleDemoActivityTest` and `GroundOverlayDemoActivityTest` with `idlingResource.waitForIdle()`. This creates more reliable tests by waiting for map events to complete rather than using fixed delays.
- Adds a `waitForIdle(long)` overload to `MapIdlingResource` to handle cases requiring a brief, controlled pause after the map has settled.
* chore: fix missing copyright headers
* refactor(kotlin): Address lint warnings
This commit applies several small refactorings to the Kotlin demo activities, focusing on code modernization and resolving lint issues.
- In `MarkerDemoActivity`, replaces `Math.max()` with the more idiomatic Kotlin function `coerceAtLeast()`.
- Simplifies trigonometric function calls by using top-level `sin` and `cos` from the Kotlin standard library instead of `Math`.
- Removes unused imports from `MarkerDemoActivity`.
- In `LayersDemoActivity`, adds `@SuppressLint("MissingPermission")` to the `onMyLocationToggled` method to address a lint warning.
* refactor(ui): Use android:name for FragmentContainerView
This commit updates the layout files to use the `android:name` attribute instead of the `class` attribute for `FragmentContainerView` to declare the fragment class. This is the modern, recommended practice.
It also removes minor whitespace and `onClick` attributes that are no longer necessary.
- Replaces the `class` attribute with `android:name` for all instances of `SupportMapFragment` and `SupportStreetViewPanoramaFragment` within `FragmentContainerView` tags across multiple demo layouts.
- Removes unnecessary `onClick` attributes from checkboxes in `layers_demo.xml`.
- Cleans up minor whitespace in `camera_clamping_demo.xml`, `street_view_panorama_navigation_demo.xml`, `indoor_demo.xml`, and `ground_overlay_demo.xml`.
Updates the Advanced Markers demo to programmatically initialize the map when a custom Map ID is not provided in the string resources. This ensures that a valid Map ID from the secrets file is always used, which is a requirement for Advanced Markers to function correctly.
This change includes:
- Adding detailed comments to both the Java and Kotlin versions of the activity to explain the Map ID loading logic.
- Implementing a fallback mechanism to create the `SupportMapFragment` with a `GoogleMapOptions` object that explicitly sets the Map ID.
* refactor: Centralize SDK versions in libs.versions.toml
Moved compileSdk, minSdk, and targetSdk to libs.versions.toml for ApiDemos and snippets projects to ensure consistency and ease of maintenance.
fix: Corrected top bar layout in Kotlin Advanced Markers demo
The Kotlin version of the Advanced Markers demo was missing a call to applyInsets, causing the top bar to overlap with the system UI. This has been corrected to match the behavior of the Java version.
* refactor: Modernize Gradle scripts and update dependencies
This commit refactors the Gradle build scripts for all snippet modules to align with modern Android development practices.
Key changes include:
- Migrating all plugin and dependency declarations to use the version catalog (`libs.versions.toml`).
- Replacing `id("...")` with `alias(libs.plugins...)` for applying plugins.
- Updating numerous library versions, including AGP, Kotlin, and various Jetpack and Google Maps libraries.
- Setting a `namespace` in all module-level `build.gradle.kts` files.
- Enabling Compose and setting the Java toolchain to version 21 across all modules.
- Enabling minification for release builds.
- Removing the legacy `buildscript` block from the root `build.gradle.kts`.
* refactor: removed coreKtx
* refactor: fix build
* refactor: fix build
* refactor: Remove unused Compose configuration from snippet modules
Removed the Jetpack Compose plugin and `compose = true` build feature from all snippet modules as it was not being used.
fix: Update maps-utils snippets
Corrected several issues in the `app-utils` Java snippets:
- Replaced the deprecated `setWeightedData` method with `updateData` in the Heatmaps demo.
- Initialized an empty list in the Heatmaps demo to prevent a potential NullPointerException.
- Added missing R class imports.
---------
Co-authored-by: Enrique López-Mañas <eenriquelopez@gmail.com>
* chore: unified Kotlin and Java modules
* chore: unified resources
* chore: removed Kotlin
* chore: headers
* chore: headers
* chore: headers
* chore: headers
* chore: added insets
* chore: headers
* chore: renamed
* fix: Refactor map creation, centralize Map ID, add Kotlin boundary controls
This commit refactors how map fragments and Map IDs are handled across the Java and Kotlin demo applications, and introduces feature parity for boundary layer controls in the Kotlin demo.
Key changes include:
- **Programmatic Map Fragment Creation:**
- Replaced static `<fragment>` map declarations with `<FrameLayout>` containers (`map_fragment_container`) in `data_driven_boundaries_demo.xml` and `data_driven_styling_demo.xml` layouts.
- Modified `DataDrivenBoundariesActivity` and `DataDrivenDatasetStylingActivity` (Java & Kotlin) to instantiate `SupportMapFragment` programmatically using `SupportMapFragment.newInstance(mapOptions)`.
- Map options (`GoogleMapOptions`) are now created with the dynamically retrieved Map ID before fragment creation.
- this allows moving the Map ID out of the xml files
- **Centralized Map ID and Configuration Logic:**
- Introduced `ApiDemoApplication` in both Java (`java-app`) and Kotlin (`kotlin-app`) modules.
- This class centralizes Map ID retrieval, checking `BuildConfig.MAP_ID` first, then the `R.string.map_id` resource, providing a consistent source.
- The Kotlin `ApiDemoApplication` also includes API Key validation on application startup.
- **Kotlin DataDrivenBoundaries Feature Enhancement:**
- Added boundary layer selection controls (popup menu via `button_feature_type`) to the Kotlin `DataDrivenBoundariesActivity`, achieving parity with the Java version's functionality.
- Implemented state management for toggling Locality, Administrative Area Level 1, and Country layers.
- Added dynamic styling logic to apply/remove styles based on layer visibility.
- Updated feature click handling for country selection, respecting layer activation state.
- **Miscellaneous Improvements:**
- Added distinct demo titles (`demo_title_java`, `demo_title_kotlin`) in `strings.xml` for better app identification.
- Updated resource references within Java/Kotlin activities for cleaner imports (e.g., `R.id...` instead of fully qualified names).
* chore: address various lint issues
* fix: explicitly bind checkboxes in the UI
---------
Co-authored-by: dkhawk <107309+dkhawk@users.noreply.github.com>