diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 7884440..e1f37fe 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -67,7 +67,6 @@
 
 import com.android.camera.app.AppController;
 import com.android.camera.app.AppManagerFactory;
-import com.android.camera.app.CameraApp;
 import com.android.camera.app.CameraAppUI;
 import com.android.camera.app.CameraController;
 import com.android.camera.app.CameraManager;
@@ -95,7 +94,6 @@
 import com.android.camera.filmstrip.FilmstripController;
 import com.android.camera.filmstrip.FilmstripImageData;
 import com.android.camera.filmstrip.FilmstripListener;
-import com.android.camera.module.ModuleController;
 import com.android.camera.module.ModulesInfo;
 import com.android.camera.settings.SettingsManager;
 import com.android.camera.settings.SettingsManager.SettingsCapabilities;
@@ -147,8 +145,10 @@
 
     public static final int REQ_CODE_GCAM_DEBUG_POSTCAPTURE = 999;
 
-    private static final int HIDE_ACTION_BAR = 1;
+    private static final int MSG_HIDE_ACTION_BAR = 1;
+    private static final int MSG_CLEAR_SCREEN_ON_FLAG = 2;
     private static final long SHOW_ACTION_BAR_TIMEOUT_MS = 3000;
+    private static final long SCREEN_DELAY_MS = 2 * 60 * 1000;  // 2 mins.
 
     /**
      * Whether onResume should reset the view to the preview.
@@ -185,7 +185,6 @@
     private ModeListView mModeListView;
     private int mCurrentModeIndex;
     private CameraModule mCurrentModule;
-    private ModuleController mCurrentModule2;
     private ModuleManagerImpl mModuleManager;
     private FrameLayout mAboveFilmstripControlLayout;
     private FrameLayout mCameraModuleRootView;
@@ -232,7 +231,6 @@
 
     private MediaSaver mMediaSaver;
 
-
     // close activity when screen turns off
     private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
         @Override
@@ -243,6 +241,11 @@
 
     private static BroadcastReceiver sScreenOffReceiver;
 
+    /**
+     * Whether the screen is kept turned on.
+     */
+    private boolean mKeepScreenOn;
+
     @Override
     public void onCameraOpened(CameraManager.CameraProxy camera) {
         if (!mModuleManager.getModuleAgent(mCurrentModeIndex).requestAppForCamera()) {
@@ -251,11 +254,11 @@
             throw new IllegalStateException("Camera opened but the module shouldn't be " +
                     "requesting");
         }
-        if (mCurrentModule2 != null) {
+        if (mCurrentModule != null) {
             SettingsCapabilities capabilities =
                 SettingsController.getSettingsCapabilities(camera);
             mSettingsManager.changeCamera(camera.getCameraId(), capabilities);
-            mCurrentModule2.onCameraAvailable(camera);
+            mCurrentModule.onCameraAvailable(camera);
         }
     }
 
@@ -290,9 +293,21 @@
 
         @Override
         public void handleMessage(Message msg) {
-            if (msg.what == HIDE_ACTION_BAR) {
-                removeMessages(HIDE_ACTION_BAR);
-                CameraActivity.this.setSystemBarsVisibility(false);
+            switch (msg.what) {
+                case MSG_HIDE_ACTION_BAR: {
+                    removeMessages(MSG_HIDE_ACTION_BAR);
+                    CameraActivity.this.setSystemBarsVisibility(false);
+                    break;
+                }
+
+                case MSG_CLEAR_SCREEN_ON_FLAG:  {
+                    if (!mPaused) {
+                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+                    }
+                    break;
+                }
+
+                default:
             }
         }
     }
@@ -341,7 +356,7 @@
                             CameraActivity.this.setSystemBarsVisibility(true, false);
                         } else if (mActionBar.isShowing()) {
                             // Hide action bar after time out in full screen mode
-                            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
+                            mMainHandler.sendEmptyMessageDelayed(MSG_HIDE_ACTION_BAR,
                                     SHOW_ACTION_BAR_TIMEOUT_MS);
                         }
                     }
