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