1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.mediapicker; 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.graphics.Canvas; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.hardware.Camera; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcelable; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.util.AttributeSet; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.ViewGroup; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.FrameLayout; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.PersistentInstanceState; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ThreadUtil; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class CameraMediaChooserView extends FrameLayout implements PersistentInstanceState { 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String KEY_CAMERA_INDEX = "camera_index"; 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // True if we have at least queued an update to the view tree to support software rendering 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // fallback 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mIsSoftwareFallbackActive; 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public CameraMediaChooserView(final Context context, final AttributeSet attrs) { 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(context, attrs); 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected Parcelable onSaveInstanceState() { 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Bundle bundle = new Bundle(); 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd bundle.putInt(KEY_CAMERA_INDEX, CameraManager.get().getCameraIndex()); 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return bundle; 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected void onRestoreInstanceState(final Parcelable state) { 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!(state instanceof Bundle)) { 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Bundle bundle = (Bundle) state; 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd CameraManager.get().selectCameraByIndex(bundle.getInt(KEY_CAMERA_INDEX)); 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public Parcelable saveState() { 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return onSaveInstanceState(); 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void restoreState(final Parcelable restoredState) { 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd onRestoreInstanceState(restoredState); 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void resetState() { 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd CameraManager.get().selectCamera(Camera.CameraInfo.CAMERA_FACING_BACK); 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected void onDraw(final Canvas canvas) { 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onDraw(canvas); 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // If the canvas isn't hardware accelerated, we have to replace the HardwareCameraPreview 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // with a SoftwareCameraPreview which supports software rendering 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!canvas.isHardwareAccelerated() && !mIsSoftwareFallbackActive) { 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mIsSoftwareFallbackActive = true; 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Post modifying the tree since we can't modify the view tree during a draw pass 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ThreadUtil.getMainThreadHandler().post(new Runnable() { 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final HardwareCameraPreview cameraPreview = 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd (HardwareCameraPreview) findViewById(R.id.camera_preview); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (cameraPreview == null) { 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ViewGroup parent = ((ViewGroup) cameraPreview.getParent()); 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int index = parent.indexOfChild(cameraPreview); 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final SoftwareCameraPreview softwareCameraPreview = 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd new SoftwareCameraPreview(getContext()); 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Be sure to remove the hardware view before adding the software view to 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // prevent having 2 camera previews active at the same time 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd parent.removeView(cameraPreview); 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd parent.addView(softwareCameraPreview, index); 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 103