Initial version -- added millennium read funcionality

This commit is contained in:
Pablo
2026-03-09 22:05:28 +01:00
commit 77c2ded482
2770 changed files with 141927 additions and 0 deletions
@@ -0,0 +1,307 @@
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.model.CameraPosition;
import com.google.android.gms.maps.model.Marker;
import com.google.maps.android.clustering.ClusterItem;
import com.google.maps.android.clustering.algo.Algorithm;
import com.google.maps.android.clustering.algo.NonHierarchicalDistanceBasedAlgorithm;
import com.google.maps.android.clustering.algo.PreCachingAlgorithmDecorator;
import com.google.maps.android.clustering.algo.ScreenBasedAlgorithm;
import com.google.maps.android.clustering.algo.ScreenBasedAlgorithmAdapter;
import com.google.maps.android.clustering.view.ClusterRenderer;
import com.google.maps.android.clustering.view.DefaultClusterRenderer;
import com.google.maps.android.collections.MarkerManager;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/* JADX INFO: loaded from: classes2.dex */
public class ClusterManager<T extends ClusterItem> implements GoogleMap.OnCameraIdleListener, GoogleMap.OnMarkerClickListener, GoogleMap.OnInfoWindowClickListener {
private ScreenBasedAlgorithm<T> mAlgorithm;
private final MarkerManager.Collection mClusterMarkers;
private ClusterManager<T>.ClusterTask mClusterTask;
private final ReadWriteLock mClusterTaskLock;
private GoogleMap mMap;
private final MarkerManager mMarkerManager;
private final MarkerManager.Collection mMarkers;
private OnClusterClickListener<T> mOnClusterClickListener;
private OnClusterInfoWindowClickListener<T> mOnClusterInfoWindowClickListener;
private OnClusterInfoWindowLongClickListener<T> mOnClusterInfoWindowLongClickListener;
private OnClusterItemClickListener<T> mOnClusterItemClickListener;
private OnClusterItemInfoWindowClickListener<T> mOnClusterItemInfoWindowClickListener;
private OnClusterItemInfoWindowLongClickListener<T> mOnClusterItemInfoWindowLongClickListener;
private CameraPosition mPreviousCameraPosition;
private ClusterRenderer<T> mRenderer;
public interface OnClusterClickListener<T extends ClusterItem> {
boolean onClusterClick(Cluster<T> cluster);
}
public interface OnClusterInfoWindowClickListener<T extends ClusterItem> {
void onClusterInfoWindowClick(Cluster<T> cluster);
}
public interface OnClusterInfoWindowLongClickListener<T extends ClusterItem> {
void onClusterInfoWindowLongClick(Cluster<T> cluster);
}
public interface OnClusterItemClickListener<T extends ClusterItem> {
boolean onClusterItemClick(T t);
}
public interface OnClusterItemInfoWindowClickListener<T extends ClusterItem> {
void onClusterItemInfoWindowClick(T t);
}
public interface OnClusterItemInfoWindowLongClickListener<T extends ClusterItem> {
void onClusterItemInfoWindowLongClick(T t);
}
public ClusterManager(Context context, GoogleMap googleMap) {
this(context, googleMap, new MarkerManager(googleMap));
}
public ClusterManager(Context context, GoogleMap googleMap, MarkerManager markerManager) {
this.mClusterTaskLock = new ReentrantReadWriteLock();
this.mMap = googleMap;
this.mMarkerManager = markerManager;
this.mClusterMarkers = markerManager.newCollection();
this.mMarkers = markerManager.newCollection();
this.mRenderer = new DefaultClusterRenderer(context, googleMap, this);
this.mAlgorithm = new ScreenBasedAlgorithmAdapter(new PreCachingAlgorithmDecorator(new NonHierarchicalDistanceBasedAlgorithm()));
this.mClusterTask = new ClusterTask();
this.mRenderer.onAdd();
}
public MarkerManager.Collection getMarkerCollection() {
return this.mMarkers;
}
public MarkerManager.Collection getClusterMarkerCollection() {
return this.mClusterMarkers;
}
public MarkerManager getMarkerManager() {
return this.mMarkerManager;
}
public void setRenderer(ClusterRenderer<T> clusterRenderer) {
this.mRenderer.setOnClusterClickListener(null);
this.mRenderer.setOnClusterItemClickListener(null);
this.mClusterMarkers.clear();
this.mMarkers.clear();
this.mRenderer.onRemove();
this.mRenderer = clusterRenderer;
clusterRenderer.onAdd();
this.mRenderer.setOnClusterClickListener(this.mOnClusterClickListener);
this.mRenderer.setOnClusterInfoWindowClickListener(this.mOnClusterInfoWindowClickListener);
this.mRenderer.setOnClusterInfoWindowLongClickListener(this.mOnClusterInfoWindowLongClickListener);
this.mRenderer.setOnClusterItemClickListener(this.mOnClusterItemClickListener);
this.mRenderer.setOnClusterItemInfoWindowClickListener(this.mOnClusterItemInfoWindowClickListener);
this.mRenderer.setOnClusterItemInfoWindowLongClickListener(this.mOnClusterItemInfoWindowLongClickListener);
cluster();
}
public void setAlgorithm(Algorithm<T> algorithm) {
if (algorithm instanceof ScreenBasedAlgorithm) {
setAlgorithm((ScreenBasedAlgorithm) algorithm);
} else {
setAlgorithm((ScreenBasedAlgorithm) new ScreenBasedAlgorithmAdapter(algorithm));
}
}
public void setAlgorithm(ScreenBasedAlgorithm<T> screenBasedAlgorithm) {
screenBasedAlgorithm.lock();
try {
Algorithm<T> algorithm = getAlgorithm();
this.mAlgorithm = screenBasedAlgorithm;
if (algorithm != null) {
algorithm.lock();
try {
screenBasedAlgorithm.addItems(algorithm.getItems());
algorithm.unlock();
} catch (Throwable th) {
algorithm.unlock();
throw th;
}
}
screenBasedAlgorithm.unlock();
if (this.mAlgorithm.shouldReclusterOnMapMovement()) {
this.mAlgorithm.onCameraChange(this.mMap.getCameraPosition());
}
cluster();
} catch (Throwable th2) {
screenBasedAlgorithm.unlock();
throw th2;
}
}
public void setAnimation(boolean z) {
this.mRenderer.setAnimation(z);
}
public ClusterRenderer<T> getRenderer() {
return this.mRenderer;
}
public Algorithm<T> getAlgorithm() {
return this.mAlgorithm;
}
public void clearItems() {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
algorithm.clearItems();
} finally {
algorithm.unlock();
}
}
public boolean addItems(Collection<T> collection) {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
return algorithm.addItems(collection);
} finally {
algorithm.unlock();
}
}
public boolean addItem(T t) {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
return algorithm.addItem(t);
} finally {
algorithm.unlock();
}
}
public boolean removeItems(Collection<T> collection) {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
return algorithm.removeItems(collection);
} finally {
algorithm.unlock();
}
}
public boolean removeItem(T t) {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
return algorithm.removeItem(t);
} finally {
algorithm.unlock();
}
}
public boolean updateItem(T t) {
Algorithm<T> algorithm = getAlgorithm();
algorithm.lock();
try {
return algorithm.updateItem(t);
} finally {
algorithm.unlock();
}
}
public void cluster() {
this.mClusterTaskLock.writeLock().lock();
try {
this.mClusterTask.cancel(true);
ClusterManager<T>.ClusterTask clusterTask = new ClusterTask();
this.mClusterTask = clusterTask;
clusterTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Float.valueOf(this.mMap.getCameraPosition().zoom));
} finally {
this.mClusterTaskLock.writeLock().unlock();
}
}
@Override // com.google.android.gms.maps.GoogleMap.OnCameraIdleListener
public void onCameraIdle() {
ClusterRenderer<T> clusterRenderer = this.mRenderer;
if (clusterRenderer instanceof GoogleMap.OnCameraIdleListener) {
((GoogleMap.OnCameraIdleListener) clusterRenderer).onCameraIdle();
}
this.mAlgorithm.onCameraChange(this.mMap.getCameraPosition());
if (this.mAlgorithm.shouldReclusterOnMapMovement()) {
cluster();
return;
}
CameraPosition cameraPosition = this.mPreviousCameraPosition;
if (cameraPosition == null || cameraPosition.zoom != this.mMap.getCameraPosition().zoom) {
this.mPreviousCameraPosition = this.mMap.getCameraPosition();
cluster();
}
}
@Override // com.google.android.gms.maps.GoogleMap.OnMarkerClickListener
public boolean onMarkerClick(Marker marker) {
return getMarkerManager().onMarkerClick(marker);
}
@Override // com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener
public void onInfoWindowClick(Marker marker) {
getMarkerManager().onInfoWindowClick(marker);
}
private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> {
private ClusterTask() {
}
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.os.AsyncTask
public Set<? extends Cluster<T>> doInBackground(Float... fArr) {
Algorithm<T> algorithm = ClusterManager.this.getAlgorithm();
algorithm.lock();
try {
return algorithm.getClusters(fArr[0].floatValue());
} finally {
algorithm.unlock();
}
}
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.os.AsyncTask
public void onPostExecute(Set<? extends Cluster<T>> set) {
ClusterManager.this.mRenderer.onClustersChanged(set);
}
}
public void setOnClusterClickListener(OnClusterClickListener<T> onClusterClickListener) {
this.mOnClusterClickListener = onClusterClickListener;
this.mRenderer.setOnClusterClickListener(onClusterClickListener);
}
public void setOnClusterInfoWindowClickListener(OnClusterInfoWindowClickListener<T> onClusterInfoWindowClickListener) {
this.mOnClusterInfoWindowClickListener = onClusterInfoWindowClickListener;
this.mRenderer.setOnClusterInfoWindowClickListener(onClusterInfoWindowClickListener);
}
public void setOnClusterInfoWindowLongClickListener(OnClusterInfoWindowLongClickListener<T> onClusterInfoWindowLongClickListener) {
this.mOnClusterInfoWindowLongClickListener = onClusterInfoWindowLongClickListener;
this.mRenderer.setOnClusterInfoWindowLongClickListener(onClusterInfoWindowLongClickListener);
}
public void setOnClusterItemClickListener(OnClusterItemClickListener<T> onClusterItemClickListener) {
this.mOnClusterItemClickListener = onClusterItemClickListener;
this.mRenderer.setOnClusterItemClickListener(onClusterItemClickListener);
}
public void setOnClusterItemInfoWindowClickListener(OnClusterItemInfoWindowClickListener<T> onClusterItemInfoWindowClickListener) {
this.mOnClusterItemInfoWindowClickListener = onClusterItemInfoWindowClickListener;
this.mRenderer.setOnClusterItemInfoWindowClickListener(onClusterItemInfoWindowClickListener);
}
public void setOnClusterItemInfoWindowLongClickListener(OnClusterItemInfoWindowLongClickListener<T> onClusterItemInfoWindowLongClickListener) {
this.mOnClusterItemInfoWindowLongClickListener = onClusterItemInfoWindowLongClickListener;
this.mRenderer.setOnClusterItemInfoWindowLongClickListener(onClusterItemInfoWindowLongClickListener);
}
}