14491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin/* 24491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * Copyright (C) 2013 The Android Open Source Project 34491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * 44491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 54491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * you may not use this file except in compliance with the License. 64491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * You may obtain a copy of the License at 74491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * 84491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 94491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * 104491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * Unless required by applicable law or agreed to in writing, software 114491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 124491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * See the License for the specific language governing permissions and 144491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * limitations under the License. 154491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin */ 164491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 174491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinpackage com.android.mediaframeworktest.integration; 184491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 194491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.CameraInfo; 204491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.ICamera; 214491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.ICameraClient; 224491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.ICameraServiceListener; 234491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.IProCameraCallbacks; 244491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.IProCameraUser; 252f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.ICameraDeviceCallbacks; 262f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.ICameraDeviceUser; 2770c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalaimport android.hardware.camera2.impl.CameraMetadataNative; 2872f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinimport android.hardware.camera2.impl.CaptureResultExtras; 2966ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunkimport android.hardware.camera2.utils.BinderHolder; 3066ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunkimport android.hardware.camera2.utils.CameraBinderDecorator; 314491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.Binder; 324491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.IBinder; 334491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.RemoteException; 344491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.test.AndroidTestCase; 354491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.test.suitebuilder.annotation.SmallTest; 364491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.util.Log; 374491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 384491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin/** 3970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <p> 404491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * Junit / Instrumentation test case for the camera2 api 4170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </p> 4270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <p> 4370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * To run only tests in this class: 4470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </p> 454491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * 4670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <pre> 474491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * adb shell am instrument \ 4870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * -e class com.android.mediaframeworktest.integration.CameraBinderTest \ 4970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner 5070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </pre> 514491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin */ 524491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinpublic class CameraBinderTest extends AndroidTestCase { 534961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static final int MAX_PARAMETERS_LENGTH = 100; 544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 5570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin static String TAG = "CameraBinderTest"; 564491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin // From ICameraService.h 584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static final int API_VERSION_1 = 1; 594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static final int API_VERSION_2 = 2; 604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 6170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin protected CameraBinderTestUtils mUtils; 624491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 634491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public CameraBinderTest() { 644491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 654491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 6670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin @Override 674491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin protected void setUp() throws Exception { 684491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin super.setUp(); 694491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 7070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils = new CameraBinderTestUtils(getContext()); 714491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 724491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 734491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @SmallTest 744491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void testNumberOfCameras() throws Exception { 7570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 7670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin int numCameras = mUtils.getCameraService().getNumberOfCameras(); 7770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue("At least this many cameras: " + mUtils.getGuessedNumCameras(), 7870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin numCameras >= mUtils.getGuessedNumCameras()); 794491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin Log.v(TAG, "Number of cameras " + numCameras); 804491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 814491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 824491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @SmallTest 834491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void testCameraInfo() throws Exception { 8470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 854491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 864491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin CameraInfo info = new CameraInfo(); 874491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin info.info.facing = -1; 884491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin info.info.orientation = -1; 894491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 9070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue( 9170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin "Camera service returned info for camera " + cameraId, 9270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().getCameraInfo(cameraId, info) == 9370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.NO_ERROR); 944491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin assertTrue("Facing was not set for camera " + cameraId, info.info.facing != -1); 954491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin assertTrue("Orientation was not set for camera " + cameraId, 964491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin info.info.orientation != -1); 974491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 984491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin Log.v(TAG, "Camera " + cameraId + " info: facing " + info.info.facing 994491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin + ", orientation " + info.info.orientation); 1004491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1014491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1024491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1034961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @SmallTest 1044961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin public void testGetLegacyParameters() throws Exception { 1054961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 1064961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1074961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin String[] parameters = new String[1]; 1084961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin assertEquals("Camera service returned parameters for camera " + cameraId, 1094961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin CameraBinderTestUtils.NO_ERROR, 1104961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin mUtils.getCameraService().getLegacyParameters(cameraId, /*out*/parameters)); 1114961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin assertNotNull(parameters[0]); 1124961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin assertTrue("Parameters should have at least one character in it", 1134961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin parameters[0].length() > 0); 1144961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1154961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin int end = parameters[0].length(); 1164961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin if (end > MAX_PARAMETERS_LENGTH) { 1174961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin end = MAX_PARAMETERS_LENGTH; 1184961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1194961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1204961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Log.v(TAG, "Camera " + cameraId + " parameters: " + parameters[0].substring(0, end)); 1214961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1244961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /** The camera2 api is only supported on HAL3.2+ devices */ 1254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @SmallTest 1264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin public void testSupportsCamera2Api() throws Exception { 1274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 1284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1294961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin int res = mUtils.getCameraService().supportsCameraApi(cameraId, API_VERSION_2); 1304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin if (res != CameraBinderTestUtils.NO_ERROR && res != CameraBinderTestUtils.EOPNOTSUPP) { 1324961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin fail("Camera service returned bad value when queried if it supports camera2 api: " 1334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin + res + " for camera ID " + cameraId); 1344961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin boolean supports = res == CameraBinderTestUtils.NO_ERROR; 1374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Log.v(TAG, "Camera " + cameraId + " supports api2: " + supports); 1384961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1394961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1404961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /** The camera1 api is supported on *all* devices regardless of HAL version */ 1424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @SmallTest 1434961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin public void testSupportsCamera1Api() throws Exception { 1444961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 1454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1464961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin int res = mUtils.getCameraService().supportsCameraApi(cameraId, API_VERSION_1); 1474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin assertEquals( 1484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin "Camera service returned bad value when queried if it supports camera1 api: " 1494961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin + res + " for camera ID " + cameraId, CameraBinderTestUtils.NO_ERROR, res); 1504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1534491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin static abstract class DummyBase extends Binder implements android.os.IInterface { 1544491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @Override 1554491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public IBinder asBinder() { 1564491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin return this; 1574491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1584491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1594491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1604491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin static class DummyCameraClient extends DummyBase implements ICameraClient { 1614491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1624491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1634491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @SmallTest 1644491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void testConnect() throws Exception { 16570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 1664491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1674491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin ICameraClient dummyCallbacks = new DummyCameraClient(); 1684491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1694491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin String clientPackageName = getContext().getPackageName(); 1704491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 17166ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk BinderHolder holder = new BinderHolder(); 17266ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk CameraBinderDecorator.newInstance(mUtils.getCameraService()) 17366ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk .connect(dummyCallbacks, cameraId, clientPackageName, 17466ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk CameraBinderTestUtils.USE_CALLING_UID, holder); 17566ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk ICamera cameraUser = ICamera.Stub.asInterface(holder.getBinder()); 1764491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 1774491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1784491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin Log.v(TAG, String.format("Camera %s connected", cameraId)); 1794491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1804491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin cameraUser.disconnect(); 1814491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1824491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1834491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1844491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin static class DummyProCameraCallbacks extends DummyBase implements IProCameraCallbacks { 1854491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 1864491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1874491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @SmallTest 1884491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void testConnectPro() throws Exception { 18970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 1904491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1914491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin IProCameraCallbacks dummyCallbacks = new DummyProCameraCallbacks(); 1924491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 1934491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin String clientPackageName = getContext().getPackageName(); 1944491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 19566ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk BinderHolder holder = new BinderHolder(); 19666ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk CameraBinderDecorator.newInstance(mUtils.getCameraService()) 19766ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk .connectPro(dummyCallbacks, cameraId, 19866ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); 19966ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk IProCameraUser cameraUser = IProCameraUser.Stub.asInterface(holder.getBinder()); 20070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 20170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 20270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin Log.v(TAG, String.format("Camera %s connected", cameraId)); 20370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 20470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin cameraUser.disconnect(); 20570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin } 20670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin } 20770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 2084c913801141163362dd5bb7c9784c83f69c11054Zhijun He @SmallTest 2094c913801141163362dd5bb7c9784c83f69c11054Zhijun He public void testConnectLegacy() throws Exception { 2104c913801141163362dd5bb7c9784c83f69c11054Zhijun He final int CAMERA_HAL_API_VERSION_1_0 = 0x100; 2114c913801141163362dd5bb7c9784c83f69c11054Zhijun He for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 2124c913801141163362dd5bb7c9784c83f69c11054Zhijun He ICamera cameraUser = null; 2134c913801141163362dd5bb7c9784c83f69c11054Zhijun He ICameraClient dummyCallbacks = new DummyCameraClient(); 2144c913801141163362dd5bb7c9784c83f69c11054Zhijun He 2154c913801141163362dd5bb7c9784c83f69c11054Zhijun He String clientPackageName = getContext().getPackageName(); 2164c913801141163362dd5bb7c9784c83f69c11054Zhijun He 2174c913801141163362dd5bb7c9784c83f69c11054Zhijun He BinderHolder holder = new BinderHolder(); 2184c913801141163362dd5bb7c9784c83f69c11054Zhijun He 2194c913801141163362dd5bb7c9784c83f69c11054Zhijun He try { 2204c913801141163362dd5bb7c9784c83f69c11054Zhijun He CameraBinderDecorator.newInstance(mUtils.getCameraService()) 2214c913801141163362dd5bb7c9784c83f69c11054Zhijun He .connectLegacy(dummyCallbacks, cameraId, CAMERA_HAL_API_VERSION_1_0, 2224c913801141163362dd5bb7c9784c83f69c11054Zhijun He clientPackageName, 2234c913801141163362dd5bb7c9784c83f69c11054Zhijun He CameraBinderTestUtils.USE_CALLING_UID, holder); 2244c913801141163362dd5bb7c9784c83f69c11054Zhijun He cameraUser = ICamera.Stub.asInterface(holder.getBinder()); 2254c913801141163362dd5bb7c9784c83f69c11054Zhijun He assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 2264c913801141163362dd5bb7c9784c83f69c11054Zhijun He 2274c913801141163362dd5bb7c9784c83f69c11054Zhijun He Log.v(TAG, String.format("Camera %s connected as HAL1 legacy device", cameraId)); 2284c913801141163362dd5bb7c9784c83f69c11054Zhijun He } catch (RuntimeException e) { 2294c913801141163362dd5bb7c9784c83f69c11054Zhijun He // Not all camera device support openLegacy. 2304c913801141163362dd5bb7c9784c83f69c11054Zhijun He Log.i(TAG, "Unable to open camera as HAL1 legacy camera device " + e); 2314c913801141163362dd5bb7c9784c83f69c11054Zhijun He } finally { 2324c913801141163362dd5bb7c9784c83f69c11054Zhijun He if (cameraUser != null) { 2334c913801141163362dd5bb7c9784c83f69c11054Zhijun He cameraUser.disconnect(); 2344c913801141163362dd5bb7c9784c83f69c11054Zhijun He } 2354c913801141163362dd5bb7c9784c83f69c11054Zhijun He } 2364c913801141163362dd5bb7c9784c83f69c11054Zhijun He } 2374c913801141163362dd5bb7c9784c83f69c11054Zhijun He } 2384c913801141163362dd5bb7c9784c83f69c11054Zhijun He 239693e21d6052b32ad7815d9c0d7bd01fd6170a608Zhijun He static class DummyCameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub { 24070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 241438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He /* 242438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * (non-Javadoc) 243438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * @see 244438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.ICameraDeviceCallbacks#onCameraError(int, 245438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.CaptureResultExtras) 246438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He */ 2474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @Override 248acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala public void onDeviceError(int errorCode, CaptureResultExtras resultExtras) 249438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He throws RemoteException { 250438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He // TODO Auto-generated method stub 25170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 252e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala } 253e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala 254438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He /* 255438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * (non-Javadoc) 256438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * @see 257438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.ICameraDeviceCallbacks#onCaptureStarted( 258438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.CaptureResultExtras, long) 259438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He */ 2604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @Override 261438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He public void onCaptureStarted(CaptureResultExtras resultExtras, long timestamp) 262438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He throws RemoteException { 263438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He // TODO Auto-generated method stub 264438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He 265e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala } 266e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala 267438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He /* 268438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * (non-Javadoc) 269438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * @see 270438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.ICameraDeviceCallbacks#onResultReceived( 271438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.impl.CameraMetadataNative, 272438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * android.hardware.camera2.CaptureResultExtras) 273438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He */ 2744961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @Override 275438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He public void onResultReceived(CameraMetadataNative result, CaptureResultExtras resultExtras) 276e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala throws RemoteException { 277438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He // TODO Auto-generated method stub 278438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He 279438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He } 280438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He 281438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He /* 282438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * (non-Javadoc) 283438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He * @see android.hardware.camera2.ICameraDeviceCallbacks#onCameraIdle() 284438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He */ 2854961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin @Override 286acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala public void onDeviceIdle() throws RemoteException { 287438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He // TODO Auto-generated method stub 288438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He 28970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin } 29070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin } 29170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 29270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin @SmallTest 29370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin public void testConnectDevice() throws Exception { 29470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 29570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 29670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks(); 29770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 29870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin String clientPackageName = getContext().getPackageName(); 29970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 30066ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk BinderHolder holder = new BinderHolder(); 30166ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk CameraBinderDecorator.newInstance(mUtils.getCameraService()) 30266ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk .connectDevice(dummyCallbacks, cameraId, 30366ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk clientPackageName, CameraBinderTestUtils.USE_CALLING_UID, holder); 30466ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk ICameraDeviceUser cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); 3054491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin assertNotNull(String.format("Camera %s was null", cameraId), cameraUser); 3064491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 3074491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin Log.v(TAG, String.format("Camera %s connected", cameraId)); 3084491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 3094491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin cameraUser.disconnect(); 3104491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3114491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3124491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 313693e21d6052b32ad7815d9c0d7bd01fd6170a608Zhijun He static class DummyCameraServiceListener extends ICameraServiceListener.Stub { 3144491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @Override 3154491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void onStatusChanged(int status, int cameraId) 3164491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin throws RemoteException { 3174491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin Log.v(TAG, String.format("Camera %d has status changed to 0x%x", cameraId, status)); 3184491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3194491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3204491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 3214491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin /** 32270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <pre> 3234491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * adb shell am instrument \ 32470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testAddRemoveListeners' \ 32570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner 32670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </pre> 3274491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin */ 3284491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin @SmallTest 3294491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin public void testAddRemoveListeners() throws Exception { 33070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) { 3314491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 3324491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin ICameraServiceListener listener = new DummyCameraServiceListener(); 3334491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin 33470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue( 33570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin "Listener was removed before added", 33670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().removeListener(listener) == 33770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.BAD_VALUE); 33870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 33970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue("Listener was not added", 34070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().addListener(listener) == 34170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.NO_ERROR); 34270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue( 34370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin "Listener was wrongly added again", 34470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().addListener(listener) == 34570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.ALREADY_EXISTS); 34670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin 34770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue( 34870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin "Listener was not removed", 34970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().removeListener(listener) == 35070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.NO_ERROR); 35170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin assertTrue( 35270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin "Listener was wrongly removed again", 35370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin mUtils.getCameraService().removeListener(listener) == 35470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin CameraBinderTestUtils.BAD_VALUE); 3554491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3564491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin } 3574491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin} 358