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;
225d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvalaimport android.hardware.ICameraService;
234491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.hardware.ICameraServiceListener;
242f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.ICameraDeviceCallbacks;
252f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.ICameraDeviceUser;
2670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvalaimport android.hardware.camera2.impl.CameraMetadataNative;
2772f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinimport android.hardware.camera2.impl.CaptureResultExtras;
284491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.Binder;
294491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.IBinder;
304491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.os.RemoteException;
315d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvalaimport android.os.ServiceSpecificException;
324491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.test.AndroidTestCase;
334491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.test.suitebuilder.annotation.SmallTest;
344491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinimport android.util.Log;
354491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
364491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin/**
3770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <p>
384491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * Junit / Instrumentation test case for the camera2 api
3970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </p>
4070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <p>
4170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * To run only tests in this class:
4270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </p>
434491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin *
4470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * <pre>
454491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin * adb shell am instrument \
4670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *   -e class com.android.mediaframeworktest.integration.CameraBinderTest \
4770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *   -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
4870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * </pre>
494491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin */
504491d684f47fcf1e05652f910587a930be8a4135Igor Murashkinpublic class CameraBinderTest extends AndroidTestCase {
514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    private static final int MAX_PARAMETERS_LENGTH = 100;
524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
5370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    static String TAG = "CameraBinderTest";
544491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
554961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    // From ICameraService.h
564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    private static final int API_VERSION_1 = 1;
574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    private static final int API_VERSION_2 = 2;
584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
595717612ba9ac78021e81f5b45ca7903c318499f9Eino-Ville Talvala    private static final int CAMERA_TYPE_BACKWARD_COMPATIBLE = 0;
605717612ba9ac78021e81f5b45ca7903c318499f9Eino-Ville Talvala    private static final int CAMERA_TYPE_ALL = 1;
615717612ba9ac78021e81f5b45ca7903c318499f9Eino-Ville Talvala
6270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    protected CameraBinderTestUtils mUtils;
634491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
644491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    public CameraBinderTest() {
654491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
664491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
6770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    @Override
684491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    protected void setUp() throws Exception {
694491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        super.setUp();
704491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
7170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        mUtils = new CameraBinderTestUtils(getContext());
724491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
734491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
744491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    @SmallTest
754491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    public void testNumberOfCameras() throws Exception {
7670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
775717612ba9ac78021e81f5b45ca7903c318499f9Eino-Ville Talvala        int numCameras = mUtils.getCameraService().getNumberOfCameras(CAMERA_TYPE_ALL);
7870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        assertTrue("At least this many cameras: " + mUtils.getGuessedNumCameras(),
7970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin                numCameras >= mUtils.getGuessedNumCameras());
804491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        Log.v(TAG, "Number of cameras " + numCameras);
814491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
824491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
834491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    @SmallTest
844491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    public void testCameraInfo() throws Exception {
8570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
864491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
875d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            CameraInfo info = mUtils.getCameraService().getCameraInfo(cameraId);
884491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            assertTrue("Facing was not set for camera " + cameraId, info.info.facing != -1);
894491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            assertTrue("Orientation was not set for camera " + cameraId,
904491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin                    info.info.orientation != -1);
914491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
924491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            Log.v(TAG, "Camera " + cameraId + " info: facing " + info.info.facing
934491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin                    + ", orientation " + info.info.orientation);
944491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        }
954491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
964491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
974961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    @SmallTest
984961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    public void testGetLegacyParameters() throws Exception {
994961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
1004961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1015d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            String parameters = mUtils.getCameraService().getLegacyParameters(cameraId);
1025d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            assertNotNull(parameters);
1034961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            assertTrue("Parameters should have at least one character in it",
1045d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                    parameters.length() > 0);
1054961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1065d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            int end = parameters.length();
1074961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            if (end > MAX_PARAMETERS_LENGTH) {
1084961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                end = MAX_PARAMETERS_LENGTH;
1094961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            }
1104961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1115d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            Log.v(TAG, "Camera " + cameraId + " parameters: " + parameters.substring(0, end));
1124961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
1134961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
1144961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1154961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    /** The camera2 api is only supported on HAL3.2+ devices */
1164961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    @SmallTest
1174961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    public void testSupportsCamera2Api() throws Exception {
1184961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
1194961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1205d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            boolean supports = mUtils.getCameraService().supportsCameraApi(cameraId, API_VERSION_2);
1214961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            Log.v(TAG, "Camera " + cameraId + " supports api2: " + supports);
1234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
1244961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
1254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    /** The camera1 api is supported on *all* devices regardless of HAL version */
1274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    @SmallTest
1284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    public void testSupportsCamera1Api() throws Exception {
1294961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
1304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1315d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            boolean supports = mUtils.getCameraService().supportsCameraApi(cameraId, API_VERSION_1);
1325d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            assertTrue(
1335d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                    "Camera service returned false when queried if it supports camera1 api " +
1345d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                    " for camera ID " + cameraId, supports);
1354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
1364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
1374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1384491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    static abstract class DummyBase extends Binder implements android.os.IInterface {
1394491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        @Override
1404491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        public IBinder asBinder() {
1414491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            return this;
1424491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        }
1434491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
1444491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
1454491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    static class DummyCameraClient extends DummyBase implements ICameraClient {
1464491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
1474491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
1484491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    @SmallTest
1494491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    public void testConnect() throws Exception {
15070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
1514491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
1524491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            ICameraClient dummyCallbacks = new DummyCameraClient();
1534491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
1544491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            String clientPackageName = getContext().getPackageName();
1554491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
1565d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            ICamera cameraUser = mUtils.getCameraService()
15766ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk                    .connect(dummyCallbacks, cameraId, clientPackageName,
1585d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                            ICameraService.USE_CALLING_UID,
1595d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                            ICameraService.USE_CALLING_PID);
1604491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
16170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
16270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            Log.v(TAG, String.format("Camera %s connected", cameraId));
16370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
16470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            cameraUser.disconnect();
16570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
16670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
16770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
1684c913801141163362dd5bb7c9784c83f69c11054Zhijun He    @SmallTest
1694c913801141163362dd5bb7c9784c83f69c11054Zhijun He    public void testConnectLegacy() throws Exception {
1704c913801141163362dd5bb7c9784c83f69c11054Zhijun He        final int CAMERA_HAL_API_VERSION_1_0 = 0x100;
1714c913801141163362dd5bb7c9784c83f69c11054Zhijun He        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
1724c913801141163362dd5bb7c9784c83f69c11054Zhijun He            ICamera cameraUser = null;
1734c913801141163362dd5bb7c9784c83f69c11054Zhijun He            ICameraClient dummyCallbacks = new DummyCameraClient();
1744c913801141163362dd5bb7c9784c83f69c11054Zhijun He
1754c913801141163362dd5bb7c9784c83f69c11054Zhijun He            String clientPackageName = getContext().getPackageName();
1764c913801141163362dd5bb7c9784c83f69c11054Zhijun He
1774c913801141163362dd5bb7c9784c83f69c11054Zhijun He            try {
1785d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                cameraUser = mUtils.getCameraService()
1794c913801141163362dd5bb7c9784c83f69c11054Zhijun He                        .connectLegacy(dummyCallbacks, cameraId, CAMERA_HAL_API_VERSION_1_0,
1805d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                                clientPackageName,
1815d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                                ICameraService.USE_CALLING_UID);
1824c913801141163362dd5bb7c9784c83f69c11054Zhijun He                assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
1834c913801141163362dd5bb7c9784c83f69c11054Zhijun He
1844c913801141163362dd5bb7c9784c83f69c11054Zhijun He                Log.v(TAG, String.format("Camera %s connected as HAL1 legacy device", cameraId));
1854c913801141163362dd5bb7c9784c83f69c11054Zhijun He            } catch (RuntimeException e) {
1864c913801141163362dd5bb7c9784c83f69c11054Zhijun He                // Not all camera device support openLegacy.
1874c913801141163362dd5bb7c9784c83f69c11054Zhijun He                Log.i(TAG, "Unable to open camera as HAL1 legacy camera device " + e);
1884c913801141163362dd5bb7c9784c83f69c11054Zhijun He            } finally {
1894c913801141163362dd5bb7c9784c83f69c11054Zhijun He                if (cameraUser != null) {
1904c913801141163362dd5bb7c9784c83f69c11054Zhijun He                    cameraUser.disconnect();
1914c913801141163362dd5bb7c9784c83f69c11054Zhijun He                }
1924c913801141163362dd5bb7c9784c83f69c11054Zhijun He            }
1934c913801141163362dd5bb7c9784c83f69c11054Zhijun He        }
1944c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
1954c913801141163362dd5bb7c9784c83f69c11054Zhijun He
196693e21d6052b32ad7815d9c0d7bd01fd6170a608Zhijun He    static class DummyCameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {
19770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
198438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        /*
199438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * (non-Javadoc)
200438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * @see
201438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.ICameraDeviceCallbacks#onCameraError(int,
202438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.CaptureResultExtras)
203438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         */
2044961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        @Override
205acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala        public void onDeviceError(int errorCode, CaptureResultExtras resultExtras)
206438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He                throws RemoteException {
207438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He            // TODO Auto-generated method stub
20870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
209e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala        }
210e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala
211438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        /*
212438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * (non-Javadoc)
213438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * @see
214438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.ICameraDeviceCallbacks#onCaptureStarted(
215438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.CaptureResultExtras, long)
216438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         */
2174961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        @Override
218438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        public void onCaptureStarted(CaptureResultExtras resultExtras, long timestamp)
219438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He                throws RemoteException {
220438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He            // TODO Auto-generated method stub
221438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He
222e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala        }
223e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala
224438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        /*
225438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * (non-Javadoc)
226438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * @see
227438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.ICameraDeviceCallbacks#onResultReceived(
228438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.impl.CameraMetadataNative,
229438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * android.hardware.camera2.CaptureResultExtras)
230438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         */
2314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        @Override
232438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        public void onResultReceived(CameraMetadataNative result, CaptureResultExtras resultExtras)
233e841d4e16526a2e466f662305682aa3459d07c15Eino-Ville Talvala                throws RemoteException {
234438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He            // TODO Auto-generated method stub
235438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He
236438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        }
237438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He
238438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He        /*
239438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * (non-Javadoc)
240438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         * @see android.hardware.camera2.ICameraDeviceCallbacks#onCameraIdle()
241438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He         */
2424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        @Override
243acc0095bc84914d3ce41ad8298f698c37935b8a8Eino-Ville Talvala        public void onDeviceIdle() throws RemoteException {
244ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala            // TODO Auto-generated method stub
245ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala
246ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        }
247ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala
248ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        /*
249ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala         * (non-Javadoc)
250ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala         * @see android.hardware.camera2.ICameraDeviceCallbacks#onPrepared()
251ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala         */
252ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        @Override
253ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        public void onPrepared(int streamId) throws RemoteException {
254438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He            // TODO Auto-generated method stub
255438d77e0429f78def6c0cb3c21095202c71b8220Zhijun He
25670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        }
2572da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen
2582da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen        /*
2592da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen         * (non-Javadoc)
2602da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen         * @see android.hardware.camera2.ICameraDeviceCallbacks#onRepeatingRequestError()
2612da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen         */
2622da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen        @Override
2632da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen        public void onRepeatingRequestError(long lastFrameNumber) {
2642da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen            // TODO Auto-generated method stub
2652da496f1ce63548486fe28e074f6af90c970db8cChien-Yu Chen        }
26670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    }
26770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
26870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    @SmallTest
26970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    public void testConnectDevice() throws Exception {
27070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
27170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
27270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks();
27370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
27470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin            String clientPackageName = getContext().getPackageName();
27570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
2765d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            ICameraDeviceUser cameraUser =
2775d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                    mUtils.getCameraService().connectDevice(
2785d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        dummyCallbacks, cameraId,
2795d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        clientPackageName,
2805d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        ICameraService.USE_CALLING_UID);
2814491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
2824491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
2834491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            Log.v(TAG, String.format("Camera %s connected", cameraId));
2844491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
2854491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            cameraUser.disconnect();
2864491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        }
2874491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
2884491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
289693e21d6052b32ad7815d9c0d7bd01fd6170a608Zhijun He    static class DummyCameraServiceListener extends ICameraServiceListener.Stub {
2904491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        @Override
2914491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        public void onStatusChanged(int status, int cameraId)
2924491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin                throws RemoteException {
2934491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            Log.v(TAG, String.format("Camera %d has status changed to 0x%x", cameraId, status));
2944491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        }
295afa91399fd32ede17d440ec1c3321eee0426123cChien-Yu Chen        public void onTorchStatusChanged(int status, String cameraId)
296afa91399fd32ede17d440ec1c3321eee0426123cChien-Yu Chen                throws RemoteException {
297afa91399fd32ede17d440ec1c3321eee0426123cChien-Yu Chen            Log.v(TAG, String.format("Camera %s has torch status changed to 0x%x",
298afa91399fd32ede17d440ec1c3321eee0426123cChien-Yu Chen                    cameraId, status));
299afa91399fd32ede17d440ec1c3321eee0426123cChien-Yu Chen        }
3004491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
3014491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
3024491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    /**
30370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin     * <pre>
3044491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin     * adb shell am instrument \
30570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin     *   -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testAddRemoveListeners' \
30670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin     *   -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
30770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin     * </pre>
3084491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin     */
3094491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    @SmallTest
3104491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    public void testAddRemoveListeners() throws Exception {
31170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin        for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
3124491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
3134491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin            ICameraServiceListener listener = new DummyCameraServiceListener();
3144491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin
3155d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            try {
3165d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                mUtils.getCameraService().removeListener(listener);
3175d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                fail("Listener was removed before added");
3185d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            } catch (ServiceSpecificException e) {
3195d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                assertEquals("Listener was removed before added",
3205d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        e.errorCode, ICameraService.ERROR_ILLEGAL_ARGUMENT);
3215d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            }
32270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
3235d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            mUtils.getCameraService().addListener(listener);
32470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
3255d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            try {
3265d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                mUtils.getCameraService().addListener(listener);
3275d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                fail("Listener was wrongly added again");
3285d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            } catch (ServiceSpecificException e) {
3295d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                assertEquals("Listener was wrongly added again",
3305d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        e.errorCode, ICameraService.ERROR_ALREADY_EXISTS);
3315d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            }
3325d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala
3335d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            mUtils.getCameraService().removeListener(listener);
3345d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala
3355d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            try {
3365d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                mUtils.getCameraService().removeListener(listener);
3375d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                fail("Listener was wrongly removed twice");
3385d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            } catch (ServiceSpecificException e) {
3395d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                assertEquals("Listener was wrongly removed twice",
3405d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                        e.errorCode, ICameraService.ERROR_ILLEGAL_ARGUMENT);
3415d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            }
3424491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin        }
3434491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin    }
3444491d684f47fcf1e05652f910587a930be8a4135Igor Murashkin}
345