ActivityBase.java revision 7d9eadd0c6c38b3761b7e8d3fa3658d194810d60
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;
237673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Liimport android.view.KeyEvent;
247d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.content.Context;
255df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Liimport android.content.Intent;
267d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.hardware.Camera;
278608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Changimport android.media.AudioManager;
288608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Changimport android.os.Bundle;
297d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Millerimport android.util.Log;
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) {
448608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang        super.onCreate(icicle);
458608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang        setVolumeControlStream(AudioManager.STREAM_MUSIC);
468608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang    }
478608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang
488608b577921acf67a5a7b7968cb3633b8f94714dChih-Chung Chang    @Override
497d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    public void onWindowFocusChanged(boolean hasFocus) {
507d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (LOGV) Log.v(TAG, "onWindowFocusChanged.hasFocus=" + hasFocus
517d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller                + ".mOnResumePending=" + mOnResumePending);
527d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (hasFocus && mOnResumePending) {
537d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            doOnResume();
547d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = false;
557d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        }
567d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
577d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
587d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
597d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    protected void onResume() {
607d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        super.onResume();
617d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // Don't grab the camera if in use by lockscreen. For example, face
627d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // unlock may be using the camera. Camera may be already opened in
637d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // onCreate. doOnResume should continue if mCameraDevice != null.
647d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (mCameraDevice == null && !hasWindowFocus() && isKeyguardLocked()) {
657d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            if (LOGV) Log.v(TAG, "onRsume. mOnResumePending=true");
667d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = true;
677d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        } else {
687d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            if (LOGV) Log.v(TAG, "onRsume. mOnResumePending=false");
697d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            doOnResume();
707d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller            mOnResumePending = false;
717d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        }
727d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
737d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
747d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
757d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    protected void onPause() {
767d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        if (LOGV) Log.v(TAG, "onPause");
777d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        super.onPause();
787d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        mOnResumePending = false;
797d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
807d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
817d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    // Put the code of onResume in this method.
827d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    abstract protected void doOnResume();
837d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
847d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    @Override
854d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang    public boolean onSearchRequested() {
864d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang        return false;
874d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang    }
887673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li
897673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    @Override
907673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    public boolean onKeyDown(int keyCode, KeyEvent event) {
917673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        // Prevent software keyboard or voice search from showing up.
927673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        if (keyCode == KeyEvent.KEYCODE_SEARCH
937673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li                || keyCode == KeyEvent.KEYCODE_MENU) {
947673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li            if (event.isLongPress()) return true;
957673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        }
967673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li
977673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li        return super.onKeyDown(keyCode, event);
987673ada94b5e2263e7190ca246694cdee31ed03eWu-cheng Li    }
995df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1005df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    protected void setResultEx(int resultCode) {
1015df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultCodeForTesting = resultCode;
1025df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        setResult(resultCode);
1035df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1045df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1055df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    protected void setResultEx(int resultCode, Intent data) {
1065df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultCodeForTesting = resultCode;
1075df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        mResultDataForTesting = data;
1085df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        setResult(resultCode, data);
1095df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1105df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1115df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    public int getResultCode() {
1125df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        return mResultCodeForTesting;
1135df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1145df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li
1155df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    public Intent getResultData() {
1165df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li        return mResultDataForTesting;
1175df067af93e6b386167f11cdf12701b7905ee444Wu-cheng Li    }
1185f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang
1195f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    @Override
1205f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    protected void onDestroy() {
1215f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        PopupManager.removeInstance(this);
1225f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        super.onDestroy();
1235f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    }
1247d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller
1257d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    private boolean isKeyguardLocked() {
1267d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
1277d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        // isKeyguardSecure excludes the slide lock case.
1287d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller        return (kgm != null) && kgm.isKeyguardLocked() && kgm.isKeyguardSecure();
1297d9eadd0c6c38b3761b7e8d3fa3658d194810d60Jim Miller    }
1304d2aefbe7c108bae9e4ae735c7cd230792201098Chih-Chung Chang}
131