1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.callcomposer.camera;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.graphics.SurfaceTexture;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.hardware.Camera;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Parcelable;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.util.AttributeSet;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.TextureView;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.io.IOException;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/**
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * A hardware accelerated preview texture for the camera. This is the preferred CameraPreview
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * because it animates smoother. When hardware acceleration isn't available, SoftwareCameraPreview
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * is used.
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * <p>There is a significant amount of duplication between HardwareCameraPreview and
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * SoftwareCameraPreview which we can't easily share due to a lack of multiple inheritance, The
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * implementations of the shared methods are delegated to CameraPreview
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class HardwareCameraPreview extends TextureView implements CameraPreview.CameraPreviewHost {
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private CameraPreview mPreview;
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public HardwareCameraPreview(final Context context, final AttributeSet attrs) {
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super(context, attrs);
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview = new CameraPreview(this);
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    setSurfaceTextureListener(
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        new SurfaceTextureListener() {
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onSurfaceTextureAvailable(
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              final SurfaceTexture surfaceTexture, final int i, final int i2) {
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            CameraManager.get().setSurface(mPreview);
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onSurfaceTextureSizeChanged(
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              final SurfaceTexture surfaceTexture, final int i, final int i2) {
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            CameraManager.get().setSurface(mPreview);
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public boolean onSurfaceTextureDestroyed(final SurfaceTexture surfaceTexture) {
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            CameraManager.get().setSurface(null);
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            return true;
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onSurfaceTextureUpdated(final SurfaceTexture surfaceTexture) {
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            CameraManager.get().setSurface(mPreview);
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        });
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setShown() {
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.setShown();
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onVisibilityChanged(final View changedView, final int visibility) {
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onVisibilityChanged(changedView, visibility);
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.onVisibilityChanged(visibility);
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onDetachedFromWindow() {
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onDetachedFromWindow();
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.onDetachedFromWindow();
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onAttachedToWindow() {
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onAttachedToWindow();
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.onAttachedToWindow();
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onRestoreInstanceState(final Parcelable state) {
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onRestoreInstanceState(state);
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.onRestoreInstanceState();
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    widthMeasureSpec = mPreview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    heightMeasureSpec = mPreview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public View getView() {
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return this;
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isValid() {
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return getSurfaceTexture() != null;
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void startPreview(final Camera camera) throws IOException {
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    camera.setPreviewTexture(getSurfaceTexture());
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onCameraPermissionGranted() {
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    mPreview.onCameraPermissionGranted();
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
126