@@ -398,9 +413,9 @@
                 @Override
                 public void onDataFocusChanged(final int dataID, final boolean focused) {
                     // Delay hiding action bar if there is any user interaction
-                    if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) {
-                        mMainHandler.removeMessages(HIDE_ACTION_BAR);
-                        mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
+                    if (mMainHandler.hasMessages(MSG_HIDE_ACTION_BAR)) {
+                        mMainHandler.removeMessages(MSG_HIDE_ACTION_BAR);
+                        mMainHandler.sendEmptyMessageDelayed(MSG_HIDE_ACTION_BAR,
                                 SHOW_ACTION_BAR_TIMEOUT_MS);
                     }
                     // TODO: This callback is UI event callback, should always
@@ -496,7 +511,7 @@
      * will be sent after a timeout to hide the action bar.
      */
     private void setSystemBarsVisibility(boolean visible, boolean hideLater) {
-        mMainHandler.removeMessages(HIDE_ACTION_BAR);
+        mMainHandler.removeMessages(MSG_HIDE_ACTION_BAR);
 
         int currentSystemUIVisibility = mAboveFilmstripControlLayout.getSystemUiVisibility();
         int newSystemUIVisibility = DEFAULT_SYSTEM_UI_VISIBILITY |
@@ -520,7 +535,7 @@
 
         // Now delay hiding the bars
         if (visible && hideLater) {
-            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
+            mMainHandler.sendEmptyMessageDelayed(MSG_HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
         }
     }
 
@@ -612,9 +627,9 @@
     @Override
     public void onMenuVisibilityChanged(boolean isVisible) {
         // If menu is showing, we need to make sure action bar does not go away.
-        mMainHandler.removeMessages(HIDE_ACTION_BAR);
+        mMainHandler.removeMessages(MSG_HIDE_ACTION_BAR);
         if (!isVisible) {
-            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
+            mMainHandler.sendEmptyMessageDelayed(MSG_HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
         }
     }
 
@@ -935,6 +950,21 @@
     }
 
     @Override
+    public void enableKeepScreenOn(boolean enabled) {
+        if (mPaused) {
+            return;
+        }
+
+        mKeepScreenOn = enabled;
+        if (mKeepScreenOn) {
+            mMainHandler.removeMessages(MSG_CLEAR_SCREEN_ON_FLAG);
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        } else {
+            keepScreenOnForAWhile();
+        }
+    }
+
+    @Override
     public CameraProvider getCameraProvider() {
         return mCameraController;
     }
@@ -1220,7 +1250,7 @@
                 modeIndex == ModulesInfo.MODULE_VIDEO) {
             mCameraAppUI.prepareModuleUI();
         }
-        mCurrentModule.init(this, mCameraModuleRootView);
+        mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
 
         if (!mSecureCamera) {
             mDataAdapter = mWrappedDataAdapter;
@@ -1283,7 +1313,9 @@
     @Override
     public void onUserInteraction() {
         super.onUserInteraction();
-        mCurrentModule.onUserInteraction();
+        if (!isFinishing()) {
+            keepScreenOnForAWhile();
+        }
     }
 
     @Override
@@ -1316,6 +1348,7 @@
 
         mLocalImagesObserver.setActivityPaused(true);
         mLocalVideosObserver.setActivityPaused(true);
+        resetScreenOn();
         super.onPause();
     }
 
@@ -1372,6 +1405,8 @@
         mLocalImagesObserver.setActivityPaused(false);
         mLocalVideosObserver.setActivityPaused(false);
 
+        keepScreenOnForAWhile();
+
         mModeListView.startAccordionAnimation();
     }
 
@@ -1581,8 +1616,7 @@
             mCameraController.closeCamera();
         }
         mCurrentModeIndex = agent.getModuleId();
-        mCurrentModule2 = agent.createModule(this);
-        mCurrentModule = (CameraModule) mCurrentModule2;
+        mCurrentModule = (CameraModule)  agent.createModule(this);
     }
 
     @Override
@@ -1632,7 +1666,7 @@
     }
 
     private void openModule(CameraModule module) {
-        module.init(this, mCameraModuleRootView);
+        module.init(this, isSecureCamera(), isCaptureIntent());
         module.resume();
     }
 
@@ -1817,4 +1851,19 @@
     public CameraModule getCurrentModule() {
         return mCurrentModule;
     }
+
+    private void keepScreenOnForAWhile() {
+        if (mKeepScreenOn) {
+            return;
+        }
+        mMainHandler.removeMessages(MSG_CLEAR_SCREEN_ON_FLAG);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        mMainHandler.sendEmptyMessageDelayed(MSG_CLEAR_SCREEN_ON_FLAG, SCREEN_DELAY_MS);
+    }
+
+    private void resetScreenOn() {
+        mKeepScreenOn = false;
+        mMainHandler.removeMessages(MSG_CLEAR_SCREEN_ON_FLAG);
+        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+    }
 }
diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java
index 69d6cf9..f89c997 100644
--- a/src/com/android/camera/CameraModule.java
+++ b/src/com/android/camera/CameraModule.java
@@ -39,25 +39,12 @@
     }
 
     @Deprecated
-    public abstract void init(CameraActivity activity, View frame);
-
-    @Deprecated
     public abstract void onPreviewFocusChanged(boolean previewFocused);
 
-    @Deprecated
-    public abstract void onConfigurationChanged(Configuration config);
-
-    @Deprecated
-    public abstract void onStop();
-
-    @Deprecated
-    public abstract void installIntentFilter();
-
-    @Deprecated
-    public abstract void onActivityResult(int requestCode, int resultCode, Intent data);
-
-    @Deprecated
-    public abstract boolean onBackPressed();
+    @Override
+    public boolean onBackPressed() {
+        return false;
+    }
 
     @Deprecated
     public abstract boolean onKeyDown(int keyCode, KeyEvent event);
@@ -69,24 +56,6 @@
     public abstract void onSingleTapUp(View view, int x, int y);
 
     @Deprecated
-    public abstract void onPreviewTextureCopied();
-
-    @Deprecated
-    public abstract void onCaptureTextureCopied();
-
-    @Deprecated
-    public abstract void onUserInteraction();
-
-    @Deprecated
-    public abstract boolean updateStorageHintOnResume();
-
-    @Deprecated
-    public abstract void onOrientationChanged(int orientation);
-
-    @Deprecated
-    public abstract void onShowSwitcherPopup();
-
-    @Deprecated
     public abstract void onMediaSaverAvailable(MediaSaver s);
 
     @Deprecated
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 03711ea..8537f05 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -18,13 +18,9 @@
 
 import android.annotation.TargetApi;
 import android.app.Activity;
-import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
@@ -51,7 +47,6 @@
 import android.view.KeyEvent;
 import android.view.OrientationEventListener;
 import android.view.View;
-import android.view.WindowManager;
 
 import com.android.camera.app.CameraManager.CameraAFCallback;
 import com.android.camera.app.CameraManager.CameraAFMoveCallback;
@@ -60,7 +55,6 @@
 import com.android.camera.app.CameraManager.CameraShutterCallback;
 import com.android.camera.PhotoModule.NamedImages.NamedEntity;
 import com.android.camera.app.AppController;
-import com.android.camera.app.CameraServices;
 import com.android.camera.app.MediaSaver;
 import com.android.camera.exif.ExifInterface;
 import com.android.camera.exif.ExifTag;
