mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-17 21:29:54 +01:00
Release surface to work around Android bug #54285.
This commit is contained in:
@@ -8,6 +8,7 @@ import android.hardware.Camera.Parameters;
|
|||||||
import android.hardware.Camera.Size;
|
import android.hardware.Camera.Size;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.view.Surface;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
|
|
||||||
@@ -40,8 +41,9 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
|
|
||||||
private Camera camera = null;
|
private Camera camera = null;
|
||||||
private PreviewConsumer previewConsumer = null;
|
private PreviewConsumer previewConsumer = null;
|
||||||
|
private Surface surface = null;
|
||||||
private int displayOrientation = 0, surfaceWidth = 0, surfaceHeight = 0;
|
private int displayOrientation = 0, surfaceWidth = 0, surfaceHeight = 0;
|
||||||
private boolean autoFocus = false, surfaceExists = false;
|
private boolean autoFocus = false;
|
||||||
|
|
||||||
public CameraView(Context context) {
|
public CameraView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -59,8 +61,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
protected void onAttachedToWindow() {
|
protected void onAttachedToWindow() {
|
||||||
super.onAttachedToWindow();
|
super.onAttachedToWindow();
|
||||||
setKeepScreenOn(true);
|
setKeepScreenOn(true);
|
||||||
SurfaceHolder holder = getHolder();
|
getHolder().addCallback(this);
|
||||||
holder.addCallback(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -68,6 +69,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
setKeepScreenOn(false);
|
setKeepScreenOn(false);
|
||||||
getHolder().removeCallback(this);
|
getHolder().removeCallback(this);
|
||||||
|
if (surface != null) surface.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start(Camera camera, PreviewConsumer previewConsumer,
|
public void start(Camera camera, PreviewConsumer previewConsumer,
|
||||||
@@ -92,7 +94,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
enableAutoFocus(params.getFocusMode());
|
enableAutoFocus(params.getFocusMode());
|
||||||
// Log the parameters that are being used (maybe not what we asked for)
|
// Log the parameters that are being used (maybe not what we asked for)
|
||||||
logCameraParameters();
|
logCameraParameters();
|
||||||
if (surfaceExists) startPreview(getHolder());
|
if (surface != null) startPreview(getHolder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
@@ -270,13 +272,18 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
@Override
|
@Override
|
||||||
public void surfaceCreated(SurfaceHolder holder) {
|
public void surfaceCreated(SurfaceHolder holder) {
|
||||||
LOG.info("Surface created");
|
LOG.info("Surface created");
|
||||||
surfaceExists = true;
|
if (surface != null) throw new IllegalStateException();
|
||||||
|
surface = holder.getSurface();
|
||||||
if (camera != null) startPreview(holder);
|
if (camera != null) startPreview(holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||||
if (LOG.isLoggable(INFO)) LOG.info("Surface changed: " + w + "x" + h);
|
if (LOG.isLoggable(INFO)) LOG.info("Surface changed: " + w + "x" + h);
|
||||||
|
// Release the previous surface if necessary
|
||||||
|
if (surface != null && surface != holder.getSurface())
|
||||||
|
surface.release();
|
||||||
|
surface = holder.getSurface();
|
||||||
surfaceWidth = w;
|
surfaceWidth = w;
|
||||||
surfaceHeight = h;
|
surfaceHeight = h;
|
||||||
if (camera == null) return; // We are stopped
|
if (camera == null) return; // We are stopped
|
||||||
@@ -295,7 +302,8 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
|
|||||||
@Override
|
@Override
|
||||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||||
LOG.info("Surface destroyed");
|
LOG.info("Surface destroyed");
|
||||||
surfaceExists = false;
|
if (holder.getSurface() != surface) throw new IllegalStateException();
|
||||||
|
if (surface != null) surface.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user