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