Initial version -- added millennium read funcionality
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user