• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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