10d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li/*
20d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * Copyright (C) 2011 The Android Open Source Project
30d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li *
40d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
50d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * you may not use this file except in compliance with the License.
60d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * You may obtain a copy of the License at
70d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li *
80d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
90d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li *
100d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * Unless required by applicable law or agreed to in writing, software
110d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
120d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * See the License for the specific language governing permissions and
140d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li * limitations under the License.
150d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li */
160d604e2af9eeed22685fd62e2281c2cd9728d58bWu-cheng Li
1744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Lipackage com.android.camera.functional;
1844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
1944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport com.android.camera.Camera;
2044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport com.android.camera.R;
2144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
2244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.app.Activity;
2344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.app.Instrumentation;
2444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.content.Intent;
2544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.graphics.Bitmap;
2644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.graphics.BitmapFactory;
2744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.net.Uri;
2844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.os.Environment;
2944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.os.Process;
3044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.provider.MediaStore;
3144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.test.ActivityInstrumentationTestCase2;
3244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.test.suitebuilder.annotation.LargeTest;
3344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.test.UiThreadTest;
3444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.util.Log;
3544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport android.view.KeyEvent;
3644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
3744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport java.io.BufferedInputStream;
3844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport java.io.File;
3944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Liimport java.io.FileInputStream;
4044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
4144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Lipublic class ImageCaptureIntentTest extends ActivityInstrumentationTestCase2 <Camera> {
4244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private static final String TAG = "ImageCaptureIntentTest";
4344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private Intent mIntent;
4444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
4544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public ImageCaptureIntentTest() {
4644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        super(Camera.class);
4744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
4844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
4944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @Override
5044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    protected void setUp() throws Exception {
5144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        super.setUp();
5244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
5344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
5444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
5544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @LargeTest
5644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public void testNoExtraOutput() throws Exception {
5744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        setActivityIntent(mIntent);
5844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getActivity();
5944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
6044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        takePicture();
6144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        pressDone();
6244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
6344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(getActivity().isFinishing());
6444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertEquals(Activity.RESULT_OK, getActivity().getResultCode());
6544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Intent resultData = getActivity().getResultData();
6644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Bitmap bitmap = (Bitmap) resultData.getParcelableExtra("data");
6744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertNotNull(bitmap);
6844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(bitmap.getWidth() > 0);
6944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(bitmap.getHeight() > 0);
7044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
7144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
7244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @LargeTest
7344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public void testExtraOutput() throws Exception {
7444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        File file = new File(Environment.getExternalStorageDirectory(),
7544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            "test.jpg");
7644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        BufferedInputStream stream = null;
7744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        byte[] jpegData;
7844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
7944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        try {
8044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
8144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            setActivityIntent(mIntent);
8244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            getActivity();
8344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
8444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            takePicture();
8544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            pressDone();
8644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
8744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            assertTrue(getActivity().isFinishing());
8844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            assertEquals(Activity.RESULT_OK, getActivity().getResultCode());
8944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
9044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            // Verify the jpeg file
9144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            int fileLength = (int) file.length();
9244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            assertTrue(fileLength > 0);
9344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            jpegData = new byte[fileLength];
9444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            stream = new BufferedInputStream(new FileInputStream(file));
9544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            stream.read(jpegData);
9644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        } finally {
9744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            if (stream != null) stream.close();
9844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            file.delete();
9944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        }
10044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
10144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Bitmap b = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length);
10244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(b.getWidth() > 0);
10344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(b.getHeight() > 0);
10444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
10544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
10644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @LargeTest
10744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public void testRetake() throws Exception {
10844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        setActivityIntent(mIntent);
10944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getActivity();
11044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
11144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        takePicture();
11244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        pressRetake();
11344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        takePicture();
11444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        pressDone();
11544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
11644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(getActivity().isFinishing());
11744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertEquals(Activity.RESULT_OK, getActivity().getResultCode());
11844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Intent resultData = getActivity().getResultData();
11944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Bitmap bitmap = (Bitmap) resultData.getParcelableExtra("data");
12044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertNotNull(bitmap);
12144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(bitmap.getWidth() > 0);
12244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(bitmap.getHeight() > 0);
12344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
12444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
12544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @LargeTest
12644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public void testCancel() throws Exception {
12744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        setActivityIntent(mIntent);
12844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getActivity();
12944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
13044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        pressCancel();
13144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
13244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(getActivity().isFinishing());
13344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertEquals(Activity.RESULT_CANCELED, getActivity().getResultCode());
13444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
13544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
13644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    @LargeTest
13744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    public void testSnapshotCancel() throws Exception {
13844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        setActivityIntent(mIntent);
13944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getActivity();
14044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
14144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        takePicture();
14244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        pressCancel();
14344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
14444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertTrue(getActivity().isFinishing());
14544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        assertEquals(Activity.RESULT_CANCELED, getActivity().getResultCode());
14644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
14744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
14844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private void takePicture() throws Exception {
14944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getInstrumentation().sendKeySync(
15044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_FOCUS));
15144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getInstrumentation().sendCharacterSync(KeyEvent.KEYCODE_CAMERA);
15244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        Thread.sleep(4000);
15344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
15444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
15544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private void pressDone() {
15644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getInstrumentation().runOnMainSync(new Runnable() {
15744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            public void run() {
15844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li                getActivity().findViewById(R.id.btn_done).performClick();
15944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            }
16044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        });
16144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
16244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
16344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private void pressRetake() {
16444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getInstrumentation().runOnMainSync(new Runnable() {
16544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            public void run() {
16644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li                getActivity().findViewById(R.id.btn_retake).performClick();
16744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            }
16844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        });
16944294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
17044294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li
17144294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    private void pressCancel() {
17244294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        getInstrumentation().runOnMainSync(new Runnable() {
17344294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            public void run() {
17444294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li                getActivity().findViewById(R.id.btn_cancel).performClick();
17544294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li            }
17644294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li        });
17744294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li    }
17844294b68bdef9b1a06c070b998e53ce8c5732e5bWu-cheng Li}
179