@@ -70,13 +64,11 @@
 import com.android.camera.settings.SettingsManager.DefaultCameraIdSetting;
 import com.android.camera.settings.SettingsManager.ExposureSetting;
 import com.android.camera.settings.SettingsManager.FlashSetting;
-import com.android.camera.settings.SettingsManager.FocusModeSetting;
 import com.android.camera.settings.SettingsManager.HintSetting;
 import com.android.camera.settings.SettingsManager.HdrSetting;
 import com.android.camera.settings.SettingsManager.HdrPlusSetting;
 import com.android.camera.settings.SettingsManager.LocationSetting;
 import com.android.camera.settings.SettingsManager.PictureSizeSetting;
-import com.android.camera.settings.SettingsManager.SettingsListener;
 import com.android.camera.settings.SettingsManager.TimerSetting;
 import com.android.camera.settings.SettingsManager.TimerSoundSetting;
 import com.android.camera.settings.SettingsManager.SceneModeSetting;
@@ -113,17 +105,17 @@
     // We number the request code from 1000 to avoid collision with Gallery.
     private static final int REQUEST_CROP = 1000;
 
-    private static final int SETUP_PREVIEW = 1;
-    private static final int FIRST_TIME_INIT = 2;
-    private static final int CLEAR_SCREEN_DELAY = 3;
-    private static final int SET_CAMERA_PARAMETERS_WHEN_IDLE = 4;
-    private static final int SHOW_TAP_TO_FOCUS_TOAST = 5;
-    private static final int SWITCH_CAMERA = 6;
-    private static final int SWITCH_CAMERA_START_ANIMATION = 7;
-    private static final int CAMERA_OPEN_DONE = 8;
-    private static final int OPEN_CAMERA_FAIL = 9;
-    private static final int CAMERA_DISABLED = 10;
-    private static final int SWITCH_TO_GCAM_MODULE = 11;
+    // Messages defined for the UI thread handler.
+    private static final int MSG_SETUP_PREVIEW = 1;
+    private static final int MSG_FIRST_TIME_INIT = 2;
+    private static final int MSG_SET_CAMERA_PARAMETERS_WHEN_IDLE = 3;
+    private static final int MSG_SHOW_TAP_TO_FOCUS_TOAST = 4;
+    private static final int MSG_SWITCH_CAMERA = 5;
+    private static final int MSG_SWITCH_CAMERA_START_ANIMATION = 6;
+    private static final int MSG_CAMERA_OPEN_DONE = 7;
+    private static final int MSG_OPEN_CAMERA_FAIL = 8;
+    private static final int MSG_CAMERA_DISABLED = 9;
+    private static final int MSG_SWITCH_TO_GCAM_MODULE = 10;
 
     // The subset of parameters we need to update in setCameraParameters().
     private static final int UPDATE_PARAM_INITIALIZE = 1;
@@ -173,7 +165,6 @@
 
     private static final String sTempCropFilename = "crop-temp";
 
-    private ContentProviderClient mMediaProviderClient;
     private boolean mFaceDetectionStarted = false;
 
     // mCropValue and mSaveUri are used only if isImageCaptureIntent() is true.
