diff --git a/.gitignore b/.gitignore index 50a8fc02..62c6c003 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ google-services.json # VS Code .vscode/ +snippets/docs/ diff --git a/README.md b/README.md index 9d9e97d9..cd813436 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Android Views. It's a great starting point to understand core concepts like map * **[Maps3DSamples/advanced](Maps3DSamples/advanced)**: For developers using Jetpack Compose, this sample demonstrates how to integrate the Maps3D SDK into a declarative UI. It utilizes helper classes to bridge the SDK's View-based SDK with Compose, offering a more modern approach to building UIs with 3D maps. +* **[snippets](snippets)**: A collection of standalone, extraction-ready code snippets demonstrating standard integration endpoints in both Kotlin and Java. Includes a coordinate checklist mapping tracker listed in [CATALOG.md](snippets/CATALOG.md). ## View-based Kotlin Samples diff --git a/settings.gradle.kts b/settings.gradle.kts index a554202b..53a350d7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -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/snippets/CATALOG.md b/snippets/CATALOG.md new file mode 100644 index 00000000..68b9480c --- /dev/null +++ b/snippets/CATALOG.md @@ -0,0 +1,229 @@ +# πŸ—ΊοΈ Maps3D API Snippets Catalog + +This document serves as a comprehensive developer reference mapping high-level concepts directly index extracts. + +## πŸ“‘ Snippet Concepts Index + +This section maps high-level concepts (groups) to specific demonstration files and lines in both languages. + +### Camera +> Snippets demonstrating dynamic camera orchestration and animations. + +- **1. Fly To**: + - *Description*: Animates the camera to a specific position with a tilt and heading over 5 seconds. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) + - Tag: `maps_android_3d_camera_fly_to_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L45-L64) + - Tag: `maps_android_3d_camera_fly_to_java` +- **2. Fly Around**: + - *Description*: Rotates the camera 360 degrees around a specific location over 10 seconds. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) + - Tag: `maps_android_3d_camera_fly_around_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L75-L94) + - Tag: `maps_android_3d_camera_fly_around_java` +- **3. Stop Animation**: + - *Description*: Stops any currently running camera animation immediately. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) + - Tag: `maps_android_3d_camera_stop_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L106-L115) + - Tag: `maps_android_3d_camera_stop_java` +- **4. Listen Camera Events**: + - *Description*: Logs camera change events to the console, printing the center coordinates as the camera moves. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L188-L202) + - Tag: `maps_android_3d_camera_events_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L128-L147) + - Tag: `maps_android_3d_camera_events_java` +- **5. Listen Steady State**: + - *Description*: Logs to the console when the map finishes rendering or enters a steady state. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L219-L223) + - Tag: `maps_android_3d_camera_steady_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L159-L163) + - Tag: `maps_android_3d_camera_steady_java` +- **6. Camera Restriction**: + - *Description*: Restricts the camera to a specific altitude range and bounding box. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) + - Tag: `maps_android_3d_camera_restriction_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L184-L194) + - Tag: `maps_android_3d_camera_restriction_java` + +### Map Initialization +> Snippets demonstrating map lifecycle, listeners and readiness states. + +- **1. Listen Events**: + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L94-L114) + - Tag: `maps_android_3d_init_listeners_kt` +- **1. Basic Map3D Initialization**: + - *Description*: Initializes a standard 3D Map View and sets an initial camera angle. + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L45-L64) + - Tag: `maps_android_3d_init_basic_java` +- **2. Add Map to AndroidView**: + - *Description*: Shows how to add a Map3DView to an AndroidView which bridges to Jetpack Compose. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) + - Tag: `maps_android_3d_init_basic_kt` +- **2. Listen Map Events**: + - *Description*: Logs map events to the console, such as clicks or idle status. + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L73-L97) + - Tag: `maps_android_3d_init_listeners_java` + +### Markers +> Snippets demonstrating standard, extruded, and custom styled markers. + +- **1. Basic**: + - *Description*: Adds a standard marker. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) + - Tag: `maps_android_3d_marker_add_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) + - Tag: `maps_android_3d_marker_add_java` +- **2. Advanced**: + - *Description*: Adds a 'Priority Marker' that is extruded and collides with other markers. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) + - Tag: `maps_android_3d_marker_options_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) + - Tag: `maps_android_3d_marker_options_java` +- **3. Click**: + - *Description*: Adds a marker that logs a message when clicked. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) + - Tag: `maps_android_3d_marker_click_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) + - Tag: `maps_android_3d_marker_click_java` +- **4. Custom Icon**: + - *Description*: Adds a marker with a custom icon using PinConfiguration and Glyph styling. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:173](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L173) + - Tag: `No Tag` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) + - Tag: `maps_android_3d_marker_custom_icon_java` +- **5. Color Glyph**: + - *Description*: Adds a marker with a customized glyph color. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) + - Tag: `maps_android_3d_marker_glyph_color_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) + - Tag: `maps_android_3d_marker_glyph_color_java` +- **6. Text Glyph**: + - *Description*: Adds a marker with text inside the glyph. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) + - Tag: `maps_android_3d_marker_glyph_text_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) + - Tag: `maps_android_3d_marker_glyph_text_java` +- **7. Circle Glyph**: + - *Description*: Adds a marker with a default circle glyph. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) + - Tag: `maps_android_3d_marker_glyph_circle_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) + - Tag: `maps_android_3d_marker_glyph_circle_java` + +### Models +- **1. Basic**: + - *Description*: Loads a GLB model from a URL and places it clamped to the ground. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) + - Tag: `maps_android_3d_model_add_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) + - Tag: `maps_android_3d_model_add_java` + +### Places +- **1. Listen Clicks**: + - *Description*: Sets up a listener that logs the Place ID when a user clicks on a 3D building or POI. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L44-L53) + - Tag: `maps_android_3d_place_click_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java#L56-L68) + - Tag: `maps_android_3d_place_click_java` + +### Polygons +> Snippets demonstrating 2D and 3D extruded polygon layers on the map. + +- **1. Basic**: + - *Description*: Draws a red polygon with a blue stroke around a small area + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) + - Tag: `maps_android_3d_polygon_add_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) + - Tag: `maps_android_3d_polygon_add_java` +- **2. Extruded**: + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) + - Tag: `maps_android_3d_polygon_extruded_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) + - Tag: `maps_android_3d_polygon_extruded_java` +- **3. Polygon with Hole**: + - *Description*: Draws a polygon with an interior hole cutout. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) + - Tag: `maps_android_3d_polygon_hole_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) + - Tag: `maps_android_3d_polygon_hole_java` + +### Polylines +> Snippets demonstrating 2D and 3D extruded polyline paths on the map. + +- **1. Basic**: + - *Description*: Draws a thick red polyline connecting three points + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) + - Tag: `maps_android_3d_polyline_add_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) + - Tag: `maps_android_3d_polyline_add_java` +- **2. Styled**: + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) + - Tag: `maps_android_3d_polyline_options_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) + - Tag: `maps_android_3d_polyline_options_java` + +### Popovers +> Snippets demonstrating anchored and configured 3D Popover views. + +- **1. Marker Anchor**: + - *Description*: Adds a 'Hello Popover!' text bubble anchored to a marker + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) + - Tag: `maps_android_3d_popover_add_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) + - Tag: `maps_android_3d_popover_add_java` +- **2. Configured**: + - *Description*: Adds an 'Info' popover anchored to a marker with auto-close enabled and auto-pan disabled. + - **Kotlin** + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) + - Tag: `maps_android_3d_popover_options_kt` + - **Java** + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) + - Tag: `maps_android_3d_popover_options_java` + diff --git a/snippets/COVERAGE.md b/snippets/COVERAGE.md new file mode 100644 index 00000000..9286fe43 --- /dev/null +++ b/snippets/COVERAGE.md @@ -0,0 +1,1757 @@ +# πŸ“Š Maps3D API Coverage Matrix + +This matrix ensures that every critical feature in the 3D Maps SDK is actively demonstrated inside a snippet boundary (`// [START ...]`). + +## Kotlin Snippets +### `Camera` +- `getCenter`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:58](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L58) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L188-L202) (Tag: `maps_android_3d_camera_events_kt`) +- `setCenter`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:191](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L191) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:204](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L204) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:84](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L84) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:58](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L58) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:129](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L129) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:188](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L188) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:78](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L78) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:126](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L126) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:74](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L74) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:122](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L122) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L77) (Tag: `No Tag`) +- `setHeading`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:197](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L197) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:210](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L210) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:86](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L86) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:60](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L60) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:135](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L135) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:189](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L189) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:84](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L84) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:132](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L132) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:80](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L80) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:124](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L124) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:79](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L79) (Tag: `No Tag`) +- `setRange`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:198](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L198) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:211](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L211) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:87](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L87) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:61](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L61) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:136](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L136) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:189](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L189) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:85](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L85) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:133](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L133) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:81](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L81) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:125](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L125) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:80](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L80) (Tag: `No Tag`) +- `setRoll`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:189](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L189) (Tag: `No Tag`) +- `setTilt`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:196](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L196) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:209](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L209) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:85](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L85) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:59](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L59) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:134](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L134) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:189](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L189) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:83](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L83) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:131](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L131) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:79](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L79) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:123](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L123) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:78](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L78) (Tag: `No Tag`) +- `writeToParcel`: ❌ No coverage + +### `CameraRestriction` +- `setBounds`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setMaxAltitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setMaxHeading`: ❌ No coverage +- `setMaxTilt`: ❌ No coverage +- `setMinAltitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setMinHeading`: ❌ No coverage +- `setMinTilt`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `FlyAroundOptions` +- `getCenter`: ❌ No coverage +- `getDurationInMillis`: ❌ No coverage +- `getRounds`: ❌ No coverage +- `setCenter`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) +- `setDurationInMillis`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) +- `setRounds`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) +- `writeToParcel`: ❌ No coverage + +### `FlyToOptions` +- `getDurationInMillis`: ❌ No coverage +- `getEndCamera`: ❌ No coverage +- `setDurationInMillis`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:202](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L202) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:213](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L213) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:89](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L89) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:63](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L63) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:138](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L138) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:191](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L191) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:87](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L87) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:135](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L135) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:83](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L83) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:127](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L127) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:82](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L82) (Tag: `No Tag`) +- `setEndCamera`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:201](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L201) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:203](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L203) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:83](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L83) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:57](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L57) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:128](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L128) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:187](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L187) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L77) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:125](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L125) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:73](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L73) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:121](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L121) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:76](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L76) (Tag: `No Tag`) +- `writeToParcel`: ❌ No coverage + +### `Glyph` +- `equals`: ❌ No coverage +- `fromCircle`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) +- `fromColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:180](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L180) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) +- `fromText`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) +- `getColor`: ❌ No coverage +- `getImage`: ❌ No coverage +- `getText`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) +- `setImage`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:182](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L182) (Tag: `No Tag`) +- `setText`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `GoogleMap3D` +- `addMarker`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:31](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L31) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:200](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L200) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `addModel`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:49](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L49) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `addPolygon`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:43](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L43) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `addPolyline`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:37](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L37) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `addPopover`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:55](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L55) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `flyCameraAround`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:68](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L68) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) +- `flyCameraTo`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:200](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L200) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:67](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L67) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:202](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L202) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt:82](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L82) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:56](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L56) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:127](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L127) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:186](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L186) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:76](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L76) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:124](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L124) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:72](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L72) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:120](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L120) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:75](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L75) (Tag: `No Tag`) +- `getCamera`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:57](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L57) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:65](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L65) (Tag: `No Tag`) +- `getCameraRestriction`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:72](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L72) (Tag: `No Tag`) +- `getMapMode`: ❌ No coverage +- `setCamera`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:60](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L60) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) +- `setCameraAnimationEndListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:19](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L19) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:20](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L20) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:27](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L27) (Tag: `No Tag`) +- `setCameraChangedListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:61](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L61) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt:206](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L206) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L188-L202) (Tag: `maps_android_3d_camera_events_kt`) +- `setCameraRestriction`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:71](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L71) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setMap3DClickListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:62](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L62) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L44-L53) (Tag: `maps_android_3d_place_click_kt`) +- `setMapMode`: ❌ No coverage +- `setOnMapReadyListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:127](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L127) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:69](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L69) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L94-L114) (Tag: `maps_android_3d_init_listeners_kt`) +- `setOnMapSteadyListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:70](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L70) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L219-L223) (Tag: `maps_android_3d_camera_steady_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L94-L114) (Tag: `maps_android_3d_init_listeners_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:40](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L40) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:42](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L42) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt:51](kotlin-app/src/main/java/com/example/snippets/kotlin/utils/MapExtensions.kt#L51) (Tag: `No Tag`) +- `stopCameraAnimation`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt:66](kotlin-app/src/main/java/com/example/snippets/kotlin/TrackedMap3D.kt#L66) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + +### `Hole` +- `getVertices`: ❌ No coverage +- `setVertices`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `ImageView` +- `equals`: ❌ No coverage +- `getResourceId`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setResourceId`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `LatLngAltitude` +- `getAltitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:73](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L73) (Tag: `No Tag`) +- `getLatitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:71](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L71) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:205](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L205) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `getLongitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:72](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L72) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:206](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L206) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `getPosition`: ❌ No coverage +- `setAltitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:194](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L194) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:188](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L188) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:207](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L207) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:58](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L58) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:132](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L132) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:188](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L188) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:81](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L81) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:129](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L129) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L77) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:122](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L122) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L77) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setLatitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:192](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L192) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:186](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L186) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:205](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L205) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:58](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L58) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:130](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L130) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:188](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L188) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:79](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L79) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:127](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L127) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:75](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L75) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:122](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L122) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L77) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setLongitude`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:193](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L193) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L137-L176) (Tag: `maps_android_3d_camera_stop_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L62-L81) (Tag: `maps_android_3d_camera_fly_to_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L93-L125) (Tag: `maps_android_3d_camera_fly_around_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:187](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L187) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:206](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L206) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt:58](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PlaceSnippets.kt#L58) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:131](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L131) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:188](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L188) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt:80](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L80) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:128](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L128) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt:76](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L76) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:122](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L122) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt:77](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L77) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `writeToParcel`: ❌ No coverage + +### `LatLngBounds` +- `getNorthEastLat`: ❌ No coverage +- `getNorthEastLng`: ❌ No coverage +- `getSouthWestLat`: ❌ No coverage +- `getSouthWestLng`: ❌ No coverage +- `setNorthEastLat`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setNorthEastLng`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setSouthWestLat`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `setSouthWestLng`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/CameraControlSnippets.kt#L235-L259) (Tag: `maps_android_3d_camera_restriction_kt`) +- `writeToParcel`: ❌ No coverage + +### `Map3DOptions` +- `attributes`: ❌ No coverage +- `bounds`: ❌ No coverage +- `centerAlt`: ❌ No coverage +- `centerLat`: ❌ No coverage +- `centerLng`: ❌ No coverage +- `defaultUiDisabled`: ❌ No coverage +- `fromAttributeSet`: ❌ No coverage +- `getAttributes`: ❌ No coverage +- `getBounds`: ❌ No coverage +- `getCenterAlt`: ❌ No coverage +- `getCenterLat`: ❌ No coverage +- `getCenterLng`: ❌ No coverage +- `getDefaultUiDisabled`: ❌ No coverage +- `getHeading`: ❌ No coverage +- `getMapId`: ❌ No coverage +- `getMapMode`: ❌ No coverage +- `getMaxAltitude`: ❌ No coverage +- `getMaxHeading`: ❌ No coverage +- `getMaxTilt`: ❌ No coverage +- `getMinAltitude`: ❌ No coverage +- `getMinHeading`: ❌ No coverage +- `getMinTilt`: ❌ No coverage +- `getOptions`: ❌ No coverage +- `getRange`: ❌ No coverage +- `getRoll`: ❌ No coverage +- `getTilt`: ❌ No coverage +- `heading`: ❌ No coverage +- `mapId`: ❌ No coverage +- `mapMode`: ❌ No coverage +- `maxAltitude`: ❌ No coverage +- `maxHeading`: ❌ No coverage +- `maxTilt`: ❌ No coverage +- `minAltitude`: ❌ No coverage +- `minHeading`: ❌ No coverage +- `minTilt`: ❌ No coverage +- `options`: ❌ No coverage +- `range`: ❌ No coverage +- `roll`: ❌ No coverage +- `tilt`: ❌ No coverage + +### `Map3DView` +- `getMap3DViewAsync`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt:122](kotlin-app/src/main/java/com/example/snippets/kotlin/MapActivity.kt#L122) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MapInitSnippets.kt#L42-L83) (Tag: `maps_android_3d_init_basic_kt`) +- `getOverlayView`: ❌ No coverage +- `getParams`: ❌ No coverage +- `overlayView`: ❌ No coverage +- `params`: ❌ No coverage +- `setParams`: ❌ No coverage + +### `Marker` +- `getAltitudeMode`: ❌ No coverage +- `getCollisionBehavior`: ❌ No coverage +- `getDrawsWhenOccluded`: ❌ No coverage +- `getId`: ❌ No coverage +- `getLabel`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getSizePreserved`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `isExtruded`: ❌ No coverage +- `onMarkerClick`: ❌ No coverage +- `remove`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt:60](kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt#L60) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) +- `setCollisionBehavior`: ❌ No coverage +- `setDrawsWhenOccluded`: ❌ No coverage +- `setExtruded`: ❌ No coverage +- `setLabel`: ❌ No coverage +- `setPosition`: ❌ No coverage +- `setSizePreserved`: ❌ No coverage +- `setUrl`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `MarkerOptions` +- `getAltitudeMode`: ❌ No coverage +- `getCollisionBehavior`: ❌ No coverage +- `getId`: ❌ No coverage +- `getLabel`: ❌ No coverage +- `getPosition`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:205](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L205) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:206](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L206) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `getZIndex`: ❌ No coverage +- `isDrawnWhenOccluded`: ❌ No coverage +- `isExtruded`: ❌ No coverage +- `isSizePreserved`: ❌ No coverage +- `setAltitudeMode`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `setCollisionBehavior`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `setDrawnWhenOccluded`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `setExtruded`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) +- `setId`: ❌ No coverage +- `setLabel`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:190](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L190) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setPosition`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:185](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L185) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L136-L166) (Tag: `maps_android_3d_marker_click_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L53-L82) (Tag: `maps_android_3d_marker_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L94-L124) (Tag: `maps_android_3d_marker_options_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setSizePreserved`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `MarkerOptions.that` +- `getStyle`: ❌ No coverage +- `setStyle`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `MarkerStyle` +- `equals`: ❌ No coverage +- `getImageView`: ❌ No coverage +- `getPinConfiguration`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Model` +- `getAltitudeMode`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOrientation`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getScale`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `onModelClick`: ❌ No coverage +- `remove`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt:63](kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt#L63) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setOrientation`: ❌ No coverage +- `setPosition`: ❌ No coverage +- `setScale`: ❌ No coverage +- `setUrl`: ❌ No coverage + +### `ModelOptions` +- `getAltitudeMode`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOrientation`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getScale`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `setAltitudeMode`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setId`: ❌ No coverage +- `setOrientation`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setPosition`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setScale`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setUrl`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `writeToParcel`: ❌ No coverage + +### `Orientation` +- `getHeading`: ❌ No coverage +- `getRoll`: ❌ No coverage +- `getTilt`: ❌ No coverage +- `setHeading`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setRoll`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setTilt`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `writeToParcel`: ❌ No coverage + +### `PinConfiguration` +- `builder`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:192](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L192) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) +- `equals`: ❌ No coverage +- `getBackgroundColor`: ❌ No coverage +- `getBorderColor`: ❌ No coverage +- `getGlyph`: ❌ No coverage +- `getScale`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setBackgroundColor`: ❌ No coverage +- `setBorderColor`: ❌ No coverage +- `setGlyph`: ❌ No coverage +- `setScale`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `PinConfiguration.Builder` +- `build`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:197](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L197) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) +- `setBackgroundColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:195](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L195) (Tag: `No Tag`) +- `setBorderColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:196](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L196) (Tag: `No Tag`) +- `setGlyph`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:194](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L194) (Tag: `No Tag`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L227-L255) (Tag: `maps_android_3d_marker_glyph_color_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L267-L295) (Tag: `maps_android_3d_marker_glyph_text_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L307-L338) (Tag: `maps_android_3d_marker_glyph_circle_kt`) +- `setScale`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt:193](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/MarkerSnippets.kt#L193) (Tag: `No Tag`) + +### `Polygon` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getFillColor`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getInnerCoordinates`: ❌ No coverage +- `getInnerPaths`: ❌ No coverage +- `getOuterCoordinates`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `onPolygonClick`: ❌ No coverage +- `remove`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt:62](kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt#L62) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setDrawsOccludedSegments`: ❌ No coverage +- `setExtruded`: ❌ No coverage +- `setFillColor`: ❌ No coverage +- `setGeodesic`: ❌ No coverage +- `setInnerCoordinates`: ❌ No coverage +- `setInnerPaths`: ❌ No coverage +- `setOuterCoordinates`: ❌ No coverage +- `setPath`: ❌ No coverage +- `setStrokeColor`: ❌ No coverage +- `setStrokeWidth`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `PolygonOptions` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getFillColor`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getInnerPaths`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `setAltitudeMode`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setDrawsOccludedSegments`: ❌ No coverage +- `setExtruded`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) +- `setFillColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setGeodesic`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) +- `setId`: ❌ No coverage +- `setInnerPaths`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) +- `setPath`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L100-L125) (Tag: `maps_android_3d_polygon_extruded_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L151-L184) (Tag: `maps_android_3d_polygon_hole_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setStrokeColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setStrokeWidth`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolygonSnippets.kt#L49-L74) (Tag: `maps_android_3d_polygon_add_kt`) +- `setZIndex`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Polyline` +- `getAltitudeMode`: ❌ No coverage +- `getCoordinates`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOuterColor`: ❌ No coverage +- `getOuterWidth`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `onPolylineClick`: ❌ No coverage +- `remove`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt:61](kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt#L61) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setCoordinates`: ❌ No coverage +- `setDrawsOccludedSegments`: ❌ No coverage +- `setGeodesic`: ❌ No coverage +- `setOuterColor`: ❌ No coverage +- `setOuterWidth`: ❌ No coverage +- `setPath`: ❌ No coverage +- `setStrokeColor`: ❌ No coverage +- `setStrokeWidth`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `PolylineOptions` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOuterColor`: ❌ No coverage +- `getOuterWidth`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `setAltitudeMode`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setDrawsOccludedSegments`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setExtruded`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setGeodesic`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setId`: ❌ No coverage +- `setOuterColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setOuterWidth`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setPath`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setStrokeColor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setStrokeWidth`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L48-L70) (Tag: `maps_android_3d_polyline_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PolylineSnippets.kt#L96-L122) (Tag: `maps_android_3d_polyline_options_kt`) +- `setZIndex`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Popover` +- `altitudeMode`: ❌ No coverage +- `anchorId`: ❌ No coverage +- `anchorOffset`: ❌ No coverage +- `autoCloseEnabled`: ❌ No coverage +- `autoPanEnabled`: ❌ No coverage +- `autoPanFn`: ❌ No coverage +- `content`: ❌ No coverage +- `getAltitudeMode`: ❌ No coverage +- `getAnchorId`: ❌ No coverage +- `getAnchorOffset`: ❌ No coverage +- `getAutoCloseEnabled`: ❌ No coverage +- `getAutoPanEnabled`: ❌ No coverage +- `getAutoPanFn`: ❌ No coverage +- `getContent`: ❌ No coverage +- `getIsVisible`: ❌ No coverage +- `getPositionAnchor`: ❌ No coverage +- `getRemoveFn`: ❌ No coverage +- `hide`: ❌ No coverage +- `isVisible`: ❌ No coverage +- `positionAnchor`: ❌ No coverage +- `remove`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt:64](kotlin-app/src/main/java/com/example/snippets/kotlin/SnippetRegistry.kt#L64) (Tag: `No Tag`) +- `removeFn`: ❌ No coverage +- `show`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `toggle`: ❌ No coverage + +### `PopoverOptions` +- `getAltitudeMode`: ❌ No coverage +- `getAnchorOffset`: ❌ No coverage +- `getAutoCloseEnabled`: ❌ No coverage +- `getAutoPanEnabled`: ❌ No coverage +- `getContent`: ❌ No coverage +- `getPopoverStyle`: ❌ No coverage +- `getPositionAnchor`: ❌ No coverage +- `setAltitudeMode`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) +- `setAnchorOffset`: ❌ No coverage +- `setAutoCloseEnabled`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setAutoPanEnabled`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setContent`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) +- `setPopoverStyle`: ❌ No coverage +- `setPositionAnchor`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L48-L73) (Tag: `maps_android_3d_popover_add_kt`) + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/PopoverSnippets.kt#L95-L118) (Tag: `maps_android_3d_popover_options_kt`) + +### `PopoverShadow` +- `getColor`: ❌ No coverage +- `getOffsetX`: ❌ No coverage +- `getOffsetY`: ❌ No coverage +- `getRadius`: ❌ No coverage +- `setColor`: ❌ No coverage +- `setOffsetX`: ❌ No coverage +- `setOffsetY`: ❌ No coverage +- `setRadius`: ❌ No coverage + +### `PopoverStyle` +- `getBackgroundColor`: ❌ No coverage +- `getBorderRadius`: ❌ No coverage +- `getPadding`: ❌ No coverage +- `getShadow`: ❌ No coverage +- `setBackgroundColor`: ❌ No coverage +- `setBorderRadius`: ❌ No coverage +- `setPadding`: ❌ No coverage +- `setShadow`: ❌ No coverage + +### `Validators.for` +- `Anchorable`: ❌ No coverage +- `Camera`: ❌ No coverage +- `CameraRestriction`: ❌ No coverage +- `FlyAroundOptions`: ❌ No coverage +- `FlyToOptions`: ❌ No coverage +- `Hole`: ❌ No coverage +- `LatLngAltitude`: ❌ No coverage +- `LatLngBounds`: ❌ No coverage +- `Map3DOptions`: ❌ No coverage +- `MarkerOptions`: ❌ No coverage +- `ModelOptions`: ❌ No coverage +- `Orientation`: ❌ No coverage +- `PolygonOptions`: ❌ No coverage +- `PolylineOptions`: ❌ No coverage +- `PopoverOptions`: ❌ No coverage +- `Vector3D`: ❌ No coverage +- `requireNonNegative`: ❌ No coverage +- `validateAltitude`: ❌ No coverage +- `validateFinite`: ❌ No coverage +- `validateHeading`: ❌ No coverage +- `validateLatitude`: ❌ No coverage +- `validateLongitude`: ❌ No coverage +- `validateRange`: ❌ No coverage +- `validateRoll`: ❌ No coverage +- `validateTilt`: ❌ No coverage + +### `Vector3D` +- `getX`: ❌ No coverage +- `getY`: ❌ No coverage +- `getZ`: ❌ No coverage +- `setX`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setY`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `setZ`: + - [kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets/ModelSnippets.kt#L52-L79) (Tag: `maps_android_3d_model_add_kt`) +- `writeToParcel`: ❌ No coverage + +### Missing Extracted API Coverage (Kotlin Snippets) +The following non-getter/setter APIs currently have `0` occurrences within this section: + +- `Camera.writeToParcel` +- `CameraRestriction.writeToParcel` +- `FlyAroundOptions.writeToParcel` +- `FlyToOptions.writeToParcel` +- `Glyph.equals` +- `Glyph.hashCode` +- `Glyph.writeToParcel` +- `Hole.writeToParcel` +- `ImageView.equals` +- `ImageView.hashCode` +- `ImageView.writeToParcel` +- `LatLngAltitude.writeToParcel` +- `LatLngBounds.writeToParcel` +- `Map3DOptions.attributes` +- `Map3DOptions.bounds` +- `Map3DOptions.centerAlt` +- `Map3DOptions.centerLat` +- `Map3DOptions.centerLng` +- `Map3DOptions.defaultUiDisabled` +- `Map3DOptions.fromAttributeSet` +- `Map3DOptions.heading` +- `Map3DOptions.mapId` +- `Map3DOptions.mapMode` +- `Map3DOptions.maxAltitude` +- `Map3DOptions.maxHeading` +- `Map3DOptions.maxTilt` +- `Map3DOptions.minAltitude` +- `Map3DOptions.minHeading` +- `Map3DOptions.minTilt` +- `Map3DOptions.options` +- `Map3DOptions.range` +- `Map3DOptions.roll` +- `Map3DOptions.tilt` +- `Map3DView.overlayView` +- `Map3DView.params` +- `Marker.isExtruded` +- `Marker.onMarkerClick` +- `MarkerOptions.isDrawnWhenOccluded` +- `MarkerOptions.isExtruded` +- `MarkerOptions.isSizePreserved` +- `MarkerOptions.that.writeToParcel` +- `MarkerStyle.equals` +- `MarkerStyle.hashCode` +- `MarkerStyle.writeToParcel` +- `Model.onModelClick` +- `ModelOptions.writeToParcel` +- `Orientation.writeToParcel` +- `PinConfiguration.equals` +- `PinConfiguration.hashCode` +- `PinConfiguration.writeToParcel` +- `Polygon.onPolygonClick` +- `PolygonOptions.writeToParcel` +- `Polyline.onPolylineClick` +- `PolylineOptions.writeToParcel` +- `Popover.altitudeMode` +- `Popover.anchorId` +- `Popover.anchorOffset` +- `Popover.autoCloseEnabled` +- `Popover.autoPanEnabled` +- `Popover.autoPanFn` +- `Popover.content` +- `Popover.hide` +- `Popover.isVisible` +- `Popover.positionAnchor` +- `Popover.removeFn` +- `Popover.toggle` +- `Validators.for.Anchorable` +- `Validators.for.Camera` +- `Validators.for.CameraRestriction` +- `Validators.for.FlyAroundOptions` +- `Validators.for.FlyToOptions` +- `Validators.for.Hole` +- `Validators.for.LatLngAltitude` +- `Validators.for.LatLngBounds` +- `Validators.for.Map3DOptions` +- `Validators.for.MarkerOptions` +- `Validators.for.ModelOptions` +- `Validators.for.Orientation` +- `Validators.for.PolygonOptions` +- `Validators.for.PolylineOptions` +- `Validators.for.PopoverOptions` +- `Validators.for.Vector3D` +- `Validators.for.requireNonNegative` +- `Validators.for.validateAltitude` +- `Validators.for.validateFinite` +- `Validators.for.validateHeading` +- `Validators.for.validateLatitude` +- `Validators.for.validateLongitude` +- `Validators.for.validateRange` +- `Validators.for.validateRoll` +- `Validators.for.validateTilt` +- `Vector3D.writeToParcel` + +## Java Snippets +### `Camera` +- `getCenter`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:55](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L55) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L128-L147) (Tag: `maps_android_3d_camera_events_java`) +- `setCenter`: ❌ No coverage +- `setHeading`: ❌ No coverage +- `setRange`: ❌ No coverage +- `setRoll`: ❌ No coverage +- `setTilt`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `CameraRestriction` +- `setBounds`: ❌ No coverage +- `setMaxAltitude`: ❌ No coverage +- `setMaxHeading`: ❌ No coverage +- `setMaxTilt`: ❌ No coverage +- `setMinAltitude`: ❌ No coverage +- `setMinHeading`: ❌ No coverage +- `setMinTilt`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `FlyAroundOptions` +- `getCenter`: ❌ No coverage +- `getDurationInMillis`: ❌ No coverage +- `getRounds`: ❌ No coverage +- `setCenter`: ❌ No coverage +- `setDurationInMillis`: ❌ No coverage +- `setRounds`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `FlyToOptions` +- `getDurationInMillis`: ❌ No coverage +- `getEndCamera`: ❌ No coverage +- `setDurationInMillis`: ❌ No coverage +- `setEndCamera`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Glyph` +- `equals`: ❌ No coverage +- `fromCircle`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) +- `fromColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) +- `fromText`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) +- `getColor`: ❌ No coverage +- `getImage`: ❌ No coverage +- `getText`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) +- `setImage`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) +- `setText`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `GoogleMap3D` +- `addMarker`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:54](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L54) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `addModel`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:72](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L72) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `addPolygon`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:66](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L66) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `addPolyline`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:60](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L60) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `addPopover`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:78](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L78) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `flyCameraAround`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:86](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L86) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L106-L115) (Tag: `maps_android_3d_camera_stop_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L75-L94) (Tag: `maps_android_3d_camera_fly_around_java`) +- `flyCameraTo`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:91](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L91) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L45-L64) (Tag: `maps_android_3d_camera_fly_to_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java:83](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L83) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java:74](java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java#L74) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java:128](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L128) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java:178](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L178) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java:88](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L88) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java:125](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L125) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java:84](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L84) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java:123](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L123) (Tag: `No Tag`) +- `getCamera`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:53](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L53) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:89](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L89) (Tag: `No Tag`) +- `getCameraRestriction`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:95](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L95) (Tag: `No Tag`) +- `getMapMode`: ❌ No coverage +- `setCamera`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:83](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L83) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java:182](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L182) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L75-L94) (Tag: `maps_android_3d_camera_fly_around_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L45-L64) (Tag: `maps_android_3d_init_basic_java`) +- `setCameraAnimationEndListener`: ❌ No coverage +- `setCameraChangedListener`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:84](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L84) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L128-L147) (Tag: `maps_android_3d_camera_events_java`) +- `setCameraRestriction`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:94](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L94) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L184-L194) (Tag: `maps_android_3d_camera_restriction_java`) +- `setMap3DClickListener`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:85](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L85) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java#L56-L68) (Tag: `maps_android_3d_place_click_java`) +- `setMapMode`: ❌ No coverage +- `setOnMapReadyListener`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:92](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L92) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L73-L97) (Tag: `maps_android_3d_init_listeners_java`) +- `setOnMapSteadyListener`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:93](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L93) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L159-L163) (Tag: `maps_android_3d_camera_steady_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java#L75-L94) (Tag: `maps_android_3d_camera_fly_around_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L73-L97) (Tag: `maps_android_3d_init_listeners_java`) +- `stopCameraAnimation`: + - [java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java:90](java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java#L90) (Tag: `No Tag`) + +### `Hole` +- `getVertices`: ❌ No coverage +- `setVertices`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `ImageView` +- `equals`: ❌ No coverage +- `getResourceId`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setResourceId`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `LatLngAltitude` +- `getAltitude`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:64](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L64) (Tag: `No Tag`) +- `getLatitude`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:64](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L64) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `getLongitude`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:64](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L64) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `getPosition`: ❌ No coverage +- `setAltitude`: ❌ No coverage +- `setLatitude`: ❌ No coverage +- `setLongitude`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `LatLngBounds` +- `getNorthEastLat`: ❌ No coverage +- `getNorthEastLng`: ❌ No coverage +- `getSouthWestLat`: ❌ No coverage +- `getSouthWestLng`: ❌ No coverage +- `setNorthEastLat`: ❌ No coverage +- `setNorthEastLng`: ❌ No coverage +- `setSouthWestLat`: ❌ No coverage +- `setSouthWestLng`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Map3DOptions` +- `attributes`: ❌ No coverage +- `bounds`: ❌ No coverage +- `centerAlt`: ❌ No coverage +- `centerLat`: ❌ No coverage +- `centerLng`: ❌ No coverage +- `defaultUiDisabled`: ❌ No coverage +- `fromAttributeSet`: ❌ No coverage +- `getAttributes`: ❌ No coverage +- `getBounds`: ❌ No coverage +- `getCenterAlt`: ❌ No coverage +- `getCenterLat`: ❌ No coverage +- `getCenterLng`: ❌ No coverage +- `getDefaultUiDisabled`: ❌ No coverage +- `getHeading`: ❌ No coverage +- `getMapId`: ❌ No coverage +- `getMapMode`: ❌ No coverage +- `getMaxAltitude`: ❌ No coverage +- `getMaxHeading`: ❌ No coverage +- `getMaxTilt`: ❌ No coverage +- `getMinAltitude`: ❌ No coverage +- `getMinHeading`: ❌ No coverage +- `getMinTilt`: ❌ No coverage +- `getOptions`: ❌ No coverage +- `getRange`: ❌ No coverage +- `getRoll`: ❌ No coverage +- `getTilt`: ❌ No coverage +- `heading`: ❌ No coverage +- `mapId`: ❌ No coverage +- `mapMode`: ❌ No coverage +- `maxAltitude`: ❌ No coverage +- `maxHeading`: ❌ No coverage +- `maxTilt`: ❌ No coverage +- `minAltitude`: ❌ No coverage +- `minHeading`: ❌ No coverage +- `minTilt`: ❌ No coverage +- `options`: ❌ No coverage +- `range`: ❌ No coverage +- `roll`: ❌ No coverage +- `tilt`: ❌ No coverage + +### `Map3DView` +- `getMap3DViewAsync`: + - [java-app/src/main/java/com/example/snippets/java/MapActivity.java:115](java-app/src/main/java/com/example/snippets/java/MapActivity.java#L115) (Tag: `No Tag`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java#L45-L64) (Tag: `maps_android_3d_init_basic_java`) +- `getOverlayView`: ❌ No coverage +- `getParams`: ❌ No coverage +- `overlayView`: ❌ No coverage +- `params`: ❌ No coverage +- `setParams`: ❌ No coverage + +### `Marker` +- `getAltitudeMode`: ❌ No coverage +- `getCollisionBehavior`: ❌ No coverage +- `getDrawsWhenOccluded`: ❌ No coverage +- `getId`: ❌ No coverage +- `getLabel`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getSizePreserved`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `isExtruded`: ❌ No coverage +- `onMarkerClick`: ❌ No coverage +- `remove`: + - [java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java:38](java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java#L38) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) +- `setCollisionBehavior`: ❌ No coverage +- `setDrawsWhenOccluded`: ❌ No coverage +- `setExtruded`: ❌ No coverage +- `setLabel`: ❌ No coverage +- `setPosition`: ❌ No coverage +- `setSizePreserved`: ❌ No coverage +- `setUrl`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `MarkerOptions` +- `getAltitudeMode`: ❌ No coverage +- `getCollisionBehavior`: ❌ No coverage +- `getId`: ❌ No coverage +- `getLabel`: ❌ No coverage +- `getPosition`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `getZIndex`: ❌ No coverage +- `isDrawnWhenOccluded`: ❌ No coverage +- `isExtruded`: ❌ No coverage +- `isSizePreserved`: ❌ No coverage +- `setAltitudeMode`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `setCollisionBehavior`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `setDrawnWhenOccluded`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `setExtruded`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) +- `setId`: ❌ No coverage +- `setLabel`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `setPosition`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L125-L147) (Tag: `maps_android_3d_marker_click_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L64-L81) (Tag: `maps_android_3d_marker_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L93-L113) (Tag: `maps_android_3d_marker_options_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `setSizePreserved`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `MarkerOptions.that` +- `getStyle`: ❌ No coverage +- `setStyle`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `MarkerStyle` +- `equals`: ❌ No coverage +- `getImageView`: ❌ No coverage +- `getPinConfiguration`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Model` +- `getAltitudeMode`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOrientation`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getScale`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `onModelClick`: ❌ No coverage +- `remove`: + - [java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java:41](java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java#L41) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `setOrientation`: ❌ No coverage +- `setPosition`: ❌ No coverage +- `setScale`: ❌ No coverage +- `setUrl`: ❌ No coverage + +### `ModelOptions` +- `getAltitudeMode`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOrientation`: ❌ No coverage +- `getPosition`: ❌ No coverage +- `getScale`: ❌ No coverage +- `getUrl`: ❌ No coverage +- `setAltitudeMode`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `setId`: ❌ No coverage +- `setOrientation`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `setPosition`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `setScale`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `setUrl`: + - [java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java#L60-L78) (Tag: `maps_android_3d_model_add_java`) +- `writeToParcel`: ❌ No coverage + +### `Orientation` +- `getHeading`: ❌ No coverage +- `getRoll`: ❌ No coverage +- `getTilt`: ❌ No coverage +- `setHeading`: ❌ No coverage +- `setRoll`: ❌ No coverage +- `setTilt`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `PinConfiguration` +- `builder`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) +- `equals`: ❌ No coverage +- `getBackgroundColor`: ❌ No coverage +- `getBorderColor`: ❌ No coverage +- `getGlyph`: ❌ No coverage +- `getScale`: ❌ No coverage +- `hashCode`: ❌ No coverage +- `setBackgroundColor`: ❌ No coverage +- `setBorderColor`: ❌ No coverage +- `setGlyph`: ❌ No coverage +- `setScale`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `PinConfiguration.Builder` +- `build`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) +- `setBackgroundColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) +- `setBorderColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) +- `setGlyph`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L201-L220) (Tag: `maps_android_3d_marker_glyph_color_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L232-L251) (Tag: `maps_android_3d_marker_glyph_text_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L263-L285) (Tag: `maps_android_3d_marker_glyph_circle_java`) +- `setScale`: + - [java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java#L159-L189) (Tag: `maps_android_3d_marker_custom_icon_java`) + +### `Polygon` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getFillColor`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getInnerCoordinates`: ❌ No coverage +- `getInnerPaths`: ❌ No coverage +- `getOuterCoordinates`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `onPolygonClick`: ❌ No coverage +- `remove`: + - [java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java:40](java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java#L40) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setDrawsOccludedSegments`: ❌ No coverage +- `setExtruded`: ❌ No coverage +- `setFillColor`: ❌ No coverage +- `setGeodesic`: ❌ No coverage +- `setInnerCoordinates`: ❌ No coverage +- `setInnerPaths`: ❌ No coverage +- `setOuterCoordinates`: ❌ No coverage +- `setPath`: ❌ No coverage +- `setStrokeColor`: ❌ No coverage +- `setStrokeWidth`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `PolygonOptions` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getFillColor`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getInnerPaths`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `setAltitudeMode`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setDrawsOccludedSegments`: ❌ No coverage +- `setExtruded`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) +- `setFillColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setGeodesic`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) +- `setId`: ❌ No coverage +- `setInnerPaths`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) +- `setPath`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L100-L124) (Tag: `maps_android_3d_polygon_extruded_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L140-L174) (Tag: `maps_android_3d_polygon_hole_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setStrokeColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setStrokeWidth`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java#L60-L84) (Tag: `maps_android_3d_polygon_add_java`) +- `setZIndex`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Polyline` +- `getAltitudeMode`: ❌ No coverage +- `getCoordinates`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOuterColor`: ❌ No coverage +- `getOuterWidth`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `onPolylineClick`: ❌ No coverage +- `remove`: + - [java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java:39](java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java#L39) (Tag: `No Tag`) +- `setAltitudeMode`: ❌ No coverage +- `setClickListener`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setCoordinates`: ❌ No coverage +- `setDrawsOccludedSegments`: ❌ No coverage +- `setGeodesic`: ❌ No coverage +- `setOuterColor`: ❌ No coverage +- `setOuterWidth`: ❌ No coverage +- `setPath`: ❌ No coverage +- `setStrokeColor`: ❌ No coverage +- `setStrokeWidth`: ❌ No coverage +- `setZIndex`: ❌ No coverage + +### `PolylineOptions` +- `getAltitudeMode`: ❌ No coverage +- `getDrawsOccludedSegments`: ❌ No coverage +- `getExtruded`: ❌ No coverage +- `getGeodesic`: ❌ No coverage +- `getId`: ❌ No coverage +- `getOuterColor`: ❌ No coverage +- `getOuterWidth`: ❌ No coverage +- `getPath`: ❌ No coverage +- `getStrokeColor`: ❌ No coverage +- `getStrokeWidth`: ❌ No coverage +- `getZIndex`: ❌ No coverage +- `setAltitudeMode`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setDrawsOccludedSegments`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setExtruded`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setGeodesic`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setId`: ❌ No coverage +- `setOuterColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setOuterWidth`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setPath`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setStrokeColor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setStrokeWidth`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L59-L80) (Tag: `maps_android_3d_polyline_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java#L96-L121) (Tag: `maps_android_3d_polyline_options_java`) +- `setZIndex`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### `Popover` +- `altitudeMode`: ❌ No coverage +- `anchorId`: ❌ No coverage +- `anchorOffset`: ❌ No coverage +- `autoCloseEnabled`: ❌ No coverage +- `autoPanEnabled`: ❌ No coverage +- `autoPanFn`: ❌ No coverage +- `content`: ❌ No coverage +- `getAltitudeMode`: ❌ No coverage +- `getAnchorId`: ❌ No coverage +- `getAnchorOffset`: ❌ No coverage +- `getAutoCloseEnabled`: ❌ No coverage +- `getAutoPanEnabled`: ❌ No coverage +- `getAutoPanFn`: ❌ No coverage +- `getContent`: ❌ No coverage +- `getIsVisible`: ❌ No coverage +- `getPositionAnchor`: ❌ No coverage +- `getRemoveFn`: ❌ No coverage +- `hide`: ❌ No coverage +- `isVisible`: ❌ No coverage +- `positionAnchor`: ❌ No coverage +- `remove`: + - [java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java:42](java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java#L42) (Tag: `No Tag`) +- `removeFn`: ❌ No coverage +- `show`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `toggle`: ❌ No coverage + +### `PopoverOptions` +- `getAltitudeMode`: ❌ No coverage +- `getAnchorOffset`: ❌ No coverage +- `getAutoCloseEnabled`: ❌ No coverage +- `getAutoPanEnabled`: ❌ No coverage +- `getContent`: ❌ No coverage +- `getPopoverStyle`: ❌ No coverage +- `getPositionAnchor`: ❌ No coverage +- `setAltitudeMode`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) +- `setAnchorOffset`: ❌ No coverage +- `setAutoCloseEnabled`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `setAutoPanEnabled`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `setContent`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) +- `setPopoverStyle`: ❌ No coverage +- `setPositionAnchor`: + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L58-L82) (Tag: `maps_android_3d_popover_add_java`) + - [java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java](java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java#L94-L118) (Tag: `maps_android_3d_popover_options_java`) + +### `PopoverShadow` +- `getColor`: ❌ No coverage +- `getOffsetX`: ❌ No coverage +- `getOffsetY`: ❌ No coverage +- `getRadius`: ❌ No coverage +- `setColor`: ❌ No coverage +- `setOffsetX`: ❌ No coverage +- `setOffsetY`: ❌ No coverage +- `setRadius`: ❌ No coverage + +### `PopoverStyle` +- `getBackgroundColor`: ❌ No coverage +- `getBorderRadius`: ❌ No coverage +- `getPadding`: ❌ No coverage +- `getShadow`: ❌ No coverage +- `setBackgroundColor`: ❌ No coverage +- `setBorderRadius`: ❌ No coverage +- `setPadding`: ❌ No coverage +- `setShadow`: ❌ No coverage + +### `Validators.for` +- `Anchorable`: ❌ No coverage +- `Camera`: ❌ No coverage +- `CameraRestriction`: ❌ No coverage +- `FlyAroundOptions`: ❌ No coverage +- `FlyToOptions`: ❌ No coverage +- `Hole`: ❌ No coverage +- `LatLngAltitude`: ❌ No coverage +- `LatLngBounds`: ❌ No coverage +- `Map3DOptions`: ❌ No coverage +- `MarkerOptions`: ❌ No coverage +- `ModelOptions`: ❌ No coverage +- `Orientation`: ❌ No coverage +- `PolygonOptions`: ❌ No coverage +- `PolylineOptions`: ❌ No coverage +- `PopoverOptions`: ❌ No coverage +- `Vector3D`: ❌ No coverage +- `requireNonNegative`: ❌ No coverage +- `validateAltitude`: ❌ No coverage +- `validateFinite`: ❌ No coverage +- `validateHeading`: ❌ No coverage +- `validateLatitude`: ❌ No coverage +- `validateLongitude`: ❌ No coverage +- `validateRange`: ❌ No coverage +- `validateRoll`: ❌ No coverage +- `validateTilt`: ❌ No coverage + +### `Vector3D` +- `getX`: ❌ No coverage +- `getY`: ❌ No coverage +- `getZ`: ❌ No coverage +- `setX`: ❌ No coverage +- `setY`: ❌ No coverage +- `setZ`: ❌ No coverage +- `writeToParcel`: ❌ No coverage + +### Missing Extracted API Coverage (Java Snippets) +The following non-getter/setter APIs currently have `0` occurrences within this section: + +- `Camera.writeToParcel` +- `CameraRestriction.writeToParcel` +- `FlyAroundOptions.writeToParcel` +- `FlyToOptions.writeToParcel` +- `Glyph.equals` +- `Glyph.hashCode` +- `Glyph.writeToParcel` +- `Hole.writeToParcel` +- `ImageView.equals` +- `ImageView.hashCode` +- `ImageView.writeToParcel` +- `LatLngAltitude.writeToParcel` +- `LatLngBounds.writeToParcel` +- `Map3DOptions.attributes` +- `Map3DOptions.bounds` +- `Map3DOptions.centerAlt` +- `Map3DOptions.centerLat` +- `Map3DOptions.centerLng` +- `Map3DOptions.defaultUiDisabled` +- `Map3DOptions.fromAttributeSet` +- `Map3DOptions.heading` +- `Map3DOptions.mapId` +- `Map3DOptions.mapMode` +- `Map3DOptions.maxAltitude` +- `Map3DOptions.maxHeading` +- `Map3DOptions.maxTilt` +- `Map3DOptions.minAltitude` +- `Map3DOptions.minHeading` +- `Map3DOptions.minTilt` +- `Map3DOptions.options` +- `Map3DOptions.range` +- `Map3DOptions.roll` +- `Map3DOptions.tilt` +- `Map3DView.overlayView` +- `Map3DView.params` +- `Marker.isExtruded` +- `Marker.onMarkerClick` +- `MarkerOptions.isDrawnWhenOccluded` +- `MarkerOptions.isExtruded` +- `MarkerOptions.isSizePreserved` +- `MarkerOptions.that.writeToParcel` +- `MarkerStyle.equals` +- `MarkerStyle.hashCode` +- `MarkerStyle.writeToParcel` +- `Model.onModelClick` +- `ModelOptions.writeToParcel` +- `Orientation.writeToParcel` +- `PinConfiguration.equals` +- `PinConfiguration.hashCode` +- `PinConfiguration.writeToParcel` +- `Polygon.onPolygonClick` +- `PolygonOptions.writeToParcel` +- `Polyline.onPolylineClick` +- `PolylineOptions.writeToParcel` +- `Popover.altitudeMode` +- `Popover.anchorId` +- `Popover.anchorOffset` +- `Popover.autoCloseEnabled` +- `Popover.autoPanEnabled` +- `Popover.autoPanFn` +- `Popover.content` +- `Popover.hide` +- `Popover.isVisible` +- `Popover.positionAnchor` +- `Popover.removeFn` +- `Popover.toggle` +- `Validators.for.Anchorable` +- `Validators.for.Camera` +- `Validators.for.CameraRestriction` +- `Validators.for.FlyAroundOptions` +- `Validators.for.FlyToOptions` +- `Validators.for.Hole` +- `Validators.for.LatLngAltitude` +- `Validators.for.LatLngBounds` +- `Validators.for.Map3DOptions` +- `Validators.for.MarkerOptions` +- `Validators.for.ModelOptions` +- `Validators.for.Orientation` +- `Validators.for.PolygonOptions` +- `Validators.for.PolylineOptions` +- `Validators.for.PopoverOptions` +- `Validators.for.Vector3D` +- `Validators.for.requireNonNegative` +- `Validators.for.validateAltitude` +- `Validators.for.validateFinite` +- `Validators.for.validateHeading` +- `Validators.for.validateLatitude` +- `Validators.for.validateLongitude` +- `Validators.for.validateRange` +- `Validators.for.validateRoll` +- `Validators.for.validateTilt` +- `Vector3D.writeToParcel` + diff --git a/snippets/README.md b/snippets/README.md new file mode 100644 index 00000000..1fb8ac96 --- /dev/null +++ b/snippets/README.md @@ -0,0 +1,43 @@ +# Maps 3D Android Snippets + +A collection of standalone, extracting-ready code snippets demonstrating standard integration endpoints for the **Google Maps 3D SDK for Android**. + +## πŸ“‚ Code Layout + +The snippets are available in both **Kotlin** and **Java** module sets accurately: +- **Kotlin**: [`snippets/kotlin-app`](kotlin-app/src/main/java/com/example/snippets/kotlin/snippets) +- **Java**: [`snippets/java-app`](java-app/src/main/java/com/example/snippets/java/snippets) + +### **Thematic Topics Coverages** +- **`MapInitSnippets`**: Lifecycle initialization listeners and reading steady state intervals. +- **`CameraControlSnippets`**: Orchestrating animations with explicit coordination. +- **`PolygonSnippets` / `PolylineSnippets`**: Managing mesh geometry vector objects overlays. +- **`PopoverSnippets` / `MarkerSnippets`**: Static labels and dynamic 2D frames over 3D coordinates anchor bounds. + +--- + +## πŸ”¬ Architectural Design: The `TrackedMap3D` Decorator + +To maintain clean, lightweight extracted code extracts free from lifecycle clearing boilerplate setups, these snippets wrap `GoogleMap3D` in a **Decorator delegate** called **`TrackedMap3D`**: + +```kotlin +class TrackedMap3D(val delegate: GoogleMap3D, private val items: MutableList) { + fun addMarker(...) { + val marker = delegate.addMarker(...) + if (marker != null) items.add(marker) // Track reference for clearing + return marker + } +} +``` + +### **Why use a Delegate wrapper?** +When the layout detail launcher switches between snippets to preview live inside sample frame interfaces, `SnippetRegistry` clears tracked coordinates references accumulated from previous snippets cleanly to guarantee a fully interactive clean-slate coordinate frame every snapshot launch cycle iteratively. + +--- + +## πŸ“œ Full API Checklist Index +For absolute breakdowns of exact class function parameters, refer to the fully indexed checklist and matrix: + +πŸ‘‰ **[`CATALOG.md`](CATALOG.md)**: Standard Sample Concept Index +πŸ‘‰ **[`COVERAGE.md`](COVERAGE.md)**: API Coverage Matrix and missing deficits checklist + diff --git a/snippets/build.gradle.kts b/snippets/build.gradle.kts index ec9b12b7..950cdc10 100644 --- a/snippets/build.gradle.kts +++ b/snippets/build.gradle.kts @@ -14,11 +14,30 @@ * limitations under the License. */ -// 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.kotlin.android) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.secrets.gradle.plugin) apply false + id("com.diffplug.spotless") version "6.25.0" +} + +subprojects { + apply(plugin = "com.diffplug.spotless") + configure { + java { + target("**/*.java") + googleJavaFormat().aosp() + removeUnusedImports() + trimTrailingWhitespace() + endWithNewline() + } + kotlin { + target("**/*.kt") + ktlint().editorConfigOverride(mapOf("indent_size" to "4", "ktlint_function_naming_ignore_when_annotated_with" to "Composable")) + trimTrailingWhitespace() + endWithNewline() + } + } } diff --git a/snippets/common/src/main/res/drawable/arrow_back_24px.xml b/snippets/common/src/main/res/drawable/arrow_back_24px.xml new file mode 100644 index 00000000..1073c4f4 --- /dev/null +++ b/snippets/common/src/main/res/drawable/arrow_back_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/snippets/common/src/main/res/drawable/arrow_forward_24px.xml b/snippets/common/src/main/res/drawable/arrow_forward_24px.xml new file mode 100644 index 00000000..686f693e --- /dev/null +++ b/snippets/common/src/main/res/drawable/arrow_forward_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/snippets/common/src/main/res/drawable/photo_camera_24px.xml b/snippets/common/src/main/res/drawable/photo_camera_24px.xml new file mode 100644 index 00000000..a926b427 --- /dev/null +++ b/snippets/common/src/main/res/drawable/photo_camera_24px.xml @@ -0,0 +1,25 @@ + + + + diff --git a/snippets/common/src/main/res/drawable/restart_alt_24px.xml b/snippets/common/src/main/res/drawable/restart_alt_24px.xml new file mode 100644 index 00000000..0a8cde2d --- /dev/null +++ b/snippets/common/src/main/res/drawable/restart_alt_24px.xml @@ -0,0 +1,25 @@ + + + + diff --git a/snippets/common/src/main/res/layout/activity_map.xml b/snippets/common/src/main/res/layout/activity_map.xml index 053a06fe..e463be6f 100644 --- a/snippets/common/src/main/res/layout/activity_map.xml +++ b/snippets/common/src/main/res/layout/activity_map.xml @@ -1,3 +1,4 @@ + - + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snippets/java-app/src/androidTest/java/com/example/snippets/java/ExampleInstrumentedTest.java b/snippets/java-app/src/androidTest/java/com/example/snippets/java/ExampleInstrumentedTest.java deleted file mode 100644 index 1b6bbad3..00000000 --- a/snippets/java-app/src/androidTest/java/com/example/snippets/java/ExampleInstrumentedTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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. - * 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.example.snippets.java; - -import androidx.test.ext.junit.rules.ActivityScenarioRule; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Rule - public ActivityScenarioRule activityRule = - new ActivityScenarioRule<>(MainActivity.class); - - @Test - public void useAppContext() { - // Context of the app under test. - String packageName = InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName(); - assertEquals("com.example.snippets.java", packageName); - } -} diff --git a/snippets/java-app/src/androidTest/java/com/example/snippets/java/MapActivityTest.java b/snippets/java-app/src/androidTest/java/com/example/snippets/java/MapActivityTest.java deleted file mode 100644 index bb564524..00000000 --- a/snippets/java-app/src/androidTest/java/com/example/snippets/java/MapActivityTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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. - * 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.example.snippets.java; - -import androidx.test.core.app.ActivityScenario; -import androidx.test.ext.junit.runners.AndroidJUnit4; -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 com.example.snippets.java.MapActivity; // Implicitly imported if in same package but good to be explicit or if names collide - -@RunWith(AndroidJUnit4.class) -public class MapActivityTest { - - @Test - public void mapActivityLaunches() { - try (ActivityScenario scenario = ActivityScenario.launch(MapActivity.class)) { - // Check if map view is displayed - // R.id.map is in com.example.snippets.common.R - onView(withId(com.example.snippets.common.R.id.map)).check(matches(isDisplayed())); - } - } -} diff --git a/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetDiscoveryTest.java b/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetDiscoveryTest.java new file mode 100644 index 00000000..c7686488 --- /dev/null +++ b/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetDiscoveryTest.java @@ -0,0 +1,53 @@ +/* + * 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. + * 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.example.snippets.java; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class SnippetDiscoveryTest { + + @Test + public void verifySnippetGroupsLoaded() { + // Use the application context for scanning if needed, although scanning currently triggers + // from + // local setup + List groups = SnippetRegistry.getSnippetGroups(); + + assertNotNull("Snippet groups list should not be null", groups); + assertFalse("Snippet groups list should not be empty", groups.isEmpty()); + + for (SnippetGroupInfo group : groups) { + assertNotNull("Group title should not be null", group.getTitle()); + assertFalse("Group title should not be empty", group.getTitle().isEmpty()); + assertFalse( + "Group '" + group.getTitle() + "' must have items", group.getItems().isEmpty()); + + for (SnippetItemInfo item : group.getItems()) { + assertNotNull("Snippet title should not be null", item.getTitle()); + assertFalse("Snippet title should not be empty", item.getTitle().isEmpty()); + assertNotNull("Snippet description should not be null", item.getDescription()); + } + } + } +} diff --git a/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetRunTest.java b/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetRunTest.java index bb86eeac..665b63bf 100644 --- a/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetRunTest.java +++ b/snippets/java-app/src/androidTest/java/com/example/snippets/java/SnippetRunTest.java @@ -16,21 +16,20 @@ package com.example.snippets.java; +import static org.junit.Assert.fail; + import android.content.Context; import android.content.Intent; import androidx.test.core.app.ActivityScenario; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; +import com.example.snippets.common.R; import com.google.android.gms.maps3d.Map3DView; -import org.junit.Test; -import org.junit.runner.RunWith; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.Set; - -import static org.junit.Assert.fail; -import static org.junit.Assert.assertNotNull; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SnippetRunTest { @@ -47,13 +46,14 @@ public void verifyAllSnippetsLaunchWithoutCrash() { try (ActivityScenario scenario = ActivityScenario.launch(intent)) { CountDownLatch latch = new CountDownLatch(1); - scenario.onActivity(activity -> { - // Verify map view exists - Map3DView map = activity.findViewById(com.example.snippets.common.R.id.map); - if (map != null) { - latch.countDown(); - } - }); + scenario.onActivity( + activity -> { + // Verify map view exists + Map3DView map = activity.findViewById(R.id.map); + if (map != null) { + latch.countDown(); + } + }); if (!latch.await(5, TimeUnit.SECONDS)) { fail("Map3DView not found or activity timeout for snippet: " + snippetTitle); } diff --git a/snippets/java-app/src/main/AndroidManifest.xml b/snippets/java-app/src/main/AndroidManifest.xml index d6b6997b..6e0becd9 100644 --- a/snippets/java-app/src/main/AndroidManifest.xml +++ b/snippets/java-app/src/main/AndroidManifest.xml @@ -30,7 +30,8 @@ tools:targetApi="31"> + android:exported="true" + android:launchMode="singleTask"> @@ -40,7 +41,8 @@ + android:label="Snippet Demo" + android:theme="@style/Theme.Snippets.Map" /> diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/JavaSnippetsActivity.java b/snippets/java-app/src/main/java/com/example/snippets/java/JavaSnippetsActivity.java index ba27d9f6..85389227 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/JavaSnippetsActivity.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/JavaSnippetsActivity.java @@ -18,16 +18,14 @@ import android.content.Intent; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import java.util.ArrayList; -import java.util.List; - import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import java.util.List; public class JavaSnippetsActivity extends AppCompatActivity { @@ -40,19 +38,25 @@ protected void onCreate(Bundle savedInstanceState) { RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); - ViewCompat.setOnApplyWindowInsetsListener(recyclerView, (v, windowInsets) -> { - Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, insets.top, insets.right, insets.bottom); - return WindowInsetsCompat.CONSUMED; - }); - - List snippets = new ArrayList<>(SnippetRegistry.snippets.values()); - - SnippetAdapter adapter = new SnippetAdapter(snippets, snippet -> { - Intent intent = new Intent(this, MapActivity.class); - intent.putExtra(MapActivity.EXTRA_SNIPPET_TITLE, snippet.title); - startActivity(intent); - }); + ViewCompat.setOnApplyWindowInsetsListener( + recyclerView, + (v, windowInsets) -> { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(insets.left, insets.top, insets.right, insets.bottom); + return WindowInsetsCompat.CONSUMED; + }); + + List groups = SnippetRegistry.getSnippetGroups(); + + SnippetGroupAdapter adapter = + new SnippetGroupAdapter( + groups, + item -> { + Intent intent = new Intent(this, MapActivity.class); + intent.putExtra("group_title", item.getGroupTitle()); + intent.putExtra(MapActivity.EXTRA_SNIPPET_TITLE, item.getTitle()); + startActivity(intent); + }); recyclerView.setAdapter(adapter); } } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/MapActivity.java b/snippets/java-app/src/main/java/com/example/snippets/java/MapActivity.java index 13062471..56c330a6 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/MapActivity.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/MapActivity.java @@ -17,126 +17,243 @@ package com.example.snippets.java; import android.os.Bundle; -import androidx.activity.EdgeToEdge; - +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.widget.Toast; +import androidx.activity.EdgeToEdge; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import com.example.snippets.common.R; import com.google.android.gms.maps3d.GoogleMap3D; - +import com.google.android.gms.maps3d.Map3DView; import com.google.android.gms.maps3d.OnMap3DViewReadyCallback; - -import com.example.snippets.common.R; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.LatLngAltitude; +import java.util.ArrayList; +import java.util.List; public class MapActivity extends AppCompatActivity { - public static final String EXTRA_SNIPPET_TITLE = "snippet_title"; - - private com.google.android.gms.maps3d.Map3DView map3DView; - - private boolean triggered = false; - - private String snippetTitle; - private GoogleMap3D map; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_map); - map3DView = findViewById(R.id.map); - map3DView.onCreate(savedInstanceState); - - snippetTitle = getIntent().getStringExtra(EXTRA_SNIPPET_TITLE); - map3DView.getMap3DViewAsync(new OnMap3DViewReadyCallback() { - @Override - public void onMap3DViewReady(@NonNull GoogleMap3D map) { - MapActivity.this.map = map; - Log.w("MapActivity", "onMap3DViewReady" + map); - - runSnippet(); // <-- This will fail if the map is not ready - - map.setOnMapReadyListener(sceneReadiness -> { - if (!triggered && sceneReadiness >= 99.0) { - Log.w("MapActivity", "onMapReady sceneReadiness: " + sceneReadiness); - triggered = true; - runSnippet(); // <-- This will only be called the first time the map is ready - } - }); - } - - @Override - public void onError(@NonNull Exception error) { - runOnUiThread(() -> Toast.makeText(MapActivity.this, "Map Error: " + error.getMessage(), Toast.LENGTH_LONG).show()); - } - }); - } - - protected void runSnippet() { - // Map is ready - if (snippetTitle != null) { - Snippet snippet = SnippetRegistry.snippets.get(snippetTitle); - if (snippet != null) { - try { - snippet.action.execute(MapActivity.this, map); - runOnUiThread(() -> Toast.makeText(MapActivity.this, "Running: " + snippetTitle, Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - runOnUiThread(() -> Toast.makeText(MapActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show()); - e.printStackTrace(); + public static final String EXTRA_SNIPPET_TITLE = "snippet_title"; + + private Map3DView map3DView; + + private String snippetTitle; + private String groupTitle; + private GoogleMap3D map; + private int currentIndex = -1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_map); + map3DView = findViewById(R.id.map); + map3DView.onCreate(savedInstanceState); + + findViewById(R.id.snapshot_button) + .setOnClickListener( + v -> { + if (map != null) { + Camera cam = map.getCamera(); + if (cam != null) { + LatLngAltitude center = cam.getCenter(); + double rawHeading = + cam.getHeading() != null ? cam.getHeading() : 0.0; + double heading = (rawHeading % 360.0 + 360.0) % 360.0; + + double rawRoll = cam.getRoll() != null ? cam.getRoll() : 0.0; + double roll = rawRoll == -0.0 ? 0.0 : rawRoll; + + Log.d( + "MapActivity", + String.format( + "Camera Pose:\ncenter = latLngAltitude {\n latitude = %.6f\n longitude = %.6f\n altitude = %.2f\n}\ntilt = %.2f\nheading = %.2f\nrange = %.2f\nroll = %.2f", + center.getLatitude(), + center.getLongitude(), + center.getAltitude(), + cam.getTilt() != null ? cam.getTilt() : 0.0, + heading, + cam.getRange() != null ? cam.getRange() : 0.0, + roll)); + } + } else { + Log.d("MapActivity", "Map NOT initialized yet"); + } + }); + + findViewById(R.id.reset_view_button).setOnClickListener(v -> runSnippet()); + + groupTitle = getIntent().getStringExtra("group_title"); + snippetTitle = getIntent().getStringExtra(EXTRA_SNIPPET_TITLE); + final List snippetList = new ArrayList<>(); + for (SnippetGroupInfo group : SnippetRegistry.getSnippetGroups()) { + snippetList.addAll(group.getItems()); + } + for (int i = 0; i < snippetList.size(); i++) { + SnippetItemInfo item = snippetList.get(i); + if (item.getTitle().equals(snippetTitle) + && (groupTitle == null || item.getGroupTitle().equals(groupTitle))) { + currentIndex = i; + break; + } + } + + findViewById(R.id.previous_button) + .setOnClickListener( + v -> { + if (snippetList.isEmpty()) return; + if (currentIndex > 0) { + currentIndex--; + } else { + currentIndex = snippetList.size() - 1; + } + SnippetItemInfo item = snippetList.get(currentIndex); + groupTitle = item.getGroupTitle(); + snippetTitle = item.getTitle(); + runSnippet(); + }); + + findViewById(R.id.next_button) + .setOnClickListener( + v -> { + if (snippetList.isEmpty()) return; + if (currentIndex < snippetList.size() - 1) { + currentIndex++; + } else { + currentIndex = 0; + } + SnippetItemInfo item = snippetList.get(currentIndex); + groupTitle = item.getGroupTitle(); + snippetTitle = item.getTitle(); + runSnippet(); + }); + + map3DView.getMap3DViewAsync( + new OnMap3DViewReadyCallback() { + @Override + public void onMap3DViewReady(@NonNull GoogleMap3D map) { + MapActivity.this.map = map; + Log.w("MapActivity", "onMap3DViewReady " + map); + + // Simple 3-second delay to bypass readiness bugs as requested + runSnippet(); + } + + @Override + public void onError(@NonNull Exception error) { + runOnUiThread( + () -> + Toast.makeText( + MapActivity.this, + "Map Error: " + error.getMessage(), + Toast.LENGTH_LONG) + .show()); + } + }); + } + + protected void runSnippet() { + if (snippetTitle != null) { + String key = groupTitle != null ? groupTitle + " - " + snippetTitle : snippetTitle; + SnippetItemInfo snippet = SnippetRegistry.snippets.get(key); + if (snippet == null) { + // Fallback linear scan + for (SnippetGroupInfo g : SnippetRegistry.getSnippetGroups()) { + for (SnippetItemInfo item : g.getItems()) { + if (item.getTitle().equals(snippetTitle)) { + snippet = item; + break; + } + } + } + } + final SnippetItemInfo finalSnippet = snippet; + if (finalSnippet != null) { + SnippetRegistry.clearTrackedItems(); + // 3 second delay + new Handler(Looper.getMainLooper()) + .postDelayed( + () -> { + try { + finalSnippet.getAction().execute(MapActivity.this, map); + runOnUiThread( + () -> + Toast.makeText( + MapActivity.this, + finalSnippet.getGroupTitle() + + ": " + + finalSnippet + .getTitle() + + ".\n" + + finalSnippet + .getDescription(), + Toast.LENGTH_LONG) + .show()); + } catch (Exception e) { + runOnUiThread( + () -> + Toast.makeText( + MapActivity.this, + "Error: " + e.getMessage(), + Toast.LENGTH_LONG) + .show()); + e.printStackTrace(); + } + }, + 3000); + } else { + runOnUiThread( + () -> + Toast.makeText( + MapActivity.this, + "Snippet not found: " + snippetTitle, + Toast.LENGTH_LONG) + .show()); + } } - } else { - runOnUiThread(() -> Toast.makeText(MapActivity.this, "Snippet not found: " + snippetTitle, Toast.LENGTH_LONG).show()); - } } - } - - @Override - protected void onStart() { - super.onStart(); - if (map3DView != null) - map3DView.onStart(); - } - - @Override - protected void onResume() { - super.onResume(); - if (map3DView != null) - map3DView.onResume(); - } - - @Override - protected void onPause() { - if (map3DView != null) - map3DView.onPause(); - super.onPause(); - } - - @Override - protected void onStop() { - if (map3DView != null) - map3DView.onStop(); - super.onStop(); - } - - @Override - protected void onDestroy() { - if (map3DView != null) - map3DView.onDestroy(); - super.onDestroy(); - } - - @Override - public void onLowMemory() { - super.onLowMemory(); - if (map3DView != null) - map3DView.onLowMemory(); - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - if (map3DView != null) - map3DView.onSaveInstanceState(outState); - } + + @Override + protected void onStart() { + super.onStart(); + if (map3DView != null) map3DView.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + if (map3DView != null) map3DView.onResume(); + } + + @Override + protected void onPause() { + if (map3DView != null) map3DView.onPause(); + super.onPause(); + } + + @Override + protected void onStop() { + if (map3DView != null) map3DView.onStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + if (map3DView != null) map3DView.onDestroy(); + super.onDestroy(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + if (map3DView != null) map3DView.onLowMemory(); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (map3DView != null) map3DView.onSaveInstanceState(outState); + } } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetAdapter.java b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetAdapter.java deleted file mode 100644 index 15ea3386..00000000 --- a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetAdapter.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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. - * 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.example.snippets.java; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import java.util.List; - -public class SnippetAdapter extends RecyclerView.Adapter { - - private final List snippets; - private final OnItemClickListener listener; - - public interface OnItemClickListener { - void onItemClick(Snippet snippet); - } - - public SnippetAdapter(List snippets, OnItemClickListener listener) { - this.snippets = snippets; - this.listener = listener; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.list_item_snippet, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - holder.bind(snippets.get(position), listener); - } - - @Override - public int getItemCount() { - return snippets.size(); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - private final TextView title; - private final TextView description; - - public ViewHolder(@NonNull View itemView) { - super(itemView); - title = itemView.findViewById(R.id.title); - description = itemView.findViewById(R.id.description); - } - - public void bind(final Snippet snippet, final OnItemClickListener listener) { - title.setText(snippet.title); - description.setText(snippet.description); - itemView.setOnClickListener(v -> listener.onItemClick(snippet)); - } - } -} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupAdapter.java b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupAdapter.java new file mode 100644 index 00000000..13ef2005 --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupAdapter.java @@ -0,0 +1,149 @@ +/* + * 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. + * 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.example.snippets.java; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** Adapter supporting grouped category headers and snippet items representing the hierarchy. */ +public class SnippetGroupAdapter extends RecyclerView.Adapter { + + private static final int TYPE_HEADER = 0; + private static final int TYPE_ITEM = 1; + + private final List items = new ArrayList<>(); + private final List groups; + private final Set expandedGroups = new HashSet<>(); + private final OnItemClickListener listener; + + public interface OnItemClickListener { + void onItemClick(SnippetItemInfo item); + } + + public SnippetGroupAdapter(List groups, OnItemClickListener listener) { + this.groups = groups; + this.listener = listener; + // All groups expanded by default + for (SnippetGroupInfo group : groups) { + expandedGroups.add(group.getTitle()); + } + rebuildItems(); + } + + private void rebuildItems() { + items.clear(); + for (SnippetGroupInfo group : groups) { + items.add(group); // Header + if (expandedGroups.contains(group.getTitle())) { + items.addAll(group.getItems()); // Sub-items + } + } + } + + @Override + public int getItemViewType(int position) { + if (items.get(position) instanceof SnippetGroupInfo) { + return TYPE_HEADER; + } else { + return TYPE_ITEM; + } + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == TYPE_HEADER) { + View view = + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_item_group_header, parent, false); + return new HeaderViewHolder(view); + } else { + View view = + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_item_snippet, parent, false); + return new ItemViewHolder(view); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (getItemViewType(position) == TYPE_HEADER) { + SnippetGroupInfo group = (SnippetGroupInfo) items.get(position); + boolean isExpanded = expandedGroups.contains(group.getTitle()); + ((HeaderViewHolder) holder) + .bind( + group, + isExpanded, + v -> { + if (isExpanded) { + expandedGroups.remove(group.getTitle()); + } else { + expandedGroups.add(group.getTitle()); + } + rebuildItems(); + notifyDataSetChanged(); + }); + } else { + ((ItemViewHolder) holder).bind((SnippetItemInfo) items.get(position), listener); + } + } + + @Override + public int getItemCount() { + return items.size(); + } + + static class HeaderViewHolder extends RecyclerView.ViewHolder { + private final TextView headerTitle; + + public HeaderViewHolder(@NonNull View itemView) { + super(itemView); + headerTitle = itemView.findViewById(R.id.headerTitle); + } + + public void bind( + SnippetGroupInfo group, boolean isExpanded, View.OnClickListener clickListener) { + headerTitle.setText((isExpanded ? "β–Ό " : "β–Ά ") + group.getTitle()); + itemView.setOnClickListener(clickListener); + } + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + private final TextView title; + private final TextView description; + + public ItemViewHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + description = itemView.findViewById(R.id.description); + } + + public void bind(final SnippetItemInfo item, final OnItemClickListener listener) { + title.setText(item.getTitle()); + description.setText(item.getDescription()); + itemView.setOnClickListener(v -> listener.onItemClick(item)); + } + } +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupInfo.java b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupInfo.java new file mode 100644 index 00000000..551af34a --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetGroupInfo.java @@ -0,0 +1,44 @@ +/* + * 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. + * 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.example.snippets.java; + +import java.util.List; + +/** Model class containing metadata and items for a grouped category of snippets. */ +public class SnippetGroupInfo { + private final String title; + private final String description; + private final List items; + + public SnippetGroupInfo(String title, String description, List items) { + this.title = title; + this.description = description; + this.items = items; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public List getItems() { + return items; + } +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetItemInfo.java b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetItemInfo.java new file mode 100644 index 00000000..a0c2011a --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetItemInfo.java @@ -0,0 +1,49 @@ +/* + * 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. + * 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.example.snippets.java; + +/** Model class containing metadata and execution logic for an individual snippet item. */ +public class SnippetItemInfo { + private final String title; + private final String description; + private final String groupTitle; + private final SnippetAction action; + + public SnippetItemInfo( + String title, String description, String groupTitle, SnippetAction action) { + this.title = title; + this.description = description; + this.groupTitle = groupTitle; + this.action = action; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getGroupTitle() { + return groupTitle; + } + + public SnippetAction getAction() { + return action; + } +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java index 3ef15ea7..ef38592e 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/SnippetRegistry.java @@ -16,85 +16,122 @@ package com.example.snippets.java; +import android.content.Context; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.example.snippets.java.snippets.*; - +import com.google.android.gms.maps3d.Popover; +import com.google.android.gms.maps3d.model.Marker; +import com.google.android.gms.maps3d.model.Model; +import com.google.android.gms.maps3d.model.Polygon; +import com.google.android.gms.maps3d.model.Polyline; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; public class SnippetRegistry { - public static final Map snippets = new LinkedHashMap<>(); - - static { - registerSnippet("Map Initialization - Listeners", - "Initializes a 3D map and logs events when the scene is ready (100% loaded) and steady (camera stopped moving).", - (context, map) -> new MapInitSnippets().setupMapListeners(context, map)); - - registerSnippet("Camera - Fly To", - "Animates the camera to a specific position (Lat: 37.422, Lng: -122.084, Alt: 100m) with a 45-degree tilt and 90-degree heading over 5 seconds.", - (context, map) -> new CameraControlSnippets(map).flyCameraToPosition()); - - registerSnippet("Camera - Fly Around", - "Rotates the camera 360 degrees around a specific location (Lat: 37.422, Lng: -122.084) over 10 seconds.", - (context, map) -> new CameraControlSnippets(map).flyCameraAroundLocation()); - - registerSnippet("Camera - Stop Animation", - "Stops any currently running camera animation immediately.", - (context, map) -> new CameraControlSnippets(map).stopAnimation()); - - registerSnippet("Camera - Listen Events", - "Logs camera change events to the console, printing the center coordinates as the camera moves.", - (context, map) -> new CameraControlSnippets(map).listenToCameraEvents()); - - registerSnippet("Markers - Basic", - "Adds a standard marker at Lat: 37.422, Lng: -122.084, Alt: 10m.", - (context, map) -> new MarkerSnippets(map).addBasicMarker()); - - registerSnippet("Markers - Advanced", - "Adds a 'Priority Marker' at Lat: 37.422, Lng: -122.084, Alt: 10m (Relative to Ground) that is extruded and collides with other markers.", - (context, map) -> new MarkerSnippets(map).addAdvancedMarker()); - - registerSnippet("Markers - Click", - "Adds a marker at Lat: 37.42, Lng: -122.08 that logs a message when clicked.", - (context, map) -> new MarkerSnippets(map).handleMarkerClick()); - registerSnippet("Polygons - Basic", - "Draws a red polygon with a blue stroke around a small area near Lat: 37.42, Lng: -122.08.", - (context, map) -> new PolygonSnippets(map).addBasicPolygon()); - - registerSnippet("Polygons - Extruded", - "Draws a semi-transparent red extruded polygon (height 50m) around a small area near Lat: 37.42, Lng: -122.08.", - (context, map) -> new PolygonSnippets(map).addExtrudedPolygon()); - - registerSnippet("Polylines - Basic", - "Draws a thick red polyline connecting three points near Lat: 37.42, Lng: -122.08.", - (context, map) -> new PolylineSnippets(map).addBasicPolyline()); - - registerSnippet("Polylines - Styled", - "Draws a magenta polyline with a green outline, extruded and following the ground curvature (geodesic), connecting two points.", - (context, map) -> new PolylineSnippets(map).addStyledPolyline()); - - registerSnippet("Models - Basic", - "Loads a GLB model from a URL (https://example.com/model.glb) and places it clamped to the ground at Lat: 37.422, Lng: -122.084.", - (context, map) -> new ModelSnippets(map).addBasicModel()); - - registerSnippet("Models - Advanced", - "Loads a GLB model from assets (my_model.glb), scales it by 2x, rotates it, and places it at 10m relative altitude.", - (context, map) -> new ModelSnippets(map).addAdvancedModel()); - - registerSnippet("Popovers - Marker", - "Adds a 'Hello Popover!' text bubble anchored to a marker at Lat: 37.422, Lng: -122.084.", - (context, map) -> new PopoverSnippets(context, map).addPopoverToMarker()); + private static final List addedElements = new ArrayList<>(); + + public static void clearTrackedItems() { + for (Object item : addedElements) { + try { + if (item instanceof Marker) ((Marker) item).remove(); + else if (item instanceof Polyline) ((Polyline) item).remove(); + else if (item instanceof Polygon) ((Polygon) item).remove(); + else if (item instanceof Model) ((Model) item).remove(); + else if (item instanceof Popover) ((Popover) item).remove(); + } catch (Exception e) { + /* ignore */ + } + } + addedElements.clear(); + } - registerSnippet("Popovers - Configured", - "Adds an 'Info' popover anchored to a marker at [0,0] with auto-close enabled and auto-pan disabled.", - (context, map) -> new PopoverSnippets(context, map).addConfiguredPopover()); + private static final List> snippetClasses = + Arrays.asList( + MapInitSnippets.class, + CameraControlSnippets.class, + MarkerSnippets.class, + PolygonSnippets.class, + PolylineSnippets.class, + ModelSnippets.class, + PopoverSnippets.class, + PlaceSnippets.class); + + /** Scans annotated classes to build the hierarchical snippet model. */ + public static List getSnippetGroups() { + List groups = new ArrayList<>(); + + for (Class clazz : snippetClasses) { + SnippetGroup groupAnnotation = clazz.getAnnotation(SnippetGroup.class); + if (groupAnnotation == null) continue; + + List items = new ArrayList<>(); + + for (Method method : clazz.getDeclaredMethods()) { + SnippetItem itemAnnotation = method.getAnnotation(SnippetItem.class); + if (itemAnnotation == null) continue; + + items.add( + new SnippetItemInfo( + itemAnnotation.title(), + itemAnnotation.description(), + groupAnnotation.title(), + (context, map) -> { + try { + TrackedMap3D trackedMap = + new TrackedMap3D(map, addedElements); + Object instance = + createInstance(clazz, context, trackedMap); + if (method.getParameterCount() == 0) { + method.invoke(instance); + } else if (method.getParameterCount() == 1 + && method.getParameterTypes()[0] == Context.class) { + method.invoke(instance, context); + } + } catch (Exception e) { + e.printStackTrace(); + } + })); + } + + if (!items.isEmpty()) { + items.sort(Comparator.comparing(SnippetItemInfo::getTitle)); + groups.add( + new SnippetGroupInfo( + groupAnnotation.title(), groupAnnotation.description(), items)); + } + } + return groups; + } - registerSnippet("Places - Listen Clicks", - "Sets up a listener that logs the Place ID when a user clicks on a 3D building or POI.", - (context, map) -> new PlaceSnippets(map).listenToPlaceClicks()); + private static Object createInstance(Class clazz, Context context, TrackedMap3D map) + throws Exception { + try { + return clazz.getConstructor(Context.class, TrackedMap3D.class) + .newInstance(context, map); + } catch (NoSuchMethodException e1) { + try { + return clazz.getConstructor(TrackedMap3D.class).newInstance(map); + } catch (NoSuchMethodException e2) { + return clazz.getConstructor().newInstance(); + } + } } - private static void registerSnippet(String title, String description, SnippetAction action) { - snippets.put(title, new Snippet(title, description, action)); + // Legacy support for Activities during refactoring + public static final Map snippets = new LinkedHashMap<>(); + + static { + for (SnippetGroupInfo group : getSnippetGroups()) { + for (SnippetItemInfo item : group.getItems()) { + snippets.put(group.getTitle() + " - " + item.getTitle(), item); + } + } } } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java b/snippets/java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java new file mode 100644 index 00000000..3a685dd3 --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/TrackedMap3D.java @@ -0,0 +1,125 @@ +/* + * 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. + * 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.example.snippets.java; + +import com.google.android.gms.maps3d.GoogleMap3D; +import com.google.android.gms.maps3d.OnCameraChangedListener; +import com.google.android.gms.maps3d.OnMap3DClickListener; +import com.google.android.gms.maps3d.OnMapReadyListener; +import com.google.android.gms.maps3d.OnMapSteadyListener; +import com.google.android.gms.maps3d.Popover; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.CameraRestriction; +import com.google.android.gms.maps3d.model.FlyAroundOptions; +import com.google.android.gms.maps3d.model.FlyToOptions; +import com.google.android.gms.maps3d.model.Marker; +import com.google.android.gms.maps3d.model.MarkerOptions; +import com.google.android.gms.maps3d.model.Model; +import com.google.android.gms.maps3d.model.ModelOptions; +import com.google.android.gms.maps3d.model.Polygon; +import com.google.android.gms.maps3d.model.PolygonOptions; +import com.google.android.gms.maps3d.model.Polyline; +import com.google.android.gms.maps3d.model.PolylineOptions; +import com.google.android.gms.maps3d.model.PopoverOptions; +import java.util.List; + +/** Decorator wrapper around GoogleMap3D to track elements added during a snippet session. */ +public class TrackedMap3D { + + private final GoogleMap3D delegate; + private final List items; + + public TrackedMap3D(GoogleMap3D delegate, List items) { + this.delegate = delegate; + this.items = items; + } + + public Marker addMarker(MarkerOptions options) { + Marker marker = delegate.addMarker(options); + if (marker != null) items.add(marker); + return marker; + } + + public Polyline addPolyline(PolylineOptions options) { + Polyline polyline = delegate.addPolyline(options); + if (polyline != null) items.add(polyline); + return polyline; + } + + public Polygon addPolygon(PolygonOptions options) { + Polygon polygon = delegate.addPolygon(options); + if (polygon != null) items.add(polygon); + return polygon; + } + + public Model addModel(ModelOptions options) { + Model model = delegate.addModel(options); + if (model != null) items.add(model); + return model; + } + + public Popover addPopover(PopoverOptions options) { + Popover popover = delegate.addPopover(options); + if (popover != null) items.add(popover); + return popover; + } + + public void setCamera(Camera camera) { + delegate.setCamera(camera); + } + + public void setCameraChangedListener(OnCameraChangedListener listener) { + delegate.setCameraChangedListener(listener); + } + + public void setMap3DClickListener(OnMap3DClickListener listener) { + delegate.setMap3DClickListener(listener); + } + + public void flyCameraAround(FlyAroundOptions options) { + delegate.flyCameraAround(options); + } + + // Pass-through standard map calls if any are invoked inside snippets + public Camera getCamera() { + return delegate.getCamera(); + } + + public void stopCameraAnimation() { + delegate.stopCameraAnimation(); + } + + public void flyCameraTo(FlyToOptions options) { + delegate.flyCameraTo(options); + } + + public void setOnMapReadyListener(OnMapReadyListener listener) { + delegate.setOnMapReadyListener(listener); + } + + public void setOnMapSteadyListener(OnMapSteadyListener listener) { + delegate.setOnMapSteadyListener(listener); + } + + public void setCameraRestriction(CameraRestriction restriction) { + delegate.setCameraRestriction(restriction); + } + + public CameraRestriction getCameraRestriction() { + return delegate.getCameraRestriction(); + } +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetGroup.java b/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetGroup.java new file mode 100644 index 00000000..129ed2c1 --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetGroup.java @@ -0,0 +1,37 @@ +/* + * 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. + * 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.example.snippets.java.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** Marks a class containing multiple snippet methods with category metadata. */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface SnippetGroup { + /** + * @return The displayed title for this snippet category. + */ + String title(); + + /** + * @return A brief explanation of what the category contains. + */ + String description() default ""; +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetItem.java b/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetItem.java new file mode 100644 index 00000000..f6e96dbf --- /dev/null +++ b/snippets/java-app/src/main/java/com/example/snippets/java/annotations/SnippetItem.java @@ -0,0 +1,37 @@ +/* + * 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. + * 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.example.snippets.java.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** Marks a method inside a [SnippetGroup] with execution metadata. */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SnippetItem { + /** + * @return The displayed title for this individual snippet action. + */ + String title(); + + /** + * @return A brief explanation of what the snippet achieves. + */ + String description() default ""; +} diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java index 00b907a6..6b730f9c 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/CameraControlSnippets.java @@ -16,103 +16,175 @@ package com.example.snippets.java.snippets; -import androidx.annotation.NonNull; - import android.os.Handler; import android.os.Looper; import android.util.Log; -import com.google.android.gms.maps3d.GoogleMap3D; -import com.google.android.gms.maps3d.OnCameraChangedListener; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.CameraRestriction; import com.google.android.gms.maps3d.model.FlyAroundOptions; import com.google.android.gms.maps3d.model.FlyToOptions; import com.google.android.gms.maps3d.model.LatLngAltitude; +import com.google.android.gms.maps3d.model.LatLngBounds; +@SnippetGroup( + title = "Camera", + description = "Snippets demonstrating dynamic camera orchestration and animations.") public class CameraControlSnippets { - private final GoogleMap3D map; + private final TrackedMap3D map; - public CameraControlSnippets(GoogleMap3D map) { + public CameraControlSnippets(TrackedMap3D map) { this.map = map; } // [START maps_android_3d_camera_fly_to_java] - /** - * Animates the camera to a specific position (coordinates, heading, tilt) over - * a duration. - */ + /** Animates the camera to a specific position (coordinates, heading, tilt) over a duration. */ + @SnippetItem( + title = "1. Fly To", + description = + "Animates the camera to a specific position with a tilt and heading over 5 seconds.") public void flyCameraToPosition() { - LatLngAltitude center = new LatLngAltitude(37.4220, -122.0841, 100.0); + LatLngAltitude center = new LatLngAltitude(38.743829, -109.499512, 1460.37); // Create a target camera: - // center: LatLngAltitude target - // heading: 90.0 (East) - Orient the user to look towards the sunrise/East. - // tilt: 45.0 degrees - An angled view reveals the 3D extrusion of models and - // terrain, unlike a flat top-down view (0.0). - // roll: 0.0 - Keep the horizon level for a standard perspective. - // range: 1000.0 meters - A moderate distance that provides a good view of a - // localized neighborhood or landmark cluster without losing context. - Camera targetCamera = new Camera(center, 90.0, 45.0, 0.0, 1000.0); + Camera targetCamera = new Camera(center, 338.52, 76.16, 0.0, 191.71); // FlyToOptions constructor: endCamera, durationInMillis FlyToOptions options = new FlyToOptions(targetCamera, 5000L); map.flyCameraTo(options); } + // [END maps_android_3d_camera_fly_to_java] - // [START maps_android_3d_camera_fly_around_java] - /** - * Orbits the camera around a specific location. - */ + /** Orbits the camera around a specific location. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Fly Around", + description = + "Rotates the camera 360 degrees around a specific location over 10 seconds.") public void flyCameraAroundLocation() { - LatLngAltitude center = new LatLngAltitude(37.4220, -122.0841, 0.0); + // [START maps_android_3d_camera_fly_around_java] + LatLngAltitude center = new LatLngAltitude(38.743502, -109.499374, 1467.0); // Create a target camera: - // center: LatLngAltitude target - // heading: 0.0 (North) - Start the orbit facing North. - // tilt: 45.0 degrees - Maintain an angled view to appreciate the 3D subject - // during the orbit. - // roll: 0.0 - Keep the horizon level. - // range: 500.0 meters - A closer range (compared to flyTo) keeps the subject - // large and central during the cinematic rotation. - Camera targetCamera = new Camera(center, 0.0, 45.0, 0.0, 500.0); + Camera targetCamera = new Camera(center, 349.6, 58.1, 0.0, 138.2); // Orbit around the target // FlyAroundOptions constructor: center, durationInMillis, rounds - FlyAroundOptions options = new FlyAroundOptions(targetCamera, 10000L, 1.0); - - map.flyCameraAround(options); + FlyAroundOptions options = new FlyAroundOptions(targetCamera, 6000L, 2.0); + + // Although not completely necessary, the experience will be usually be better by + // waiting for the camera to steady before starting the flyCameraAround + map.setCamera(targetCamera); + + map.setOnMapSteadyListener( + isSteady -> { + if (isSteady) { + map.setOnMapSteadyListener(null); // Cleanup + map.flyCameraAround(options); + } + }); + // [END maps_android_3d_camera_fly_around_java] } - // [END maps_android_3d_camera_fly_around_java] - // [START maps_android_3d_camera_stop_java] - /** - * Stops the current camera animation. - */ + /** Stops the current camera animation. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "3. Stop Animation", + description = "Stops any currently running camera animation immediately.") public void stopAnimation() { - LatLngAltitude center = new LatLngAltitude(37.4220, -122.0841, 0.0); - Camera targetCamera = new Camera(center, 0.0, 45.0, 0.0, 500.0); - FlyAroundOptions options = new FlyAroundOptions(targetCamera, 30000L, 10.0); + // [START maps_android_3d_camera_stop_java] + LatLngAltitude center = new LatLngAltitude(38.743502, -109.499374, 1467.0); + Camera targetCamera = new Camera(center, 349.6, 58.1, 0.0, 138.2); - // 1. Start an animation so we have something to stop - map.flyCameraAround(options); + // 1. Start a perpetual flyAround animation so we have something to stop + map.flyCameraAround(new FlyAroundOptions(targetCamera, 30000L, 10.0)); - // 2. Schedule the stop command after 3000ms (3 seconds) - new Handler(Looper.getMainLooper()).postDelayed(map::stopCameraAnimation, 3000); + // 2. Schedule the stop command after 2 seconds + new Handler(Looper.getMainLooper()).postDelayed(map::stopCameraAnimation, 2000); + // [END maps_android_3d_camera_stop_java] } - // [END maps_android_3d_camera_stop_java] // [START maps_android_3d_camera_events_java] - // [START maps_android_3d_camera_events_java] - /** - * Listens to camera change events and logs the visible region. - */ + /** Listens to camera change events and logs the visible region. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "4. Listen Camera Events", + description = "Demonstrates camera change listening") public void listenToCameraEvents() { - map.setCameraChangedListener(camera -> Log.d("Maps3D", "Camera State: " + - "Center: " + camera.getCenter() + - ", Heading: " + camera.getHeading() + - ", Tilt: " + camera.getTilt() + - ", Roll: " + camera.getRoll() + - ", Range: " + camera.getRange())); + // [START maps_android_3d_camera_events_java] + final long[] lastLogTime = {0L}; + map.setCameraChangedListener( + camera -> { + long currentTime = System.currentTimeMillis(); + if (currentTime - lastLogTime[0] > 500) { // Limit to 1 log per 500ms + lastLogTime[0] = currentTime; + Log.d( + "Maps3D", + "Camera State: " + + "Center: " + + camera.getCenter() + + ", Heading: " + + camera.getHeading() + + ", Tilt: " + + camera.getTilt() + + ", Roll: " + + camera.getRoll() + + ", Range: " + + camera.getRange()); + } + }); + + // Detach after 5 seconds to prevent log spam + new Handler(Looper.getMainLooper()) + .postDelayed( + () -> { + map.setCameraChangedListener(null); + }, + 5000); + // [END maps_android_3d_camera_events_java] + } + + /** Listens to map steady state events. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "5. Listen Steady State", + description = + "Logs to the console when the map finishes rendering or enters a steady state.") + public void listenToMapSteadyState() { + // [START maps_android_3d_camera_steady_java] + map.setOnMapSteadyListener( + isSceneSteady -> { + Log.d("Maps3D", "Map Is Steady: " + isSceneSteady); + }); + // [END maps_android_3d_camera_steady_java] + } + + /** Restricts the camera to a specific altitude range and geographic bounds. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "6. Camera Restriction", + description = "Restricts the camera to a specific altitude range and bounding box.") + public void setCameraRestrictions() { + Camera camera = + new Camera( + new LatLngAltitude(40.748233, -73.985663, 1500.0), // center + 0.0, // heading + 45.0, // tilt + 0.0, // roll + 1000.0 // range + ); + map.setCamera(camera); + + // [START maps_android_3d_camera_restriction_java] + LatLngBounds nycBounds = new LatLngBounds(40.856492, -73.802409, 40.685630, -74.050304); + + CameraRestriction restriction = + new CameraRestriction(500.0, 10000.0, 0.0, 360.0, 0.0, 90.0, nycBounds); + + map.setCameraRestriction(restriction); + // [END maps_android_3d_camera_restriction_java] } - // [END maps_android_3d_camera_events_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java index 21cdb418..475ee942 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MapInitSnippets.java @@ -17,74 +17,99 @@ package com.example.snippets.java.snippets; import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.widget.Toast; import androidx.annotation.NonNull; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.GoogleMap3D; - import com.google.android.gms.maps3d.Map3DView; import com.google.android.gms.maps3d.OnMap3DViewReadyCallback; import com.google.android.gms.maps3d.OnMapReadyListener; import com.google.android.gms.maps3d.OnMapSteadyListener; import com.google.android.gms.maps3d.model.Camera; import com.google.android.gms.maps3d.model.LatLngAltitude; -import android.os.Handler; -import android.os.Looper; -import android.widget.Toast; +@SnippetGroup( + title = "Map Initialization", + description = "Snippets demonstrating map lifecycle, listeners and readiness states.") public class MapInitSnippets { - // [START maps_android_3d_init_basic_java] - /** - * Initializes a standard 3D Map View. - */ + @SnippetItem( + title = "1. Basic Map3D Initialization", + description = "Initializes a standard 3D Map View and sets an initial camera angle.") + @SuppressWarnings("unused") public void basicMap3D(Context context) { + // [START maps_android_3d_init_basic_java] Map3DView map3DView = new Map3DView(context); // Get the map asynchronously - map3DView.getMap3DViewAsync(new OnMap3DViewReadyCallback() { - @Override - public void onMap3DViewReady(@NonNull GoogleMap3D googleMap3D) { - // Map is ready to be used - LatLngAltitude center = new LatLngAltitude(40.0150, -105.2705, 5000.0); - Camera camera = new Camera(center, 0.0, 45.0, 0.0, 10000.0); - googleMap3D.setCamera(camera); - } + map3DView.getMap3DViewAsync( + new OnMap3DViewReadyCallback() { + @Override + public void onMap3DViewReady(@NonNull GoogleMap3D googleMap3D) { + // Map is ready to be used + LatLngAltitude center = new LatLngAltitude(40.0150, -105.2705, 5000.0); + Camera camera = new Camera(center, 0.0, 45.0, 0.0, 10000.0); + googleMap3D.setCamera(camera); + } - @Override - public void onError(@NonNull Exception e) { - // Handle initialization error - } - }); + @Override + public void onError(@NonNull Exception e) { + // Log the exception to guide developers debugging layout mismatches + Log.e( + "MapInitSnippets", + "Failed to initialize 3D Map: " + e.getMessage(), + e); + } + }); + // [END maps_android_3d_init_basic_java] } - // [END maps_android_3d_init_basic_java] - // [START maps_android_3d_init_listeners_java] - /** - * Sets up listeners for map readiness and steady state. - */ + /** Sets up listeners for map readiness and steady state. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Listen Map Events", + description = "Logs map events to the console, such as clicks or idle status.") public void setupMapListeners(Context context, GoogleMap3D map) { + // [START maps_android_3d_init_listeners_java] Handler mainHandler = new Handler(Looper.getMainLooper()); - map.setOnMapReadyListener(new OnMapReadyListener() { - @Override - public void onMapReady(double sceneReadiness) { - if (sceneReadiness == 1.0) { - // Scene is fully loaded - mainHandler.post(() -> Toast - .makeText(context, "Map Scene Ready (100%)", Toast.LENGTH_SHORT).show()); - } - } - }); + map.setOnMapReadyListener( + new OnMapReadyListener() { + @Override + public void onMapReady(double sceneReadiness) { + if (sceneReadiness == 1.0) { + // Scene is fully loaded + mainHandler.post( + () -> + Toast.makeText( + context, + "Map Scene Ready (100%)", + Toast.LENGTH_SHORT) + .show()); + } + } + }); - map.setOnMapSteadyListener(new OnMapSteadyListener() { - @Override - public void onMapSteadyChange(boolean isSceneSteady) { - if (isSceneSteady) { - // Camera is not moving and data is loaded - mainHandler.post(() -> Toast - .makeText(context, "Map Scene Steady", Toast.LENGTH_SHORT).show()); - } - } - }); + map.setOnMapSteadyListener( + new OnMapSteadyListener() { + @Override + public void onMapSteadyChange(boolean isSceneSteady) { + if (isSceneSteady) { + // Camera is not moving and data is loaded + mainHandler.post( + () -> + Toast.makeText( + context, + "Map Scene Steady", + Toast.LENGTH_SHORT) + .show()); + } + } + }); + // [END maps_android_3d_init_listeners_java] } - // [END maps_android_3d_init_listeners_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java index 83d5d723..5fdd8faf 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/MarkerSnippets.java @@ -16,34 +16,44 @@ package com.example.snippets.java.snippets; -import androidx.annotation.NonNull; -import com.google.android.gms.maps3d.GoogleMap3D; +import android.content.Context; +import android.graphics.Color; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; +import com.example.snippets.java.R; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.model.AltitudeMode; +import com.google.android.gms.maps3d.model.Camera; import com.google.android.gms.maps3d.model.CollisionBehavior; +import com.google.android.gms.maps3d.model.FlyToOptions; +import com.google.android.gms.maps3d.model.Glyph; +import com.google.android.gms.maps3d.model.ImageView; import com.google.android.gms.maps3d.model.LatLngAltitude; import com.google.android.gms.maps3d.model.Marker; import com.google.android.gms.maps3d.model.MarkerOptions; import com.google.android.gms.maps3d.model.PinConfiguration; -import com.google.android.gms.maps3d.model.Glyph; -import com.example.snippets.java.R; -import android.content.Context; -import android.graphics.Color; -import android.widget.ImageView; -import com.google.android.gms.maps3d.OnMarkerClickListener; +@SnippetGroup( + title = "Markers", + description = "Snippets demonstrating standard, extruded, and custom styled markers.") public class MarkerSnippets { - private final GoogleMap3D map; + private final Context context; + private final TrackedMap3D map; - public MarkerSnippets(GoogleMap3D map) { + public MarkerSnippets(Context context, TrackedMap3D map) { + this.context = context; this.map = map; } - // [START maps_android_3d_marker_add_java] - /** - * Adds a basic marker to the map. - */ + /** Adds a basic marker to the map. */ + @SuppressWarnings("unused") + @SnippetItem(title = "1. Basic", description = "Adds a standard marker.") public void addBasicMarker() { + // [START maps_android_3d_marker_add_java] LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); MarkerOptions options = new MarkerOptions(); @@ -52,99 +62,209 @@ public void addBasicMarker() { // MarkerOptions uses label, not title. Marker marker = map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_add_java] } - // [END maps_android_3d_marker_add_java] - // [START maps_android_3d_marker_options_java] - /** - * Adds an advanced marker with detailed configuration options. - */ + /** Adds an advanced marker with detailed configuration options. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Advanced", + description = + "Adds a 'Priority Marker' that is extruded and collides with other markers.") public void addAdvancedMarker() { + // [START maps_android_3d_marker_options_java] LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); MarkerOptions options = new MarkerOptions(); options.setPosition(position); options.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND); options.setLabel("Priority Marker"); - options.setCollisionBehavior(CollisionBehavior.REQUIRED); + options.setCollisionBehavior(CollisionBehavior.OPTIONAL_AND_HIDES_LOWER_PRIORITY); options.setExtruded(true); options.setDrawnWhenOccluded(true); Marker marker = map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_options_java] } - // [END maps_android_3d_marker_options_java] - // [START maps_android_3d_marker_click_java] - /** - * Adds a marker with a click listener. - */ + /** Adds a marker with a click listener. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "3. Click", + description = "Adds a marker that logs a message when clicked.") public void handleMarkerClick() { + // [START maps_android_3d_marker_click_java] LatLngAltitude position = new LatLngAltitude(37.42, -122.08, 0.0); MarkerOptions options = new MarkerOptions(); options.setPosition(position); Marker marker = map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] // [START_EXCLUDE] if (marker != null) { - marker.setClickListener(new OnMarkerClickListener() { - @Override - public void onMarkerClick() { - // Handle click - } - }); + marker.setClickListener( + () -> + new Handler(Looper.getMainLooper()) + .post( + () -> + Toast.makeText( + context, + "Marker Clicked!", + Toast.LENGTH_SHORT) + .show())); } // [END_EXCLUDE] + // [END maps_android_3d_marker_click_java] } - // [END maps_android_3d_marker_click_java] - // [START maps_android_3d_marker_custom_icon_java] - /** - * Adds a marker with a custom icon using PinConfiguration. - */ + /** Adds a marker with a custom icon using PinConfiguration. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "4. Custom Icon", + description = + "Adds a marker with a custom icon using PinConfiguration and Glyph styling.") public void addCustomMarker(Context context) { + // [START maps_android_3d_marker_custom_icon_java] LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); // Create a Glyph with a custom image Glyph glyphImage = Glyph.fromColor(Color.YELLOW); - ImageView imageView = new ImageView(context); - imageView.setImageResource(R.mipmap.ic_launcher); - - // Glyph.setImage expects a com.google.android.gms.maps3d.model.ImageView? No, wait. - // It likely expects an android.view.View or specialized type. - // Checking the Kotlin sample: glyphImage.setImage(ImageView(context)...) - // If the error says "incompatible types: android.widget.ImageView cannot be converted to com.google.android.gms.maps3d.model.ImageView", - // then the SDK has its own ImageView wrapper or I am importing the wrong one. - // Actually, looking at the hierarchy, Glyph.setImage might take a View, but if there is a name collision... - // Let's assume the SDK expects the Android ImageView but maybe the signature is weird? - // Wait, the error `com.google.android.gms.maps3d.model.ImageView` suggests there IS a model class named ImageView. - // I should check if I need to wrap it or use that class. - // But the Kotlin sample used `android.widget.ImageView`. - // Let's look at the error again: "actual type is 'android.widget.ImageView', but 'com.google.android.gms.maps3d.model.ImageView' was expected." - // This implies `Glyph` has a method `setImage(com.google.android.gms.maps3d.model.ImageView)`? - // Or maybe I am shadowing it? - - // Let's try to use the SDK's ImageView if it exists, or check imports. - // Actually, looking at the user provided code: `glyphImage.setImage(ImageView(R.drawable.ook))` - // The user code seems to use a constructor `ImageView(Int)`. Android's ImageView takes Context. - // So `com.google.android.gms.maps3d.model.ImageView` must be a thing! - - com.google.android.gms.maps3d.model.ImageView mapImageView = new com.google.android.gms.maps3d.model.ImageView(R.mipmap.ic_launcher); + + ImageView mapImageView = new ImageView(R.mipmap.ic_launcher); glyphImage.setImage(mapImageView); MarkerOptions options = new MarkerOptions(); options.setPosition(position); options.setLabel("Custom Icon Marker"); - + // Set the style using PinConfiguration - options.setStyle(PinConfiguration.builder() - .setScale(1.5f) - .setGlyph(glyphImage) - .setBackgroundColor(Color.BLUE) - .setBorderColor(Color.WHITE) - .build()); + options.setStyle( + PinConfiguration.builder() + .setScale(1.5f) + .setGlyph(glyphImage) + .setBackgroundColor(Color.BLUE) + .setBorderColor(Color.WHITE) + .build()); Marker marker = map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_custom_icon_java] + } + + /** Adds a marker with a colored Glyph. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "5. Color Glyph", + description = "Adds a marker with a customized glyph color.") + public void addMarkerWithColorGlyph() { + // [START maps_android_3d_marker_glyph_color_java] + LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); + + MarkerOptions options = new MarkerOptions(); + options.setPosition(position); + options.setLabel("Color Glyph"); + options.setStyle(PinConfiguration.builder().setGlyph(Glyph.fromColor(Color.CYAN)).build()); + + map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_glyph_color_java] + } + + /** Adds a marker with a text Glyph. */ + @SuppressWarnings("unused") + @SnippetItem(title = "6. Text Glyph", description = "Adds a marker with text inside the glyph.") + public void addMarkerWithTextGlyph() { + // [START maps_android_3d_marker_glyph_text_java] + LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); + + MarkerOptions options = new MarkerOptions(); + options.setPosition(position); + options.setLabel("Text Glyph"); + options.setStyle(PinConfiguration.builder().setGlyph(Glyph.fromText("NYC")).build()); + + map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_glyph_text_java] + } + + /** Adds a marker with a circle Glyph. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "7. Circle Glyph", + description = "Adds a marker with a default circle glyph.") + public void addMarkerWithCircleGlyph() { + // [START maps_android_3d_marker_glyph_circle_java] + LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); + + Glyph glyph = Glyph.fromCircle(); + glyph.setColor(Color.MAGENTA); + + MarkerOptions options = new MarkerOptions(); + options.setPosition(position); + options.setLabel("Circle Glyph"); + options.setStyle(PinConfiguration.builder().setGlyph(glyph).build()); + + map.addMarker(options); + // [START_EXCLUDE] + LatLngAltitude markerPos = options.getPosition(); + if (markerPos != null) { + LatLngAltitude camCenter = + new LatLngAltitude(markerPos.getLatitude(), markerPos.getLongitude(), 0.0); + Camera targetCamera = new Camera(camCenter, 0.0, 45.0, 0.0, 500.0); + map.flyCameraTo(new FlyToOptions(targetCamera, 3000L)); + } + // [END_EXCLUDE] + // [END maps_android_3d_marker_glyph_circle_java] } - // [END maps_android_3d_marker_custom_icon_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java index 1fc87b8b..69efd22b 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/ModelSnippets.java @@ -16,53 +16,74 @@ package com.example.snippets.java.snippets; -import com.google.android.gms.maps3d.GoogleMap3D; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.model.AltitudeMode; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.FlyToOptions; import com.google.android.gms.maps3d.model.LatLngAltitude; import com.google.android.gms.maps3d.model.Model; import com.google.android.gms.maps3d.model.ModelOptions; import com.google.android.gms.maps3d.model.Orientation; import com.google.android.gms.maps3d.model.Vector3D; +@SnippetGroup( + title = "Models", + description = "Snippets demonstrating 3D Model (GLB) integration and configuration.") public class ModelSnippets { - private final GoogleMap3D map; + public static final String SAUCER_URL = + "https://storage.googleapis.com/gmp-maps-demos/p3d-map/assets/UFO.glb"; - public ModelSnippets(GoogleMap3D map) { + private final Context context; + private final TrackedMap3D map; + + public ModelSnippets(Context context, TrackedMap3D map) { + this.context = context; this.map = map; } - // [START maps_android_3d_model_add_java] - /** - * Adds a basic 3D model (GLB) to the map from a URL. - */ + /** Adds a basic 3D model (GLB) to the map from a URL. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "1. Basic", + description = "Loads a GLB model from a URL and places it clamped to the ground.") public void addBasicModel() { - LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 0.0); - - ModelOptions options = new ModelOptions(); - options.setPosition(position); - options.setUrl("https://example.com/model.glb"); - options.setAltitudeMode(AltitudeMode.CLAMP_TO_GROUND); - - Model model = map.addModel(options); - } - // [END maps_android_3d_model_add_java] - - // [START maps_android_3d_model_options_java] - /** - * Adds a 3D model with advanced configuration (scale, orientation). - */ - public void addAdvancedModel() { - LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 10.0); + // [START maps_android_3d_model_add_java] + LatLngAltitude position = new LatLngAltitude(37.4220, -122.0841, 100.0); ModelOptions options = new ModelOptions(); options.setPosition(position); - options.setUrl("file:///android_asset/my_model.glb"); - options.setScale(new Vector3D(2.0, 2.0, 2.0)); - options.setOrientation(new Orientation(0.0, 45.0, 0.0)); // heading, tilt, roll - options.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND); - + options.setUrl(SAUCER_URL); + options.setAltitudeMode(AltitudeMode.RELATIVE_TO_MESH); + options.setOrientation(new Orientation(0.0, 90.0, 0.0)); // heading, tilt, roll + options.setScale(new Vector3D(10.0, 10.0, 10.0)); + Model model = map.addModel(options); + // [START_EXCLUDE] + model.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Model Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_model_add_java] + + // Position camera to see the model + Camera targetCamera = new Camera(position, 0.0, 45.0, 0.0, 300.0); + FlyToOptions flyToOptions = new FlyToOptions(targetCamera, 2000L); + map.flyCameraTo(flyToOptions); } - // [END maps_android_3d_model_options_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java index cb10cfea..de892c93 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PlaceSnippets.java @@ -16,33 +16,66 @@ package com.example.snippets.java.snippets; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.gms.maps3d.GoogleMap3D; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.OnMap3DClickListener; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.FlyToOptions; import com.google.android.gms.maps3d.model.LatLngAltitude; +@SnippetGroup( + title = "Places", + description = "Snippets demonstrating Place (POI/Building) interaction algorithms.") public class PlaceSnippets { - private final GoogleMap3D map; + private final Context context; + private final TrackedMap3D map; - public PlaceSnippets(GoogleMap3D map) { + public PlaceSnippets(Context context, TrackedMap3D map) { + this.context = context; this.map = map; } - // [START maps_android_3d_place_click_java] - /** - * Listens for clicks on 3D Places (buildings, POIs). - */ + /** Listens for clicks on 3D Places (buildings, POIs). */ + @SuppressWarnings("unused") + @SnippetItem( + title = "1. Listen Clicks", + description = + "Sets up a listener that logs the Place ID when a user clicks on a 3D building or POI.") public void listenToPlaceClicks() { - map.setMap3DClickListener(new OnMap3DClickListener() { - @Override - public void onMap3DClick(@NonNull LatLngAltitude location, @Nullable String placeId) { - if (placeId != null) { - // Handle place click - } - } - }); + // [START maps_android_3d_place_click_java] + map.setMap3DClickListener( + new OnMap3DClickListener() { + @Override + public void onMap3DClick( + @NonNull LatLngAltitude location, @Nullable String placeId) { + if (placeId != null) { + // Handle place click - Show a Toast on the UI thread + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Clicked Place ID: " + placeId, + Toast.LENGTH_SHORT) + .show(); + }); + } + } + }); + // [END maps_android_3d_place_click_java] + + // Position the camera to show the buildings (Empire State Building area) + LatLngAltitude position = new LatLngAltitude(40.7484, -73.9857, 0.0); + Camera targetCamera = new Camera(position, 0.0, 45.0, 0.0, 500.0); + FlyToOptions options = new FlyToOptions(targetCamera, 2000L); + map.flyCameraTo(options); } - // [END maps_android_3d_place_click_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java index d0ae7128..72f12ed4 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolygonSnippets.java @@ -16,35 +16,51 @@ package com.example.snippets.java.snippets; +import android.content.Context; import android.graphics.Color; -import com.google.android.gms.maps3d.GoogleMap3D; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.model.AltitudeMode; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.FlyToOptions; +import com.google.android.gms.maps3d.model.Hole; import com.google.android.gms.maps3d.model.LatLngAltitude; import com.google.android.gms.maps3d.model.Polygon; import com.google.android.gms.maps3d.model.PolygonOptions; import java.util.Arrays; import java.util.List; +@SnippetGroup( + title = "Polygons", + description = "Snippets demonstrating 2D and 3D extruded polygon layers on the map.") public class PolygonSnippets { - private final GoogleMap3D map; + private final Context context; + private final TrackedMap3D map; - public PolygonSnippets(GoogleMap3D map) { + public PolygonSnippets(Context context, TrackedMap3D map) { + this.context = context; this.map = map; } - // [START maps_android_3d_polygon_add_java] - /** - * Adds a simple polygon to the map. - */ + /** Adds a simple polygon to the map. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "1. Basic", + description = "Draws a red polygon with a blue stroke around a small area") public void addBasicPolygon() { - List points = Arrays.asList( - new LatLngAltitude(37.42, -122.08, 0.0), - new LatLngAltitude(37.42, -122.09, 0.0), - new LatLngAltitude(37.43, -122.09, 0.0), - new LatLngAltitude(37.43, -122.08, 0.0), - new LatLngAltitude(37.42, -122.08, 0.0) - ); + // [START maps_android_3d_polygon_add_java] + List points = + Arrays.asList( + new LatLngAltitude(37.42, -122.08, 0.0), + new LatLngAltitude(37.42, -122.09, 0.0), + new LatLngAltitude(37.43, -122.09, 0.0), + new LatLngAltitude(37.43, -122.08, 0.0), + new LatLngAltitude(37.42, -122.08, 0.0)); PolygonOptions options = new PolygonOptions(); options.setPath(points); @@ -52,23 +68,46 @@ public void addBasicPolygon() { options.setStrokeColor(Color.BLUE); options.setStrokeWidth(5.0); options.setAltitudeMode(AltitudeMode.CLAMP_TO_GROUND); - + Polygon polygon = map.addPolygon(options); + // [START_EXCLUDE] + polygon.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Polygon Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_polygon_add_java] + + Camera cam = + new Camera( + new LatLngAltitude(37.424968, -122.084874, 19.90), 0.0, 45.02, 0.0, 4643.0); + FlyToOptions flyTo = new FlyToOptions(cam, 1000L); + map.flyCameraTo(flyTo); } - // [END maps_android_3d_polygon_add_java] - // [START maps_android_3d_polygon_extruded_java] - /** - * Adds an extruded polygon with transparency. - */ + /** Adds an extruded polygon with transparency. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Extruded", + description = + "Draws a semi-transparent red extruded polygon (height 50m) around a small area") public void addExtrudedPolygon() { - List points = Arrays.asList( - new LatLngAltitude(37.42, -122.08, 50.0), - new LatLngAltitude(37.42, -122.09, 50.0), - new LatLngAltitude(37.43, -122.09, 50.0), - new LatLngAltitude(37.43, -122.08, 50.0), - new LatLngAltitude(37.42, -122.08, 50.0) - ); + // [START maps_android_3d_polygon_extruded_java] + List points = + Arrays.asList( + new LatLngAltitude(37.42, -122.08, 50.0), + new LatLngAltitude(37.42, -122.09, 50.0), + new LatLngAltitude(37.43, -122.09, 50.0), + new LatLngAltitude(37.43, -122.08, 50.0), + new LatLngAltitude(37.42, -122.08, 50.0)); PolygonOptions options = new PolygonOptions(); options.setPath(points); @@ -76,8 +115,88 @@ public void addExtrudedPolygon() { options.setExtruded(true); options.setGeodesic(true); options.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND); - + + Polygon polygon = map.addPolygon(options); + // [START_EXCLUDE] + polygon.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Polygon Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_polygon_extruded_java] + + Camera cam = + new Camera( + new LatLngAltitude(37.424968, -122.084874, 19.90), 0.0, 45.02, 0.0, 4643.0); + FlyToOptions flyTo = new FlyToOptions(cam, 1000L); + map.flyCameraTo(flyTo); + } + + /** Adds a polygon with a hole cutout. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "3. Polygon with Hole", + description = "Draws a polygon with an interior hole cutout.") + public void addPolygonWithHole() { + // [START maps_android_3d_polygon_hole_java] + List outerPoints = + Arrays.asList( + new LatLngAltitude(37.422, -122.084, 0.0), + new LatLngAltitude(37.422, -122.086, 0.0), + new LatLngAltitude(37.424, -122.086, 0.0), + new LatLngAltitude(37.424, -122.084, 0.0), + new LatLngAltitude(37.422, -122.084, 0.0)); + + List innerPoints = + Arrays.asList( + new LatLngAltitude(37.4225, -122.0845, 0.0), + new LatLngAltitude(37.4225, -122.0855, 0.0), + new LatLngAltitude(37.4235, -122.0855, 0.0), + new LatLngAltitude(37.4235, -122.0845, 0.0), + new LatLngAltitude(37.4225, -122.0845, 0.0)); + + PolygonOptions options = new PolygonOptions(); + options.setPath(outerPoints); + options.setFillColor(Color.GREEN); + options.setAltitudeMode(AltitudeMode.CLAMP_TO_GROUND); + + // Core logic: create a Hole object and set InnerPaths (Optional) + Hole innerHole = new Hole(innerPoints); + options.setInnerPaths(Arrays.asList(innerHole)); + Polygon polygon = map.addPolygon(options); + // [START_EXCLUDE] + polygon.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Polygon Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_polygon_hole_java] + + Camera cam = + new Camera( + new LatLngAltitude(37.423600, -122.085098, 4.31), + 0.00, + 45.00, + 0.00, + 1085.51); + FlyToOptions flyTo = new FlyToOptions(cam, 1000L); + map.flyCameraTo(flyTo); } - // [END maps_android_3d_polygon_extruded_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java index a4a54ec6..88d29f44 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PolylineSnippets.java @@ -16,53 +16,90 @@ package com.example.snippets.java.snippets; +import android.content.Context; import android.graphics.Color; -import com.google.android.gms.maps3d.GoogleMap3D; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; import com.google.android.gms.maps3d.model.AltitudeMode; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.FlyToOptions; import com.google.android.gms.maps3d.model.LatLngAltitude; import com.google.android.gms.maps3d.model.Polyline; import com.google.android.gms.maps3d.model.PolylineOptions; import java.util.Arrays; import java.util.List; +@SnippetGroup( + title = "Polylines", + description = "Snippets demonstrating 2D and 3D extruded polyline paths on the map.") public class PolylineSnippets { - private final GoogleMap3D map; + private final Context context; + private final TrackedMap3D map; - public PolylineSnippets(GoogleMap3D map) { + public PolylineSnippets(Context context, TrackedMap3D map) { + this.context = context; this.map = map; } - // [START maps_android_3d_polyline_add_java] - /** - * Adds a basic polyline to the map. - */ + /** Adds a basic polyline to the map. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "1. Basic", + description = "Draws a thick red polyline connecting three points") public void addBasicPolyline() { - List points = Arrays.asList( - new LatLngAltitude(37.42, -122.08, 0.0), - new LatLngAltitude(37.43, -122.09, 0.0), - new LatLngAltitude(37.44, -122.08, 0.0) - ); + // [START maps_android_3d_polyline_add_java] + List points = + Arrays.asList( + new LatLngAltitude(37.42, -122.08, 0.0), + new LatLngAltitude(37.43, -122.09, 0.0), + new LatLngAltitude(37.44, -122.08, 0.0)); PolylineOptions options = new PolylineOptions(); options.setPath(points); options.setStrokeColor(Color.RED); options.setStrokeWidth(10.0); options.setAltitudeMode(AltitudeMode.CLAMP_TO_GROUND); - + Polyline polyline = map.addPolyline(options); + // [START_EXCLUDE] + polyline.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Polyline Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_polyline_add_java] + + Camera camera = + new Camera(new LatLngAltitude(37.43, -122.085, 0.0), 0.0, 45.0, 0.0, 5000.0); + FlyToOptions flyToOptions = new FlyToOptions(camera, 1000L); + map.flyCameraTo(flyToOptions); } - // [END maps_android_3d_polyline_add_java] - // [START maps_android_3d_polyline_options_java] - /** - * Adds a styled polyline with complex configuration. - */ + /** Adds a styled polyline with complex configuration. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Styled", + description = + "Draws a magenta polyline with a green outline, extruded and following the ground curvature (geodesic), connecting two points.") public void addStyledPolyline() { - List points = Arrays.asList( - new LatLngAltitude(37.42, -122.08, 50.0), - new LatLngAltitude(37.43, -122.09, 100.0) - ); + // [START maps_android_3d_polyline_options_java] + List points = + Arrays.asList( + new LatLngAltitude(37.42, -122.08, 50.0), + new LatLngAltitude(37.43, -122.09, 100.0)); PolylineOptions options = new PolylineOptions(); options.setPath(points); @@ -74,8 +111,27 @@ public void addStyledPolyline() { options.setExtruded(true); options.setGeodesic(true); options.setDrawsOccludedSegments(true); - + Polyline polyline = map.addPolyline(options); + // [START_EXCLUDE] + polyline.setClickListener( + () -> { + new Handler(Looper.getMainLooper()) + .post( + () -> { + Toast.makeText( + context, + "Polyline Clicked!", + Toast.LENGTH_SHORT) + .show(); + }); + }); + // [END_EXCLUDE] + // [END maps_android_3d_polyline_options_java] + + Camera camera = + new Camera(new LatLngAltitude(37.425, -122.085, 0.0), 0.0, 45.0, 0.0, 4000.0); + FlyToOptions flyToOptions = new FlyToOptions(camera, 1000L); + map.flyCameraTo(flyToOptions); } - // [END maps_android_3d_polyline_options_java] } diff --git a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java index 641dcbae..00e08b8d 100644 --- a/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java +++ b/snippets/java-app/src/main/java/com/example/snippets/java/snippets/PopoverSnippets.java @@ -16,37 +16,45 @@ package com.example.snippets.java.snippets; -import com.example.snippets.common.R; import android.content.Context; import android.graphics.Color; import android.widget.TextView; -import com.google.android.gms.maps3d.GoogleMap3D; +import com.example.snippets.common.R; +import com.example.snippets.java.TrackedMap3D; +import com.example.snippets.java.annotations.SnippetGroup; +import com.example.snippets.java.annotations.SnippetItem; +import com.google.android.gms.maps3d.Popover; import com.google.android.gms.maps3d.model.AltitudeMode; +import com.google.android.gms.maps3d.model.Camera; +import com.google.android.gms.maps3d.model.FlyToOptions; import com.google.android.gms.maps3d.model.LatLngAltitude; import com.google.android.gms.maps3d.model.Marker; import com.google.android.gms.maps3d.model.MarkerOptions; -import com.google.android.gms.maps3d.Popover; import com.google.android.gms.maps3d.model.PopoverOptions; +@SnippetGroup( + title = "Popovers", + description = "Snippets demonstrating anchored and configured 3D Popover views.") public class PopoverSnippets { private final Context context; - private final GoogleMap3D map; + private final TrackedMap3D map; - public PopoverSnippets(Context context, GoogleMap3D map) { + public PopoverSnippets(Context context, TrackedMap3D map) { this.context = context; this.map = map; } - // [START maps_android_3d_popover_add_java] - /** - * Adds a popover anchored to a marker. - */ + /** Adds a popover anchored to a marker. */ + @SuppressWarnings("unused") + @SnippetItem( + title = "1. Marker Anchor", + description = "Adds a 'Hello Popover!' text bubble anchored to a marker") public void addPopoverToMarker() { + // [START maps_android_3d_popover_add_java] // Create a marker first Marker marker = map.addMarker(new MarkerOptions()); - if (marker == null) - return; + if (marker == null) return; // Create a custom view for the popover TextView textView = new TextView(context); @@ -66,24 +74,45 @@ public void addPopoverToMarker() { if (popover != null) { popover.show(); } + // [END maps_android_3d_popover_add_java] } - // [END maps_android_3d_popover_add_java] - // [START maps_android_3d_popover_options_java] - /** - * Adds a configured popover (auto-close enabled, auto-pan disabled). - */ + /** Adds a configured popover (auto-close enabled, auto-pan disabled). */ + @SuppressWarnings("unused") + @SnippetItem( + title = "2. Configured", + description = + "Adds an 'Info' popover anchored to a marker with auto-close enabled and auto-pan disabled.") public void addConfiguredPopover() { + // [START maps_android_3d_popover_options_java] + // Create a marker at an interesting location (e.g., Golden Gate Bridge) + MarkerOptions markerOptions = new MarkerOptions(); + LatLngAltitude position = new LatLngAltitude(37.8199, -122.4783, 0.0); + markerOptions.setPosition(position); + markerOptions.setLabel("Golden Gate Bridge"); + Marker marker = map.addMarker(markerOptions); + if (marker == null) return; + TextView textView = new TextView(context); - textView.setText(com.example.snippets.common.R.string.popover_info); + textView.setText(R.string.popover_info); + textView.setPadding(16, 16, 16, 16); + textView.setBackgroundColor(Color.WHITE); PopoverOptions options = new PopoverOptions(); options.setContent(textView); - options.setPositionAnchor(new LatLngAltitude(0, 0, 0)); + options.setPositionAnchor(marker); options.setAutoCloseEnabled(true); // Close when clicking elsewhere options.setAutoPanEnabled(false); // Do not pan to popover - map.addPopover(options); + Popover popover = map.addPopover(options); + if (popover != null) { + popover.show(); + } + // [END maps_android_3d_popover_options_java] + + // Position the camera to show the marker/popover + Camera targetCamera = new Camera(position, 0.0, 45.0, 0.0, 1000.0); + FlyToOptions flyToOptions = new FlyToOptions(targetCamera, 2000L); + map.flyCameraTo(flyToOptions); } - // [END maps_android_3d_popover_options_java] } diff --git a/snippets/java-app/src/main/res/layout/list_item_group_header.xml b/snippets/java-app/src/main/res/layout/list_item_group_header.xml new file mode 100644 index 00000000..5b17eaf1 --- /dev/null +++ b/snippets/java-app/src/main/res/layout/list_item_group_header.xml @@ -0,0 +1,9 @@ + + diff --git a/snippets/java-app/src/main/res/values/themes.xml b/snippets/java-app/src/main/res/values/themes.xml index a6304a33..3802b9d9 100644 --- a/snippets/java-app/src/main/res/values/themes.xml +++ b/snippets/java-app/src/main/res/values/themes.xml @@ -17,7 +17,11 @@ + + + + + + diff --git a/snippets/scripts/api_manifest.json b/snippets/scripts/api_manifest.json new file mode 100644 index 00000000..da9ff1c3 --- /dev/null +++ b/snippets/scripts/api_manifest.json @@ -0,0 +1,475 @@ +{ + "Popover": [ + "altitudeMode", + "anchorId", + "anchorOffset", + "autoCloseEnabled", + "autoPanEnabled", + "autoPanFn", + "content", + "getAltitudeMode", + "getAnchorId", + "getAnchorOffset", + "getAutoCloseEnabled", + "getAutoPanEnabled", + "getAutoPanFn", + "getContent", + "getIsVisible", + "getPositionAnchor", + "getRemoveFn", + "hide", + "isVisible", + "positionAnchor", + "remove", + "removeFn", + "show", + "toggle" + ], + "GoogleMap3D": [ + "addMarker", + "addModel", + "addPolygon", + "addPolyline", + "addPopover", + "flyCameraAround", + "flyCameraTo", + "getCamera", + "getCameraRestriction", + "getMapMode", + "setCamera", + "setCameraAnimationEndListener", + "setCameraChangedListener", + "setCameraRestriction", + "setMap3DClickListener", + "setMapMode", + "setOnMapReadyListener", + "setOnMapSteadyListener", + "stopCameraAnimation" + ], + "Map3DView": [ + "getMap3DViewAsync", + "getOverlayView", + "getParams", + "overlayView", + "params", + "setParams" + ], + "Validators.for": [ + "Anchorable", + "Camera", + "CameraRestriction", + "FlyAroundOptions", + "FlyToOptions", + "Hole", + "LatLngAltitude", + "LatLngBounds", + "Map3DOptions", + "MarkerOptions", + "ModelOptions", + "Orientation", + "PolygonOptions", + "PolylineOptions", + "PopoverOptions", + "Vector3D", + "requireNonNegative", + "validateAltitude", + "validateFinite", + "validateHeading", + "validateLatitude", + "validateLongitude", + "validateRange", + "validateRoll", + "validateTilt" + ], + "Map3DOptions": [ + "attributes", + "bounds", + "centerAlt", + "centerLat", + "centerLng", + "defaultUiDisabled", + "fromAttributeSet", + "getAttributes", + "getBounds", + "getCenterAlt", + "getCenterLat", + "getCenterLng", + "getDefaultUiDisabled", + "getHeading", + "getMapId", + "getMapMode", + "getMaxAltitude", + "getMaxHeading", + "getMaxTilt", + "getMinAltitude", + "getMinHeading", + "getMinTilt", + "getOptions", + "getRange", + "getRoll", + "getTilt", + "heading", + "mapId", + "mapMode", + "maxAltitude", + "maxHeading", + "maxTilt", + "minAltitude", + "minHeading", + "minTilt", + "options", + "range", + "roll", + "tilt" + ], + "Polygon": [ + "getAltitudeMode", + "getDrawsOccludedSegments", + "getExtruded", + "getFillColor", + "getGeodesic", + "getId", + "getInnerCoordinates", + "getInnerPaths", + "getOuterCoordinates", + "getPath", + "getStrokeColor", + "getStrokeWidth", + "getZIndex", + "onPolygonClick", + "remove", + "setAltitudeMode", + "setClickListener", + "setDrawsOccludedSegments", + "setExtruded", + "setFillColor", + "setGeodesic", + "setInnerCoordinates", + "setInnerPaths", + "setOuterCoordinates", + "setPath", + "setStrokeColor", + "setStrokeWidth", + "setZIndex" + ], + "Orientation": [ + "getHeading", + "getRoll", + "getTilt", + "setHeading", + "setRoll", + "setTilt", + "writeToParcel" + ], + "Glyph": [ + "equals", + "fromCircle", + "fromColor", + "fromText", + "getColor", + "getImage", + "getText", + "hashCode", + "setColor", + "setImage", + "setText", + "writeToParcel" + ], + "PolylineOptions": [ + "getAltitudeMode", + "getDrawsOccludedSegments", + "getExtruded", + "getGeodesic", + "getId", + "getOuterColor", + "getOuterWidth", + "getPath", + "getStrokeColor", + "getStrokeWidth", + "getZIndex", + "setAltitudeMode", + "setDrawsOccludedSegments", + "setExtruded", + "setGeodesic", + "setId", + "setOuterColor", + "setOuterWidth", + "setPath", + "setStrokeColor", + "setStrokeWidth", + "setZIndex", + "writeToParcel" + ], + "PopoverOptions": [ + "getAltitudeMode", + "getAnchorOffset", + "getAutoCloseEnabled", + "getAutoPanEnabled", + "getContent", + "getPopoverStyle", + "getPositionAnchor", + "setAltitudeMode", + "setAnchorOffset", + "setAutoCloseEnabled", + "setAutoPanEnabled", + "setContent", + "setPopoverStyle", + "setPositionAnchor" + ], + "ImageView": [ + "equals", + "getResourceId", + "hashCode", + "setResourceId", + "writeToParcel" + ], + "ModelOptions": [ + "getAltitudeMode", + "getId", + "getOrientation", + "getPosition", + "getScale", + "getUrl", + "setAltitudeMode", + "setId", + "setOrientation", + "setPosition", + "setScale", + "setUrl", + "writeToParcel" + ], + "MarkerOptions": [ + "getAltitudeMode", + "getCollisionBehavior", + "getId", + "getLabel", + "getPosition", + "getZIndex", + "isDrawnWhenOccluded", + "isExtruded", + "isSizePreserved", + "setAltitudeMode", + "setCollisionBehavior", + "setDrawnWhenOccluded", + "setExtruded", + "setId", + "setLabel", + "setPosition", + "setSizePreserved", + "setZIndex" + ], + "MarkerOptions.that": [ + "getStyle", + "setStyle", + "writeToParcel" + ], + "LatLngBounds": [ + "getNorthEastLat", + "getNorthEastLng", + "getSouthWestLat", + "getSouthWestLng", + "setNorthEastLat", + "setNorthEastLng", + "setSouthWestLat", + "setSouthWestLng", + "writeToParcel" + ], + "CameraRestriction": [ + "setBounds", + "setMaxAltitude", + "setMaxHeading", + "setMaxTilt", + "setMinAltitude", + "setMinHeading", + "setMinTilt", + "writeToParcel" + ], + "Hole": [ + "getVertices", + "setVertices", + "writeToParcel" + ], + "MarkerStyle": [ + "equals", + "getImageView", + "getPinConfiguration", + "hashCode", + "writeToParcel" + ], + "PolygonOptions": [ + "getAltitudeMode", + "getDrawsOccludedSegments", + "getExtruded", + "getFillColor", + "getGeodesic", + "getId", + "getInnerPaths", + "getPath", + "getStrokeColor", + "getStrokeWidth", + "getZIndex", + "setAltitudeMode", + "setDrawsOccludedSegments", + "setExtruded", + "setFillColor", + "setGeodesic", + "setId", + "setInnerPaths", + "setPath", + "setStrokeColor", + "setStrokeWidth", + "setZIndex", + "writeToParcel" + ], + "PopoverShadow": [ + "getColor", + "getOffsetX", + "getOffsetY", + "getRadius", + "setColor", + "setOffsetX", + "setOffsetY", + "setRadius" + ], + "PopoverStyle": [ + "getBackgroundColor", + "getBorderRadius", + "getPadding", + "getShadow", + "setBackgroundColor", + "setBorderRadius", + "setPadding", + "setShadow" + ], + "FlyAroundOptions": [ + "getCenter", + "getDurationInMillis", + "getRounds", + "setCenter", + "setDurationInMillis", + "setRounds", + "writeToParcel" + ], + "Marker": [ + "getAltitudeMode", + "getCollisionBehavior", + "getDrawsWhenOccluded", + "getId", + "getLabel", + "getPosition", + "getSizePreserved", + "getUrl", + "getZIndex", + "isExtruded", + "onMarkerClick", + "remove", + "setAltitudeMode", + "setClickListener", + "setCollisionBehavior", + "setDrawsWhenOccluded", + "setExtruded", + "setLabel", + "setPosition", + "setSizePreserved", + "setUrl", + "setZIndex" + ], + "Camera": [ + "getCenter", + "setCenter", + "setHeading", + "setRange", + "setRoll", + "setTilt", + "writeToParcel" + ], + "LatLngAltitude": [ + "getAltitude", + "getLatitude", + "getLongitude", + "getPosition", + "setAltitude", + "setLatitude", + "setLongitude", + "writeToParcel" + ], + "Vector3D": [ + "getX", + "getY", + "getZ", + "setX", + "setY", + "setZ", + "writeToParcel" + ], + "PinConfiguration": [ + "builder", + "equals", + "getBackgroundColor", + "getBorderColor", + "getGlyph", + "getScale", + "hashCode", + "setBackgroundColor", + "setBorderColor", + "setGlyph", + "setScale", + "writeToParcel" + ], + "PinConfiguration.Builder": [ + "build", + "setBackgroundColor", + "setBorderColor", + "setGlyph", + "setScale" + ], + "Model": [ + "getAltitudeMode", + "getId", + "getOrientation", + "getPosition", + "getScale", + "getUrl", + "onModelClick", + "remove", + "setAltitudeMode", + "setClickListener", + "setOrientation", + "setPosition", + "setScale", + "setUrl" + ], + "Polyline": [ + "getAltitudeMode", + "getCoordinates", + "getDrawsOccludedSegments", + "getGeodesic", + "getId", + "getOuterColor", + "getOuterWidth", + "getPath", + "getStrokeColor", + "getStrokeWidth", + "getZIndex", + "onPolylineClick", + "remove", + "setAltitudeMode", + "setClickListener", + "setCoordinates", + "setDrawsOccludedSegments", + "setGeodesic", + "setOuterColor", + "setOuterWidth", + "setPath", + "setStrokeColor", + "setStrokeWidth", + "setZIndex" + ], + "FlyToOptions": [ + "getDurationInMillis", + "getEndCamera", + "setDurationInMillis", + "setEndCamera", + "writeToParcel" + ] +} \ No newline at end of file diff --git a/snippets/scripts/catalog_api.py b/snippets/scripts/catalog_api.py new file mode 100644 index 00000000..67e89c9d --- /dev/null +++ b/snippets/scripts/catalog_api.py @@ -0,0 +1,368 @@ +import os +import re +import subprocess +import glob +from collections import defaultdict + +# Setup directories relative to the script location +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +SNIPPETS_DIR = os.path.dirname(SCRIPT_DIR) +import json + +def extract_region_tags(snippets_dir): + region_tags = defaultdict(list) + + for root, _, filenames in os.walk(snippets_dir): + if 'build' in root or '.gradle' in root or 'scripts' in root: continue + for name in filenames: + if name.endswith(('.kt', '.java', '.xml')): + filepath = os.path.join(root, name) + with open(filepath, 'r', encoding='utf-8') as f: + try: + lines = f.readlines() + except UnicodeDecodeError: + continue + + active_tags = {} + for i, line in enumerate(lines): + line_num = i + 1 + start_match = re.search(r'\[START\s+([a-zA-Z0-9_]+)\]', line) + if start_match: + active_tags[start_match.group(1)] = line_num + end_match = re.search(r'\[END\s+([a-zA-Z0-9_]+)\]', line) + if end_match: + tag = end_match.group(1) + if tag in active_tags: + start_line = active_tags.pop(tag) + region_tags[filepath].append({ + 'tag': tag, + 'start': start_line, + 'end': line_num + }) + return region_tags + +def parse_javap_output(snippets_dir): + class_files = [] + for ext in ['kotlin-classes', 'compileDebugJavaWithJavac', 'javac']: + path = os.path.join(snippets_dir, f"**/build/**/{ext}/**/*.class") + class_files.extend(glob.glob(path, recursive=True)) + + usages = defaultdict(list) + + for cfile in class_files: + if 'R.class' in cfile or 'R$' in cfile or 'BuildConfig.class' in cfile: continue + + result = subprocess.run(['javap', '-c', '-l', '-p', '-constants', cfile], capture_output=True, text=True) + out = result.stdout + + lines = out.split('\n') + source_file = None + method_calls = [] + current_line_table = {} + + for line in lines: + line = line.strip() + if line.startswith("Compiled from "): + source_file_match = re.search(r'"([^"]+)"', line) + if source_file_match: + source_file = source_file_match.group(1) + + if "Code:" in line: + current_line_table = {} + method_calls = [] + + match_invoke = re.search(r'^(\d+):\s+invoke.*\s+//\s*(?:Field|Method|InterfaceMethod)\s+(com/google/android/gms/maps3d/|com/example/snippets/(?:kotlin|java)/)([^:]+)\.([^:("]+)', line) + if match_invoke: + offset = int(match_invoke.group(1)) + package_path = match_invoke.group(2) + class_path = match_invoke.group(3) + method_name = match_invoke.group(4) + + if "TrackedMap3D" in class_path: + class_name = "GoogleMap3D" + else: + class_parts = class_path.split('/')[-1].split('$') + if len(class_parts) > 1 and class_parts[-1] != "1": + class_name = f"{class_parts[0]}.{class_parts[-1]}" + else: + class_name = class_parts[0] + + if method_name == "": + method_name = class_parts[-1] if 'class_parts' in locals() else method_name + method_calls.append((offset, class_name, method_name)) + + match_line = re.search(r'line\s+(\d+):\s+(\d+)', line) + if match_line and "LineNumberTable:" in out: + line_num = int(match_line.group(1)) + offset = int(match_line.group(2)) + current_line_table[offset] = line_num + + if not line and method_calls and current_line_table: + sorted_offsets = sorted(current_line_table.keys()) + for (off, cname, mname) in method_calls: + matched_line = None + for o in reversed(sorted_offsets): + if off >= o: + matched_line = current_line_table[o] + break + if matched_line and source_file: + usages[f"{cname}.{mname}"].append({"file": source_file, "line": matched_line}) + method_calls = [] + current_line_table = {} + + return usages + +def generate_snippet_index(snippets_dir, file_map, region_tags): + groups = defaultdict(lambda: { + 'description': '', + 'items': defaultdict(lambda: { + 'description': '', + 'kotlin': None, + 'java': None + }) + }) + + for root, _, filenames in os.walk(snippets_dir): + if 'build' in root or '.gradle' in root or 'scripts' in root: continue + for name in filenames: + if name.endswith(('.kt', '.java')): + filepath = os.path.join(root, name) + with open(filepath, 'r', encoding='utf-8') as f: + try: + content = f.read() + except UnicodeDecodeError: + continue + + # Find Group + group_match = re.search(r'@SnippetGroup\((.*?)\)', content, re.DOTALL) + if not group_match: continue + + group_content = group_match.group(1) + group_title_match = re.search(r'title\s*=\s*"([^"]+)"', group_content) + group_desc_match = re.search(r'description\s*=\s*"([^"]+)"', group_content) + + if not group_title_match: continue + + group_title = group_title_match.group(1) + group_desc = group_desc_match.group(1) if group_desc_match else "" + + if not groups[group_title]['description']: + groups[group_title]['description'] = group_desc + + is_kotlin = name.endswith('.kt') + # Find Items + lines = content.split('\n') + for i, line in enumerate(lines): + if '@SnippetItem' in line: + # Grab context (usually next few lines have the full annotation) + context = "\n".join(lines[i:i+10]) + item_match = re.search(r'@SnippetItem\((.*?)\)', context, re.DOTALL) + if item_match: + item_content = item_match.group(1) + item_title_match = re.search(r'title\s*=\s*"([^"]+)"', item_content) + item_desc_match = re.search(r'description\s*=\s*"([^"]+)"', item_content) + + if item_title_match: + item_title = item_title_match.group(1) + item_desc = item_desc_match.group(1) if item_desc_match else "" + + # Find active region tag mapping + active_tag = "No Tag" + start_line = i + 1 + end_line = i + 1 + + # Look up in region_tags + if filepath in region_tags: + for region in region_tags[filepath]: + # Function index i is 0-based line index, region['start'] is 1-based + # Allow +- 10 lines buffer for comments/annotations preceding the START tag + if region['start'] <= (i + 15) and region['end'] >= i: + active_tag = region['tag'] + start_line = region['start'] + end_line = region['end'] + break + + rel_path = file_map.get(name, os.path.relpath(filepath, snippets_dir)) + if active_tag != "No Tag": + link = f"[{rel_path}]({rel_path}#L{start_line}-L{end_line})" + else: + link = f"[{rel_path}:{i+1}]({rel_path}#L{i+1})" + + current_item = groups[group_title]['items'][item_title] + if not current_item['description']: + current_item['description'] = item_desc + + if is_kotlin: + current_item['kotlin'] = {'link': link, 'tag': active_tag} + else: + current_item['java'] = {'link': link, 'tag': active_tag} + + # Format Markdown + lines = ["## πŸ“‘ Snippet Concepts Index\n\n"] + lines.append("This section maps high-level concepts (groups) to specific demonstration files and lines in both languages.\n\n") + + for title, group in sorted(groups.items()): + lines.append(f"### {title}\n") + + if group['description']: + lines.append(f"> {group['description']}\n\n") + + # Sort items: try numerical sort if prefixed with numbers (e.g. "1. Basic") + sorted_items = sorted(group['items'].items(), key=lambda x: (re.search(r'^(\d+)', x[0]).group(1) if re.search(r'^(\d+)', x[0]) else x[0])) + + for item_title, item in sorted_items: + lines.append(f"- **{item_title}**:\n") + if item['description']: + lines.append(f" - *Description*: {item['description']}\n") + + if item['kotlin']: + lines.append(f" - **Kotlin**\n") + lines.append(f" - {item['kotlin']['link']}\n") + lines.append(f" - Tag: `{item['kotlin']['tag']}`\n") + if item['java']: + lines.append(f" - **Java**\n") + lines.append(f" - {item['java']['link']}\n") + lines.append(f" - Tag: `{item['java']['tag']}`\n") + + lines.append("\n") + + return lines + +def format_catalog_section(section_title, api_surface, usages, file_map, region_tags, language_ext): + lines = [f"## {section_title}\n"] + missing_apis = [] + + for class_name, methods in sorted(api_surface.items()): + lines.append(f"### `{class_name}`\n") + methods = sorted(list(set(methods))) + + has_elements = False + for method in methods: + key = f"{class_name}.{method}" + use_list = usages.get(key, []) + + filtered_uses = [] + for u in use_list: + rel_path = file_map.get(u['file'], u['file']) + if rel_path.endswith(language_ext): + filtered_uses.append(u) + + if not filtered_uses: + if not (method.startswith("get") or method.startswith("set")): + missing_apis.append(key) + lines.append(f"- `{method}`: ❌ No coverage\n") + else: + formatted_uses = [] + for u in filtered_uses: + basename = u['file'] + line_num = u['line'] + rel_path = file_map.get(basename, basename) + + active_tag = "No Tag" + full_path_for_tag = None + for fp in region_tags.keys(): + if basename in fp: + full_path_for_tag = fp + break + + if full_path_for_tag and full_path_for_tag in region_tags: + for region in region_tags[full_path_for_tag]: + if region['start'] <= line_num <= region['end']: + active_tag = region['tag'] + break + + if active_tag != "No Tag": + # We found a region, map the range + for region in region_tags[full_path_for_tag]: + if region['tag'] == active_tag: + start_line = region['start'] + end_line = region['end'] + break + formatted_uses.append(f"[{rel_path}]({rel_path}#L{start_line}-L{end_line}) (Tag: `{active_tag}`)") + else: + formatted_uses.append(f"[{rel_path}:{line_num}]({rel_path}#L{line_num}) (Tag: `{active_tag}`)") + + formatted_uses = sorted(list(set(formatted_uses))) + lines.append(f"- `{method}`:\n") + for fu in formatted_uses: + lines.append(f" - {fu}\n") + has_elements = True + + if not has_elements: + lines.append(f"_No public methods exposing documentation snippets detected._\n") + lines.append("\n") + + lines.append(f"### Missing Extracted API Coverage ({section_title})\n") + lines.append("The following non-getter/setter APIs currently have `0` occurrences within this section:\n\n") + if not missing_apis: + lines.append("πŸŽ‰ All non-getter/setter APIs are fully covered!\n\n") + else: + for missing in sorted(missing_apis): + lines.append(f"- `{missing}`\n") + lines.append("\n") + + return lines, missing_apis + +def main(): + print(f"Cataloging Maps3D API snippets...\nSCRIPT_DIR: {SCRIPT_DIR}\nSNIPPETS_DIR: {SNIPPETS_DIR}") + + print("Compiling Snippets to ensure fresh bytecode...") + res = subprocess.run(["./gradlew", "assembleDebug"], cwd=SNIPPETS_DIR, capture_output=True, text=True) + if res.returncode != 0: + print(f"Warning: Build failed. javap results may be incomplete. {res.stderr}") + + manifest_path = os.path.join(SCRIPT_DIR, "api_manifest.json") + if not os.path.exists(manifest_path): + print(f"Error: API manifest resource not found at {manifest_path}") + return + + with open(manifest_path, "r", encoding="utf-8") as f: + api_surface = json.load(f) + + print(f"Loaded {sum(len(v) for v in api_surface.values())} API endpoints from {manifest_path}.") + + region_tags = extract_region_tags(SNIPPETS_DIR) + usages = parse_javap_output(SNIPPETS_DIR) + + # Populate file_map for ALL source files to guarantee full relative paths + file_map = {} + for root, _, filenames in os.walk(SNIPPETS_DIR): + if 'build' in root or '.gradle' in root or 'scripts' in root: continue + for name in filenames: + if name.endswith(('.kt', '.java', '.xml')): + filepath = os.path.join(root, name) + rel_path = os.path.relpath(filepath, SNIPPETS_DIR) + file_map[name] = rel_path + + catalog_lines = ["# πŸ—ΊοΈ Maps3D API Snippets Catalog\n\n"] + catalog_lines.append("This document serves as a comprehensive developer reference mapping high-level concepts directly index extracts.\n\n") + + # Generate Snippet Index (Concepts to Code) + snippet_index_lines = generate_snippet_index(SNIPPETS_DIR, file_map, region_tags) + catalog_lines.extend(snippet_index_lines) + + coverage_lines = ["# πŸ“Š Maps3D API Coverage Matrix\n\n"] + coverage_lines.append("This matrix ensures that every critical feature in the 3D Maps SDK is actively demonstrated inside a snippet boundary (`// [START ...]`).\n\n") + + # Generate Kotlin Section + kt_lines, kt_missing = format_catalog_section("Kotlin Snippets", api_surface, usages, file_map, region_tags, ".kt") + coverage_lines.extend(kt_lines) + + # Generate Java Section + java_lines, java_missing = format_catalog_section("Java Snippets", api_surface, usages, file_map, region_tags, ".java") + coverage_lines.extend(java_lines) + + catalog_path = os.path.join(SNIPPETS_DIR, "CATALOG.md") + with open(catalog_path, 'w', encoding='utf-8') as f: + f.writelines(catalog_lines) + + coverage_path = os.path.join(SNIPPETS_DIR, "COVERAGE.md") + with open(coverage_path, 'w', encoding='utf-8') as f: + f.writelines(coverage_lines) + + print(f"Index successfully generated at {catalog_path}.") + print(f"Matrix successfully generated at {coverage_path}.") + print(f"Identified {len(kt_missing)} missing APIs in Kotlin, and {len(java_missing)} in Java.") + +if __name__ == '__main__': + main() diff --git a/snippets/scripts/generate_manifest.py b/snippets/scripts/generate_manifest.py new file mode 100644 index 00000000..cfca7992 --- /dev/null +++ b/snippets/scripts/generate_manifest.py @@ -0,0 +1,143 @@ +import os +import re +import json +from collections import defaultdict + +# Setup directories relative to the script location +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +SNIPPETS_DIR = os.path.dirname(SCRIPT_DIR) +MAPS3D_REF_DIR = os.path.join(SNIPPETS_DIR, "..", "maps3d-ref") + +# Functions to omit explicitly +LIFECYCLE_METHODS = { + "onCreate", "onDestroy", "onStart", "onStop", + "onResume", "onPause", "onLowMemory", "onSaveInstanceState", + "onAttachedToWindow", "onDetachedFromWindow", "onError" +} + +def find_source_files(directory): + files = [] + for root, _, filenames in os.walk(directory): + for name in filenames: + if name.endswith('.kt') or name.endswith('.java'): + files.append(os.path.join(root, name)) + return files + +def extract_api_surface(ref_dir): + """ + Parses maps3d-ref Kotlin and Java files to identify public Classes, Functions, and Properties. + Skips items annotated with @Hide, 'internal', or 'interface' declarations. + """ + api_surface = defaultdict(list) + src_files = find_source_files(ref_dir) + + for src_file in src_files: + with open(src_file, 'r', encoding='utf-8') as f: + lines = f.readlines() + + current_class = None + in_interface = False + skip_current_element = False + + for line in lines: + stripped = line.strip() + + # Reset skip flag if we find an actual class or function declaration + is_declaration = bool(re.search(r'\b(class|fun|val|var|interface|enum|public)\b', stripped)) + + if "@Hide" in stripped or "internal " in stripped or "private " in stripped or "protected " in stripped: + skip_current_element = True + if not is_declaration: + continue + + # Skip entire interfaces as requested + if "interface " in stripped and "class " not in stripped: + in_interface = True + continue + if in_interface and stripped == "}": + in_interface = False + continue + if in_interface: + continue + + class_match = re.search(r'(?:public\s+)?(?:final\s+)?(?:abstract\s+)?(?:open\s+)?(?:sealed\s+)?(?:data\s+)?class\s+(\w+)', stripped) + if not class_match: + class_match = re.search(r'(?:public\s+)?(?:static\s+)?(?:final\s+)?(?:public\s+)?enum\s+(\w+)', stripped) + + if class_match and not skip_current_element: + parsed_class = class_match.group(1) + basename = os.path.splitext(os.path.basename(src_file))[0] + if parsed_class != basename: + current_class = f"{basename}.{parsed_class}" + else: + current_class = parsed_class + elif class_match and skip_current_element: + current_class = None + + if is_declaration and skip_current_element: + skip_current_element = False + continue + + # Skip anonymous overrides (e.g. object: IOnPlaceClickListener { override fun ... }) + if "override " in stripped or "@Override" in stripped: + continue + + if current_class and not skip_current_element: + # 1. Kotlin Functions + fun_match = re.search(r'(?:public\s+)?fun\s+(?:<[^>]+>\s+)?(\w+)', stripped) + if fun_match: + api_surface[current_class].append(fun_match.group(1)) + + # 2. Kotlin Properties + prop_match = re.search(r'(?:public\s+)?(?:val|var)\s+(\w+)', stripped) + if prop_match: + prop_name = prop_match.group(1) + api_surface[current_class].append(prop_name) + capitalized = prop_name[0].upper() + prop_name[1:] + api_surface[current_class].append("get" + capitalized) + if "var " in stripped: + api_surface[current_class].append("set" + capitalized) + + # 3. Java Methods + # Match: public void setPosition(...) or public static float clamp(...) + java_method_match = re.search(r'public\s+(?:static\s+)?(?:final\s+)?(?:<[^>]+>\s+)?[\w\.<>\[\]]+\s+(\w+)\s*\(', stripped) + if java_method_match: + method_name = java_method_match.group(1) + if method_name != current_class: # Exclude Java constructors + api_surface[current_class].append(method_name) + + if skip_current_element and not stripped.startswith("@") and not stripped.startswith("//") and stripped != "": + skip_current_element = False + + # Post-processing Cleanup + api_surface.pop('for', None) + + if "Map3DView" in api_surface: + api_surface["Map3DView"] = [m for m in api_surface["Map3DView"] if m not in LIFECYCLE_METHODS] + + return api_surface + +def main(): + print(f"Extracting API surface from maps3d-ref at: {MAPS3D_REF_DIR}") + + if not os.path.exists(MAPS3D_REF_DIR): + print(f"Error: {MAPS3D_REF_DIR} does not exist.") + print("This script must be run from an environment where the 'maps3d-ref' source is available.") + return + + api_surface = extract_api_surface(MAPS3D_REF_DIR) + + # Deduplicate methods + for clazz in api_surface: + api_surface[clazz] = sorted(list(set(api_surface[clazz]))) + + manifest_path = os.path.join(SCRIPT_DIR, "api_manifest.json") + with open(manifest_path, "w", encoding="utf-8") as f: + json.dump(api_surface, f, indent=2) + + total_endpoints = sum(len(v) for v in api_surface.values()) + print(f"Successfully extracted {total_endpoints} API endpoints across {len(api_surface)} classes.") + print(f"Saved independent API resource to: {manifest_path}") + +if __name__ == '__main__': + main()