summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorŁukasz Paczos <lukasz.paczos@mapbox.com>2019-09-06 16:50:19 +0200
committerŁukasz Paczos <lukasz.paczos@mapbox.com>2019-09-06 16:50:19 +0200
commit6574aad91d17514477b646ef226ed9c6136ee617 (patch)
tree5bde2c133c387d468d73ebf7406a6dd63066ff50
parent0dff7299e2546ec7828739dd6ee0a0b9f68fb0f6 (diff)
downloadqtlocation-mapboxgl-6574aad91d17514477b646ef226ed9c6136ee617.tar.gz
[android][wip] option to cancel camera transitions
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java53
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java86
2 files changed, 84 insertions, 55 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java
index cf0a9b825f..a4c068e70c 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java
@@ -7,9 +7,10 @@ import java.util.concurrent.CopyOnWriteArrayList;
public abstract class CameraTransition<T> {
- public static final int TYPE_ANY = 0;
- public static final int TYPE_GESTURE = 1;
- public static final int TYPE_LOCATION = 2;
+ //todo camera - reason should be an intdef/enum/object so that devs can extend without clashing with default values
+ public static final int REASON_ANY = 0;
+ public static final int REASON_GESTURE = 1;
+ public static final int REASON_LOCATION = 2;
public static final Interpolator INTERPOLATOR_LINEAR = PathInterpolatorCompat.create(0f, 0f, 1f, 1f);
public static final Interpolator INTERPOLATOR_EASING = PathInterpolatorCompat.create(0f, 0f, 0.25f, 1f);
@@ -23,7 +24,7 @@ public abstract class CameraTransition<T> {
private final CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>();
- private final int type;
+ private final int reason;
private T startValue;
private final T endValue;
@@ -39,12 +40,13 @@ public abstract class CameraTransition<T> {
private boolean isCanceled;
private boolean isStarted;
+ private boolean isFinished;
private boolean isFinishing;
private final Interpolator interpolator;
- CameraTransition(int type, double durationMillis, double delayMillis, T endValue, Interpolator interpolator) {
- this.type = type;
+ CameraTransition(int reason, double durationMillis, double delayMillis, T endValue, Interpolator interpolator) {
+ this.reason = reason;
this.durationMillis = durationMillis;
this.durationNanos = durationMillis * 1E6;
this.delayMillis = delayMillis;
@@ -53,17 +55,19 @@ public abstract class CameraTransition<T> {
this.interpolator = interpolator;
}
- void initTime(T startValue, double currentTimeNanos) {
+ void onStart(T startValue, double currentTimeNanos) {
this.startTimeMillis = currentTimeNanos / 1E6 + delayMillis;
this.startTimeNanos = currentTimeNanos + delayNanos;
this.endTimeMillis = startTimeMillis + durationMillis;
this.endTimeNanos = startTimeNanos + durationNanos;
this.startValue = startValue;
this.isStarted = true;
+ this.isCanceled = false;
+ this.isFinished = false;
}
- public int getType() {
- return type;
+ public int getReason() {
+ return reason;
}
public boolean isCanceled() {
@@ -78,8 +82,12 @@ public abstract class CameraTransition<T> {
return isStarted;
}
+ public boolean isFinished() {
+ return isFinished;
+ }
+
public T getStartValue() {
- if (startValue == null) {
+ if (!isStarted) {
throw new RuntimeException("start or queue the transition first");
}
return startValue;
@@ -90,28 +98,28 @@ public abstract class CameraTransition<T> {
}
public double getStartTime() {
- if (startTimeMillis <= 0) {
+ if (!isStarted) {
throw new RuntimeException("start or queue the transition first");
}
return startTimeMillis;
}
double getStartTimeNanos() {
- if (startTimeNanos <= 0) {
+ if (!isStarted) {
throw new RuntimeException("start or queue the transition first");
}
return startTimeNanos;
}
public double getEndTime() {
- if (endTimeMillis <= 0) {
+ if (!isStarted) {
throw new RuntimeException("start or queue the transition first");
}
return endTimeMillis;
}
double getEndTimeNanos() {
- if (endTimeNanos <= 0) {
+ if (!isStarted) {
throw new RuntimeException("start or queue the transition first");
}
return endTimeNanos;
@@ -121,18 +129,10 @@ public abstract class CameraTransition<T> {
return durationMillis;
}
- double getDurationNanos() {
- return durationNanos;
- }
-
public double getDelay() {
return delayMillis;
}
- double getDelayNanos() {
- return delayNanos;
- }
-
public Interpolator getInterpolator() {
return interpolator;
}
@@ -166,12 +166,21 @@ public abstract class CameraTransition<T> {
}
void onCancel() {
+ this.isCanceled = true;
for (Listener listener : listeners) {
listener.onCancel();
}
+ onFinish();
}
void onFinish() {
+ this.startTimeMillis = 0;
+ this.startTimeNanos = 0;
+ this.endTimeMillis = 0;
+ this.endTimeNanos = 0;
+ this.startValue = null;
+ this.isStarted = false;
+ this.isFinished = true;
for (Listener listener : listeners) {
listener.onFinish();
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java
index 952cb4f20a..34bcd134db 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java
@@ -26,8 +26,6 @@ public class MapCameraController {
@NonNull
private final Transform transform;
- private volatile boolean destroyed;
-
private final Choreographer choreographer = Choreographer.getInstance();
MapCameraController(@NonNull final Transform transform) {
@@ -44,22 +42,19 @@ public class MapCameraController {
private final Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
- if (destroyed) {
- return;
- }
List<CameraTransition> canceled = new ArrayList<>();
Iterator<CameraTransition> iterator = runningTransitions.values().iterator();
while (iterator.hasNext()) {
CameraTransition transition = iterator.next();
if (transition.isCanceled()) {
- transition.onCancel();
iterator.remove();
canceled.add(transition);
}
}
for (CameraTransition transition : canceled) {
- startNextTransition(transition.getCameraProperty());
+ transition.onCancel();
+ checkNextTransition(transition.getCameraProperty());
}
boolean shouldRun = false;
@@ -80,7 +75,6 @@ public class MapCameraController {
transform.moveCamera(builder.build());
}
-
List<CameraTransition> finished = new ArrayList<>();
iterator = runningTransitions.values().iterator();
while (iterator.hasNext()) {
@@ -88,14 +82,14 @@ public class MapCameraController {
transition.onProgress();
if (transition.isFinishing()) {
- transition.onFinish();
iterator.remove();
finished.add(transition);
}
}
for (CameraTransition transition : finished) {
- startNextTransition(transition.getCameraProperty());
+ transition.onFinish();
+ checkNextTransition(transition.getCameraProperty());
}
choreographer.postFrameCallback(this);
@@ -111,7 +105,6 @@ public class MapCameraController {
if (resultingTransition != transition && resultingTransition != runningTransition) {
throw new UnsupportedOperationException();
} else if (resultingTransition != transition) {
- transition.cancel();
transition.onCancel();
} else {
runningTransition.cancel();
@@ -119,7 +112,7 @@ public class MapCameraController {
}
} else {
long time = System.nanoTime();
- transition.initTime(getCameraPropertyValue(transition.getCameraProperty()), time);
+ transition.onStart(getCameraPropertyValue(transition.getCameraProperty()), time);
runningTransitions.put(transition.getCameraProperty(), transition);
}
}
@@ -135,6 +128,42 @@ public class MapCameraController {
}
}
+ public void cancelQueuedTransitions() {
+ List<CameraTransition> canceled = new ArrayList<>();
+ for (List<CameraTransition> transitions : queuedTransitions.values()) {
+ Iterator<CameraTransition> iterator = transitions.iterator();
+ while (iterator.hasNext()) {
+ CameraTransition transition = iterator.next();
+ iterator.remove();
+ canceled.add(transition);
+ }
+ }
+
+ for (CameraTransition transition : canceled) {
+ transition.onCancel();
+ }
+ }
+
+ public void cancelRunningTransitions() {
+ List<CameraTransition> canceled = new ArrayList<>();
+ Iterator<CameraTransition> iterator = runningTransitions.values().iterator();
+ while (iterator.hasNext()) {
+ CameraTransition transition = iterator.next();
+ iterator.remove();
+ canceled.add(transition);
+ }
+
+ for (CameraTransition transition : canceled) {
+ transition.onCancel();
+ checkNextTransition(transition.getCameraProperty());
+ }
+ }
+
+ public void cancelAllTransitions() {
+ cancelQueuedTransitions();
+ cancelRunningTransitions();
+ }
+
@NonNull
public HashMap<Integer, LinkedList<CameraTransition>> getQueuedTransitions() {
return new HashMap<>(queuedTransitions);
@@ -155,19 +184,8 @@ public class MapCameraController {
}
void onDestroy() {
- destroyed = true;
-
- for (List<CameraTransition> transitions : queuedTransitions.values()) {
- for (CameraTransition transition : transitions) {
- transition.onCancel();
- }
- }
- queuedTransitions.clear();
-
- for (CameraTransition transition : runningTransitions.values()) {
- transition.onCancel();
- }
- runningTransitions.clear();
+ cancelAllTransitions();
+ choreographer.removeFrameCallback(frameCallback);
}
private static void setCameraProperty(CameraPosition.Builder builder, int property, Object value) {
@@ -231,11 +249,13 @@ public class MapCameraController {
}
}
- private void startNextTransition(int cameraProperty) {
- LinkedList<CameraTransition> queue = queuedTransitions.get(cameraProperty);
- assert queue != null;
- if (!queue.isEmpty()) {
- startTransition(queue.pop());
+ private void checkNextTransition(int cameraProperty) {
+ if (runningTransitions.get(cameraProperty) == null) {
+ LinkedList<CameraTransition> queue = queuedTransitions.get(cameraProperty);
+ assert queue != null;
+ if (!queue.isEmpty()) {
+ startTransition(queue.pop());
+ }
}
}
@@ -251,16 +271,16 @@ public class MapCameraController {
@Override
public void animationScheduled(MapCameraController controller, CameraTransition transition) {
- if (transition.getType() == CameraTransition.TYPE_GESTURE) {
+ if (transition.getReason() == CameraTransition.REASON_GESTURE) {
for (CameraTransition currentTransition : controller.getRunningTransitions().values()) {
- if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) {
+ if (currentTransition.getReason() != CameraTransition.REASON_GESTURE) {
currentTransition.cancel();
}
}
for (List<CameraTransition> currentTransitions : controller.getQueuedTransitions().values()) {
for (CameraTransition currentTransition : currentTransitions) {
- if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) {
+ if (currentTransition.getReason() != CameraTransition.REASON_GESTURE) {
currentTransition.cancel();
}
}