Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[android] - allow multiple listeners for camera events, deprecate old…
Browse files Browse the repository at this point in the history
… api
  • Loading branch information
tobrun committed Oct 6, 2017
1 parent 5e08ce0 commit 1e9a940
Show file tree
Hide file tree
Showing 4 changed files with 369 additions and 88 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package com.mapbox.mapboxsdk.maps;

import android.support.annotation.NonNull;

import java.util.ArrayList;
import java.util.List;

import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraIdleListener;
import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveCanceledListener;
import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveListener;
Expand All @@ -10,6 +15,11 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M

private boolean idle = true;

private final List<OnCameraMoveStartedListener> onCameraMoveStartedListenerList = new ArrayList<>();
private final List<OnCameraMoveCanceledListener> onCameraMoveCanceledListenerList = new ArrayList<>();
private final List<OnCameraMoveListener> onCameraMoveListenerList = new ArrayList<>();
private final List<OnCameraIdleListener> onCameraIdleListenerList = new ArrayList<>();

private OnCameraMoveStartedListener onCameraMoveStartedListener;
private OnCameraMoveCanceledListener onCameraMoveCanceledListener;
private OnCameraMoveListener onCameraMoveListener;
Expand Down Expand Up @@ -41,20 +51,38 @@ public void onCameraMoveStarted(int reason) {
if (onCameraMoveStartedListener != null) {
onCameraMoveStartedListener.onCameraMoveStarted(reason);
}

if (!onCameraMoveStartedListenerList.isEmpty()) {
for (OnCameraMoveStartedListener cameraMoveStartedListener : onCameraMoveStartedListenerList) {
cameraMoveStartedListener.onCameraMoveStarted(reason);
}
}
}

@Override
public void onCameraMove() {
if (onCameraMoveListener != null && !idle) {
onCameraMoveListener.onCameraMove();
}

if (!onCameraMoveListenerList.isEmpty()) {
for (OnCameraMoveListener cameraMoveListener : onCameraMoveListenerList) {
cameraMoveListener.onCameraMove();
}
}
}

@Override
public void onCameraMoveCanceled() {
if (onCameraMoveCanceledListener != null && !idle) {
onCameraMoveCanceledListener.onCameraMoveCanceled();
}

if (!onCameraMoveCanceledListenerList.isEmpty()) {
for (OnCameraMoveCanceledListener cameraMoveCanceledListener : onCameraMoveCanceledListenerList) {
cameraMoveCanceledListener.onCameraMoveCanceled();
}
}
}

@Override
Expand All @@ -64,6 +92,52 @@ public void onCameraIdle() {
if (onCameraIdleListener != null) {
onCameraIdleListener.onCameraIdle();
}

if (!onCameraIdleListenerList.isEmpty()) {
for (OnCameraIdleListener cameraIdleListener : onCameraIdleListenerList) {
cameraIdleListener.onCameraIdle();
}
}
}
}

void addOnCameraIdleListener(@NonNull OnCameraIdleListener listener) {
onCameraIdleListenerList.add(listener);
}

void removeOnCameraIdleListener(@NonNull OnCameraIdleListener listener) {
if (onCameraIdleListenerList.contains(listener)) {
onCameraIdleListenerList.remove(listener);
}
}

void addOnCameraMoveCancelListener(OnCameraMoveCanceledListener listener) {
onCameraMoveCanceledListenerList.add(listener);
}

void removeOnCameraMoveCancelListener(OnCameraMoveCanceledListener listener) {
if (onCameraMoveCanceledListenerList.contains(listener)) {
onCameraMoveCanceledListenerList.remove(listener);
}
}

void addOnCameraMoveStartedListener(OnCameraMoveStartedListener listener) {
onCameraMoveStartedListenerList.add(listener);
}

void removeOnCameraMoveStartedListener(OnCameraMoveStartedListener listener) {
if (onCameraMoveStartedListenerList.contains(listener)) {
onCameraMoveStartedListenerList.remove(listener);
}
}

void addOnCameraMoveListener(OnCameraMoveListener listener) {
onCameraMoveListenerList.add(listener);
}

