content: package org.opencv.android;
  
  import org.opencv.R;
  
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.opengl.GLSurfaceView;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.SurfaceHolder;
  
  public class CameraGLSurfaceView extends GLSurfaceView {
  
      private static final String LOGTAG = "CameraGLSurfaceView";
  
      public interface CameraTextureListener {
          /**
           * This method is invoked when camera preview has started. After this method is invoked
           * the frames will start to be delivered to client via the onCameraFrame() callback.
           * @param width -  the width of the frames that will be delivered
           * @param height - the height of the frames that will be delivered
           */
          public void onCameraViewStarted(int width, int height);
  
          /**
           * This method is invoked when camera preview has been stopped for some reason.
           * No frames will be delivered via onCameraFrame() callback after this method is called.
           */
          public void onCameraViewStopped();
  
          /**
           * This method is invoked when a new preview frame from Camera is ready.
           * @param texIn -  the OpenGL texture ID that contains frame in RGBA format
           * @param texOut - the OpenGL texture ID that can be used to store modified frame image t display
           * @param width -  the width of the frame
           * @param height - the height of the frame
           * @return `true` if `texOut` should be displayed, `false` - to show `texIn`
           */
          public boolean onCameraTexture(int texIn, int texOut, int width, int height);
      };
  
      private CameraTextureListener mTexListener;
      private CameraGLRendererBase mRenderer;
  
      public CameraGLSurfaceView(Context context, AttributeSet attrs) {
          super(context, attrs);
  
          TypedArray styledAttrs = getContext().obtainStyledAttributes(attrs, R.styleable.CameraBridgeViewBase);
          int cameraIndex = styledAttrs.getInt(R.styleable.CameraBridgeViewBase_camera_id, -1);
          styledAttrs.recycle();
  
          if(android.os.Build.VERSION.SDK_INT >= 21)
              mRenderer = new Camera2Renderer(this);
          else
              mRenderer = new CameraRenderer(this);
  
          setCameraIndex(cameraIndex);
  
          setEGLContextClientVersion(2);
          setRenderer(mRenderer);
          setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
      }
  
      public void setCameraTextureListener(CameraTextureListener texListener)
      {
          mTexListener = texListener;
      }
  
      public CameraTextureListener getCameraTextureListener()
      {
          return mTexListener;
      }
  
      public void setCameraIndex(int cameraIndex) {
          mRenderer.setCameraIndex(cameraIndex);
      }
  
      public void setMaxCameraPreviewSize(int maxWidth, int maxHeight) {
          mRenderer.setMaxCameraPreviewSize(maxWidth, maxHeight);
      }
  
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          super.surfaceCreated(holder);
      }
  
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
          mRenderer.mHaveSurface = false;
          super.surfaceDestroyed(holder);
      }
  
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
          super.surfaceChanged(holder, format, w, h);
      }
  
      @Override
      public void onResume() {
          Log.i(LOGTAG, "onResume");
          super.onResume();
          mRenderer.onResume();
      }
  
      @Override
      public void onPause() {
          Log.i(LOGTAG, "onPause");
          mRenderer.onPause();
          super.onPause();
      }
  
      public void enableView() {
          mRenderer.enableView();
      }
  
      public void disableView() {
          mRenderer.disableView();
      }
  }
  