@@ -312,63 +303,57 @@
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
-                case SETUP_PREVIEW: {
+                case MSG_SETUP_PREVIEW: {
                     setupPreview();
                     break;
                 }
 
-                case CLEAR_SCREEN_DELAY: {
-                    mActivity.getWindow().clearFlags(
-                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    break;
-                }
-
-                case FIRST_TIME_INIT: {
+                case MSG_FIRST_TIME_INIT: {
                     initializeFirstTime();
                     break;
                 }
 
-                case SET_CAMERA_PARAMETERS_WHEN_IDLE: {
+                case MSG_SET_CAMERA_PARAMETERS_WHEN_IDLE: {
                     setCameraParametersWhenIdle(0);
                     break;
                 }
 
-                case SHOW_TAP_TO_FOCUS_TOAST: {
+                case MSG_SHOW_TAP_TO_FOCUS_TOAST: {
                     showTapToFocusToast();
                     break;
                 }
 
-                case SWITCH_CAMERA: {
+                case MSG_SWITCH_CAMERA: {
                     switchCamera();
                     break;
                 }
 
-                case SWITCH_CAMERA_START_ANIMATION: {
+                case MSG_SWITCH_CAMERA_START_ANIMATION: {
                     // TODO: Need to revisit
                     // ((CameraScreenNail) mActivity.mCameraScreenNail).animateSwitchCamera();
                     break;
                 }
 
-                case CAMERA_OPEN_DONE: {
+                case MSG_CAMERA_OPEN_DONE: {
                     onCameraOpened();
                     break;
                 }
 
-                case OPEN_CAMERA_FAIL: {
+                case MSG_OPEN_CAMERA_FAIL: {
                     mOpenCameraFail = true;
                     CameraUtil.showErrorAndFinish(mActivity,
                             R.string.cannot_connect_camera);
                     break;
                 }
 
-                case CAMERA_DISABLED: {
+                case MSG_CAMERA_DISABLED: {
                     mCameraDisabled = true;
                     CameraUtil.showErrorAndFinish(mActivity,
                             R.string.camera_disabled);
                     break;
                 }
 
-                case SWITCH_TO_GCAM_MODULE: {
+                case MSG_SWITCH_TO_GCAM_MODULE: {
                     mActivity.onModeSelected(ModeListView.MODE_GCAM);
                 }
             }
@@ -382,10 +367,11 @@
         super(app);
     }
 
+
     @Override
-    public void init(CameraActivity activity, View parent) {
-        mActivity = activity;
-        mUI = new PhotoUI(activity, this, parent);
+    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
+        mActivity = (CameraActivity) app.getAndroidContext();
+        mUI = new PhotoUI(mActivity, this, app.getModuleLayoutRoot());
 
         SettingsManager settingsManager = mActivity.getSettingsManager();
         mCameraId = Integer.parseInt(settingsManager.get(
@@ -480,7 +466,7 @@
         mFocusManager.setMirror(mMirror);
         // Start switch camera animation. Post a message because
         // onFrameAvailable from the old camera may already exist.
-        mHandler.sendEmptyMessage(SWITCH_CAMERA_START_ANIMATION);
+        mHandler.sendEmptyMessage(MSG_SWITCH_CAMERA_START_ANIMATION);
     }
 
     // either open a new camera or switch cameras
@@ -511,16 +497,6 @@
         settingsManager.setDefault(new ExposureSetting());
     }
 
-    private void keepMediaProviderInstance() {
-        // We want to keep a reference to MediaProvider in camera's lifecycle.
-        // TODO: Utilize mMediaProviderClient instance to replace
-        // ContentResolver calls.
-        if (mMediaProviderClient == null) {
-            mMediaProviderClient = mContentResolver
-                    .acquireContentProviderClient(MediaStore.AUTHORITY);
-        }
-    }
-
     // Snapshots can only be taken after this is called. It should be called
     // once only. We could have done these things in onCreate() but we want to
     // make preview screen appear as soon as possible.
@@ -533,8 +509,6 @@
         SettingsController settingsController = mActivity.getSettingsController();
         settingsController.syncLocationManager();
 
-        keepMediaProviderInstance();
-
         mUI.initializeFirstTime();
         MediaSaver s = getServices().getMediaSaver();
         // We set the listener only when both service and shutterbutton
@@ -564,7 +538,6 @@
         }
         mNamedImages = new NamedImages();
         mUI.initializeSecondTime(mParameters);
-        keepMediaProviderInstance();
     }
 
     private void showTapToFocusToastIfNeeded() {
@@ -574,7 +547,7 @@
         // CONVERT THIS SETTING TO A STRING
         if (mFocusAreaSupported && showHint) {
             // Delay the toast for one second to wait for orientation.
-            mHandler.sendEmptyMessageDelayed(SHOW_TAP_TO_FOCUS_TOAST, 1000);
+            mHandler.sendEmptyMessageDelayed(MSG_SHOW_TAP_TO_FOCUS_TOAST, 1000);
         }
     }
 
@@ -947,8 +920,8 @@
         mOrientation = CameraUtil.roundOrientation(orientation, mOrientation);
 
         // Show the toast after getting the first orientation changed.
-        if (mHandler.hasMessages(SHOW_TAP_TO_FOCUS_TOAST)) {
-            mHandler.removeMessages(SHOW_TAP_TO_FOCUS_TOAST);
+        if (mHandler.hasMessages(MSG_SHOW_TAP_TO_FOCUS_TOAST)) {
+            mHandler.removeMessages(MSG_SHOW_TAP_TO_FOCUS_TOAST);
             showTapToFocusToast();
         }
     }
@@ -979,14 +952,6 @@
     }
 
     @Override
-    public void onStop() {
-        if (mMediaProviderClient != null) {
-            mMediaProviderClient.release();
-            mMediaProviderClient = null;
-        }
-    }
-
-    @Override
     public void onCaptureCancelled() {
         mActivity.setResultEx(Activity.RESULT_CANCELED, new Intent());
         mActivity.finish();
@@ -1148,16 +1113,6 @@
         }
     }
 
-    @Override
-    public void installIntentFilter() {
-        // Do nothing.
-    }
-
-    @Override
-    public boolean updateStorageHintOnResume() {
-        return mFirstTimeInitialized;
-    }
-
     private void onResumeTasks() {
         Log.v(TAG, "Executing onResumeTasks.");
         if (mOpenCameraFail || mCameraDisabled) return;
@@ -1173,12 +1128,11 @@
         // If first time initialization is not finished, put it in the
         // message queue.
         if (!mFirstTimeInitialized) {
-            mHandler.sendEmptyMessage(FIRST_TIME_INIT);
+            mHandler.sendEmptyMessage(MSG_FIRST_TIME_INIT);
         } else {
             initializeSecondTime();
         }
         mUI.initDisplayChangeListener();
-        keepScreenOnAwhile();
 
         UsageStatistics.onContentViewChanged(
                 UsageStatistics.COMPONENT_CAMERA, "PhotoModule");
@@ -1217,11 +1171,6 @@
     }
 
     @Override
-    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
-        init((CameraActivity) app.getAndroidContext(), app.getModuleLayoutRoot());
-    }
-
-    @Override
     public void resume() {
         mPaused = false;
         // Add delay on resume from lock screen only, in order to to speed up
@@ -1281,7 +1230,7 @@
         mHandler.removeCallbacksAndMessages(null);
 
         closeCamera();
-        resetScreenOn();
+        mActivity.enableKeepScreenOn(false);
         mUI.onPause();
 
         mPendingSwitchCameraId = -1;
@@ -1316,29 +1265,6 @@
         }
     }
 
-    @Override
-    public void onActivityResult(
-            int requestCode, int resultCode, Intent data) {
-        switch (requestCode) {
-            case REQUEST_CROP: {
-                Intent intent = new Intent();
-                if (data != null) {
-                    Bundle extras = data.getExtras();
-                    if (extras != null) {
-                        intent.putExtras(extras);
-                    }
-                }
-                mActivity.setResultEx(resultCode, intent);
-                mActivity.finish();
-
-                File path = mActivity.getFileStreamPath(sTempCropFilename);
-                path.delete();
-
-                break;
-            }
-        }
-    }
-
     private boolean canTakePicture() {
         return isCameraIdle() && (mActivity.getStorageSpaceBytes() > Storage.LOW_STORAGE_THRESHOLD_BYTES);
     }
@@ -1605,8 +1531,7 @@
         setMeteringAreasIfSupported();
 
         // Set picture size.
-        String pictureSize = settingsManager.get(
-            new PictureSizeSetting());
+        String pictureSize = settingsManager.get(new PictureSizeSetting());
         if (pictureSize == null) {
             //TODO: deprecate CameraSettings.
             CameraSettings.initialCameraPictureSize(
@@ -1690,8 +1615,7 @@
         // still supported by latest driver, if not, ignore the settings.
 
         // Set exposure compensation
-        int value = Integer.parseInt(
-            settingsManager.get(new ExposureSetting()));
+        int value = Integer.parseInt(settingsManager.get(new ExposureSetting()));
         int max = mParameters.getMaxExposureCompensation();
         int min = mParameters.getMinExposureCompensation();
         if (value >= min && value <= max) {
@@ -1715,8 +1639,7 @@
             }
 
             // Set white balance parameter.
-            String whiteBalance = settingsManager.get(
-                new WhiteBalanceSetting());
+            String whiteBalance = settingsManager.get(new WhiteBalanceSetting());
             if (CameraUtil.isSupported(whiteBalance,
                     mParameters.getSupportedWhiteBalance())) {
                 mParameters.setWhiteBalance(whiteBalance);
@@ -1773,7 +1696,7 @@
 
         // Switch to gcam module if HDR+ was selected
         if (doModeSwitch && !mIsImageCaptureIntent) {
-            mHandler.sendEmptyMessage(SWITCH_TO_GCAM_MODULE);
+            mHandler.sendEmptyMessage(MSG_SWITCH_TO_GCAM_MODULE);
         }
     }
 
@@ -1791,9 +1714,8 @@
             updateSceneMode();
             mUpdateSet = 0;
         } else {
-            if (!mHandler.hasMessages(SET_CAMERA_PARAMETERS_WHEN_IDLE)) {
-                mHandler.sendEmptyMessageDelayed(
-                        SET_CAMERA_PARAMETERS_WHEN_IDLE, 1000);
+            if (!mHandler.hasMessages(MSG_SET_CAMERA_PARAMETERS_WHEN_IDLE)) {
+                mHandler.sendEmptyMessageDelayed(MSG_SET_CAMERA_PARAMETERS_WHEN_IDLE, 1000);
             }
         }
     }
@@ -1846,33 +1768,6 @@
         switchCamera();
     }
 
-    // Preview texture has been copied. Now camera can be released and the
-    // animation can be started.
-    @Override
-    public void onPreviewTextureCopied() {
-        mHandler.sendEmptyMessage(SWITCH_CAMERA);
-    }
-
-    @Override
-    public void onCaptureTextureCopied() {
-    }
-
-    @Override
-    public void onUserInteraction() {
-        if (!mActivity.isFinishing()) keepScreenOnAwhile();
-    }
-
-    private void resetScreenOn() {
-        mHandler.removeMessages(CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    private void keepScreenOnAwhile() {
-        mHandler.removeMessages(CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY);
-    }
-
     @Override
     public void onOverriddenPreferencesClicked() {
         if (mPaused) return;
@@ -1905,11 +1800,6 @@
     }
 
     @Override
-    public void onShowSwitcherPopup() {
-        mUI.onShowSwitcherPopup();
-    }
-
-    @Override
     public int onZoomChanged(int index) {
         // Not useful to change zoom value when the activity is paused.
         if (mPaused) return index;
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 58de510..ecf2193 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -51,13 +51,11 @@
 import android.view.KeyEvent;
 import android.view.OrientationEventListener;
 import android.view.View;
-import android.view.WindowManager;
 import android.widget.Toast;
 
 import com.android.camera.app.AppController;
 import com.android.camera.app.CameraManager.CameraPictureCallback;
 import com.android.camera.app.CameraManager.CameraProxy;
-import com.android.camera.app.CameraServices;
 import com.android.camera.app.MediaSaver;
 import com.android.camera.exif.ExifInterface;
 import com.android.camera.module.ModuleController;
@@ -85,15 +83,13 @@
 
     private static final String TAG = "CAM_VideoModule";
 
-    private static final int CHECK_DISPLAY_ROTATION = 3;
-    private static final int CLEAR_SCREEN_DELAY = 4;
-    private static final int UPDATE_RECORD_TIME = 5;
-    private static final int ENABLE_SHUTTER_BUTTON = 6;
-    private static final int SHOW_TAP_TO_SNAPSHOT_TOAST = 7;
-    private static final int SWITCH_CAMERA = 8;
-    private static final int SWITCH_CAMERA_START_ANIMATION = 9;
-
-    private static final int SCREEN_DELAY = 2 * 60 * 1000;
+    // Messages defined for the UI thread handler.
+    private static final int MSG_CHECK_DISPLAY_ROTATION = 4;
+    private static final int MSG_UPDATE_RECORD_TIME = 5;
+    private static final int MSG_ENABLE_SHUTTER_BUTTON = 6;
+    private static final int MSG_SHOW_TAP_TO_SNAPSHOT_TOAST = 7;
+    private static final int MSG_SWITCH_CAMERA = 8;
+    private static final int MSG_SWITCH_CAMERA_START_ANIMATION = 9;
 
     private static final long SHUTTER_BUTTON_TIMEOUT = 500L; // 500ms
 
@@ -219,22 +215,16 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
 
-                case ENABLE_SHUTTER_BUTTON:
+                case MSG_ENABLE_SHUTTER_BUTTON:
                     mUI.enableShutter(true);
                     break;
 
-                case CLEAR_SCREEN_DELAY: {
-                    mActivity.getWindow().clearFlags(
-                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    break;
-                }
-
-                case UPDATE_RECORD_TIME: {
+                case MSG_UPDATE_RECORD_TIME: {
                     updateRecordingTime();
                     break;
                 }
 
-                case CHECK_DISPLAY_ROTATION: {
+                case MSG_CHECK_DISPLAY_ROTATION: {
                     // Restart the preview if display rotation has changed.
                     // Sometimes this happens when the device is held upside
                     // down and camera app is opened. Rotation animation will
@@ -245,22 +235,22 @@
                         startPreview();
                     }
                     if (SystemClock.uptimeMillis() - mOnResumeTime < 5000) {
-                        mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100);
+                        mHandler.sendEmptyMessageDelayed(MSG_CHECK_DISPLAY_ROTATION, 100);
                     }
                     break;
                 }
 
-                case SHOW_TAP_TO_SNAPSHOT_TOAST: {
+                case MSG_SHOW_TAP_TO_SNAPSHOT_TOAST: {
                     showTapToSnapshotToast();
                     break;
                 }
 
-                case SWITCH_CAMERA: {
+                case MSG_SWITCH_CAMERA: {
                     switchCamera();
                     break;
                 }
 
-                case SWITCH_CAMERA_START_ANIMATION: {
+                case MSG_SWITCH_CAMERA_START_ANIMATION: {
                     //TODO:
                     //((CameraScreenNail) mActivity.mCameraScreenNail).animateSwitchCamera();
 
@@ -323,10 +313,11 @@
         }
     }
 
+
     @Override
-    public void init(CameraActivity activity, View root) {
-        mActivity = activity;
-        mUI = new VideoUI(activity, this, root);
+    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
+        mActivity = (CameraActivity) app.getAndroidContext();
+        mUI = new VideoUI(mActivity, this,  app.getModuleLayoutRoot());
         mPreferences = new ComboPreferences(mActivity);
         CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal());
         mCameraId = getPreferredCameraId(mPreferences);
@@ -394,9 +385,6 @@
         }
     }
 
-    @Override
-    public void onStop() {}
-
     private void loadCameraPreferences() {
         CameraSettings settings = new CameraSettings(mActivity, mParameters,
                 mCameraId, mActivity.getCameraProvider().getCameraInfo());
@@ -423,8 +411,8 @@
         }
 
         // Show the toast after getting the first orientation changed.
-        if (mHandler.hasMessages(SHOW_TAP_TO_SNAPSHOT_TOAST)) {
-            mHandler.removeMessages(SHOW_TAP_TO_SNAPSHOT_TOAST);
+        if (mHandler.hasMessages(MSG_SHOW_TAP_TO_SNAPSHOT_TOAST)) {
+            mHandler.removeMessages(MSG_SHOW_TAP_TO_SNAPSHOT_TOAST);
             showTapToSnapshotToast();
         }
     }
@@ -533,8 +521,7 @@
         // mode and recording is stopped. It'll be re-enabled when
         // re-take button is clicked.
         if (!(mIsVideoCaptureIntent && stop)) {
-            mHandler.sendEmptyMessageDelayed(
-                    ENABLE_SHUTTER_BUTTON, SHUTTER_BUTTON_TIMEOUT);
+            mHandler.sendEmptyMessageDelayed(MSG_ENABLE_SHUTTER_BUTTON, SHUTTER_BUTTON_TIMEOUT);
         }
     }
 
@@ -623,12 +610,10 @@
     }
 
     private void resizeForPreviewAspectRatio() {
-        mUI.setAspectRatio(
-                (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
+        mUI.setAspectRatio((double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
     }
 
-    @Override
-    public void installIntentFilter() {
+    private void installIntentFilter() {
         // install an intent filter to receive SD card related events.
         IntentFilter intentFilter =
                 new IntentFilter(Intent.ACTION_MEDIA_EJECT);
@@ -730,13 +715,6 @@
     }
 
     @Override
-    public void onUserInteraction() {
-        if (!mMediaRecorderRecording && !mActivity.isFinishing()) {
-            keepScreenOnAwhile();
-        }
-    }
-
-    @Override
     public boolean onBackPressed() {
         if (mPaused) return true;
         if (mMediaRecorderRecording) {
@@ -1126,7 +1104,7 @@
         mUI.showRecordingUI(true);
 
         updateRecordingTime();
-        keepScreenOn();
+        mActivity.enableKeepScreenOn(true);
         UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
                 UsageStatistics.ACTION_CAPTURE_START, "Video");
     }
@@ -1185,7 +1163,8 @@
                 Log.v(TAG, "stopVideoRecording: Setting current video filename: "
                         + mCurrentVideoFilename);
                 AccessibilityUtils.makeAnnouncement(mUI.getShutterButton(),
-                        mActivity.getString(R.string.video_recording_stopped));
+                        mActivity.getAndroidContext().getString(R.string
+                        .video_recording_stopped));
             } catch (RuntimeException e) {
                 Log.e(TAG, "stop fail",  e);
                 if (mVideoFilename != null) deleteVideoFile(mVideoFilename);
@@ -1208,7 +1187,7 @@
             // The orientation was fixed during video recording. Now make it
             // reflect the device orientation as video recording is stopped.
             mUI.setOrientationIndicator(0, true);
-            keepScreenOnAwhile();
+            mActivity.enableKeepScreenOn(false);
             if (shouldAddToMediaStoreNow && !fail) {
                 if (mVideoFileDescriptor == null) {
                     saveVideo();
@@ -1233,28 +1212,11 @@
         // by MediaRecorder.
         if (!mPaused) mParameters = mCameraDevice.getParameters();
         UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
-                fail ? UsageStatistics.ACTION_CAPTURE_FAIL :
-                    UsageStatistics.ACTION_CAPTURE_DONE, "Video",
-                    SystemClock.uptimeMillis() - mRecordingStartTime);
+                fail ? UsageStatistics.ACTION_CAPTURE_FAIL : UsageStatistics.ACTION_CAPTURE_DONE,
+                "Video", SystemClock.uptimeMillis() - mRecordingStartTime);
         return fail;
     }
 
-    private void resetScreenOn() {
-        mHandler.removeMessages(CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    private void keepScreenOnAwhile() {
-        mHandler.removeMessages(CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY);
-    }
-
-    private void keepScreenOn() {
-        mHandler.removeMessages(CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
     private static String millisecondToTimeString(long milliSeconds, boolean displayCentiSeconds) {
         long seconds = milliSeconds / 1000; // round down to compute seconds
         long minutes = seconds / 60;
@@ -1352,8 +1314,7 @@
         }
 
         long actualNextUpdateDelay = targetNextUpdateDelay - (delta % targetNextUpdateDelay);
-        mHandler.sendEmptyMessageDelayed(
-                UPDATE_RECORD_TIME, actualNextUpdateDelay);
+        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_RECORD_TIME, actualNextUpdateDelay);
     }
 
     private static boolean isSupported(String value, List<String> supported) {
@@ -1436,18 +1397,9 @@
     }
 
     @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        // Do nothing.
-    }
-
-    @Override
-    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
-        init((CameraActivity) app.getAndroidContext(), app.getModuleLayoutRoot());
-    }
-
-    @Override
     public void resume() {
         mPaused = false;
+        installIntentFilter();
         mUI.enableShutter(false);
         mZoomValue = 0;
 
@@ -1462,8 +1414,6 @@
 
         mUI.initDisplayChangeListener();
 
-        keepScreenOnAwhile();
-
         // Initialize location service.
         boolean recordLocation = RecordLocationPreference.get(mPreferences,
                 mContentResolver);
@@ -1471,7 +1421,7 @@
 
         if (mPreviewing) {
             mOnResumeTime = SystemClock.uptimeMillis();
-            mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100);
+            mHandler.sendEmptyMessageDelayed(MSG_CHECK_DISPLAY_ROTATION, 100);
         }
 
         UsageStatistics.onContentViewChanged(
@@ -1501,13 +1451,12 @@
             mActivity.unregisterReceiver(mReceiver);
             mReceiver = null;
         }
-        resetScreenOn();
 
         if (mLocationManager != null) mLocationManager.recordLocation(false);
 
-        mHandler.removeMessages(CHECK_DISPLAY_ROTATION);
-        mHandler.removeMessages(SWITCH_CAMERA);
-        mHandler.removeMessages(SWITCH_CAMERA_START_ANIMATION);
+        mHandler.removeMessages(MSG_CHECK_DISPLAY_ROTATION);
+        mHandler.removeMessages(MSG_SWITCH_CAMERA);
+        mHandler.removeMessages(MSG_SWITCH_CAMERA_START_ANIMATION);
         mPendingSwitchCameraId = -1;
         mSwitchingCamera = false;
         mPreferenceRead = false;
@@ -1601,21 +1550,10 @@
 
         // Start switch camera animation. Post a message because
         // onFrameAvailable from the old camera may already exist.
-        mHandler.sendEmptyMessage(SWITCH_CAMERA_START_ANIMATION);
+        mHandler.sendEmptyMessage(MSG_SWITCH_CAMERA_START_ANIMATION);
         mUI.updateOnScreenIndicators(mParameters, mPreferences);
     }
 
-    // Preview texture has been copied. Now camera can be released and the
-    // animation can be started.
-    @Override
-    public void onPreviewTextureCopied() {
-        mHandler.sendEmptyMessage(SWITCH_CAMERA);
-    }
-
-    @Override
-    public void onCaptureTextureCopied() {
-    }
-
     private void initializeVideoSnapshot() {
         if (mParameters == null) return;
         if (CameraUtil.isVideoSnapshotSupported(mParameters) && !mIsVideoCaptureIntent) {
@@ -1623,7 +1561,7 @@
             if (mPreferences.getBoolean(
                         CameraSettings.KEY_VIDEO_FIRST_USE_HINT_SHOWN, true)) {
                 // Delay the toast for one second to wait for orientation.
-                mHandler.sendEmptyMessageDelayed(SHOW_TAP_TO_SNAPSHOT_TOAST, 1000);
+                mHandler.sendEmptyMessageDelayed(MSG_SHOW_TAP_TO_SNAPSHOT_TOAST, 1000);
             }
         }
     }
@@ -1750,11 +1688,6 @@
         editor.apply();
     }
 
-    @Override
-    public boolean updateStorageHintOnResume() {
-        return true;
-    }
-
     // required by OnPreferenceChangedListener
     @Override
     public void onCameraPickerClicked(int cameraId) {
@@ -1770,11 +1703,6 @@
     }
 
     @Override
-    public void onShowSwitcherPopup() {
-        mUI.onShowSwitcherPopup();
-    }
-
-    @Override
     public void onMediaSaverAvailable(MediaSaver s) {
         // do nothing.
     }
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index a48c5d0..22756d1 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -18,7 +18,6 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -42,11 +41,9 @@
 import android.view.OrientationEventListener;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 
 import com.android.camera.app.CameraManager.CameraProxy;
 import com.android.camera.app.AppController;
-import com.android.camera.app.CameraServices;
 import com.android.camera.app.MediaSaver;
 import com.android.camera.data.LocalData;
 import com.android.camera.exif.ExifInterface;
@@ -77,8 +74,7 @@
     private static final int MSG_LOW_RES_FINAL_MOSAIC_READY = 1;
     private static final int MSG_GENERATE_FINAL_MOSAIC_ERROR = 2;
     private static final int MSG_END_DIALOG_RESET_TO_PREVIEW = 3;
-    private static final int MSG_CLEAR_SCREEN_DELAY = 4;
-    private static final int MSG_RESET_TO_PREVIEW = 5;
+    private static final int MSG_RESET_TO_PREVIEW = 4;
 
     private static final int SCREEN_DELAY = 2 * 60 * 1000;
 
@@ -212,9 +208,9 @@
     }
 
     @Override
-    public void init(CameraActivity activity, View parent) {
-        mActivity = activity;
-        mRootView = parent;
+    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
+        mActivity = (CameraActivity) app.getAndroidContext();
+        mRootView = app.getModuleLayoutRoot();
 
         mCaptureState = CAPTURE_STATE_VIEWFINDER;
         mUI = new WideAnglePanoramaUI(mActivity, this, (ViewGroup) mRootView);
@@ -306,10 +302,6 @@
                         resetToPreviewIfPossible();
                         clearMosaicFrameProcessorIfNeeded();
                         break;
-                    case MSG_CLEAR_SCREEN_DELAY:
-                        mActivity.getWindow().clearFlags(WindowManager.LayoutParams.
-                                FLAG_KEEP_SCREEN_ON);
-                        break;
                     case MSG_RESET_TO_PREVIEW:
                         resetToPreviewIfPossible();
                         break;
@@ -539,7 +531,7 @@
         mUI.setMaxCaptureProgress(DEFAULT_SWEEP_ANGLE);
         mUI.showCaptureProgress();
         mDeviceOrientationAtCapture = mDeviceOrientation;
-        keepScreenOn();
+        mActivity.enableKeepScreenOn(true);
         // TODO: mActivity.getOrientationManager().lockOrientation();
         mActivity.lockOrientation();
         int degrees = CameraUtil.getDisplayRotation(mActivity);
@@ -579,7 +571,7 @@
                 }
             });
         }
-        keepScreenOnAwhile();
+        mActivity.enableKeepScreenOn(false);
     }
 
     @Override
@@ -810,12 +802,6 @@
     }
 
     @Override
-    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
-        // TODO: implement this.
-        init((CameraActivity) app.getAndroidContext(), app.getModuleLayoutRoot());
-    }
-
-    @Override
     public void resume() {
         mPaused = false;
         mOrientationEventListener.enable();
@@ -848,7 +834,6 @@
             configMosaicPreview();
             mActivity.updateStorageSpaceAndHint();
         }
