content: /*
   * Copyright (C) 2016 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.google.android.cameraview;
  
  import android.annotation.TargetApi;
  import android.content.Context;
  import android.content.res.Configuration;
  import android.graphics.Matrix;
  import android.graphics.SurfaceTexture;
  import android.view.Surface;
  import android.view.TextureView;
  import android.view.View;
  import android.view.ViewGroup;
  
  import com.ailiwean.core.Config;
  import com.ailiwean.core.Utils;
  
  @TargetApi(14)
  class TextureViewPreview extends PreviewImpl {
  
      private final TextureView mTextureView;
      private int mDisplayOrientation;
  
      TextureViewPreview(Context context, ViewGroup parent) {
          final View view = View.inflate(context, R.layout.texture_view, parent);
          mTextureView = view.findViewById(R.id.texture_view);
          mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
  
              @Override
              public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                  setSize(width, height);
                  configureTransform();
                  dispatchSurfaceChanged();
              }
  
              @Override
              public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
                  setSize(width, height);
                  configureTransform();
                  dispatchSurfaceChanged();
              }
  
              @Override
              public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                  setSize(0, 0);
                  return true;
              }
  
              @Override
              public void onSurfaceTextureUpdated(SurfaceTexture surface) {
  
              }
          });
  
      }
  
      @TargetApi(15)
      @Override
      void setBufferSize(int widthData, int heightData) {
  
          if (Config.scanRect != null) {
              Config.scanRect.setDataX(widthData);
              Config.scanRect.setDataY(heightData);
          }
          if (getSurfaceTexture() != null)
              getSurfaceTexture().setDefaultBufferSize(widthData, heightData);
      }
  
      @Override
      Surface getSurface() {
          return new Surface(mTextureView.getSurfaceTexture());
      }
  
      @Override
      SurfaceTexture getSurfaceTexture() {
          return mTextureView.getSurfaceTexture();
      }
  
      @Override
      View getView() {
          return mTextureView;
      }
  
      @Override
      Class getOutputClass() {
          return SurfaceTexture.class;
      }
  
      @Override
      void setDisplayOrientation(int displayOrientation) {
          mDisplayOrientation = displayOrientation;
          configureTransform();
      }
  
      @Override
      boolean isReady() {
          return mTextureView.getSurfaceTexture() != null;
      }
  
      /**
       * Configures the transform matrix for TextureView based on {@link Config} and
       * the surface size.
       */
      void configureTransform() {
          Matrix matrix = new Matrix();
  
          if (Utils.INSTANCE.getContext() != null &&
                  Utils.INSTANCE.getContext().getResources().getConfiguration().orientation ==
                          Configuration.ORIENTATION_LANDSCAPE && mDisplayOrientation == 0)
              mDisplayOrientation = Config.displayOrientation;
  
          if (mDisplayOrientation % 180 == 90) {
              final int width = getWidth();
              final int height = getHeight();
              // Rotate the camera preview when the screen is landscape.
              matrix.setPolyToPoly(
                      new float[]{
                              0.f, 0.f, // top left
                              width, 0.f, // top right
                              0.f, height, // bottom left
                              width, height, // bottom right
                      }, 0,
                      mDisplayOrientation == 90 ?
                              // Clockwise
                              new float[]{
                                      0.f, height, // top left
                                      0.f, 0.f, // top right
                                      width, height, // bottom left
                                      width, 0.f, // bottom right
                              } : // mDisplayOrientation == 270
                              // Counter-clockwise
                              new float[]{
                                      width, 0.f, // top left
                                      width, height, // top right
                                      0.f, 0.f, // bottom left
                                      0.f, height, // bottom right
                              }, 0,
                      4);
          } else if (mDisplayOrientation == 180) {
              matrix.postRotate(180, getWidth() / 2, getHeight() / 2);
          }
          mTextureView.setTransform(matrix);
      }
  }