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