131af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesipackage com.xtremelabs.robolectric.shadows;
231af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi
331af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi
4f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.graphics.Canvas;
5f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.graphics.ImageFormat;
6f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.graphics.Rect;
7f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.hardware.Camera;
8f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.view.Surface;
9f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport android.view.SurfaceHolder;
10f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.Robolectric;
11f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
12c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi
13c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesiimport org.junit.After;
1431af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesiimport org.junit.Before;
1531af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesiimport org.junit.Test;
1631af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesiimport org.junit.runner.RunWith;
1731af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi
18a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.equalTo;
19a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.not;
20a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.notNullValue;
217d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesiimport static org.hamcrest.CoreMatchers.nullValue;
22a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.sameInstance;
23f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultzimport static org.junit.Assert.assertThat;
2431af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi
2531af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi@RunWith(WithTestDefaultsRunner.class)
2631af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesipublic class CameraTest {
2731af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi
28f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    private Camera camera;
29f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    private ShadowCamera shadowCamera;
30f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
31f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Before
32f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void setUp() throws Exception {
33f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera = Camera.open();
34f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        shadowCamera = Robolectric.shadowOf(camera);
35f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
36c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi
37c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi    @After
38c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi    public void tearDown() throws Exception {
39c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi    	ShadowCamera.clearCameraInfo();
40c306c10d894f8ededdd5de8bd504f80db14a9d5cMichael Portuesi    }
41f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
42f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
43f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testOpen() throws Exception {
44f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(camera, notNullValue());
45f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
46f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
47f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
48f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testUnlock() throws Exception {
49f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isLocked(), equalTo(true));
50f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.unlock();
51f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isLocked(), equalTo(false));
52f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
53f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
54f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
55f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testReconnect() throws Exception {
56f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.unlock();
57f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isLocked(), equalTo(false));
58f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.reconnect();
59f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isLocked(), equalTo(true));
60f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
61f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
62f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
63f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testGetParameters() throws Exception {
64f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        Camera.Parameters parameters = camera.getParameters();
65f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(parameters, notNullValue());
66f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(parameters.getSupportedPreviewFormats(), notNullValue());
67a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwin        assertThat(parameters.getSupportedPreviewFormats().size(), not(equalTo(0)));
68f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
69f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
70f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
71f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testSetParameters() throws Exception {
72f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        Camera.Parameters parameters = camera.getParameters();
73f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(parameters.getPreviewFormat(), equalTo(ImageFormat.NV21));
74f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        parameters.setPreviewFormat(ImageFormat.JPEG);
75f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.setParameters(parameters);
76f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(camera.getParameters().getPreviewFormat(), equalTo(ImageFormat.JPEG));
77f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
78f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
79f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
80f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testSetPreviewDisplay() throws Exception {
81f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        SurfaceHolder previewSurfaceHolder = new TestSurfaceHolder();
82f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.setPreviewDisplay(previewSurfaceHolder);
83f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.getPreviewDisplay(), sameInstance(previewSurfaceHolder));
84f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
85f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
86f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
87f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testStartPreview() throws Exception {
88f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isPreviewing(), equalTo(false));
89f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.startPreview();
90f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isPreviewing(), equalTo(true));
91f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
92f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
93f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
94f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testStopPreview() throws Exception {
95f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.startPreview();
96f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isPreviewing(), equalTo(true));
97f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.stopPreview();
98f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isPreviewing(), equalTo(false));
99f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
100f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
101f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    @Test
102f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    public void testRelease() throws Exception {
103f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isReleased(), equalTo(false));
104f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        camera.release();
105f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        assertThat(shadowCamera.isReleased(), equalTo(true));
106f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
107f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
1087d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    @Test
1097d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    public void testSetPreviewCallbacks() throws Exception {
1107d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	TestPreviewCallback callback = new TestPreviewCallback();
1117d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1127d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1137d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1147d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallback(callback);
1157d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1167d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1177d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, sameInstance(camera));
118ca8b4e7c96507b66cb816a3383c93b02d79a7685Tyler Schultz    	assertThat(callback.data, equalTo("foobar".getBytes()));
1197d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    }
1207d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1217d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    @Test
1227d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    public void testSetOneShotPreviewCallbacks() throws Exception {
1237d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	TestPreviewCallback callback = new TestPreviewCallback();
1247d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1257d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1267d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1277d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setOneShotPreviewCallback(callback);
1287d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1297d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1307d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, sameInstance(camera));
131ca8b4e7c96507b66cb816a3383c93b02d79a7685Tyler Schultz    	assertThat(callback.data, equalTo("foobar".getBytes()));
1327d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    }
1337d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1347d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    @Test
1357d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    public void testPreviewCallbacksWithBuffers() throws Exception {
1367d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	TestPreviewCallback callback = new TestPreviewCallback();
1377d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1387d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1397d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1407d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallbackWithBuffer(callback);
1417d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1427d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1437d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, sameInstance(camera));
144ca8b4e7c96507b66cb816a3383c93b02d79a7685Tyler Schultz    	assertThat(callback.data, equalTo("foobar".getBytes()));
1457d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    }
1467d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1477d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    @Test
1487d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    public void testClearPreviewCallback() throws Exception {
1497d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	TestPreviewCallback callback = new TestPreviewCallback();
1507d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1517d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1527d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1537d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallback(callback);
1547d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallback(null);
1557d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1567d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1577d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1587d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1597d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1607d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setOneShotPreviewCallback(callback);
1617d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setOneShotPreviewCallback(null);
1627d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1637d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1647d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1657d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1667d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1677d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallbackWithBuffer(callback);
1687d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	camera.setPreviewCallbackWithBuffer(null);
1697d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
1707d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	shadowCamera.invokePreviewCallback("foobar".getBytes());
1717d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.camera, nullValue());
1727d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	assertThat(callback.data, nullValue());
1737d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    }
1747d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
17501477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    @Test
17601477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    public void testCameraInfoNoCameras() throws Exception {
17701477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat(Camera.getNumberOfCameras(), equalTo(0));
17801477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    }
17901477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
18001477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    @Test
18101477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    public void testCameraInfoBackOnly() throws Exception {
18201477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	Camera.CameraInfo cameraQuery = new Camera.CameraInfo();
18301477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
18401477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		addBackCamera();
18501477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	Camera.getCameraInfo(0, cameraQuery);
18601477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
18701477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat(Camera.getNumberOfCameras(), equalTo(1));
18801477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat(cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_BACK));
18901477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat(cameraQuery.orientation, equalTo(0));
19001477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    }
19101477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
19201477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    @Test
19301477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    public void testCameraInfoBackAndFront() throws Exception {
19401477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	Camera.CameraInfo cameraQuery = new Camera.CameraInfo();
19501477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		addBackCamera();
19601477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	addFrontCamera();
19701477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
19801477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat( Camera.getNumberOfCameras(), equalTo(2) );
19901477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	Camera.getCameraInfo(0, cameraQuery);
20001477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat( cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_BACK) );
20101477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat( cameraQuery.orientation, equalTo(0) );
20201477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	Camera.getCameraInfo(1, cameraQuery);
20301477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat( cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_FRONT) );
20401477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    	assertThat( cameraQuery.orientation, equalTo(90) );
20501477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi    }
20601477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
20701477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi	private void addBackCamera() {
20801477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		Camera.CameraInfo frontCamera = new Camera.CameraInfo();
20901477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		frontCamera.facing = Camera.CameraInfo.CAMERA_FACING_BACK;
21001477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		frontCamera.orientation = 0;
21101477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		ShadowCamera.addCameraInfo(0, frontCamera);
21201477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi	}
21301477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
21401477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi	private void addFrontCamera() {
21501477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		Camera.CameraInfo backCamera = new Camera.CameraInfo();
21601477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		backCamera.facing = Camera.CameraInfo.CAMERA_FACING_FRONT;
21701477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		backCamera.orientation = 90;
21801477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi		ShadowCamera.addCameraInfo(1, backCamera);
21901477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi	}
22001477cabe73bbe8916287eb510d55c526f919a4fMichael Portuesi
2217d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    private class TestPreviewCallback implements Camera.PreviewCallback {
2227d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	public Camera camera = null;
2237d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    	public byte[] data = null;
2247d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi
2257d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi		@Override
2267d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi		public void onPreviewFrame(byte[] data, Camera camera) {
2277d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi			this.data = data;
2287d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi			this.camera = camera;
2297d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi		}
2307d27d66271a8a0a34c970ec1068653c63709856bMichael Portuesi    }
231f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
232f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    private class TestSurfaceHolder implements SurfaceHolder {
233f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
234f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
235f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void addCallback(Callback callback) {
236f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
237f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
238f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
239f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public Surface getSurface() {
240f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz            return null;
241f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
242f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
243f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
244f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public Rect getSurfaceFrame() {
245f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz            return null;
246f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
247f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
248f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
249f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public boolean isCreating() {
250f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz            return false;
251f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
252f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
253f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
254f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public Canvas lockCanvas() {
255f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz            return null;
256f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
257f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
258f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
259f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public Canvas lockCanvas(Rect dirty) {
260f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz            return null;
261f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
262f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
263f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
264f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void removeCallback(Callback callback) {
265f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
266f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
267f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
268f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void setFixedSize(int width, int height) {
269f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
270f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
271f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
272f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void setFormat(int format) {
273f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
274f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
275f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
276f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void setKeepScreenOn(boolean screenOn) {
277f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
278f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
279f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
280f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void setSizeFromLayout() {
281f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
282f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
283f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
284f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void setType(int type) {
285f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
286f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz
287f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        @Override
288f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        public void unlockCanvasAndPost(Canvas canvas) {
289f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz        }
290f96b9a1f17d47e48d1f5f8e29b4ed7ffccc739abPhil Goodwin & Tyler Schultz    }
29131af8607e2c7da6ba8708f57c4b67b6b4aaad921Michael Portuesi}
292