-        keepScreenOnAwhile();
 
         // Initialize location service.
         boolean recordLocation = RecordLocationPreference.get(mPreferences,
@@ -891,7 +876,7 @@
             mWaitProcessorTask.cancel(true);
             mWaitProcessorTask = null;
         }
-        resetScreenOn();
+        mActivity.enableKeepScreenOn(false);
         mUI.removeDisplayChangeListener();
         if (mSoundPlayer != null) {
             mSoundPlayer.release();
@@ -1015,11 +1000,6 @@
     }
 
     @Override
-    public void onUserInteraction() {
-        if (mCaptureState != CAPTURE_STATE_MOSAIC) keepScreenOnAwhile();
-    }
-
-    @Override
     public boolean onBackPressed() {
         // If panorama is generating low res or high res mosaic, ignore back
         // key. So the activity will not be destroyed.
@@ -1027,22 +1007,6 @@
         return false;
     }
 
-    private void resetScreenOn() {
-        mMainHandler.removeMessages(MSG_CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    private void keepScreenOnAwhile() {
-        mMainHandler.removeMessages(MSG_CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        mMainHandler.sendEmptyMessageDelayed(MSG_CLEAR_SCREEN_DELAY, SCREEN_DELAY);
-    }
-
-    private void keepScreenOn() {
-        mMainHandler.removeMessages(MSG_CLEAR_SCREEN_DELAY);
-        mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
     private class WaitProcessorTask extends AsyncTask<Void, Void, Void> {
         @Override
         protected Void doInBackground(Void... params) {
@@ -1081,19 +1045,6 @@
     }
 
     @Override
-    public void onStop() {
-    }
-
-    @Override
-    public void installIntentFilter() {
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-    }
-
-
-    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         return false;
     }
@@ -1108,23 +1059,6 @@
     }
 
     @Override
-    public void onPreviewTextureCopied() {
-    }
-
-    @Override
-    public void onCaptureTextureCopied() {
-    }
-
-    @Override
-    public boolean updateStorageHintOnResume() {
-        return false;
-    }
-
-    @Override
-    public void onShowSwitcherPopup() {
-    }
-
-    @Override
     public void onMediaSaverAvailable(MediaSaver s) {
         // do nothing.
     }
diff --git a/src/com/android/camera/app/AppController.java b/src/com/android/camera/app/AppController.java
index 7029492..5c22b74 100644
--- a/src/com/android/camera/app/AppController.java
+++ b/src/com/android/camera/app/AppController.java
@@ -161,6 +161,13 @@
     /********************** App-level resources **********************/
 
     /**
+     * Keeps the screen turned on.
+     *
+     * @param enabled Whether to keep the screen on.
+     */
+    public void enableKeepScreenOn(boolean enabled);
+
+    /**
      * Returns the {@link com.android.camera.app.CameraProvider}.
      */
     public CameraProvider getCameraProvider();
diff --git a/src/com/android/camera/module/ModuleController.java b/src/com/android/camera/module/ModuleController.java
index a0aedbf..c427d8d 100644
--- a/src/com/android/camera/module/ModuleController.java
+++ b/src/com/android/camera/module/ModuleController.java
@@ -80,6 +80,13 @@
      */
     public void onOrientationChanged(int orientation);
 
+    /**
+     * Called when back key is pressed.
+     *
+     * @return Whether the back key event is processed.
+     */
+    public abstract boolean onBackPressed();
+
     /********************** App-level resources **********************/
 
     /**
