CameraActivity.java revision b84b9738c855a525dc1944165983cc3c342ce446
18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.app.Activity; 20b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.BroadcastReceiver; 2186d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ComponentName; 226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.content.ContentResolver; 2308650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.content.Context; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Intent; 25b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.IntentFilter; 2686d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ServiceConnection; 273cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.content.pm.ActivityInfo; 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.res.Configuration; 296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.drawable.ColorDrawable; 306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.net.Uri; 318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Bundle; 326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler; 3386d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.os.IBinder; 343cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.provider.Settings; 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.KeyEvent; 366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.LayoutInflater; 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.MotionEvent; 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.OrientationEventListener; 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View; 406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.ViewGroup; 4108650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.Window; 4208650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.WindowManager; 436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.widget.ImageView; 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.CameraDataAdapter; 466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.LocalData; 476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraSwitcher.CameraSwitchListener; 486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.FilmStripView; 4954987e8d3af88214ce4f3aed0b5c4e9ded5b1392John Reckimport com.android.gallery3d.R; 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.gallery3d.common.ApiHelper; 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.gallery3d.util.LightCycleHelper; 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class CameraActivity extends Activity 546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu implements CameraSwitchListener { 556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final String TAG = "CAM_Activity"; 576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public static final int PHOTO_MODULE_INDEX = 0; 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public static final int VIDEO_MODULE_INDEX = 1; 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public static final int PANORAMA_MODULE_INDEX = 2; 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public static final int LIGHTCYCLE_MODULE_INDEX = 3; 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = 646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu "android.media.action.STILL_IMAGE_CAMERA_SECURE"; 656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public static final String ACTION_IMAGE_CAPTURE_SECURE = 666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu "android.media.action.IMAGE_CAPTURE_SECURE"; 676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // The intent extra for camera from secure lock screen. True if the gallery 696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // should only show newly captured pictures. sSecureAlbumId does not 706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // increment. This is used when switching between camera, camcorder, and 716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // panorama. If the extra is not set, it is in the normal camera mode. 726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public static final String SECURE_CAMERA_EXTRA = "secure_camera"; 736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraDataAdapter mDataAdapter; 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mCurrentModuleIndex; 766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraModule mCurrentModule; 776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private View mRootView; 786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private FilmStripView mFilmStripView; 796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mResultCodeForTesting; 806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Intent mResultDataForTesting; 816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private OnScreenHint mStorageHint; 826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private long mStorageSpace = Storage.LOW_STORAGE_THRESHOLD; 836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private PhotoModule mController; 843cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu private boolean mAutoRotateScreen; 856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private boolean mSecureCamera; 866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private boolean mShowCameraPreview; 876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mLastRawOrientation; 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private MyOrientationEventListener mOrientationListener; 896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Handler mMainHandler; 903cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private class MyOrientationEventListener 926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu extends OrientationEventListener { 938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public MyOrientationEventListener(Context context) { 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(context); 958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onOrientationChanged(int orientation) { 998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // We keep the last known orientation. So if the user first orient 1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the camera then point the camera to floor or sky, we still have 1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the correct orientation. 1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (orientation == ORIENTATION_UNKNOWN) return; 1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mLastRawOrientation = orientation; 1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onOrientationChanged(orientation); 1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private MediaSaveService mMediaSaveService; 1096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private ServiceConnection mConnection = new ServiceConnection() { 1106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onServiceConnected(ComponentName className, IBinder b) { 1126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMediaSaveService = ((MediaSaveService.LocalBinder) b).getService(); 1136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService); 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onServiceDisconnected(ComponentName className) { 1176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMediaSaveService = null; 1186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }}; 119e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 120b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // close activity when screen turns off 121b84b9738c855a525dc1944165983cc3c342ce446Doris Liu private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { 122b84b9738c855a525dc1944165983cc3c342ce446Doris Liu @Override 123b84b9738c855a525dc1944165983cc3c342ce446Doris Liu public void onReceive(Context context, Intent intent) { 124b84b9738c855a525dc1944165983cc3c342ce446Doris Liu finish(); 125b84b9738c855a525dc1944165983cc3c342ce446Doris Liu } 126b84b9738c855a525dc1944165983cc3c342ce446Doris Liu }; 127b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 1286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private FilmStripView.Listener mFilmStripListener = new FilmStripView.Listener() { 1296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDataPromoted(int dataID) { 1316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu removeData(dataID); 1326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 133e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 1346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDataDemoted(int dataID) { 1366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu removeData(dataID); 1376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 138e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 1396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDataFullScreenChange(int dataID, boolean full) { 1416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 142e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 1436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSwitchMode(boolean toCamera) { 1456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onSwitchMode(toCamera); 1466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Runnable mDeletionRunnable = new Runnable() { 1506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void run() { 1526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.executeDeletion(CameraActivity.this); 1536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public MediaSaveService getMediaSaveService() { 1576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mMediaSaveService; 1588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void notifyNewMedia(Uri uri) { 1616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ContentResolver cr = getContentResolver(); 1626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String mimeType = cr.getType(uri); 1636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mimeType.startsWith("video/")) { 1646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu sendBroadcast(new Intent(Util.ACTION_NEW_VIDEO, uri)); 1656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.addNewVideo(cr, uri); 1666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (mimeType.startsWith("image/")) { 1676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Util.broadcastNewPicture(this, uri); 1686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.addNewPhoto(cr, uri); 1696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 1706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu android.util.Log.w(TAG, "Unknown new media with MIME type:" 1716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu + mimeType + ", uri:" + uri); 1726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void removeData(int dataID) { 1766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.removeData(CameraActivity.this, dataID); 1776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMainHandler.removeCallbacks(mDeletionRunnable); 1786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMainHandler.postDelayed(mDeletionRunnable, 3000); 1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void bindMediaSaveService() { 1826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Intent intent = new Intent(this, MediaSaveService.class); 1836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu startService(intent); // start service before binding it so the 1846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // service won't be killed if we unbind it. 1856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 1868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void unbindMediaSaveService() { 1896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mMediaSaveService != null) { 1906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMediaSaveService.setListener(null); 1916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mConnection != null) { 1936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu unbindService(mConnection); 1946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onCreate(Bundle state) { 1996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onCreate(state); 2006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setContentView(R.layout.camera_filmstrip); 2016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (ApiHelper.HAS_ROTATION_ANIMATION) { 2026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setRotationAnimation(); 2036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Check if this is in the secure camera mode. 2056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Intent intent = getIntent(); 2066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String action = intent.getAction(); 207b84b9738c855a525dc1944165983cc3c342ce446Doris Liu if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action) 208b84b9738c855a525dc1944165983cc3c342ce446Doris Liu || ACTION_IMAGE_CAPTURE_SECURE.equals(action)) { 2096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSecureCamera = true; 2106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 2116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA, false); 2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 213b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 214b84b9738c855a525dc1944165983cc3c342ce446Doris Liu if (mSecureCamera) { 215b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // Change the window flags so that secure camera can show when locked 216b84b9738c855a525dc1944165983cc3c342ce446Doris Liu Window win = getWindow(); 217b84b9738c855a525dc1944165983cc3c342ce446Doris Liu WindowManager.LayoutParams params = win.getAttributes(); 218b84b9738c855a525dc1944165983cc3c342ce446Doris Liu params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; 219b84b9738c855a525dc1944165983cc3c342ce446Doris Liu win.setAttributes(params); 220b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 221b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // Filter for screen off so that we can finish secure camera activity 222b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // when screen is off. 2236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 2246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu registerReceiver(mScreenOffReceiver, filter); 225b84b9738c855a525dc1944165983cc3c342ce446Doris Liu } 2266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu LayoutInflater inflater = getLayoutInflater(); 2276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu View rootLayout = inflater.inflate(R.layout.camera, null, false); 2286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRootView = rootLayout.findViewById(R.id.camera_app_root); 2296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter = new CameraDataAdapter( 2306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu new ColorDrawable(getResources().getColor(R.color.photo_placeholder))); 2316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView = (FilmStripView) findViewById(R.id.filmstrip_view); 2326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView.setViewGap( 2336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu getResources().getDimensionPixelSize(R.dimen.camera_film_strip_gap)); 2346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Set up the camera preview first so the preview shows up ASAP. 2356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.setCameraPreviewInfo(rootLayout, 2366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu FilmStripView.ImageData.SIZE_FULL, FilmStripView.ImageData.SIZE_FULL); 2376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView.setDataAdapter(mDataAdapter); 2386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView.setListener(mFilmStripListener); 2396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = new PhotoModule(); 2406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.init(this, mRootView); 2416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mOrientationListener = new MyOrientationEventListener(this); 2426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMainHandler = new Handler(getMainLooper()); 2436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu bindMediaSaveService(); 2448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void setRotationAnimation() { 2476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE; 2486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; 2496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Window win = getWindow(); 2506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu WindowManager.LayoutParams winParams = win.getAttributes(); 2516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu winParams.rotationAnimation = rotationAnimation; 2526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu win.setAttributes(winParams); 2538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 2566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onUserInteraction() { 2576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onUserInteraction(); 2586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onUserInteraction(); 25909106a41ee6acc6b20553662cb9b730702a8f08aDoris Liu } 2608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 2628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPause() { 2638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOrientationListener.disable(); 2648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onPauseBeforeSuper(); 2658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super.onPause(); 2668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onPauseAfterSuper(); 2678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 2708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onResume() { 2713cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu if (Settings.System.getInt(getContentResolver(), 2723cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu Settings.System.ACCELEROMETER_ROTATION, 0) == 0) {// auto-rotate off 2733cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 2743cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu mAutoRotateScreen = false; 2753cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu } else { 2763cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 2773cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu mAutoRotateScreen = true; 2783cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu } 2798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOrientationListener.enable(); 2808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onResumeBeforeSuper(); 2818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super.onResume(); 2828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onResumeAfterSuper(); 2838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // The loading is done in background and will update the filmstrip later. 2856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (!mSecureCamera) { 2866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.requestLoad(getContentResolver()); 2878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 2886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Flush out all the original data first. 2896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.flush(); 2906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ImageView v = (ImageView) getLayoutInflater().inflate( 2916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu R.layout.secure_album_placeholder, null); 2926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Put a lock placeholder as the last image by setting its date to 0. 2936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.addLocalData( 2946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu new LocalData.LocalViewData( 2956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu v, 2966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu v.getDrawable().getIntrinsicWidth(), 2976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu v.getDrawable().getIntrinsicHeight(), 2986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 0, 0)); 2998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setSwipingEnabled(true); 30108650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb } 30208650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb 3038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 3046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDestroy() { 3056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu unbindMediaSaveService(); 306b84b9738c855a525dc1944165983cc3c342ce446Doris Liu if (mSecureCamera) unregisterReceiver(mScreenOffReceiver); 3076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onDestroy(); 3088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 3116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onConfigurationChanged(Configuration config) { 3126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onConfigurationChanged(config); 3136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onConfigurationChanged(config); 3148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 3176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onKeyDown(int keyCode, KeyEvent event) { 3186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mCurrentModule.onKeyDown(keyCode, event)) return true; 3196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Prevent software keyboard or voice search from showing up. 3206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (keyCode == KeyEvent.KEYCODE_SEARCH 3216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu || keyCode == KeyEvent.KEYCODE_MENU) { 3226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (event.isLongPress()) return true; 3236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (keyCode == KeyEvent.KEYCODE_MENU && mShowCameraPreview) { 3256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return true; 3266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return super.onKeyDown(keyCode, event); 3298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 3326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onKeyUp(int keyCode, KeyEvent event) { 3336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mCurrentModule.onKeyUp(keyCode, event)) return true; 3346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (keyCode == KeyEvent.KEYCODE_MENU && mShowCameraPreview) { 3356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return true; 3368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return super.onKeyUp(keyCode, event); 3388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 3416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean dispatchTouchEvent(MotionEvent m) { 3426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mFilmStripView.dispatchTouchEvent(m); 3436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isAutoRotateScreen() { 3456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mAutoRotateScreen; 3468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageSpace() { 3496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageSpace = Storage.getAvailableSpace(); 3508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected long getStorageSpace() { 3536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mStorageSpace; 3548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageSpaceAndHint() { 3576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu updateStorageSpace(); 3586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu updateStorageHint(mStorageSpace); 3598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageHint() { 3626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu updateStorageHint(mStorageSpace); 3638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected boolean updateStorageHintOnResume() { 3666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return true; 3676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageHint(long storageSpace) { 3706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String message = null; 3716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (storageSpace == Storage.UNAVAILABLE) { 3726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.no_storage); 3736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (storageSpace == Storage.PREPARING) { 3746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.preparing_sd); 3756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (storageSpace == Storage.UNKNOWN_SIZE) { 3766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.access_sd_fail); 3776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (storageSpace <= Storage.LOW_STORAGE_THRESHOLD) { 3786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.spaceIsLow_content); 3798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (message != null) { 3826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mStorageHint == null) { 3836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint = OnScreenHint.makeText(this, message); 3846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 3856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.setText(message); 3866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.show(); 3886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (mStorageHint != null) { 3896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.cancel(); 3906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint = null; 3918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void setResultEx(int resultCode) { 3956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultCodeForTesting = resultCode; 3966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setResult(resultCode); 3978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void setResultEx(int resultCode, Intent data) { 4006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultCodeForTesting = resultCode; 4016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultDataForTesting = data; 4026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setResult(resultCode, data); 4038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getResultCode() { 4066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mResultCodeForTesting; 4078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public Intent getResultData() { 4106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mResultDataForTesting; 4118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isSecureCamera() { 4146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSecureCamera; 4158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 4186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onCameraSelected(int i) { 4196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mCurrentModuleIndex == i) return; 4206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 4216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu CameraHolder.instance().keep(); 4226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu closeModule(mCurrentModule); 4236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModuleIndex = i; 4246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu switch (i) { 4256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu case VIDEO_MODULE_INDEX: 4266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = new VideoModule(); 4276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 4286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu case PHOTO_MODULE_INDEX: 4296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = new PhotoModule(); 4306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 4316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu case LIGHTCYCLE_MODULE_INDEX: 4326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = LightCycleHelper.createPanoramaModule(); 4336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 4346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu default: 4356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 4366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 4376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 4386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu openModule(mCurrentModule); 4396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onOrientationChanged(mLastRawOrientation); 4406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mMediaSaveService != null) { 4416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService); 4426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 4438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void openModule(CameraModule module) { 4466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.init(this, mRootView); 4476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onResumeBeforeSuper(); 4486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onResumeAfterSuper(); 4498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void closeModule(CameraModule module) { 4526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onPauseBeforeSuper(); 4536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onPauseAfterSuper(); 4546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ((ViewGroup) mRootView).removeAllViews(); 4558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 4586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onShowSwitcherPopup() { 4596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 4606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 4616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setSwipingEnabled(boolean enable) { 4626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.setCameraPreviewLock(!enable); 4638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Accessor methods for getting latency times used in performance testing 4668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getAutoFocusTime() { 4678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mAutoFocusTime : -1; 4698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getShutterLag() { 4728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mShutterLag : -1; 4748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getShutterToPictureDisplayedTime() { 4778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mShutterToPictureDisplayedTime : -1; 4798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getPictureDisplayedToJpegCallbackTime() { 4828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mPictureDisplayedToJpegCallbackTime : -1; 4848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getJpegCallbackFinishTime() { 4878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mJpegCallbackFinishTime : -1; 4898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getCaptureStartTime() { 4928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 4938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mCaptureStartTime : -1; 4948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean isRecording() { 4978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof VideoModule) ? 4988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((VideoModule) mCurrentModule).isRecording() : false; 4998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 501