1 /* 2 * Copyright (C) 2015 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 17 package android.hardware.multiprocess.camera.cts; 18 19 import android.app.Activity; 20 import android.graphics.Rect; 21 import android.hardware.camera2.CameraAccessException; 22 import android.hardware.camera2.CameraDevice; 23 import android.hardware.camera2.CameraManager; 24 import android.os.Bundle; 25 import android.os.Handler; 26 import android.os.HandlerThread; 27 import android.util.Log; 28 import android.view.WindowMetrics; 29 30 /** 31 * Activity implementing basic access of the Camera2 API. 32 * 33 * <p /> 34 * This will log all errors to {@link android.hardware.multiprocess.camera.cts.ErrorLoggingService}. 35 */ 36 public class Camera2Activity extends Activity { 37 private static final String TAG = "Camera2Activity"; 38 39 ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection; 40 CameraManager mCameraManager; 41 AvailabilityCallback mAvailabilityCallback; 42 StateCallback mStateCallback; 43 Handler mCameraHandler; 44 HandlerThread mCameraHandlerThread; 45 46 @Override onCreate(Bundle savedInstanceState)47 protected void onCreate(Bundle savedInstanceState) { 48 Log.i(TAG, "onCreate called."); 49 super.onCreate(savedInstanceState); 50 mCameraHandlerThread = new HandlerThread("CameraHandlerThread"); 51 mCameraHandlerThread.start(); 52 mCameraHandler = new Handler(mCameraHandlerThread.getLooper()); 53 mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(this); 54 mErrorServiceConnection.start(); 55 } 56 57 @Override onPause()58 protected void onPause() { 59 Log.i(TAG, "onPause called."); 60 super.onPause(); 61 } 62 63 @Override onResume()64 protected void onResume() { 65 Log.i(TAG, "onResume called."); 66 super.onResume(); 67 68 WindowMetrics metrics = getWindowManager().getCurrentWindowMetrics(); 69 Rect windowRect = metrics.getBounds(); 70 mErrorServiceConnection.logAsync(TestConstants.EVENT_ACTIVITY_RESUMED, 71 windowRect.left + ":" + windowRect.top + ":" 72 + windowRect.right + ":" + windowRect.bottom); 73 74 try { 75 mCameraManager = getSystemService(CameraManager.class); 76 77 if (mCameraManager == null) { 78 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG + 79 " could not connect camera service"); 80 return; 81 } 82 // TODO: http://b/145308043 move this back to getCameraIdListNoLazy() 83 String[] cameraIds = mCameraManager.getCameraIdList(); 84 85 if (cameraIds == null || cameraIds.length == 0) { 86 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG + 87 " device reported having no cameras"); 88 return; 89 } 90 91 if (mAvailabilityCallback == null) { 92 mAvailabilityCallback = new AvailabilityCallback(); 93 mCameraManager.registerAvailabilityCallback(mAvailabilityCallback, mCameraHandler); 94 } 95 96 final String chosen = cameraIds[0]; 97 if (mStateCallback == null || mStateCallback.mChosen != chosen) { 98 mStateCallback = new StateCallback(chosen); 99 mCameraManager.openCamera(chosen, mStateCallback, mCameraHandler); 100 } 101 } catch (CameraAccessException e) { 102 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG + 103 " camera exception during connection: " + e); 104 Log.e(TAG, "Access exception: " + e); 105 } 106 } 107 108 @Override onDestroy()109 protected void onDestroy() { 110 Log.i(TAG, "onDestroy called."); 111 super.onDestroy(); 112 113 if (mAvailabilityCallback != null) { 114 mCameraManager.unregisterAvailabilityCallback(mAvailabilityCallback); 115 mAvailabilityCallback = null; 116 } 117 118 mCameraHandlerThread.quitSafely(); 119 120 if (mErrorServiceConnection != null) { 121 mErrorServiceConnection.stop(); 122 mErrorServiceConnection = null; 123 } 124 } 125 126 private class AvailabilityCallback extends CameraManager.AvailabilityCallback { 127 @Override onCameraAvailable(String cameraId)128 public void onCameraAvailable(String cameraId) { 129 super.onCameraAvailable(cameraId); 130 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_AVAILABLE, 131 cameraId); 132 Log.i(TAG, "Camera " + cameraId + " is available"); 133 } 134 135 @Override onCameraUnavailable(String cameraId)136 public void onCameraUnavailable(String cameraId) { 137 super.onCameraUnavailable(cameraId); 138 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_UNAVAILABLE, 139 cameraId); 140 Log.i(TAG, "Camera " + cameraId + " is unavailable"); 141 } 142 143 @Override onPhysicalCameraAvailable(String cameraId, String physicalCameraId)144 public void onPhysicalCameraAvailable(String cameraId, String physicalCameraId) { 145 super.onPhysicalCameraAvailable(cameraId, physicalCameraId); 146 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_AVAILABLE, 147 cameraId + " : " + physicalCameraId); 148 Log.i(TAG, "Camera " + cameraId + " : " + physicalCameraId + " is available"); 149 } 150 151 @Override onPhysicalCameraUnavailable(String cameraId, String physicalCameraId)152 public void onPhysicalCameraUnavailable(String cameraId, String physicalCameraId) { 153 super.onPhysicalCameraUnavailable(cameraId, physicalCameraId); 154 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_UNAVAILABLE, 155 cameraId + " : " + physicalCameraId); 156 Log.i(TAG, "Camera " + cameraId + " : " + physicalCameraId + " is unavailable"); 157 } 158 } 159 160 private class StateCallback extends CameraDevice.StateCallback { 161 String mChosen; 162 StateCallback(String chosen)163 StateCallback(String chosen) { 164 mChosen = chosen; 165 } 166 167 @Override onOpened(CameraDevice cameraDevice)168 public void onOpened(CameraDevice cameraDevice) { 169 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_CONNECT, 170 mChosen); 171 Log.i(TAG, "Camera " + mChosen + " is opened"); 172 } 173 174 @Override onDisconnected(CameraDevice cameraDevice)175 public void onDisconnected(CameraDevice cameraDevice) { 176 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_EVICTED, 177 mChosen); 178 Log.i(TAG, "Camera " + mChosen + " is disconnected"); 179 } 180 181 @Override onError(CameraDevice cameraDevice, int i)182 public void onError(CameraDevice cameraDevice, int i) { 183 mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG 184 + " Camera " + mChosen + " experienced error " + i); 185 Log.e(TAG, "Camera " + mChosen + " onError called with error " + i); 186 } 187 } 188 } 189