14d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang/*
24d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Copyright (C) 2009 The Android Open Source Project
34d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang *
44d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
54d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * you may not use this file except in compliance with the License.
64d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * You may obtain a copy of the License at
74d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang *
84d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
94d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang *
104d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
114d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
124d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * See the License for the specific language governing permissions and
144d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang * limitations under the License.
154d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang */
164d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang
174d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Changpackage com.android.camera;
184d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang
195f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wangimport com.android.camera.ui.PopupManager;
205f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang
214d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Changimport android.app.Activity;
227d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.app.KeyguardManager;
237d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.content.Context;
245df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Liimport android.content.Intent;
254c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.content.pm.ActivityInfo;
267d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.hardware.Camera;
278608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Changimport android.os.Bundle;
287d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.util.Log;
294c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.view.KeyEvent;
304d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang
3177c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang/**
327673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li * Superclass of Camera and VideoCamera activities.
3377c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang */
347d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerabstract public class ActivityBase extends Activity {
357d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    private static final String TAG = "ActivityBase";
367d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    private static boolean LOGV = false;
375df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    private int mResultCodeForTesting;
387d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    private boolean mOnResumePending;
395df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    private Intent mResultDataForTesting;
407d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    protected Camera mCameraDevice;
415df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
424d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang    @Override
438608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang    public void onCreate(Bundle icicle) {
444c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li        if (Util.isTabletUI()) {
454c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
46d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang        } else {
47d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
484c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li        }
498608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang        super.onCreate(icicle);
508608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang    }
518608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang
528608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang    @Override
537d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    public void onWindowFocusChanged(boolean hasFocus) {
547d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (LOGV) Log.v(TAG, "onWindowFocusChanged.hasFocus=" + hasFocus
557d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller                + ".mOnResumePending=" + mOnResumePending);
567d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (hasFocus && mOnResumePending) {
577d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            doOnResume();
587d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = false;
597d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        }
607d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
617d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
627d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
637d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    protected void onResume() {
647d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        super.onResume();
657d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // Don't grab the camera if in use by lockscreen. For example, face
667d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // unlock may be using the camera. Camera may be already opened in
677d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // onCreate. doOnResume should continue if mCameraDevice != null.
688853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        // Suppose camera app is in the foreground. If users turn off and turn
698853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        // on the screen very fast, camera app can still have the focus when the
708853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        // lock screen shows up. The keyguard takes input focus, so the caemra
718853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        // app will lose focus when it is displayed.
728853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        if (LOGV) Log.v(TAG, "onResume. hasWindowFocus()=" + hasWindowFocus());
738853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        if (mCameraDevice == null && isKeyguardLocked()) {
748853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li            if (LOGV) Log.v(TAG, "onResume. mOnResumePending=true");
757d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = true;
767d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        } else {
778853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li            if (LOGV) Log.v(TAG, "onResume. mOnResumePending=false");
787d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            doOnResume();
797d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = false;
807d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        }
817d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
827d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
837d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
847d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    protected void onPause() {
857d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (LOGV) Log.v(TAG, "onPause");
867d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        super.onPause();
877d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        mOnResumePending = false;
887d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
897d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
907d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    // Put the code of onResume in this method.
917d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    abstract protected void doOnResume();
927d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
937d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
944d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang    public boolean onSearchRequested() {
954d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang        return false;
964d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang    }
977673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li
987673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    @Override
997673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    public boolean onKeyDown(int keyCode, KeyEvent event) {
1007673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        // Prevent software keyboard or voice search from showing up.
1017673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        if (keyCode == KeyEvent.KEYCODE_SEARCH
1027673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li                || keyCode == KeyEvent.KEYCODE_MENU) {
1037673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li            if (event.isLongPress()) return true;
1047673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        }
1057673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li
1067673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        return super.onKeyDown(keyCode, event);
1077673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    }
1085df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1095df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    protected void setResultEx(int resultCode) {
1105df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultCodeForTesting = resultCode;
1115df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        setResult(resultCode);
1125df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1135df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1145df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    protected void setResultEx(int resultCode, Intent data) {
1155df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultCodeForTesting = resultCode;
1165df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultDataForTesting = data;
1175df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        setResult(resultCode, data);
1185df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1195df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1205df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    public int getResultCode() {
1215df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        return mResultCodeForTesting;
1225df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1235df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1245df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    public Intent getResultData() {
1255df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        return mResultDataForTesting;
1265df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1275f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang
1285f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    @Override
1295f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    protected void onDestroy() {
1305f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        PopupManager.removeInstance(this);
1315f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        super.onDestroy();
1325f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    }
1337d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
1347d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    private boolean isKeyguardLocked() {
1357d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
1368853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        if (LOGV) {
1378853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li            if (kgm != null) {
1388853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li                Log.v(TAG, "kgm.isKeyguardLocked()="+kgm.isKeyguardLocked()
1398853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li                        + ". kgm.isKeyguardSecure()="+kgm.isKeyguardSecure());
1408853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li            }
1418853039421ae9b129ef40c8e71a347eac321d921Wu-cheng Li        }
1427d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // isKeyguardSecure excludes the slide lock case.
1437d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        return (kgm != null) && kgm.isKeyguardLocked() && kgm.isKeyguardSecure();
1447d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
1454d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang}
146