void removeOnCameraMoveListener(OnCameraMoveListener listener) {
if (onCameraMoveListenerList.contains(listener)) {
onCameraMoveListenerList.remove(listener);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1725,38 +1725,122 @@ public void setOnCameraChangeListener(@Nullable OnCameraChangeListener listener)
* Sets a callback that is invoked when camera movement has ended.
*
* @param listener the listener to notify
* @deprecated use {@link #addOnCameraIdleListener(OnCameraIdleListener)}
* and {@link #removeOnCameraIdleListener(OnCameraIdleListener)} instead
*/
@Deprecated
public void setOnCameraIdleListener(@Nullable OnCameraIdleListener listener) {
cameraChangeDispatcher.setOnCameraIdleListener(listener);
}

/**
* Adds a callback that is invoked when camera movement has ended.
*
* @param listener the listener to notify
*/
public void addOnCameraIdleListener(@Nullable OnCameraIdleListener listener) {
cameraChangeDispatcher.addOnCameraIdleListener(listener);
}

/**
* Removes a callback that is invoked when camera movement has ended.
*
* @param listener the listener to remove
*/
public void removeOnCameraIdleListener(@Nullable OnCameraIdleListener listener) {
cameraChangeDispatcher.removeOnCameraIdleListener(listener);
}

/**
* Sets a callback that is invoked when camera movement was cancelled.
*
* @param listener the listener to notify
* @deprecated use {@link #addOnCameraMoveCancelListener(OnCameraMoveCanceledListener)} and
* {@link #removeOnCameraMoveCancelListener(OnCameraMoveCanceledListener)} instead
*/
@Deprecated
public void setOnCameraMoveCancelListener(@Nullable OnCameraMoveCanceledListener listener) {
cameraChangeDispatcher.setOnCameraMoveCanceledListener(listener);
}

/**
* Adds a callback that is invoked when camera movement was cancelled.
*
* @param listener the listener to notify
*/
public void addOnCameraMoveCancelListener(@Nullable OnCameraMoveCanceledListener listener) {
cameraChangeDispatcher.addOnCameraMoveCancelListener(listener);
}

/**
* Removes a callback that is invoked when camera movement was cancelled.
*
* @param listener the listener to remove
*/
public void removeOnCameraMoveCancelListener(@Nullable OnCameraMoveCanceledListener listener) {
cameraChangeDispatcher.removeOnCameraMoveCancelListener(listener);
}

/**
* Sets a callback that is invoked when camera movement has started.
*
* @param listener the listener to notify
* @deprecated use {@link #addOnCameraMoveStartedListener(OnCameraMoveStartedListener)} and
* {@link #removeOnCameraMoveStartedListener(OnCameraMoveStartedListener)} instead
*/
@Deprecated
public void setOnCameraMoveStartedListener(@Nullable OnCameraMoveStartedListener listener) {
cameraChangeDispatcher.setOnCameraMoveStartedListener(listener);
}

/**
* Adds a callback that is invoked when camera movement has started.
*
* @param listener the listener to notify
*/
public void addOnCameraMoveStartedListener(@Nullable OnCameraMoveStartedListener listener) {
cameraChangeDispatcher.addOnCameraMoveStartedListener(listener);
}

/**
* Removes a callback that is invoked when camera movement has started.
*
* @param listener the listener to remove
*/
public void removeOnCameraMoveStartedListener(@Nullable OnCameraMoveStartedListener listener) {
cameraChangeDispatcher.removeOnCameraMoveStartedListener(listener);
}

/**
* Sets a callback that is invoked when camera position changes.
*
* @param listener the listener to notify
* @deprecated use {@link #addOnCameraMoveListener(OnCameraMoveListener)} and
* {@link #removeOnCameraMoveListener(OnCameraMoveListener)}instead
*/
@Deprecated
public void setOnCameraMoveListener(@Nullable OnCameraMoveListener listener) {
cameraChangeDispatcher.setOnCameraMoveListener(listener);
}

/**
* Adds a callback that is invoked when camera position changes.
*
* @param listener the listener to notify
*/
public void addOnCameraMoveListener(@Nullable OnCameraMoveListener listener) {
cameraChangeDispatcher.addOnCameraMoveListener(listener);
}

/**
* Removes a callback that is invoked when camera position changes.
*
* @param listener the listener to remove
*/
public void removeOnCameraMoveListener(@Nullable OnCameraMoveListener listener) {
cameraChangeDispatcher.removeOnCameraMoveListener(listener);
}

/**
* Sets a callback that's invoked on every frame rendered to the map view.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.mapbox.mapboxsdk.maps;

import org.junit.Test;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

public class CameraChangeDispatcherTest {

@Test
public void testSetCameraIdleListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraIdleListener listener = mock(MapboxMap.OnCameraIdleListener.class);
dispatcher.setOnCameraIdleListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraIdle();
verify(listener).onCameraIdle();
}

@Test
public void testSetCameraMoveStartedListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveStartedListener listener = mock(MapboxMap.OnCameraMoveStartedListener.class);
dispatcher.setOnCameraMoveStartedListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
verify(listener).onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
}

@Test
public void testSetCameraMoveCancelListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveCanceledListener listener = mock(MapboxMap.OnCameraMoveCanceledListener.class);
dispatcher.setOnCameraMoveCanceledListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraMoveCanceled();
verify(listener).onCameraMoveCanceled();
}

@Test
public void testSetCameraMoveListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveListener listener = mock(MapboxMap.OnCameraMoveListener.class);
dispatcher.setOnCameraMoveListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraMove();
verify(listener).onCameraMove();
}

@Test
public void testAddCameraIdleListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraIdleListener listener = mock(MapboxMap.OnCameraIdleListener.class);
dispatcher.addOnCameraIdleListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraIdle();
verify(listener).onCameraIdle();
}

@Test
public void testAddCameraMoveStartedListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveStartedListener listener = mock(MapboxMap.OnCameraMoveStartedListener.class);
dispatcher.addOnCameraMoveStartedListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
verify(listener).onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
}

@Test
public void testAddCameraMoveCancelListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveCanceledListener listener = mock(MapboxMap.OnCameraMoveCanceledListener.class);
dispatcher.addOnCameraMoveCancelListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraMoveCanceled();
verify(listener).onCameraMoveCanceled();
}

@Test
public void testAddCameraMoveListener() {
CameraChangeDispatcher dispatcher = new CameraChangeDispatcher();
MapboxMap.OnCameraMoveListener listener = mock(MapboxMap.OnCameraMoveListener.class);
dispatcher.addOnCameraMoveListener(listener);
dispatcher.onCameraMoveStarted(MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE);
dispatcher.onCameraMove();
verify(listener).onCameraMove();
}
}
Loading

0 comments on commit 1e9a940

Please sign in to comment.