1de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher/* 2de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * Copyright (C) 2014 The Android Open Source Project 3de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * 4de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * Licensed under the Apache License, Version 2.0 (the "License"); 5de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * you may not use this file except in compliance with the License. 6de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * You may obtain a copy of the License at 7de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * 8de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * http://www.apache.org/licenses/LICENSE-2.0 9de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * 10de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * Unless required by applicable law or agreed to in writing, software 11de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * distributed under the License is distributed on an "AS IS" BASIS, 12de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * See the License for the specific language governing permissions and 14de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * limitations under the License. 15de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher */ 16de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 17de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherpackage com.android.ex.camera2.utils; 18de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 19de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.content.Context; 20de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.hardware.camera2.CameraDevice; 21de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.hardware.camera2.CameraManager; 22de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.os.Handler; 23de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.os.HandlerThread; 24de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport android.support.test.InjectContext; 25de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 26de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport org.junit.After; 27de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport org.junit.AfterClass; 28de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport org.junit.Before; 29de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherimport org.junit.BeforeClass; 30de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 31de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher/** 32de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher * Subclasses of this have an {@code mCamera} instance variable representing the first camera. 33de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher */ 34de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherpublic class Camera2DeviceTester { 35de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher private static HandlerThread sThread; 36de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 37de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher private static Handler sHandler; 38de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 39de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @BeforeClass 40de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public static void setupBackgroundHandler() { 41de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher sThread = new HandlerThread("CameraFramework"); 42de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher sThread.start(); 43de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher sHandler = new Handler(sThread.getLooper()); 44de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 45de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 46de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @AfterClass 47de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public static void teardownBackgroundHandler() throws Exception { 48de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher sThread.quitSafely(); 49de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher sThread.join(); 50de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 51de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 52de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @InjectContext 53de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public Context mContext; 54de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 55bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala private class DeviceCapturer extends CameraDevice.StateCallback { 56de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher private CameraDevice mCamera; 57de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 58de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public CameraDevice captureCameraDevice() throws Exception { 59de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher CameraManager manager = 60de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE); 61de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher String id = manager.getCameraIdList()[0]; 62de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher synchronized (this) { 63de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher manager.openCamera(id, this, sHandler); 64de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher wait(); 65de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 66de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher return mCamera; 67de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 68de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 69de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @Override 70de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public synchronized void onOpened(CameraDevice camera) { 71de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher mCamera = camera; 72de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher notify(); 73de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 74de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 75de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @Override 76de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public void onDisconnected(CameraDevice camera) {} 77de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 78de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @Override 79de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public void onError(CameraDevice camera, int error) {} 80de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 81de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 82de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher protected CameraDevice mCamera; 83de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 84de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @Before 85de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public void obtainCameraCaptureRequestBuilderFactory() throws Exception { 86de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher mCamera = new DeviceCapturer().captureCameraDevice(); 87de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 88de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher 89de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher @After 90de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher public void releaseCameraCaptureRequestBuilderFactory() { 91de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher mCamera.close(); 92de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher } 93de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucher} 94