/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera; import com.android.camera.ui.PopupManager; import android.app.Activity; import android.app.KeyguardManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.WindowManager; /** * Superclass of Camera and VideoCamera activities. */ abstract public class ActivityBase extends Activity { private static final String TAG = "ActivityBase"; private static boolean LOGV = false; private int mResultCodeForTesting; private boolean mOnResumePending; private Intent mResultDataForTesting; protected Camera mCameraDevice; // settings for lock screen camera protected static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE"; protected static final String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE"; @Override public void onCreate(Bundle icicle) { if (Util.isTabletUI()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } super.onCreate(icicle); if(isCameraSecure()){ Log.v(TAG, "Starting in secure camera mode."); // show on lock screen getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // Filter for screen off so that we can finish secure camera activity // when screen is off. IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mScreenOffReceiver, filter); } } @Override public void onWindowFocusChanged(boolean hasFocus) { if (LOGV) Log.v(TAG, "onWindowFocusChanged.hasFocus=" + hasFocus + ".mOnResumePending=" + mOnResumePending); if (hasFocus && mOnResumePending) { doOnResume(); mOnResumePending = false; } } @Override protected void onResume() { super.onResume(); onResumeAfterSuper(); // Don't grab the camera if in use by lockscreen. For example, face // unlock may be using the camera. Camera may be already opened in // onCreate. doOnResume should continue if mCameraDevice != null. // Suppose camera app is in the foreground. If users turn off and turn // on the screen very fast, camera app can still have the focus when the // lock screen shows up. The keyguard takes input focus, so the caemra // app will lose focus when it is displayed. if (LOGV) Log.v(TAG, "onResume. hasWindowFocus()=" + hasWindowFocus()); if (mCameraDevice == null && isKeyguardLocked()) { if (LOGV) Log.v(TAG, "onResume. mOnResumePending=true"); mOnResumePending = true; } else { if (LOGV) Log.v(TAG, "onResume. mOnResumePending=false"); doOnResume(); mOnResumePending = false; } } @Override protected void onPause() { if (LOGV) Log.v(TAG, "onPause"); super.onPause(); mOnResumePending = false; } // Put the code of onResume in this method. abstract protected void doOnResume(); @Override public boolean onSearchRequested() { return false; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Prevent software keyboard or voice search from showing up. if (keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_MENU) { if (event.isLongPress()) return true; } return super.onKeyDown(keyCode, event); } protected void setResultEx(int resultCode) { mResultCodeForTesting = resultCode; setResult(resultCode); } protected void setResultEx(int resultCode, Intent data) { mResultCodeForTesting = resultCode; mResultDataForTesting = data; setResult(resultCode, data); } public int getResultCode() { return mResultCodeForTesting; } public Intent getResultData() { return mResultDataForTesting; } @Override protected void onDestroy() { if (isCameraSecure()) { unregisterReceiver(mScreenOffReceiver); } PopupManager.removeInstance(this); super.onDestroy(); } protected boolean isKeyguardLocked() { KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); if (LOGV) { if (kgm != null) { Log.v(TAG, "kgm.isKeyguardLocked()="+kgm.isKeyguardLocked() + ". kgm.isKeyguardSecure()="+kgm.isKeyguardSecure()); } } // isKeyguardSecure excludes the slide lock case. return (kgm != null) && kgm.isKeyguardLocked() && kgm.isKeyguardSecure(); } protected boolean isCameraSecure() { // Check if this is in the secure camera mode. String action = getIntent().getAction(); if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action) || ACTION_IMAGE_CAPTURE_SECURE.equals(action)){ return true; } else{ return isKeyguardLocked(); } } // close activity when screen turns off protected BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "Finishing because screen turned off."); finish(); } }; // implemented in class Camera, class Video needs empty one public void onResumeAfterSuper() {}; }