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