From e840c1a5fbb0dc99f5b2b7cfb0701e4ad46247af Mon Sep 17 00:00:00 2001 From: Dale Hawkins <107309+dkhawk@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:13:25 -0600 Subject: [PATCH] fix: address lint issues in Java and Kotlin files --- .../maps/android/clustering/ClusterManager.kt | 1 - .../NonHierarchicalDistanceBasedAlgorithm.kt | 1 - .../algo/PreCachingAlgorithmDecorator.kt | 25 ++++----- .../clustering/view/ClusterRenderer.kt | 1 - .../view/ClusterRendererMultipleItems.kt | 26 +++++---- .../DefaultAdvancedMarkersClusterRenderer.kt | 42 +++++++------- .../clustering/view/DefaultClusterRenderer.kt | 25 +++++---- .../projection/SphericalMercatorProjection.kt | 4 +- .../android/renderer/GoogleMapRenderer.kt | 18 ++++-- .../android/heatmaps/HeatmapTileProvider.kt | 56 +++++++++---------- .../com/google/maps/android/StreetViewUtil.kt | 3 +- .../android/collections/CircleManager.java | 3 +- .../collections/GroundOverlayManager.java | 4 +- .../android/collections/MapObjectManager.java | 3 +- .../android/collections/MarkerManager.java | 7 ++- .../android/collections/PolygonManager.java | 3 +- .../android/collections/PolylineManager.java | 3 +- .../google/maps/android/ui/IconGenerator.kt | 9 ++- 18 files changed, 124 insertions(+), 110 deletions(-) diff --git a/clustering/src/main/java/com/google/maps/android/clustering/ClusterManager.kt b/clustering/src/main/java/com/google/maps/android/clustering/ClusterManager.kt index 25c113012..3130165f0 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/ClusterManager.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/ClusterManager.kt @@ -16,7 +16,6 @@ package com.google.maps.android.clustering import android.content.Context -import android.os.AsyncTask import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.GoogleMap.OnCameraIdleListener import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener diff --git a/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt b/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt index 91db577e8..5fcac43e9 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.kt @@ -22,7 +22,6 @@ import com.google.maps.android.geometry.Bounds import com.google.maps.android.geometry.Point import com.google.maps.android.projection.SphericalMercatorProjection import com.google.maps.android.quadtree.PointQuadTree -import java.util.ArrayList import java.util.Collections import java.util.HashMap import java.util.HashSet diff --git a/clustering/src/main/java/com/google/maps/android/clustering/algo/PreCachingAlgorithmDecorator.kt b/clustering/src/main/java/com/google/maps/android/clustering/algo/PreCachingAlgorithmDecorator.kt index 8e7d3045f..9ae93c972 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/algo/PreCachingAlgorithmDecorator.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/algo/PreCachingAlgorithmDecorator.kt @@ -22,6 +22,7 @@ import java.util.concurrent.Executor import java.util.concurrent.Executors import java.util.concurrent.locks.ReadWriteLock import java.util.concurrent.locks.ReentrantReadWriteLock +import kotlin.concurrent.withLock /** * Optimistically fetch clusters for adjacent zoom levels, caching them as necessary. @@ -107,24 +108,18 @@ class PreCachingAlgorithmDecorator( } private fun getClustersInternal(discreteZoom: Int): Set> { - var results: Set>? - mCacheLock.readLock().lock() - results = mCache.get(discreteZoom) - mCacheLock.readLock().unlock() + val cached = mCacheLock.readLock().withLock { + mCache.get(discreteZoom) + } + if (cached != null) { + return cached + } - if (results == null) { - mCacheLock.writeLock().lock() - try { - results = mCache.get(discreteZoom) - if (results == null) { - results = algorithm.getClusters(discreteZoom.toFloat()) - mCache.put(discreteZoom, results) - } - } finally { - mCacheLock.writeLock().unlock() + return mCacheLock.writeLock().withLock { + mCache.get(discreteZoom) ?: algorithm.getClusters(discreteZoom.toFloat()).also { + mCache.put(discreteZoom, it) } } - return results!! } private inner class PrecacheRunnable( diff --git a/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.kt b/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.kt index a081b8080..02a200b4a 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRenderer.kt @@ -18,7 +18,6 @@ package com.google.maps.android.clustering.view import androidx.annotation.StyleRes import com.google.maps.android.clustering.Cluster import com.google.maps.android.clustering.ClusterItem -import com.google.maps.android.clustering.ClusterManager import com.google.maps.android.clustering.ClusterManager.OnClusterClickListener import com.google.maps.android.clustering.ClusterManager.OnClusterInfoWindowClickListener import com.google.maps.android.clustering.ClusterManager.OnClusterInfoWindowLongClickListener diff --git a/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.kt b/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.kt index 74bd91190..bbf2c5ec1 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/view/ClusterRendererMultipleItems.kt @@ -63,7 +63,6 @@ import java.util.Queue import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executor import java.util.concurrent.Executors -import java.util.concurrent.locks.Condition import java.util.concurrent.locks.Lock import java.util.concurrent.locks.ReentrantLock import kotlin.math.abs @@ -325,17 +324,19 @@ open class ClusterRendererMultipleItems @JvmOverloads construct } val projection = mMap.projection - var renderTask: RenderTask? - synchronized(this) { - renderTask = mNextClusters + val renderTask = synchronized(this) { + val task = mNextClusters mNextClusters = null mViewModificationInProgress = true + task } - renderTask!!.setCallback { sendEmptyMessage(TASK_FINISHED) } - renderTask!!.setProjection(projection) - renderTask!!.setMapZoom(mMap.cameraPosition.zoom) - mExecutor.execute(renderTask) + renderTask?.let { + it.setCallback { sendEmptyMessage(TASK_FINISHED) } + it.setProjection(projection) + it.setMapZoom(mMap.cameraPosition.zoom) + mExecutor.execute(it) + } } fun queue(clusters: Set>) { @@ -475,14 +476,15 @@ open class ClusterRendererMultipleItems @JvmOverloads construct } for (marker in markersToRemove) { - val onScreen = marker.position?.let { visibleBounds.contains(it) } ?: false + val position = marker.position + val onScreen = position?.let { visibleBounds.contains(it) } ?: false if (onScreen && mAnimate) { - val point = mSphericalMercatorProjection!!.toPoint(marker.position!!) + val point = mSphericalMercatorProjection!!.toPoint(position) val closest = findClosestCluster(newClustersOnScreen, point) if (closest != null) { val animateTo = mSphericalMercatorProjection!!.toLatLng(closest) - markerModifier.animateThenRemove(marker, marker.position!!, animateTo!!) + markerModifier.animateThenRemove(marker, position, animateTo) RendererLogger.d("ClusterRenderer", "Animating then removing marker at position: " + marker.position) } else if (mClusterMarkerCache.mCache.keys .iterator() @@ -1143,7 +1145,7 @@ open class ClusterRendererMultipleItems @JvmOverloads construct val markerWithPosition: MarkerWithPosition if (marker == null) { RendererLogger.d("ClusterRenderer", "Creating new cluster marker") - val markerOptions = MarkerOptions().position(if (animateFrom == null) cluster.position else animateFrom) + val markerOptions = MarkerOptions().position(animateFrom ?: cluster.position) onBeforeClusterRendered(cluster, markerOptions) marker = mClusterManager.clusterMarkerCollection.addMarker(markerOptions) mClusterMarkerCache.put(cluster, marker) diff --git a/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.kt b/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.kt index 84637073f..36343542e 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultAdvancedMarkersClusterRenderer.kt @@ -60,7 +60,6 @@ import java.util.Queue import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executor import java.util.concurrent.Executors -import java.util.concurrent.locks.Condition import java.util.concurrent.locks.ReentrantLock import kotlin.math.abs import kotlin.math.min @@ -269,17 +268,19 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads } val projection = mMap.projection - var renderTask: RenderTask? - synchronized(this) { - renderTask = mNextClusters + val renderTask = synchronized(this) { + val task = mNextClusters mNextClusters = null mViewModificationInProgress = true + task } - renderTask!!.setCallback { sendEmptyMessage(TASK_FINISHED) } - renderTask!!.setProjection(projection) - renderTask!!.setMapZoom(mMap.cameraPosition.zoom) - mExecutor.execute(renderTask) + renderTask?.let { + it.setCallback { sendEmptyMessage(TASK_FINISHED) } + it.setProjection(projection) + it.setMapZoom(mMap.cameraPosition.zoom) + mExecutor.execute(it) + } } fun queue(clusters: Set>) { @@ -473,7 +474,7 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads val closest = findClosestCluster(newClustersOnScreen, point) if (closest != null) { val animateTo = mSphericalMercatorProjection!!.toLatLng(closest) - markerModifier.animateThenRemove(marker, marker.position, animateTo!!) + markerModifier.animateThenRemove(marker, marker.position, animateTo) } else { markerModifier.remove(true, marker.marker) } @@ -1004,7 +1005,7 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads if (!shouldRenderAsCluster(cluster)) { for (item in cluster.items) { var marker = mMarkerCache[item] as AdvancedMarker? - var markerWithPosition: MarkerWithPosition + val markerWithPosition: MarkerWithPosition if (marker == null) { val advancedMarkerOptions = AdvancedMarkerOptions() if (animateFrom != null) { @@ -1016,9 +1017,10 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads } } onBeforeClusterItemRendered(item, advancedMarkerOptions) - marker = mClusterManager.markerCollection.addMarker(advancedMarkerOptions) as AdvancedMarker? - markerWithPosition = MarkerWithPosition(marker!!) - mMarkerCache.put(item, marker!!) + val newMarker = mClusterManager.markerCollection.addMarker(advancedMarkerOptions) as AdvancedMarker + marker = newMarker + markerWithPosition = MarkerWithPosition(newMarker) + mMarkerCache.put(item, newMarker) if (animateFrom != null) { markerModifier.animate(markerWithPosition, animateFrom, item.position) } @@ -1033,14 +1035,14 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads } var marker = mClusterMarkerCache[cluster] as AdvancedMarker? - var markerWithPosition: MarkerWithPosition + val markerWithPosition: MarkerWithPosition if (marker == null) { - val advancedMarkerOptions = AdvancedMarkerOptions().position(if (animateFrom == null) cluster.position else animateFrom) + val advancedMarkerOptions = AdvancedMarkerOptions().position(animateFrom ?: cluster.position) onBeforeClusterRendered(cluster, advancedMarkerOptions) - val `object` = mClusterManager.clusterMarkerCollection.addMarker(advancedMarkerOptions) - marker = `object` as AdvancedMarker? - mClusterMarkerCache.put(cluster, marker!!) - markerWithPosition = MarkerWithPosition(marker) + val newMarker = mClusterManager.clusterMarkerCollection.addMarker(advancedMarkerOptions) as AdvancedMarker + marker = newMarker + mClusterMarkerCache.put(cluster, newMarker) + markerWithPosition = MarkerWithPosition(newMarker) if (animateFrom != null) { markerModifier.animate(markerWithPosition, animateFrom, cluster.position) } @@ -1048,7 +1050,7 @@ open class DefaultAdvancedMarkersClusterRenderer @JvmOverloads markerWithPosition = MarkerWithPosition(marker) onClusterUpdated(cluster, marker) } - onClusterRendered(cluster, marker!!) + onClusterRendered(cluster, marker) newMarkers.add(markerWithPosition) } } diff --git a/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.kt b/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.kt index 1e278ea83..394522175 100644 --- a/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.kt +++ b/clustering/src/main/java/com/google/maps/android/clustering/view/DefaultClusterRenderer.kt @@ -59,7 +59,6 @@ import java.util.Queue import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executor import java.util.concurrent.Executors -import java.util.concurrent.locks.Condition import java.util.concurrent.locks.ReentrantLock import kotlin.math.abs import kotlin.math.min @@ -268,17 +267,19 @@ open class DefaultClusterRenderer @JvmOverloads constructor( } val projection = mMap.projection - var renderTask: RenderTask? - synchronized(this) { - renderTask = mNextClusters + val renderTask = synchronized(this) { + val task = mNextClusters mNextClusters = null mViewModificationInProgress = true + task } - renderTask!!.setCallback { sendEmptyMessage(TASK_FINISHED) } - renderTask!!.setProjection(projection) - renderTask!!.setMapZoom(mMap.cameraPosition.zoom) - mExecutor.execute(renderTask) + renderTask?.let { + it.setCallback { sendEmptyMessage(TASK_FINISHED) } + it.setProjection(projection) + it.setMapZoom(mMap.cameraPosition.zoom) + mExecutor.execute(it) + } } fun queue(clusters: Set>) { @@ -472,7 +473,7 @@ open class DefaultClusterRenderer @JvmOverloads constructor( val closest = findClosestCluster(newClustersOnScreen, point) if (closest != null) { val animateTo = mSphericalMercatorProjection!!.toLatLng(closest) - markerModifier.animateThenRemove(marker, marker.position, animateTo!!) + markerModifier.animateThenRemove(marker, marker.position, animateTo) } else { markerModifier.remove(true, marker.marker) } @@ -1013,7 +1014,7 @@ open class DefaultClusterRenderer @JvmOverloads constructor( if (!shouldRenderAsCluster(cluster)) { for (item in cluster.items) { var marker = mMarkerCache[item] - var markerWithPosition: MarkerWithPosition + val markerWithPosition: MarkerWithPosition if (marker == null) { val markerOptions = MarkerOptions() if (animateFrom != null) { @@ -1042,9 +1043,9 @@ open class DefaultClusterRenderer @JvmOverloads constructor( } var marker = mClusterMarkerCache[cluster] - var markerWithPosition: MarkerWithPosition + val markerWithPosition: MarkerWithPosition if (marker == null) { - val markerOptions = MarkerOptions().position(if (animateFrom == null) cluster.position else animateFrom) + val markerOptions = MarkerOptions().position(animateFrom ?: cluster.position) onBeforeClusterRendered(cluster, markerOptions) marker = mClusterManager.clusterMarkerCollection.addMarker(markerOptions) mClusterMarkerCache.put(cluster, marker) diff --git a/clustering/src/main/java/com/google/maps/android/projection/SphericalMercatorProjection.kt b/clustering/src/main/java/com/google/maps/android/projection/SphericalMercatorProjection.kt index 071ebbd55..971a81bdd 100644 --- a/clustering/src/main/java/com/google/maps/android/projection/SphericalMercatorProjection.kt +++ b/clustering/src/main/java/com/google/maps/android/projection/SphericalMercatorProjection.kt @@ -21,12 +21,12 @@ import kotlin.math.* class SphericalMercatorProjection( private val worldWidth: Double, ) { - fun toPoint(latLng: LatLng): Point { + fun toPoint(latLng: LatLng): com.google.maps.android.geometry.Point { val x = latLng.longitude / 360 + .5 val siny = sin(Math.toRadians(latLng.latitude)) val y = 0.5 * ln((1 + siny) / (1 - siny)) / -(2 * PI) + .5 - return Point(x * worldWidth, y * worldWidth) + return com.google.maps.android.geometry.Point(x * worldWidth, y * worldWidth) } fun toLatLng(point: com.google.maps.android.geometry.Point): LatLng { diff --git a/data/src/main/java/com/google/maps/android/renderer/GoogleMapRenderer.kt b/data/src/main/java/com/google/maps/android/renderer/GoogleMapRenderer.kt index 85de2cc0a..0162d9996 100644 --- a/data/src/main/java/com/google/maps/android/renderer/GoogleMapRenderer.kt +++ b/data/src/main/java/com/google/maps/android/renderer/GoogleMapRenderer.kt @@ -40,13 +40,17 @@ class GoogleMapRenderer( override fun addLayer(layer: Layer) { if (layers.add(layer)) { - layer.mapObjects.forEach { renderObject(it) } + for (mapObject in layer.mapObjects) { + renderObject(mapObject) + } } } override fun removeLayer(layer: Layer): Boolean { if (layers.remove(layer)) { - layer.mapObjects.forEach { removeRenderedObject(it) } + for (mapObject in layer.mapObjects) { + removeRenderedObject(mapObject) + } return true } return false @@ -55,8 +59,10 @@ class GoogleMapRenderer( override fun getLayers(): Collection = layers override fun clear() { - layers.forEach { layer -> - layer.mapObjects.forEach { removeRenderedObject(it) } + for (layer in layers) { + for (mapObject in layer.mapObjects) { + removeRenderedObject(mapObject) + } } layers.clear() } @@ -135,7 +141,9 @@ class GoogleMapRenderer( visible(polygon.isVisible) zIndex(polygon.zIndex) strokeJointType(polygon.strokeJointType) - polygon.holes.forEach { addHole(it) } + for (hole in polygon.holes) { + addHole(hole) + } polygon.strokePattern?.let { strokePattern(it) } } val sdkPolygon = map.addPolygon(options) diff --git a/heatmaps/src/main/java/com/google/maps/android/heatmaps/HeatmapTileProvider.kt b/heatmaps/src/main/java/com/google/maps/android/heatmaps/HeatmapTileProvider.kt index 64ca20ffc..0475968da 100644 --- a/heatmaps/src/main/java/com/google/maps/android/heatmaps/HeatmapTileProvider.kt +++ b/heatmaps/src/main/java/com/google/maps/android/heatmaps/HeatmapTileProvider.kt @@ -75,11 +75,11 @@ class HeatmapTileProvider private constructor( * @param latLngs A collection of LatLngs. * @return This builder. */ - fun data(latLngs: Collection): Builder = - apply { - this.weightedData(wrapData(latLngs)) - require(this.weightedData?.isNotEmpty() == true) { "No input points." } - } + fun data(latLngs: Collection): Builder { + weightedData(wrapData(latLngs)) + require(weightedData?.isNotEmpty() == true) { "No input points." } + return this + } /** * Specifies the dataset to use for the heatmap, accepting WeightedLatLngs. @@ -87,11 +87,11 @@ class HeatmapTileProvider private constructor( * @param weightedData A collection of WeightedLatLngs. * @return This builder. */ - fun weightedData(weightedData: Collection): Builder = - apply { - this.weightedData = weightedData - require(this.weightedData?.isNotEmpty() == true) { "No input points." } - } + fun weightedData(weightedData: Collection): Builder { + this.weightedData = weightedData + require(this.weightedData?.isNotEmpty() == true) { "No input points." } + return this + } /** * Specifies the radius of the heatmap blur, in pixels. @@ -99,11 +99,11 @@ class HeatmapTileProvider private constructor( * @param radius The radius. Must be between 10 and 50, inclusive. * @return This builder. */ - fun radius(radius: Int): Builder = - apply { - this.radius = radius - require(this.radius in MIN_RADIUS..MAX_RADIUS) { "Radius not within bounds." } - } + fun radius(radius: Int): Builder { + this.radius = radius + require(this.radius in MIN_RADIUS..MAX_RADIUS) { "Radius not within bounds." } + return this + } /** * Specifies the color gradient of the heatmap. @@ -111,10 +111,10 @@ class HeatmapTileProvider private constructor( * @param gradient The gradient to use. * @return This builder. */ - fun gradient(gradient: Gradient): Builder = - apply { - this.gradient = gradient - } + fun gradient(gradient: Gradient): Builder { + this.gradient = gradient + return this + } /** * Specifies the opacity of the heatmap layer. @@ -122,11 +122,11 @@ class HeatmapTileProvider private constructor( * @param opacity The opacity. Must be between 0 and 1, inclusive. * @return This builder. */ - fun opacity(opacity: Double): Builder = - apply { - this.opacity = opacity - require(this.opacity in 0.0..1.0) { "Opacity must be in range [0, 1]" } - } + fun opacity(opacity: Double): Builder { + this.opacity = opacity + require(this.opacity in 0.0..1.0) { "Opacity must be in range [0, 1]" } + return this + } /** * Specifies a custom maximum intensity value for the heatmap. @@ -134,10 +134,10 @@ class HeatmapTileProvider private constructor( * @param intensity The maximum intensity. * @return This builder. */ - fun maxIntensity(intensity: Double): Builder = - apply { - this.intensity = intensity - } + fun maxIntensity(intensity: Double): Builder { + this.intensity = intensity + return this + } /** * Creates a new HeatmapTileProvider instance from the builder's properties. diff --git a/library/src/main/java/com/google/maps/android/StreetViewUtil.kt b/library/src/main/java/com/google/maps/android/StreetViewUtil.kt index a30645d09..3db600867 100644 --- a/library/src/main/java/com/google/maps/android/StreetViewUtil.kt +++ b/library/src/main/java/com/google/maps/android/StreetViewUtil.kt @@ -72,8 +72,7 @@ class StreetViewUtils { throw IOException("HTTP Error: $responseCode") } } catch (e: IOException) { - e.printStackTrace() - throw IOException("Network error: ${e.message}") + throw IOException("Network error: ${e.message}", e) } } } diff --git a/library/src/main/java/com/google/maps/android/collections/CircleManager.java b/library/src/main/java/com/google/maps/android/collections/CircleManager.java index b3e87ea9c..ac466d965 100644 --- a/library/src/main/java/com/google/maps/android/collections/CircleManager.java +++ b/library/src/main/java/com/google/maps/android/collections/CircleManager.java @@ -59,7 +59,8 @@ public void onCircleClick(@NonNull Circle circle) { } } - public class Collection extends MapObjectManager.Collection { + /** A collection of {@link Circle}s on the map with its own set of listeners. */ + public class Collection extends MapObjectManager.Collection { private GoogleMap.OnCircleClickListener mCircleClickListener; public Collection() {} diff --git a/library/src/main/java/com/google/maps/android/collections/GroundOverlayManager.java b/library/src/main/java/com/google/maps/android/collections/GroundOverlayManager.java index 2a675aac0..5d24bfd22 100644 --- a/library/src/main/java/com/google/maps/android/collections/GroundOverlayManager.java +++ b/library/src/main/java/com/google/maps/android/collections/GroundOverlayManager.java @@ -60,7 +60,9 @@ public void onGroundOverlayClick(@NonNull GroundOverlay groundOverlay) { } } - public class Collection extends MapObjectManager.Collection { + /** A collection of {@link GroundOverlay}s on the map with its own set of listeners. */ + public class Collection + extends MapObjectManager.Collection { private GoogleMap.OnGroundOverlayClickListener mGroundOverlayClickListener; public Collection() {} diff --git a/library/src/main/java/com/google/maps/android/collections/MapObjectManager.java b/library/src/main/java/com/google/maps/android/collections/MapObjectManager.java index 014dcb7fe..b3f6b3ff4 100644 --- a/library/src/main/java/com/google/maps/android/collections/MapObjectManager.java +++ b/library/src/main/java/com/google/maps/android/collections/MapObjectManager.java @@ -34,7 +34,7 @@ *

All object operations (adds and removes) should occur via its collection class. That is, don't * add an object via a collection, then remove it via Object.remove() */ -abstract class MapObjectManager { +abstract class MapObjectManager.Collection> { protected final GoogleMap mMap; private final Map mNamedCollections = new HashMap<>(); @@ -97,6 +97,7 @@ public class Collection { public Collection() {} + @SuppressWarnings("unchecked") protected void add(O object) { mObjects.add(object); mAllObjects.put(object, (C) this); diff --git a/library/src/main/java/com/google/maps/android/collections/MarkerManager.java b/library/src/main/java/com/google/maps/android/collections/MarkerManager.java index 366becfa7..ea5bd2da6 100644 --- a/library/src/main/java/com/google/maps/android/collections/MarkerManager.java +++ b/library/src/main/java/com/google/maps/android/collections/MarkerManager.java @@ -17,6 +17,7 @@ import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.AdvancedMarkerOptions; import com.google.android.gms.maps.model.Marker; @@ -51,11 +52,13 @@ void setListenersOnUiThread() { } } + @Override public Collection newCollection() { return new Collection(); } @Override + @Nullable public View getInfoWindow(@NonNull Marker marker) { Collection collection = mAllObjects.get(marker); if (collection != null && collection.mInfoWindowAdapter != null) { @@ -65,6 +68,7 @@ public View getInfoWindow(@NonNull Marker marker) { } @Override + @Nullable public View getInfoContents(@NonNull Marker marker) { Collection collection = mAllObjects.get(marker); if (collection != null && collection.mInfoWindowAdapter != null) { @@ -127,7 +131,8 @@ protected void removeObjectFromMap(Marker object) { object.remove(); } - public class Collection extends MapObjectManager.Collection { + /** A collection of {@link Marker}s on the map with its own set of listeners. */ + public class Collection extends MapObjectManager.Collection { private GoogleMap.OnInfoWindowClickListener mInfoWindowClickListener; private GoogleMap.OnInfoWindowLongClickListener mInfoWindowLongClickListener; private GoogleMap.OnMarkerClickListener mMarkerClickListener; diff --git a/library/src/main/java/com/google/maps/android/collections/PolygonManager.java b/library/src/main/java/com/google/maps/android/collections/PolygonManager.java index 43c4817a9..9c4714a82 100644 --- a/library/src/main/java/com/google/maps/android/collections/PolygonManager.java +++ b/library/src/main/java/com/google/maps/android/collections/PolygonManager.java @@ -59,7 +59,8 @@ public void onPolygonClick(@NonNull Polygon polygon) { } } - public class Collection extends MapObjectManager.Collection { + /** A collection of {@link Polygon}s on the map with its own set of listeners. */ + public class Collection extends MapObjectManager.Collection { private GoogleMap.OnPolygonClickListener mPolygonClickListener; public Collection() {} diff --git a/library/src/main/java/com/google/maps/android/collections/PolylineManager.java b/library/src/main/java/com/google/maps/android/collections/PolylineManager.java index cc5aff3c5..a236b5b00 100644 --- a/library/src/main/java/com/google/maps/android/collections/PolylineManager.java +++ b/library/src/main/java/com/google/maps/android/collections/PolylineManager.java @@ -59,7 +59,8 @@ public void onPolylineClick(@NonNull Polyline polyline) { } } - public class Collection extends MapObjectManager.Collection { + /** A collection of {@link Polyline}s on the map with its own set of listeners. */ + public class Collection extends MapObjectManager.Collection { private GoogleMap.OnPolylineClickListener mPolylineClickListener; public Collection() {} diff --git a/ui/src/main/java/com/google/maps/android/ui/IconGenerator.kt b/ui/src/main/java/com/google/maps/android/ui/IconGenerator.kt index e7e34fa42..716a67171 100644 --- a/ui/src/main/java/com/google/maps/android/ui/IconGenerator.kt +++ b/ui/src/main/java/com/google/maps/android/ui/IconGenerator.kt @@ -26,6 +26,8 @@ import android.view.View import android.view.View.MeasureSpec import android.view.ViewGroup import android.widget.TextView +import androidx.core.view.ViewCompat +import androidx.core.widget.TextViewCompat /** * IconGenerator generates icons that contain text (or custom content) within an info @@ -168,9 +170,7 @@ class IconGenerator(private val context: Context) { * @param resid the identifier of the resource. */ fun setTextAppearance(context: Context, resid: Int) { - if (textView != null) { - textView!!.setTextAppearance(context, resid) - } + textView?.let { TextViewCompat.setTextAppearance(it, resid) } } /** @@ -206,9 +206,8 @@ class IconGenerator(private val context: Context) { * * @param background the Drawable to use as the background, or null to remove the background. */ - // View#setBackgroundDrawable is compatible with pre-API level 16 (Jelly Bean). fun setBackground(background: Drawable?) { - container.setBackgroundDrawable(background) + ViewCompat.setBackground(container, background) // Force setting of padding. // setBackgroundDrawable does not call setPadding if the background has 0 padding.