From 8ad3759b9c4b6767202d959a5b75732cc740763d Mon Sep 17 00:00:00 2001 From: Tobrun Date: Wed, 29 Nov 2017 12:26:52 +0100 Subject: [android] - use concurrent lists for camera change listeners (#10542) --- .../mapboxsdk/maps/CameraChangeDispatcher.java | 51 +++++++++++----------- 1 file changed, 25 insertions(+), 26 deletions(-) (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java index cf780dcc3f..f046744c31 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java @@ -2,8 +2,7 @@ package com.mapbox.mapboxsdk.maps; import android.support.annotation.NonNull; -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraIdleListener; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveCanceledListener; @@ -15,10 +14,10 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M private boolean idle = true; - private final List onCameraMoveStartedListenerList = new ArrayList<>(); - private final List onCameraMoveCanceledListenerList = new ArrayList<>(); - private final List onCameraMoveListenerList = new ArrayList<>(); - private final List onCameraIdleListenerList = new ArrayList<>(); + private final CopyOnWriteArrayList onCameraMoveStarted = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onCameraMoveCanceled = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onCameraMove = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList onCameraIdle = new CopyOnWriteArrayList<>(); private OnCameraMoveStartedListener onCameraMoveStartedListener; private OnCameraMoveCanceledListener onCameraMoveCanceledListener; @@ -58,8 +57,8 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } // new API - if (!onCameraMoveStartedListenerList.isEmpty()) { - for (OnCameraMoveStartedListener cameraMoveStartedListener : onCameraMoveStartedListenerList) { + if (!onCameraMoveStarted.isEmpty()) { + for (OnCameraMoveStartedListener cameraMoveStartedListener : onCameraMoveStarted) { cameraMoveStartedListener.onCameraMoveStarted(reason); } } @@ -73,8 +72,8 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } // new API - if (!onCameraMoveListenerList.isEmpty() && !idle) { - for (OnCameraMoveListener cameraMoveListener : onCameraMoveListenerList) { + if (!onCameraMove.isEmpty() && !idle) { + for (OnCameraMoveListener cameraMoveListener : onCameraMove) { cameraMoveListener.onCameraMove(); } } @@ -88,8 +87,8 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } // new API - if (!onCameraMoveCanceledListenerList.isEmpty() && !idle) { - for (OnCameraMoveCanceledListener cameraMoveCanceledListener : onCameraMoveCanceledListenerList) { + if (!onCameraMoveCanceled.isEmpty() && !idle) { + for (OnCameraMoveCanceledListener cameraMoveCanceledListener : onCameraMoveCanceled) { cameraMoveCanceledListener.onCameraMoveCanceled(); } } @@ -105,8 +104,8 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } // new API - if (!onCameraIdleListenerList.isEmpty()) { - for (OnCameraIdleListener cameraIdleListener : onCameraIdleListenerList) { + if (!onCameraIdle.isEmpty()) { + for (OnCameraIdleListener cameraIdleListener : onCameraIdle) { cameraIdleListener.onCameraIdle(); } } @@ -114,42 +113,42 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } void addOnCameraIdleListener(@NonNull OnCameraIdleListener listener) { - onCameraIdleListenerList.add(listener); + onCameraIdle.add(listener); } void removeOnCameraIdleListener(@NonNull OnCameraIdleListener listener) { - if (onCameraIdleListenerList.contains(listener)) { - onCameraIdleListenerList.remove(listener); + if (onCameraIdle.contains(listener)) { + onCameraIdle.remove(listener); } } void addOnCameraMoveCancelListener(OnCameraMoveCanceledListener listener) { - onCameraMoveCanceledListenerList.add(listener); + onCameraMoveCanceled.add(listener); } void removeOnCameraMoveCancelListener(OnCameraMoveCanceledListener listener) { - if (onCameraMoveCanceledListenerList.contains(listener)) { - onCameraMoveCanceledListenerList.remove(listener); + if (onCameraMoveCanceled.contains(listener)) { + onCameraMoveCanceled.remove(listener); } } void addOnCameraMoveStartedListener(OnCameraMoveStartedListener listener) { - onCameraMoveStartedListenerList.add(listener); + onCameraMoveStarted.add(listener); } void removeOnCameraMoveStartedListener(OnCameraMoveStartedListener listener) { - if (onCameraMoveStartedListenerList.contains(listener)) { - onCameraMoveStartedListenerList.remove(listener); + if (onCameraMoveStarted.contains(listener)) { + onCameraMoveStarted.remove(listener); } } void addOnCameraMoveListener(OnCameraMoveListener listener) { - onCameraMoveListenerList.add(listener); + onCameraMove.add(listener); } void removeOnCameraMoveListener(OnCameraMoveListener listener) { - if (onCameraMoveListenerList.contains(listener)) { - onCameraMoveListenerList.remove(listener); + if (onCameraMove.contains(listener)) { + onCameraMove.remove(listener); } } } -- cgit v1.2.1 From 4525ff714adb483a213638e251c38156bd7fa04e Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 14 Dec 2017 12:15:36 +0100 Subject: Post camera listener invocations (#10690) * [android] - post camera listener invocations * remove jvm unit test --- .../mapboxsdk/maps/CameraChangeDispatcher.java | 127 +++++++++++++-------- 1 file changed, 81 insertions(+), 46 deletions(-) (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java index f046744c31..605c8912e2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java @@ -1,5 +1,6 @@ package com.mapbox.mapboxsdk.maps; +import android.os.Handler; import android.support.annotation.NonNull; import java.util.concurrent.CopyOnWriteArrayList; @@ -9,10 +10,16 @@ import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveCanceledListener; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveListener; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener; +/** + * Class responsible for dispatching camera change events to registered listeners. + */ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, MapboxMap.OnCameraMoveListener, MapboxMap.OnCameraMoveCanceledListener, OnCameraIdleListener { + private final Handler handler = new Handler(); + private boolean idle = true; + private int moveStartedReason; private final CopyOnWriteArrayList onCameraMoveStarted = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList onCameraMoveCanceled = new CopyOnWriteArrayList<>(); @@ -24,6 +31,74 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M private OnCameraMoveListener onCameraMoveListener; private OnCameraIdleListener onCameraIdleListener; + private final Runnable onCameraMoveStartedRunnable = new Runnable() { + @Override + public void run() { + // deprecated API + if (onCameraMoveStartedListener != null) { + onCameraMoveStartedListener.onCameraMoveStarted(moveStartedReason); + } + + // new API + if (!onCameraMoveStarted.isEmpty()) { + for (OnCameraMoveStartedListener cameraMoveStartedListener : onCameraMoveStarted) { + cameraMoveStartedListener.onCameraMoveStarted(moveStartedReason); + } + } + } + }; + + private final Runnable onCameraMoveRunnable = new Runnable() { + @Override + public void run() { + // deprecated API + if (onCameraMoveListener != null && !idle) { + onCameraMoveListener.onCameraMove(); + } + + // new API + if (!onCameraMove.isEmpty() && !idle) { + for (OnCameraMoveListener cameraMoveListener : onCameraMove) { + cameraMoveListener.onCameraMove(); + } + } + } + }; + + private final Runnable onCameraMoveCancelRunnable = new Runnable() { + @Override + public void run() { + // deprecated API + if (onCameraMoveCanceledListener != null && !idle) { + onCameraMoveCanceledListener.onCameraMoveCanceled(); + } + + // new API + if (!onCameraMoveCanceled.isEmpty() && !idle) { + for (OnCameraMoveCanceledListener cameraMoveCanceledListener : onCameraMoveCanceled) { + cameraMoveCanceledListener.onCameraMoveCanceled(); + } + } + } + }; + + private final Runnable onCameraIdleRunnable = new Runnable() { + @Override + public void run() { + // deprecated API + if (onCameraIdleListener != null) { + onCameraIdleListener.onCameraIdle(); + } + + // new API + if (!onCameraIdle.isEmpty()) { + for (OnCameraIdleListener cameraIdleListener : onCameraIdle) { + cameraIdleListener.onCameraIdle(); + } + } + } + }; + @Deprecated void setOnCameraMoveStartedListener(OnCameraMoveStartedListener onCameraMoveStartedListener) { this.onCameraMoveStartedListener = onCameraMoveStartedListener; @@ -45,70 +120,30 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M } @Override - public void onCameraMoveStarted(int reason) { + public void onCameraMoveStarted(final int reason) { if (!idle) { return; } idle = false; - - // deprecated API - if (onCameraMoveStartedListener != null) { - onCameraMoveStartedListener.onCameraMoveStarted(reason); - } - - // new API - if (!onCameraMoveStarted.isEmpty()) { - for (OnCameraMoveStartedListener cameraMoveStartedListener : onCameraMoveStarted) { - cameraMoveStartedListener.onCameraMoveStarted(reason); - } - } + moveStartedReason = reason; + handler.post(onCameraMoveStartedRunnable); } @Override public void onCameraMove() { - // deprecated API - if (onCameraMoveListener != null && !idle) { - onCameraMoveListener.onCameraMove(); - } - - // new API - if (!onCameraMove.isEmpty() && !idle) { - for (OnCameraMoveListener cameraMoveListener : onCameraMove) { - cameraMoveListener.onCameraMove(); - } - } + handler.post(onCameraMoveRunnable); } @Override public void onCameraMoveCanceled() { - // deprecated API - if (onCameraMoveCanceledListener != null && !idle) { - onCameraMoveCanceledListener.onCameraMoveCanceled(); - } - - // new API - if (!onCameraMoveCanceled.isEmpty() && !idle) { - for (OnCameraMoveCanceledListener cameraMoveCanceledListener : onCameraMoveCanceled) { - cameraMoveCanceledListener.onCameraMoveCanceled(); - } - } + handler.post(onCameraMoveCancelRunnable); } @Override public void onCameraIdle() { if (!idle) { idle = true; - // deprecated API - if (onCameraIdleListener != null) { - onCameraIdleListener.onCameraIdle(); - } - - // new API - if (!onCameraIdle.isEmpty()) { - for (OnCameraIdleListener cameraIdleListener : onCameraIdle) { - cameraIdleListener.onCameraIdle(); - } - } + handler.post(onCameraIdleRunnable); } } -- cgit v1.2.1