143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi/*
243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * Copyright (C) 2011 The Android Open Source Project
343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi *
443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * Licensed under the Apache License, Version 2.0 (the "License");
543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * you may not use this file except in compliance with the License.
643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * You may obtain a copy of the License at
743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi *
843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi *      http://www.apache.org/licenses/LICENSE-2.0
943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi *
1043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * Unless required by applicable law or agreed to in writing, software
1143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * distributed under the License is distributed on an "AS IS" BASIS,
1243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * See the License for the specific language governing permissions and
1443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi * limitations under the License.
1543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi */
1643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
1743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchipackage com.android.gallery3d.functional;
1843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
1943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport com.android.camera.CameraActivity;
207db6eb02312a4c649d34351d1d78add1d8ec814bJohn Reckimport com.android.gallery3d.R;
2143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
2243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.app.Activity;
2343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.content.Intent;
2443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.graphics.Bitmap;
2543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.graphics.BitmapFactory;
2643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.net.Uri;
2743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.os.Environment;
2843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.provider.MediaStore;
2943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.test.ActivityInstrumentationTestCase2;
3043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.test.suitebuilder.annotation.LargeTest;
3143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport android.view.KeyEvent;
3243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
3343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport java.io.BufferedInputStream;
3443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport java.io.File;
3543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchiimport java.io.FileInputStream;
3643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
3743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchipublic class ImageCaptureIntentTest extends ActivityInstrumentationTestCase2 <CameraActivity> {
3843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    private Intent mIntent;
3943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
4043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    public ImageCaptureIntentTest() {
4143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        super(CameraActivity.class);
4243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
4343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
4443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    @Override
4543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    protected void setUp() throws Exception {
4643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        super.setUp();
4743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
4843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
4943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
5043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    @LargeTest
5143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    public void testNoExtraOutput() throws Exception {
5243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        setActivityIntent(mIntent);
5343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getActivity();
5443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
5543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        takePicture();
5643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        pressDone();
5743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
5843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(getActivity().isFinishing());
5943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertEquals(Activity.RESULT_OK, getActivity().getResultCode());
6043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        Intent resultData = getActivity().getResultData();
6143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        Bitmap bitmap = (Bitmap) resultData.getParcelableExtra("data");
6243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertNotNull(bitmap);
6343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(bitmap.getWidth() > 0);
6443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(bitmap.getHeight() > 0);
6543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
6643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
6743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    @LargeTest
6843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    public void testExtraOutput() throws Exception {
6943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        File file = new File(Environment.getExternalStorageDirectory(),
7043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            "test.jpg");
7143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        BufferedInputStream stream = null;
7243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        byte[] jpegData;
7343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
7443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        try {
7543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
7643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            setActivityIntent(mIntent);
7743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            getActivity();
7843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
7943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            takePicture();
8043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            pressDone();
8143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
8243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            assertTrue(getActivity().isFinishing());
8343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            assertEquals(Activity.RESULT_OK, getActivity().getResultCode());
8443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
8543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            // Verify the jpeg file
8643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            int fileLength = (int) file.length();
8743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            assertTrue(fileLength > 0);
8843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            jpegData = new byte[fileLength];
8943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            stream = new BufferedInputStream(new FileInputStream(file));
9043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            stream.read(jpegData);
9143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        } finally {
9243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            if (stream != null) stream.close();
9343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            file.delete();
9443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        }
9543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
9643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        Bitmap b = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length);
9743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(b.getWidth() > 0);
9843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(b.getHeight() > 0);
9943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
10043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
10143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    @LargeTest
10243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    public void testCancel() throws Exception {
10343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        setActivityIntent(mIntent);
10443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getActivity();
10543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
10643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        pressCancel();
10743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
10843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(getActivity().isFinishing());
10943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertEquals(Activity.RESULT_CANCELED, getActivity().getResultCode());
11043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
11143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
11243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    @LargeTest
11343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    public void testSnapshotCancel() throws Exception {
11443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        setActivityIntent(mIntent);
11543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getActivity();
11643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
11743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        takePicture();
11843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        pressCancel();
11943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
12043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertTrue(getActivity().isFinishing());
12143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        assertEquals(Activity.RESULT_CANCELED, getActivity().getResultCode());
12243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
12343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
12443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    private void takePicture() throws Exception {
12543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getInstrumentation().sendKeySync(
12643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_FOCUS));
12743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getInstrumentation().sendCharacterSync(KeyEvent.KEYCODE_CAMERA);
12843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        Thread.sleep(4000);
12943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
13043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
13143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    private void pressDone() {
13243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getInstrumentation().runOnMainSync(new Runnable() {
13343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            @Override
13443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            public void run() {
13543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi                getActivity().findViewById(R.id.btn_done).performClick();
13643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            }
13743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        });
13843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
13943a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi
14043a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    private void pressCancel() {
14143a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        getInstrumentation().runOnMainSync(new Runnable() {
14243a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            @Override
14343a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            public void run() {
14443a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi                getActivity().findViewById(R.id.btn_cancel).performClick();
14543a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi            }
14643a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi        });
14743a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi    }
14843a4f8b2b2f32299b945fca31bd95a5c3439d835Jason Noguchi}
149