diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview')
3 files changed, 62 insertions, 38 deletions
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 9ddee8d1ad..2d0c0ed69b 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 @@ -3,7 +3,6 @@ package com.mapbox.mapboxsdk.maps.renderer.glsurfaceview; import android.content.Context; import android.opengl.GLSurfaceView; import android.support.annotation.NonNull; -import android.view.SurfaceHolder; import com.mapbox.mapboxsdk.maps.renderer.MapRenderer; import com.mapbox.mapboxsdk.maps.renderer.egl.EGLConfigChooser; @@ -22,10 +21,10 @@ import static android.opengl.GLSurfaceView.RENDERMODE_WHEN_DIRTY; public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceView.Renderer { @NonNull - private final GLSurfaceView glSurfaceView; + private final MapboxGLSurfaceView glSurfaceView; public GLSurfaceViewMapRenderer(Context context, - GLSurfaceView glSurfaceView, + MapboxGLSurfaceView glSurfaceView, String localIdeographFontFamily) { super(context, localIdeographFontFamily); this.glSurfaceView = glSurfaceView; @@ -34,18 +33,13 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi glSurfaceView.setRenderer(this); glSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY); glSurfaceView.setPreserveEGLContextOnPause(true); - glSurfaceView.getHolder().addCallback(new SurfaceHolderCallbackAdapter() { - - @Override - public void surfaceCreated(SurfaceHolder holder) { - super.surfaceCreated(holder); - hasSurface.set(true); - } - + glSurfaceView.setDetachedListener(new MapboxGLSurfaceView.OnGLSurfaceViewDetachedListener() { @Override - public void surfaceDestroyed(SurfaceHolder holder) { - super.surfaceDestroyed(holder); - hasSurface.set(false); + public void onGLSurfaceViewDetached() { + // because the GL thread is destroyed when the view is detached from window, + // we need to ensure releasing the native renderer as well. + // This avoids releasing it only when the view is being recreated, which is already on a new GL thread, + // and leads to JNI crashes like https://github.com/mapbox/mapbox-gl-native/issues/14618 nativeReset(); } }); @@ -103,9 +97,6 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi */ @Override public void requestRender() { - if (!hasSurface.get()) { - return; - } glSurfaceView.requestRender(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/MapboxGLSurfaceView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/MapboxGLSurfaceView.java new file mode 100644 index 0000000000..ccdbc58220 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/MapboxGLSurfaceView.java @@ -0,0 +1,54 @@ +package com.mapbox.mapboxsdk.maps.renderer.glsurfaceview; + +import android.content.Context; +import android.opengl.GLSurfaceView; +import android.support.annotation.NonNull; +import android.util.AttributeSet; + +/** + * {@link GLSurfaceView} extension that notifies a listener when the view is detached from window, + * which is the point of destruction of the GL thread. + */ +public class MapboxGLSurfaceView extends GLSurfaceView { + + private OnGLSurfaceViewDetachedListener detachedListener; + + public MapboxGLSurfaceView(Context context) { + super(context); + } + + public MapboxGLSurfaceView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onDetachedFromWindow() { + if (detachedListener != null) { + detachedListener.onGLSurfaceViewDetached(); + } + super.onDetachedFromWindow(); + } + + /** + * Set a listener that gets notified when the view is detached from window. + * + * @param detachedListener listener + */ + public void setDetachedListener(@NonNull OnGLSurfaceViewDetachedListener detachedListener) { + if (this.detachedListener != null) { + throw new IllegalArgumentException("Detached from window listener has been already set."); + } + this.detachedListener = detachedListener; + } + + /** + * Listener interface that notifies when a {@link MapboxGLSurfaceView} is detached from window. + */ + public interface OnGLSurfaceViewDetachedListener { + + /** + * Called when a {@link MapboxGLSurfaceView} is detached from window. + */ + void onGLSurfaceViewDetached(); + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/SurfaceHolderCallbackAdapter.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/SurfaceHolderCallbackAdapter.java deleted file mode 100644 index 4c50df5029..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/SurfaceHolderCallbackAdapter.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.mapbox.mapboxsdk.maps.renderer.glsurfaceview; - -import android.view.SurfaceHolder; - -class SurfaceHolderCallbackAdapter implements SurfaceHolder.Callback { - - @Override - public void surfaceCreated(SurfaceHolder holder) { - - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - - } -} |