diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/drawable/gz.png b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/gz.png
new file mode 100644
index 0000000..8689ec7
Binary files /dev/null and b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/gz.png differ
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/drawable/location_city_24px.xml b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/location_city_24px.xml
new file mode 100644
index 0000000..f4c5010
--- /dev/null
+++ b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/location_city_24px.xml
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/drawable/ook.png b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/ook.png
new file mode 100644
index 0000000..4050ed9
Binary files /dev/null and b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/ook.png differ
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/drawable/public_24px.xml b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/public_24px.xml
new file mode 100644
index 0000000..1e29874
--- /dev/null
+++ b/Maps3DSamples/ApiDemos/common/src/main/res/drawable/public_24px.xml
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_common_map.xml b/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_common_map.xml
index 2854abc..3c13b57 100644
--- a/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_common_map.xml
+++ b/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_common_map.xml
@@ -23,22 +23,31 @@
android:layout_height="match_parent"
>
-
+ app:elevation="0dp"
+ >
+
+
+
+
+
+
+
+
+
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_hello_map.xml b/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_hello_map.xml
index 9962230..71a6027 100644
--- a/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_hello_map.xml
+++ b/Maps3DSamples/ApiDemos/common/src/main/res/layout/activity_hello_map.xml
@@ -38,6 +38,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Maps3DSamples/ApiDemos/common/src/main/res/values/strings.xml b/Maps3DSamples/ApiDemos/common/src/main/res/values/strings.xml
index 14670dd..72edd54 100644
--- a/Maps3DSamples/ApiDemos/common/src/main/res/values/strings.xml
+++ b/Maps3DSamples/ApiDemos/common/src/main/res/values/strings.xml
@@ -29,6 +29,7 @@
Polygons
Polylines
3D models
+ Popovers
Coming soon!
diff --git a/Maps3DSamples/ApiDemos/gradle/gradle-daemon-jvm.properties b/Maps3DSamples/ApiDemos/gradle/gradle-daemon-jvm.properties
new file mode 100644
index 0000000..a8d938a
--- /dev/null
+++ b/Maps3DSamples/ApiDemos/gradle/gradle-daemon-jvm.properties
@@ -0,0 +1,13 @@
+#This file is generated by updateDaemonJvm
+toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect
+toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/879378f84c64b2c76003b97a32968399/redirect
+toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect
+toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/879378f84c64b2c76003b97a32968399/redirect
+toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/70ee42f1b0395356c016dbcb3e88f71d/redirect
+toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ee5178090598fb4291558827b9f00e0d/redirect
+toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ff1d4fc92bcfc9d3799beabb4e70cfa3/redirect
+toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/879378f84c64b2c76003b97a32968399/redirect
+toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3dc48436acf46a9c2958682158988183/redirect
+toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d7d142be6e19e13dff41787c063f3185/redirect
+toolchainVendor=JETBRAINS
+toolchainVersion=21
diff --git a/Maps3DSamples/ApiDemos/gradle/libs.versions.toml b/Maps3DSamples/ApiDemos/gradle/libs.versions.toml
index 58fdaee..80555b3 100644
--- a/Maps3DSamples/ApiDemos/gradle/libs.versions.toml
+++ b/Maps3DSamples/ApiDemos/gradle/libs.versions.toml
@@ -3,21 +3,21 @@ compileSdk = "36"
minSdk = "26"
targetSdk = "36"
-activityCompose = "1.11.0"
+activityCompose = "1.12.3"
agp = "8.13.2"
appcompat = "1.7.1"
-composeBom = "2025.09.00"
+composeBom = "2026.01.01"
coreKtx = "1.17.0"
desugar_jdk_libs = "2.1.5"
espressoCore = "3.7.0"
junit = "4.13.2"
junitVersion = "1.3.0"
-kotlin = "2.2.20"
-lifecycleRuntimeKtx = "2.9.4"
+kotlin = "2.3.0"
+lifecycleRuntimeKtx = "2.10.0"
material = "1.13.0"
-playServicesBase = "18.8.0"
-playServicesMaps3d = "0.1.0"
+playServicesBase = "18.10.0"
+playServicesMaps3d = "0.2.0"
secretsGradlePlugin = "2.0.1"
truth = "1.4.5"
uiautomator = "2.3.0"
diff --git a/Maps3DSamples/ApiDemos/java-app/build.gradle.kts b/Maps3DSamples/ApiDemos/java-app/build.gradle.kts
index 0fdc9f9..d02a332 100644
--- a/Maps3DSamples/ApiDemos/java-app/build.gradle.kts
+++ b/Maps3DSamples/ApiDemos/java-app/build.gradle.kts
@@ -14,9 +14,6 @@
* limitations under the License.
*/
-import org.gradle.api.GradleException
-import java.io.File
-
// Check for secrets.properties file before proceeding with build tasks.
val secretsFile = rootProject.file("secrets.properties")
val isCI = System.getenv("CI")?.toBoolean() ?: false
diff --git a/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/markers/MarkersActivity.java b/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/markers/MarkersActivity.java
index b196e89..f50e572 100644
--- a/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/markers/MarkersActivity.java
+++ b/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/markers/MarkersActivity.java
@@ -16,14 +16,21 @@
import static com.example.maps3d.common.UtilitiesKt.toValidCamera;
+import android.view.View;
+import android.widget.Button;
+
import com.example.maps3djava.sampleactivity.SampleBaseActivity;
import com.google.android.gms.maps3d.GoogleMap3D;
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.Map3DMode;
import com.google.android.gms.maps3d.model.MarkerOptions;
+import com.google.android.gms.maps3d.model.PinConfiguration;
/**
* Demonstrates the use of different altitude modes for markers in a 3D map.
@@ -41,8 +48,7 @@ public final String getTAG() {
return this.getClass().getSimpleName();
}
- @Override
- public final Camera getInitialCamera() {
+ public final Camera getBerlinCamera() {
return toValidCamera(new Camera(
new LatLngAltitude(
52.51974795,
@@ -56,11 +62,63 @@ public final Camera getInitialCamera() {
));
}
+ public final Camera getTokyoCamera() {
+ return toValidCamera(new Camera(
+ new LatLngAltitude(
+ 35.658708,
+ 139.702206,
+ 23.3),
+ 117.0,
+ 55.0,
+ 0.0,
+ 2868.0));
+ }
+
+ @Override
+ public final Camera getInitialCamera() {
+ return toValidCamera(new Camera(
+ new LatLngAltitude(
+ 40.748425,
+ -73.985590,
+ 348.7),
+ 22.0,
+ 80.0,
+ 0.0,
+ 1518.0));
+ }
+
@Override
public void onMap3DViewReady(GoogleMap3D googleMap3D) {
super.onMap3DViewReady(googleMap3D);
googleMap3D.setMapMode(Map3DMode.SATELLITE);
+ Button flyBerlinButton = findViewById(com.example.maps3dcommon.R.id.fly_berlin_button);
+ if (flyBerlinButton != null) {
+ runOnUiThread(() -> flyBerlinButton.setVisibility(View.VISIBLE));
+ flyBerlinButton.setOnClickListener(v -> {
+ FlyToOptions options = new FlyToOptions(getBerlinCamera(), 2000L);
+ googleMap3D.flyCameraTo(options);
+ });
+ }
+
+ Button flyNycButton = findViewById(com.example.maps3dcommon.R.id.fly_nyc_button);
+ if (flyNycButton != null) {
+ runOnUiThread(() -> flyNycButton.setVisibility(View.VISIBLE));
+ flyNycButton.setOnClickListener(v -> {
+ FlyToOptions options = new FlyToOptions(getInitialCamera(), 2000L);
+ googleMap3D.flyCameraTo(options);
+ });
+ }
+
+ Button flyTokyoButton = findViewById(com.example.maps3dcommon.R.id.fly_tokyo_button);
+ if (flyTokyoButton != null) {
+ runOnUiThread(() -> flyTokyoButton.setVisibility(View.VISIBLE));
+ flyTokyoButton.setOnClickListener(v -> {
+ FlyToOptions options = new FlyToOptions(getTokyoCamera(), 2000L);
+ googleMap3D.flyCameraTo(options);
+ });
+ }
+
addMarkerWithToastListener(googleMap3D,
new LatLngAltitude(52.519605780912585, 13.406867190588198, 150.0),
"Absolute (150m)",
@@ -88,6 +146,77 @@ public void onMap3DViewReady(GoogleMap3D googleMap3D) {
AltitudeMode.RELATIVE_TO_MESH,
CollisionBehavior.REQUIRED
);
+
+ MarkerOptions apeOptions = new MarkerOptions();
+ apeOptions.setPosition(new LatLngAltitude(40.7484, -73.9857, 100.0));
+ apeOptions.setZIndex(1);
+ apeOptions.setLabel("King Kong / Empire State Building");
+ apeOptions.setAltitudeMode(AltitudeMode.RELATIVE_TO_MESH);
+ apeOptions.setCollisionBehavior(CollisionBehavior.REQUIRED);
+ apeOptions.setExtruded(true);
+ apeOptions.setDrawnWhenOccluded(true);
+
+ apeOptions.setStyle(new ImageView(com.example.maps3dcommon.R.drawable.ook));
+
+ com.google.android.gms.maps3d.model.Marker apeMarker = googleMap3D.addMarker(apeOptions);
+ if (apeMarker != null) {
+ apeMarker.setClickListener(
+ () -> MarkersActivity.this.showToast("Clicked on marker: " + apeMarker.getLabel()));
+ }
+
+ Glyph customColorGlyph = Glyph.fromColor(android.graphics.Color.CYAN);
+ MarkerOptions customColorOptions = new MarkerOptions();
+ customColorOptions.setPosition(new LatLngAltitude(40.7486, -73.9848, 600.0));
+ customColorOptions.setExtruded(true);
+ customColorOptions.setDrawnWhenOccluded(true);
+ customColorOptions.setLabel("Custom Color Pin");
+ customColorOptions.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND);
+ PinConfiguration.Builder colorPinBuilder = PinConfiguration.builder();
+ colorPinBuilder.setBackgroundColor(android.graphics.Color.RED);
+ colorPinBuilder.setBorderColor(android.graphics.Color.WHITE);
+ colorPinBuilder.setGlyph(customColorGlyph);
+ customColorOptions.setStyle(colorPinBuilder.build());
+
+ com.google.android.gms.maps3d.model.Marker colorMarker = googleMap3D.addMarker(customColorOptions);
+ if (colorMarker != null) {
+ colorMarker.setClickListener(
+ () -> MarkersActivity.this.showToast("Clicked on marker: " + colorMarker.getLabel()));
+ }
+
+ Glyph textGlyph = Glyph.fromColor(android.graphics.Color.RED);
+ textGlyph.setText("NYC\n 🍎 ");
+ MarkerOptions textOptions = new MarkerOptions();
+ textOptions.setPosition(new LatLngAltitude(40.7482, -73.9862, 600.0));
+ textOptions.setExtruded(true);
+ textOptions.setDrawnWhenOccluded(true);
+ textOptions.setLabel("Custom Text Pin");
+ textOptions.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND);
+ PinConfiguration.Builder textPinBuilder = PinConfiguration.builder();
+ textPinBuilder.setBackgroundColor(android.graphics.Color.YELLOW);
+ textPinBuilder.setBorderColor(android.graphics.Color.BLUE);
+ textPinBuilder.setGlyph(textGlyph);
+ textOptions.setStyle(textPinBuilder.build());
+
+ com.google.android.gms.maps3d.model.Marker textMarker = googleMap3D.addMarker(textOptions);
+ if (textMarker != null) {
+ textMarker.setClickListener(
+ () -> MarkersActivity.this.showToast("Clicked on marker: " + textMarker.getLabel()));
+ }
+
+ MarkerOptions shibuyaOptions = new MarkerOptions();
+ shibuyaOptions.setPosition(new LatLngAltitude(35.6595, 139.7005, 50.0));
+ shibuyaOptions.setLabel("Shibuya Crossing Easter Egg");
+ shibuyaOptions.setAltitudeMode(AltitudeMode.RELATIVE_TO_GROUND);
+ shibuyaOptions.setExtruded(true);
+ shibuyaOptions.setDrawnWhenOccluded(true);
+ shibuyaOptions.setStyle(new ImageView(com.example.maps3dcommon.R.drawable.gz));
+
+ com.google.android.gms.maps3d.model.Marker shibuyaMarker = googleMap3D.addMarker(shibuyaOptions);
+ if (shibuyaMarker != null) {
+ shibuyaMarker.setClickListener(
+ () -> MarkersActivity.this.showToast("Clicked on marker: " + shibuyaMarker.getLabel()));
+ }
+
}
private void addMarkerWithToastListener(
diff --git a/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/sampleactivity/SampleBaseActivity.java b/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/sampleactivity/SampleBaseActivity.java
index ef7ad84..b0b022c 100644
--- a/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/sampleactivity/SampleBaseActivity.java
+++ b/Maps3DSamples/ApiDemos/java-app/src/main/java/com/example/maps3djava/sampleactivity/SampleBaseActivity.java
@@ -86,25 +86,30 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_common_map);
View rootView = findViewById(R.id.map_container);
+ MaterialToolbar topBar = findViewById(R.id.top_bar);
+
+ topBar.setTitle(getTitle());
+
ViewCompat.setOnApplyWindowInsetsListener(rootView, (v, windowInsets) -> {
- Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
-
- // Apply the insets as padding to the view.
- // This will push the content down from behind the status bar and up from
- // behind the navigation bar.
- v.setPadding(
- insets.left,
- insets.top,
- insets.right,
- insets.bottom
- );
-
- // Return CONSUMED to signal that we've handled the insets.
+ Insets statusBarInsets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars());
+ Insets navInsets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars());
+
+ View appBarLayout = findViewById(R.id.app_bar_layout);
+ if (appBarLayout != null) {
+ appBarLayout.setPadding(0, statusBarInsets.top, 0, 0);
+ }
+ androidx.constraintlayout.helper.widget.Flow buttonFlow = findViewById(R.id.button_flow);
+ if (buttonFlow != null) {
+ android.view.ViewGroup.MarginLayoutParams layoutParams = (android.view.ViewGroup.MarginLayoutParams) buttonFlow
+ .getLayoutParams();
+ int margin8dp = (int) (8 * getResources().getDisplayMetrics().density);
+ layoutParams.bottomMargin = navInsets.bottom + margin8dp;
+ buttonFlow.setLayoutParams(layoutParams);
+ }
+
return WindowInsetsCompat.CONSUMED;
});
- ((MaterialToolbar) findViewById(R.id.top_bar)).setTitle(getTitle());
-
map3DView = findViewById(R.id.map3dView);
map3DView.onCreate(savedInstanceState);
map3DView.getMap3DViewAsync(this);
@@ -219,4 +224,57 @@ protected void snapshot(Camera camera) {
protected void showToast(String message) {
runOnUiThread(() -> Toast.makeText(this, message, Toast.LENGTH_SHORT).show());
}
+
+ @Override
+ public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
+ if (googleMap3D == null)
+ return super.onKeyDown(keyCode, event);
+ Camera currentCamera = googleMap3D.getCamera();
+ if (currentCamera == null)
+ return super.onKeyDown(keyCode, event);
+
+ float dTilt = 0f;
+ float dHeading = 0f;
+ float dRange = 0f;
+
+ float incrementAmount = 5.0f;
+ float rangeIncrementAmount = 200.0f;
+ boolean handled = true;
+
+ switch (keyCode) {
+ case android.view.KeyEvent.KEYCODE_W:
+ dTilt = -incrementAmount;
+ break;
+ case android.view.KeyEvent.KEYCODE_S:
+ dTilt = incrementAmount;
+ break;
+ case android.view.KeyEvent.KEYCODE_A:
+ dHeading = -incrementAmount;
+ break;
+ case android.view.KeyEvent.KEYCODE_D:
+ dHeading = incrementAmount;
+ break;
+ case android.view.KeyEvent.KEYCODE_Z:
+ dRange = -rangeIncrementAmount;
+ break;
+ case android.view.KeyEvent.KEYCODE_X:
+ dRange = rangeIncrementAmount;
+ break;
+ default:
+ handled = false;
+ }
+
+ if (handled) {
+ Camera newCamera = new Camera(
+ currentCamera.getCenter(),
+ com.example.maps3d.common.UtilitiesKt.toHeading(currentCamera.getHeading() + dHeading),
+ com.example.maps3d.common.UtilitiesKt.toTilt(currentCamera.getTilt() + dTilt),
+ currentCamera.getRoll(),
+ com.example.maps3d.common.UtilitiesKt.toRange(currentCamera.getRange() + dRange));
+ googleMap3D.setCamera(newCamera);
+ return true;
+ }
+
+ return super.onKeyDown(keyCode, event);
+ }
}
\ No newline at end of file
diff --git a/Maps3DSamples/ApiDemos/kotlin-app/src/main/AndroidManifest.xml b/Maps3DSamples/ApiDemos/kotlin-app/src/main/AndroidManifest.xml
index 28be531..9acd0a0 100644
--- a/Maps3DSamples/ApiDemos/kotlin-app/src/main/AndroidManifest.xml
+++ b/Maps3DSamples/ApiDemos/kotlin-app/src/main/AndroidManifest.xml
@@ -95,6 +95,15 @@
android:exported="true"
/>
+
+
+
+
diff --git a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/cameracontrols/CameraControlsActivity.kt b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/cameracontrols/CameraControlsActivity.kt
index bdad1b7..6037483 100644
--- a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/cameracontrols/CameraControlsActivity.kt
+++ b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/cameracontrols/CameraControlsActivity.kt
@@ -170,8 +170,8 @@ class CameraControlsActivity : SampleBaseActivity(), OnMap3DViewReadyCallback {
*
* @param googleMap3D The [GoogleMap3D] object representing the 3D map.
*/
- override fun onMap3DViewReady(googleMap3D: GoogleMap3D) {
- super.onMap3DViewReady(googleMap3D)
+ override fun onMapReady(googleMap3D: GoogleMap3D) {
+ super.onMapReady(googleMap3D)
this.googleMap3D = googleMap3D
// Set the initial camera position
@@ -187,7 +187,7 @@ class CameraControlsActivity : SampleBaseActivity(), OnMap3DViewReadyCallback {
googleMap3D.setOnMapSteadyListener { isSteady ->
if (isSteady) {
googleMap3D.setOnMapSteadyListener(null)
- CoroutineScope(Dispatchers.Main).launch {
+ CoroutineScope(Dispatchers.Main).launch {
delay(2000.milliseconds)
flyToEmpireStateBuilding()
}
diff --git a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mainactivity/MainActivity.kt b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mainactivity/MainActivity.kt
index 417c500..8912493 100644
--- a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mainactivity/MainActivity.kt
+++ b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mainactivity/MainActivity.kt
@@ -52,6 +52,7 @@ import com.example.maps3dkotlin.markers.MarkersActivity
import com.example.maps3dkotlin.models.ModelsActivity
import com.example.maps3dkotlin.polygons.PolygonsActivity
import com.example.maps3dkotlin.polylines.PolylinesActivity
+import com.example.maps3dkotlin.popovers.PopoversActivity
import com.example.maps3dkotlin.theme.Maps3DSamplesTheme
import kotlinx.coroutines.launch
@@ -83,6 +84,7 @@ class MainActivity : ComponentActivity() {
Sample(R.string.feature_title_polygons, PolygonsActivity::class.java),
Sample(R.string.feature_title_polylines, PolylinesActivity::class.java),
Sample(R.string.feature_title_3d_models, ModelsActivity::class.java),
+ Sample(R.string.feature_title_popovers, PopoversActivity::class.java),
Sample(R.string.feature_title_map_interactions, MapInteractionsActivity::class.java),
)
diff --git a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mapinteractions/MapInteractionsActivity.kt b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mapinteractions/MapInteractionsActivity.kt
index ba3160a..97a8dc8 100644
--- a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mapinteractions/MapInteractionsActivity.kt
+++ b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/mapinteractions/MapInteractionsActivity.kt
@@ -1,6 +1,7 @@
package com.example.maps3dkotlin.mapinteractions
import android.widget.Toast
+import androidx.lifecycle.lifecycleScope
import com.example.maps3dkotlin.sampleactivity.SampleBaseActivity
import com.google.android.gms.maps3d.GoogleMap3D
import com.google.android.gms.maps3d.model.Map3DMode
@@ -23,11 +24,12 @@ class MapInteractionsActivity : SampleBaseActivity() {
range = 3757.0
}
- override fun onMap3DViewReady(googleMap3D: GoogleMap3D) {
- super.onMap3DViewReady(googleMap3D)
+ override fun onMapReady(googleMap3D: GoogleMap3D) {
+ super.onMapReady(googleMap3D)
googleMap3D.setMapMode(Map3DMode.HYBRID)
- CoroutineScope(Dispatchers.Main).launch {
+ // Listeners for map clicks. We use lifecycleScope to ensure coroutines are cancelled when the activity is destroyed.
+ lifecycleScope.launch {
googleMap3D.setMap3DClickListener { location, placeId ->
if (placeId != null) {
showToast("Clicked on place with ID: $placeId")
@@ -38,9 +40,9 @@ class MapInteractionsActivity : SampleBaseActivity() {
}
}
- fun showToast(message: String) {
- CoroutineScope(Dispatchers.Main).launch {
- Toast.makeText(this@MapInteractionsActivity, message, android.widget.Toast.LENGTH_SHORT).show()
+ private fun showToast(message: String) {
+ lifecycleScope.launch {
+ Toast.makeText(this@MapInteractionsActivity, message, Toast.LENGTH_SHORT).show()
}
}
diff --git a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/markers/MarkersActivity.kt b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/markers/MarkersActivity.kt
index e45755a..df977d2 100644
--- a/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/markers/MarkersActivity.kt
+++ b/Maps3DSamples/ApiDemos/kotlin-app/src/main/java/com/example/maps3dkotlin/markers/MarkersActivity.kt
@@ -15,21 +15,24 @@
package com.example.maps3dkotlin.markers
import android.util.Log
+import android.view.View
+import android.widget.Button
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.example.maps3dkotlin.sampleactivity.SampleBaseActivity
import com.google.android.gms.maps3d.GoogleMap3D
import com.google.android.gms.maps3d.model.AltitudeMode
import com.google.android.gms.maps3d.model.CollisionBehavior
+import com.google.android.gms.maps3d.model.Glyph
+import com.google.android.gms.maps3d.model.ImageView
import com.google.android.gms.maps3d.model.Map3DMode
import com.google.android.gms.maps3d.model.Marker
import com.google.android.gms.maps3d.model.camera
import com.google.android.gms.maps3d.model.latLngAltitude
import com.google.android.gms.maps3d.model.markerOptions
+import com.google.android.gms.maps3d.model.pinConfiguration
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
-import kotlin.time.Duration.Companion.milliseconds
/**
* This activity demonstrates the various altitude modes available for markers on a 3D map.
@@ -51,10 +54,7 @@ import kotlin.time.Duration.Companion.milliseconds
class MarkersActivity : SampleBaseActivity() {
override val TAG = MarkersActivity::class.java.simpleName
- // The initial camera position is defined declaratively, providing a clear overview of
- // the starting view of the map. This makes it easy to understand and modify the initial
- // scene without digging into the logic of the activity.
- override val initialCamera = camera {
+ val berlinCamera = camera {
center = latLngAltitude {
latitude = 52.51974795
longitude = 13.40715553
@@ -65,14 +65,74 @@ class MarkersActivity : SampleBaseActivity() {
range = 1500.0
}
- override fun onMap3DViewReady(googleMap3D: GoogleMap3D) {
- super.onMap3DViewReady(googleMap3D)
+ val nycCamera = camera {
+ center = latLngAltitude {
+ latitude = 40.748425
+ longitude = -73.985590
+ altitude = 348.7
+ }
+ heading = 22.0
+ tilt = 80.0
+ range = 1518.0
+ }
+
+ val tokyoCamera = camera {
+ center = latLngAltitude {
+ latitude = 35.658708
+ longitude = 139.702206
+ altitude = 23.3
+ }
+ heading = 117.0
+ tilt = 55.0
+ range = 2868.0
+ }
+
+ // The initial camera position is defined declaratively, providing a clear overview of
+ // the starting view of the map. This makes it easy to understand and modify the initial
+ // scene without digging into the logic of the activity.
+ override val initialCamera = nycCamera
+
+ override fun onMapReady(googleMap3D: GoogleMap3D) {
+ super.onMapReady(googleMap3D)
googleMap3D.setMapMode(Map3DMode.SATELLITE)
- // Using lifecycleScope ensures that the coroutine is automatically cancelled when the
- // activity is destroyed, preventing potential memory leaks.
- lifecycleScope.launch {
- delay(1.milliseconds)
+ findViewById