From d826aefef265a829b135bc4d50c5e3a3417b1392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Thu, 21 Feb 2019 13:37:15 +0100 Subject: wip --- .../java/com/mapbox/mapboxsdk/maps/IMapView.java | 19 +++ .../mapbox/mapboxsdk/maps/MapPresenterImpl.java | 27 ++-- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 144 ++++++++++++--------- .../mapboxsdk/maps/renderer/MapRenderer.java | 6 +- .../glsurfaceview/GLSurfaceViewMapRenderer.java | 4 +- .../textureview/TextureViewMapRenderer.java | 4 +- .../com/mapbox/mapboxsdk/maps/MapPresenterTest.kt | 58 +++++++-- 7 files changed, 160 insertions(+), 102 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IMapView.java diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IMapView.java new file mode 100644 index 0000000000..702afddbe7 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/IMapView.java @@ -0,0 +1,19 @@ +package com.mapbox.mapboxsdk.maps; + +import android.support.annotation.Nullable; + +interface IMapView { + void setForegroundColor(int foregroundLoadColor); + + void inflateInternalViews(); + + void setViewOptions(); + + void createTextureView(@Nullable String localFontFamily, boolean translucent); + + void createSurfaceView(@Nullable String localFontFamily, boolean renderSurfaceOnTop); + + float getDensity(); + + void createNativeMapView(float pixelRatio, boolean crossSourceCollisions, MapChangeReceiver mapChangeReceiver); +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapPresenterImpl.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapPresenterImpl.java index 653420941a..97ca1be746 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapPresenterImpl.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapPresenterImpl.java @@ -3,18 +3,14 @@ package com.mapbox.mapboxsdk.maps; import android.content.Context; import android.support.annotation.NonNull; -import com.mapbox.mapboxsdk.maps.renderer.MapRenderer; - class MapPresenterImpl implements MapPresenter { private final MapChangeReceiver mapChangeReceiver; - private final MapView mapView; + private final IMapView mapView; private final MapboxMapOptions mapboxMapOptions; - private final MapRenderer renderer; - private final NativeMapView nativeMapView; - MapPresenterImpl(@NonNull MapView mapView, @NonNull Context context, @NonNull MapboxMapOptions mapboxMapOptions, + MapPresenterImpl(@NonNull IMapView mapView, @NonNull Context context, @NonNull MapboxMapOptions mapboxMapOptions, @NonNull MapChangeReceiver mapChangeReceiver) { this.mapView = mapView; this.mapboxMapOptions = mapboxMapOptions; @@ -26,15 +22,17 @@ class MapPresenterImpl implements MapPresenter { String localFontFamily = mapboxMapOptions.getLocalIdeographFontFamily(); if (mapboxMapOptions.getTextureMode()) { - renderer = mapView.createTextureView(this, localFontFamily, - mapboxMapOptions.getTranslucentTextureSurface()); + mapView.createTextureView(localFontFamily, mapboxMapOptions.getTranslucentTextureSurface()); } else { - renderer = mapView.createSurfaceView(this, localFontFamily, - mapboxMapOptions.getRenderSurfaceOnTop()); + mapView.createSurfaceView(localFontFamily, mapboxMapOptions.getRenderSurfaceOnTop()); } - nativeMapView = mapView.createNativeMapView(getPixelRatio(), mapboxMapOptions.getCrossSourceCollisions(), - mapChangeReceiver, renderer); + mapView.createNativeMapView(getPixelRatio(), mapboxMapOptions.getCrossSourceCollisions(), mapChangeReceiver); + } + + @Override + public void onSurfaceCreated() { + } private float getPixelRatio() { @@ -47,11 +45,6 @@ class MapPresenterImpl implements MapPresenter { return pixelRatio; } - @Override - public void onSurfaceCreated() { - - } - @Override public void addOnCameraWillChangeListener(MapView.OnCameraWillChangeListener listener) { mapChangeReceiver.addOnCameraWillChangeListener(listener); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 6f22585e96..0bf6762e75 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -39,6 +39,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_MAP_NORTH_ANIMATION; import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_WAIT_IDLE; @@ -58,6 +61,7 @@ import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_WAIT_IDLE; */ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { + private final IMapView impl = new IMapViewImpl(); private MapPresenter mapPresenter; private final MapCallback mapCallback = new MapCallback(); private final InitialRenderCallback initialRenderCallback = new InitialRenderCallback(); @@ -68,6 +72,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { private MapboxMap mapboxMap; private AttributionClickListener attributionClickListener; private MapboxMapOptions mapboxMapOptions; + private MapRenderer mapRenderer; private boolean destroyed; private boolean hasSurface; @@ -118,7 +123,74 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { mapboxMapOptions = options; - mapPresenter = new MapPresenterImpl(this, context, options, new MapChangeReceiver()); + mapPresenter = new MapPresenterImpl(impl, context, options, new MapChangeReceiver()); + } + + private class IMapViewImpl implements IMapView { + + /// + /// Private View Implementation + /// + + public void setForegroundColor(int foregroundLoadColor) { + // hide surface until map is fully loaded #10990 + MapView.this.setForeground(new ColorDrawable(foregroundLoadColor)); + } + + public void inflateInternalViews() { + View view = LayoutInflater.from(getContext()).inflate(R.layout.mapbox_mapview_internal, MapView.this); + compassView = view.findViewById(R.id.compassView); + attrView = view.findViewById(R.id.attributionView); + logoView = view.findViewById(R.id.logoView); + } + + public void setViewOptions() { + // add accessibility support + setContentDescription(getContext().getString(R.string.mapbox_mapActionDescription)); + setWillNotDraw(false); + } + + public void createTextureView(@Nullable String localFontFamily, boolean translucent) { + TextureView textureView = new TextureView(getContext()); + mapRenderer = + new TextureViewMapRenderer(getContext(), textureView, localFontFamily, translucent) { + @Override + protected void onSurfaceCreated(GL10 gl, EGLConfig config) { + mapPresenter.onSurfaceCreated(); + super.onSurfaceCreated(gl, config); + } + }; + addView(textureView, 0); + } + + public void createSurfaceView(@Nullable String localFontFamily, boolean renderSurfaceOnTop) { + GLSurfaceView glSurfaceView = new GLSurfaceView(getContext()); + glSurfaceView.setZOrderMediaOverlay(renderSurfaceOnTop); + mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, localFontFamily) { + @Override + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + mapPresenter.onSurfaceCreated(); + super.onSurfaceCreated(gl, config); + } + }; + addView(glSurfaceView, 0); + } + + public float getDensity() { + return getResources().getDisplayMetrics().density; + } + + public void createNativeMapView(float pixelRatio, boolean crossSourceCollisions, + MapChangeReceiver mapChangeReceiver) { + nativeMapView = new NativeMapView( + FileSource.getInstance(getContext()), + pixelRatio, + crossSourceCollisions, + MapView.this, + mapChangeReceiver, + mapRenderer + ); + } } private void initialiseMap() { @@ -134,9 +206,8 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { // callback for camera change events final CameraChangeDispatcher cameraDispatcher = new CameraChangeDispatcher(); - // setup components for MapboxMap creation - Projection proj = new Projection(nativeMapView); - UiSettings uiSettings = new UiSettings(proj, focalInvalidator, compassView, attrView, logoView, getPixelRatio()); + + // TODO PRESENTERS legacy annotations LongSparseArray annotationsArray = new LongSparseArray<>(); IconManager iconManager = new IconManager(nativeMapView); Annotations annotations = new AnnotationContainer(nativeMapView, annotationsArray); @@ -146,6 +217,12 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { ShapeAnnotations shapeAnnotations = new ShapeAnnotationContainer(nativeMapView, annotationsArray); AnnotationManager annotationManager = new AnnotationManager(this, annotationsArray, iconManager, annotations, markers, polygons, polylines, shapeAnnotations); + + + // setup components for MapboxMap creation + Projection proj = new Projection(nativeMapView); + UiSettings uiSettings = new UiSettings(proj, focalInvalidator, compassView, attrView, logoView, 1/*TODO + PRESENTERS getPixelRatio()*/); Transform transform = new Transform(this, nativeMapView, cameraDispatcher); // MapboxMap @@ -356,7 +433,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { @UiThread public void onDestroy() { destroyed = true; - mapChangeReceiver.clear(); + //TODO PRESENTERS mapChangeReceiver.clear(); mapCallback.onDestroy(); initialRenderCallback.onDestroy(); @@ -716,63 +793,6 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { mapPresenter.removeOnSourceChangedListener(listener); } - - /// - /// View Implementation - /// - - void setForegroundColor(int foregroundLoadColor) { - // hide surface until map is fully loaded #10990 - setForeground(new ColorDrawable(foregroundLoadColor)); - } - - void inflateInternalViews() { - View view = LayoutInflater.from(getContext()).inflate(R.layout.mapbox_mapview_internal, this); - compassView = view.findViewById(R.id.compassView); - attrView = view.findViewById(R.id.attributionView); - logoView = view.findViewById(R.id.logoView); - } - - void setViewOptions() { - // add accessibility support - setContentDescription(getContext().getString(R.string.mapbox_mapActionDescription)); - setWillNotDraw(false); - } - - MapRenderer createTextureView(@NonNull MapPresenter mapPresenter, @Nullable String localFontFamily, - boolean translucent) { - TextureView textureView = new TextureView(getContext()); - MapRenderer mapRenderer = - new TextureViewMapRenderer(mapPresenter, getContext(), textureView, localFontFamily, translucent); - addView(textureView, 0); - return mapRenderer; - } - - MapRenderer createSurfaceView(@NonNull MapPresenter mapPresenter, @Nullable String localFontFamily, - boolean renderSurfaceOnTop) { - GLSurfaceView glSurfaceView = new GLSurfaceView(getContext()); - glSurfaceView.setZOrderMediaOverlay(renderSurfaceOnTop); - MapRenderer mapRenderer = new GLSurfaceViewMapRenderer(mapPresenter, getContext(), glSurfaceView, localFontFamily); - addView(glSurfaceView, 0); - return mapRenderer; - } - - float getDensity() { - return getResources().getDisplayMetrics().density; - } - - NativeMapView createNativeMapView(float pixelRatio, boolean crossSourceCollisions, - MapChangeReceiver mapChangeReceiver, MapRenderer renderer) { - return new NativeMapView( - FileSource.getInstance(getContext()), - pixelRatio, - crossSourceCollisions, - this, - mapChangeReceiver, - renderer - ); - } - /** * Interface definition for a callback to be invoked when the camera will change. *

diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java index 68719a5f59..98f48e9d79 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java @@ -28,13 +28,10 @@ public abstract class MapRenderer implements MapRendererScheduler { // Holds the pointer to the native peer after initialisation private long nativePtr = 0; - private final MapPresenter mapPresenter; - private double expectedRenderTime = 0; private MapboxMap.OnFpsChangedListener onFpsChangedListener; - public MapRenderer(@NonNull MapPresenter mapPresenter, @NonNull Context context, String localIdeographFontFamily) { - this.mapPresenter = mapPresenter; + public MapRenderer(@NonNull Context context, String localIdeographFontFamily) { FileSource fileSource = FileSource.getInstance(context); float pixelRatio = context.getResources().getDisplayMetrics().density; String programCacheDir = FileSource.getInternalCachePath(context); @@ -69,7 +66,6 @@ public abstract class MapRenderer implements MapRendererScheduler { @CallSuper protected void onSurfaceCreated(GL10 gl, EGLConfig config) { - mapPresenter.onSurfaceCreated(); nativeOnSurfaceCreated(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java index 6e86b6395a..5575d883a6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java @@ -25,10 +25,10 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi @NonNull private final GLSurfaceView glSurfaceView; - public GLSurfaceViewMapRenderer(@NonNull MapPresenter mapPresenter, Context context, + public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView, String localIdeographFontFamily) { - super(mapPresenter, context, localIdeographFontFamily); + super(context, localIdeographFontFamily); this.glSurfaceView = glSurfaceView; glSurfaceView.setEGLContextClientVersion(2); glSurfaceView.setEGLConfigChooser(new EGLConfigChooser()); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java index d58b6e0de4..df41012a4c 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java @@ -28,11 +28,11 @@ public class TextureViewMapRenderer extends MapRenderer { * @param localIdeographFontFamily the local font family * @param translucentSurface the translucency flag */ - public TextureViewMapRenderer(@NonNull MapPresenter mapPresenter, @NonNull Context context, + public TextureViewMapRenderer(@NonNull Context context, @NonNull TextureView textureView, String localIdeographFontFamily, boolean translucentSurface) { - super(mapPresenter, context, localIdeographFontFamily); + super(context, localIdeographFontFamily); this.translucentSurface = translucentSurface; renderThread = new TextureViewRenderThread(textureView, this); renderThread.start(); diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapPresenterTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapPresenterTest.kt index c1bf44e81c..cd6bca353e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapPresenterTest.kt +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapPresenterTest.kt @@ -1,7 +1,6 @@ package com.mapbox.mapboxsdk.maps import android.content.Context -import com.mapbox.mapboxsdk.maps.renderer.MapRenderer import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -11,15 +10,14 @@ import org.mockito.junit.MockitoJUnitRunner @RunWith(MockitoJUnitRunner::class) class MapPresenterTest { private lateinit var mapPresenter: MapPresenter - private lateinit var mapView: MapView + private lateinit var mapView: IMapView private lateinit var context: Context private lateinit var mapboxMapOptions: MapboxMapOptions - private lateinit var mapRenderer: MapRenderer private lateinit var mapChangeReceiver: MapChangeReceiver @Before fun setup() { - mapView = mock(MapView::class.java) + mapView = mock(IMapView::class.java) context = mock(Context::class.java) mapChangeReceiver = mock(MapChangeReceiver::class.java) @@ -29,9 +27,6 @@ class MapPresenterTest { doReturn(null).`when`(mapboxMapOptions).localIdeographFontFamily doReturn(1f).`when`(mapboxMapOptions).pixelRatio - doReturn(mapRenderer).`when`(mapView).createSurfaceView(any(), any(), any()) - doReturn(mapRenderer).`when`(mapView).createTextureView(any(), any(), any()) - mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) } @@ -57,7 +52,7 @@ class MapPresenterTest { doReturn(false).`when`(mapboxMapOptions).translucentTextureSurface doReturn(null).`when`(mapboxMapOptions).localIdeographFontFamily mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createTextureView(mapPresenter, null, false) + verify(mapView).createTextureView(null, false) } @Test @@ -67,7 +62,7 @@ class MapPresenterTest { doReturn(true).`when`(mapboxMapOptions).translucentTextureSurface doReturn(null).`when`(mapboxMapOptions).localIdeographFontFamily mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createTextureView(mapPresenter, null, true) + verify(mapView).createTextureView(null, true) } @Test @@ -77,7 +72,7 @@ class MapPresenterTest { doReturn(true).`when`(mapboxMapOptions).translucentTextureSurface doReturn("comic-sans").`when`(mapboxMapOptions).localIdeographFontFamily mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createTextureView(mapPresenter, "comic-sans", true) + verify(mapView).createTextureView("comic-sans", true) } @Test @@ -87,7 +82,7 @@ class MapPresenterTest { doReturn(null).`when`(mapboxMapOptions).localIdeographFontFamily doReturn(false).`when`(mapboxMapOptions).renderSurfaceOnTop mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createSurfaceView(mapPresenter, null, false) + verify(mapView).createSurfaceView(null, false) } @Test @@ -97,7 +92,7 @@ class MapPresenterTest { doReturn("comic-sans").`when`(mapboxMapOptions).localIdeographFontFamily doReturn(true).`when`(mapboxMapOptions).renderSurfaceOnTop mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createSurfaceView(mapPresenter, "comic-sans", true) + verify(mapView).createSurfaceView("comic-sans", true) } @Test @@ -105,7 +100,16 @@ class MapPresenterTest { reset(mapView) doReturn(false).`when`(mapboxMapOptions).crossSourceCollisions mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createNativeMapView(1f, false, mapChangeReceiver, mapRenderer) + verify(mapView).createNativeMapView(1f, false, mapChangeReceiver) + } + + @Test + fun init_initializeNativeMapView_pixelDensity() { + reset(mapView) + doReturn(false).`when`(mapboxMapOptions).crossSourceCollisions + doReturn(0.5f).`when`(mapboxMapOptions).pixelRatio + mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) + verify(mapView).createNativeMapView(0.5f, false, mapChangeReceiver) } @Test @@ -113,6 +117,32 @@ class MapPresenterTest { reset(mapView) doReturn(true).`when`(mapboxMapOptions).crossSourceCollisions mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) - verify(mapView).createNativeMapView(1f, true, mapChangeReceiver, mapRenderer) + verify(mapView).createNativeMapView(1f, true, mapChangeReceiver) + } + + @Test + fun init_order_texture() { + reset(mapView) + doReturn(true).`when`(mapboxMapOptions).textureMode + mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) + val orderVerifier = inOrder(mapView) + orderVerifier.verify(mapView).setForegroundColor(anyInt()) + orderVerifier.verify(mapView).inflateInternalViews() + orderVerifier.verify(mapView).setViewOptions() + orderVerifier.verify(mapView).createTextureView(null, false) + orderVerifier.verify(mapView).createNativeMapView(anyFloat(), anyBoolean(), any(MapChangeReceiver::class.java)) + } + + @Test + fun init_order_surface() { + reset(mapView) + doReturn(false).`when`(mapboxMapOptions).textureMode + mapPresenter = MapPresenterImpl(mapView, context, mapboxMapOptions, mapChangeReceiver) + val orderVerifier = inOrder(mapView) + orderVerifier.verify(mapView).setForegroundColor(anyInt()) + orderVerifier.verify(mapView).inflateInternalViews() + orderVerifier.verify(mapView).setViewOptions() + orderVerifier.verify(mapView).createSurfaceView(null, false) + orderVerifier.verify(mapView).createNativeMapView(anyFloat(), anyBoolean(), any(MapChangeReceiver::class.java)) } } \ No newline at end of file -- cgit v1.2.1