Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e5427ea authored by Adnan's avatar Adnan Committed by Adnan Begovic
Browse files

SystemUI: Utilize TextureView for CameraTile.

  SurfaceView causes unecessary and confusing view bleeding
  when the camera preview is about to begin. Utilize TextureView
  to display the content stream which behaves better within the
  QuickSettingsTile's container.

Change-Id: I408545ea92e29ab2cf4760b097ecf0cea4d813c9
parent 08a9111b
Loading
Loading
Loading
Loading
+36 −38
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.media.ExifInterface;
import android.net.Uri;
@@ -36,7 +37,7 @@ import android.util.Log;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.TextureView;
import android.view.View;
import android.view.ViewParent;
import android.view.WindowManager;
@@ -57,14 +58,14 @@ import com.android.systemui.statusbar.phone.QuickSettingsController;
import com.android.systemui.statusbar.phone.QuickSettingsTileView;

public class CameraTile extends QuickSettingsTile implements
        QuickSettingsTileView.OnPrepareListener {
        QuickSettingsTileView.OnPrepareListener, TextureView.SurfaceTextureListener {
    private static final String DEFAULT_IMAGE_FILE_NAME_FORMAT = "'IMG'_yyyyMMdd_HHmmss";
    private static final int CAMERA_ID = 0;

    private Handler mHandler;
    private View mIconContainer;
    private FrameLayout mSurfaceLayout;
    private SurfaceView mSurfaceView;
    private TextureView mTextureView;
    private View mFlashView;

    private Camera mCamera;
@@ -144,9 +145,10 @@ public class CameraTile extends QuickSettingsTile implements
            final View parent = (View) mContainer.getParent();

            mIconContainer.setVisibility(View.GONE);
            mSurfaceView = new CameraPreview(mContext, mCamera);
            mSurfaceView.setVisibility(View.VISIBLE);
            mSurfaceLayout.addView(mSurfaceView, 0);
            mTextureView = new TextureView(mContext);
            mTextureView.setVisibility(View.VISIBLE);
            mSurfaceLayout.addView(mTextureView, 0);
            mTextureView.setSurfaceTextureListener(CameraTile.this);
        }
    };

@@ -230,9 +232,10 @@ public class CameraTile extends QuickSettingsTile implements
            mCameraOrientationListener.disable();

            mIconContainer.setVisibility(View.VISIBLE);
            mSurfaceView.setVisibility(View.GONE);
            mSurfaceLayout.removeView(mSurfaceView);
            mSurfaceView = null;
            mTextureView.setVisibility(View.GONE);
            mSurfaceLayout.removeView(mTextureView);
            mTextureView.setSurfaceTextureListener(null);
            mTextureView = null;
        }
    };

@@ -389,25 +392,12 @@ public class CameraTile extends QuickSettingsTile implements
        }
    }

    private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
        private SurfaceHolder mHolder;
        private Camera mCamera;

        public CameraPreview(Context context, Camera camera) {
            super(context);
            mCamera = camera;

            // Install a SurfaceHolder.Callback so we get notified when the
            // underlying surface is created and destroyed.
            mHolder = getHolder();
            mHolder.addCallback(this);
        }

        public void surfaceCreated(SurfaceHolder holder) {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        // The Surface has been created, now tell the camera where
        // to draw the preview.
        try {
                mCamera.setPreviewDisplay(holder);
            mCamera.setPreviewTexture(surface);
            mCamera.startPreview();
            mCameraStarted = true;
            mCameraBusy = false;
@@ -418,11 +408,19 @@ public class CameraTile extends QuickSettingsTile implements
        }
    }

        public void surfaceDestroyed(SurfaceHolder holder) {
    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

    }

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }

    private class Storage {