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