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