Consolidate onResume* and onPause* in modules.

1. Combine onResumeAfterSuper() and onResumeBeforeSuper() to resume().
2. Combine onPauseAfterSuper() and onPauseBeforeSuper() to pause().
3. Add helper function requestBackCamera() to CameraModule.

Change-Id: Ie0ffb0168e2df1e77aba4ead4f8729eca09c894a
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index ebf635e..a285306 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -72,6 +72,7 @@
 import com.android.camera.app.CameraManager;
 import com.android.camera.app.CameraManagerFactory;
 import com.android.camera.app.CameraProvider;
+import com.android.camera.app.CameraServices;
 import com.android.camera.app.ImageTaskManager;
 import com.android.camera.app.MediaSaver;
 import com.android.camera.app.ModuleManagerImpl;
@@ -1286,15 +1287,14 @@
         performDeletion();
         // TODO: call mCurrentModule.pause() instead after all the modules
         // support pause().
-        mCurrentModule.onPauseBeforeSuper();
+        mCurrentModule.pause();
         mOrientationManager.pause();
         // Close the camera and wait for the operation done.
         mCameraController.closeCamera();
-        super.onPause();
-        mCurrentModule.onPauseAfterSuper();
 
         mLocalImagesObserver.setActivityPaused(true);
         mLocalVideosObserver.setActivityPaused(true);
+        super.onPause();
     }
 
     @Override
@@ -1325,11 +1325,8 @@
                 UsageStatistics.ACTION_FOREGROUNDED, this.getClass().getSimpleName());
 
         mOrientationManager.resume();
-        // TODO: call mCurrentModule.resume() instead after all the modules
-        // support resume().
-        mCurrentModule.onResumeBeforeSuper();
         super.onResume();
-        mCurrentModule.onResumeAfterSuper();
+        mCurrentModule.resume();
 
         setSwipingEnabled(true);
 
@@ -1541,7 +1538,7 @@
             mCameraController.closeCamera();
         }
         mCurrentModeIndex = agent.getModuleId();
-        mCurrentModule2 = agent.createModule((CameraApp) getApplication());
+        mCurrentModule2 = agent.createModule(this);
         mCurrentModule = (CameraModule) mCurrentModule2;
     }
 
@@ -1550,6 +1547,11 @@
         return mSettingsManager;
     }
 
+    @Override
+    public CameraServices getServices() {
+        return (CameraServices) getApplication();
+    }
+
     /**
      * Launches an ACTION_EDIT intent for the given local data item.
      */
@@ -1583,17 +1585,11 @@
 
     private void openModule(CameraModule module) {
         module.init(this, mCameraModuleRootView);
-        // TODO: call mCurrentModule.resume() instead after all the modules
-        // support resume().
-        module.onResumeBeforeSuper();
-        module.onResumeAfterSuper();
+        module.resume();
     }
 
     private void closeModule(CameraModule module) {
-        // TODO: call mCurrentModule.pause() instead after all the modules
-        // support pause().
-        module.onPauseBeforeSuper();
-        module.onPauseAfterSuper();
+        module.pause();
         ((ViewGroup) mCameraModuleRootView).removeAllViews();
     }
 
diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java
index 9f735dd..69d6cf9 100644
--- a/src/com/android/camera/CameraModule.java
+++ b/src/com/android/camera/CameraModule.java
@@ -21,16 +21,21 @@
 import android.view.KeyEvent;
 import android.view.View;
 
+import com.android.camera.app.AppController;
+import com.android.camera.app.CameraProvider;
 import com.android.camera.app.CameraServices;
 import com.android.camera.app.MediaSaver;
+import com.android.camera.module.ModuleController;
 
-public abstract class CameraModule {
+public abstract class CameraModule implements ModuleController {
 
     /** Provides common services and functionality to the module. */
     private final CameraServices mServices;
+    private final CameraProvider mCameraProvider;
 
-    public CameraModule(CameraServices services) {
-        mServices = services;
+    public CameraModule(AppController app) {
+        mServices = app.getServices();
+        mCameraProvider = app.getCameraProvider();
     }
 
     @Deprecated
@@ -40,18 +45,6 @@
     public abstract void onPreviewFocusChanged(boolean previewFocused);
 
     @Deprecated
-    public abstract void onPauseBeforeSuper();
-
-    @Deprecated
-    public abstract void onPauseAfterSuper();
-
-    @Deprecated
-    public abstract void onResumeBeforeSuper();
-
-    @Deprecated
-    public abstract void onResumeAfterSuper();
-
-    @Deprecated
     public abstract void onConfigurationChanged(Configuration config);
 
     @Deprecated
@@ -105,4 +98,23 @@
     protected CameraServices getServices() {
         return mServices;
     }
+
+    /**
+     * @return An instance used by the module to get the camera.
+     */
+    protected CameraProvider getCameraProvider() {
+        return mCameraProvider;
+    }
+
+    /**
+     * Requests the back camera through {@link CameraProvider}.
+     * This calls {@link
+     * com.android.camera.app.CameraProvider#requestCamera(int)}. The camera
+     * will be returned through {@link
+     * #onCameraAvailable(com.android.camera.app.CameraManager.CameraProxy)}
+     * when it's available.
+     */
+    protected void requestBackCamera() {
+        mCameraProvider.requestCamera(mCameraProvider.getFirstBackCameraId());
+    }
 }
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index cf9f024..468ec7b 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -363,8 +363,8 @@
     /**
      * Constructs a new photo module.
      */
-    public PhotoModule(CameraServices services) {
-        super(services);
+    public PhotoModule(AppController app) {
+        super(app);
     }
 
     @Override
@@ -1181,33 +1181,6 @@
         return mFirstTimeInitialized;
     }
 
-    @Override
-    public void onResumeBeforeSuper() {
-        mPaused = false;
-    }
-
-    @Override
-    public void onResumeAfterSuper() {
-        // Add delay on resume from lock screen only, in order to to speed up
-        // the onResume --> onPause --> onResume cycle from lock screen.
-        // Don't do always because letting go of thread can cause delay.
-        String action = mActivity.getIntent().getAction();
-        if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(action)
-                || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)) {
-            Log.v(TAG, "On resume, from lock screen.");
-            // Note: onPauseAfterSuper() will delete this runnable, so we will
-            // at most have 1 copy queued up.
-            mHandler.postDelayed(new Runnable() {
-                public void run() {
-                    onResumeTasks();
-                }
-            }, ON_RESUME_TASKS_DELAY_MSEC);
-        } else {
-            Log.v(TAG, "On resume.");
-            onResumeTasks();
-        }
-    }
-
     private void onResumeTasks() {
         Log.v(TAG, "Executing onResumeTasks.");
         if (mOpenCameraFail || mCameraDisabled) return;
@@ -1245,13 +1218,57 @@
         }
     }
 
-    @Override
-    public void onPauseAfterSuper() {
+    /**
+     * The focus manager is the first UI related element to get initialized,
+     * and it requires the RenderOverlay, so initialize it here
+     */
+    private void initializeFocusManager() {
+        // Create FocusManager object. startPreview needs it.
+        // if mFocusManager not null, reuse it
+        // otherwise create a new instance
+        if (mFocusManager != null) {
+            mFocusManager.removeMessages();
+        } else {
+            CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+            mMirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
+            String[] defaultFocusModes = mActivity.getResources().getStringArray(
+                    R.array.pref_camera_focusmode_default_array);
+            mFocusManager = new FocusOverlayManager(mPreferences, defaultFocusModes,
+                    mInitialParams, this, mMirror,
+                    mActivity.getMainLooper(), mUI);
+        }
     }
 
     @Override
-    public void onPauseBeforeSuper() {
-        Log.v(TAG, "On pause.");
+    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
+        // the onResume --> onPause --> onResume cycle from lock screen.
+        // Don't do always because letting go of thread can cause delay.
+        String action = mActivity.getIntent().getAction();
+        if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(action)
+                || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)) {
+            Log.v(TAG, "On resume, from lock screen.");
+            // Note: onPauseAfterSuper() will delete this runnable, so we will
+            // at most have 1 copy queued up.
+            mHandler.postDelayed(new Runnable() {
+                public void run() {
+                    onResumeTasks();
+                }
+            }, ON_RESUME_TASKS_DELAY_MSEC);
+        } else {
+            Log.v(TAG, "On resume.");
+            onResumeTasks();
+        }
+    }
+
+    @Override
+    public void pause() {
         mPaused = true;
         Sensor gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         if (gsensor != null) {
@@ -1299,44 +1316,6 @@
         mUI.removeDisplayChangeListener();
     }
 
-    /**
-     * The focus manager is the first UI related element to get initialized,
-     * and it requires the RenderOverlay, so initialize it here
-     */
-    private void initializeFocusManager() {
-        // Create FocusManager object. startPreview needs it.
-        // if mFocusManager not null, reuse it
-        // otherwise create a new instance
-        if (mFocusManager != null) {
-            mFocusManager.removeMessages();
-        } else {
-            CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
-            mMirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
-            String[] defaultFocusModes = mActivity.getResources().getStringArray(
-                    R.array.pref_camera_focusmode_default_array);
-            mFocusManager = new FocusOverlayManager(mPreferences, defaultFocusModes,
-                    mInitialParams, this, mMirror,
-                    mActivity.getMainLooper(), mUI);
-        }
-    }
-
-    @Override
-    public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
-        init((CameraActivity) app.getAndroidContext(), app.getModuleLayoutRoot());
-    }
-
-    @Override
-    public void resume() {
-        onResumeBeforeSuper();
-        onResumeAfterSuper();
-    }
-
-    @Override
-    public void pause() {
-        onPauseBeforeSuper();
-        onPauseAfterSuper();
-    }
-
     @Override
     public void destroy() {
         // TODO: implement this.
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index fbb0101..7d5680f 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -294,8 +294,8 @@
     /**
      * Construct a new video module.
      */
-    public VideoModule(CameraServices services) {
-        super(services);
+    public VideoModule(AppController app) {
+        super(app);
     }
 
     private String createName(long dateTaken) {
@@ -638,43 +638,6 @@
         mActivity.registerReceiver(mReceiver, intentFilter);
     }
 
-    @Override
-    public void onResumeBeforeSuper() {
-        mPaused = false;
-    }
-
-    @Override
-    public void onResumeAfterSuper() {
-        mUI.enableShutter(false);
-        mZoomValue = 0;
-
-        showVideoSnapshotUI(false);
-
-        if (!mPreviewing) {
-            requestCamera(mCameraId);
-        } else {
-            // preview already started
-            mUI.enableShutter(true);
-        }
-
-        mUI.initDisplayChangeListener();
-
-        keepScreenOnAwhile();
-
-        // Initialize location service.
-        boolean recordLocation = RecordLocationPreference.get(mPreferences,
-                mContentResolver);
-        mLocationManager.recordLocation(recordLocation);
-
-        if (mPreviewing) {
-            mOnResumeTime = SystemClock.uptimeMillis();
-            mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100);
-        }
-
-        UsageStatistics.onContentViewChanged(
-                UsageStatistics.COMPONENT_CAMERA, "VideoModule");
-    }
-
     private void setDisplayOrientation() {
         mDisplayRotation = CameraUtil.getDisplayRotation(mActivity);
         mCameraDisplayOrientation = CameraUtil.getDisplayOrientation(mDisplayRotation, mCameraId);
@@ -767,48 +730,6 @@
     }
 
     @Override
-    public void onPauseBeforeSuper() {
-        mPaused = true;
-
-        mUI.showPreviewCover();
-        if (mMediaRecorderRecording) {
-            // Camera will be released in onStopVideoRecording.
-            onStopVideoRecording();
-        } else {
-            stopPreview();
-            closeCamera();
-            releaseMediaRecorder();
-        }
-
-        closeVideoFileDescriptor();
-
-
-        releasePreviewResources();
-
-        if (mReceiver != null) {
-            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);
-        mPendingSwitchCameraId = -1;
-        mSwitchingCamera = false;
-        mPreferenceRead = false;
-
-        mUI.collapseCameraControls();
-        mUI.removeDisplayChangeListener();
-    }
-
-    @Override
-    public void onPauseAfterSuper() {
-    }
-
-    @Override
     public void onUserInteraction() {
         if (!mMediaRecorderRecording && !mActivity.isFinishing()) {
             keepScreenOnAwhile();
@@ -1526,14 +1447,73 @@
 
     @Override
     public void resume() {
-        onResumeBeforeSuper();
-        onResumeAfterSuper();
+        mPaused = false;
+        mUI.enableShutter(false);
+        mZoomValue = 0;
+
+        showVideoSnapshotUI(false);
+
+        if (!mPreviewing) {
+            requestCamera(mCameraId);
+        } else {
+            // preview already started
+            mUI.enableShutter(true);
+        }
+
+        mUI.initDisplayChangeListener();
+
+        keepScreenOnAwhile();
+
+        // Initialize location service.
+        boolean recordLocation = RecordLocationPreference.get(mPreferences,
+                mContentResolver);
+        mLocationManager.recordLocation(recordLocation);
+
+        if (mPreviewing) {
+            mOnResumeTime = SystemClock.uptimeMillis();
+            mHandler.sendEmptyMessageDelayed(CHECK_DISPLAY_ROTATION, 100);
+        }
+
+        UsageStatistics.onContentViewChanged(
+                UsageStatistics.COMPONENT_CAMERA, "VideoModule");
     }
 
     @Override
     public void pause() {
-        onPauseBeforeSuper();
-        onPauseAfterSuper();
+        mPaused = true;
+
+        mUI.showPreviewCover();
+        if (mMediaRecorderRecording) {
+            // Camera will be released in onStopVideoRecording.
+            onStopVideoRecording();
+        } else {
+            stopPreview();
+            closeCamera();
+            releaseMediaRecorder();
+        }
+
+        closeVideoFileDescriptor();
+
+
+        releasePreviewResources();
+
+        if (mReceiver != null) {
+            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);
+        mPendingSwitchCameraId = -1;
+        mSwitchingCamera = false;
+        mPreferenceRead = false;
+
+        mUI.collapseCameraControls();
+        mUI.removeDisplayChangeListener();
     }
 
     @Override
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index f7dba07..a48c5d0 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -154,8 +154,8 @@
     /**
      * Constructs a new Wide-Angle panorama module.
      */
-    public WideAnglePanoramaModule(CameraServices services) {
-        super(services);
+    public WideAnglePanoramaModule(AppController app) {
+        super(app);
     }
 
     @Override
@@ -810,51 +810,6 @@
     }
 
     @Override
-    public void onPauseBeforeSuper() {
-        mPaused = true;
-        if (mLocationManager != null) mLocationManager.recordLocation(false);
-    }
-
-    @Override
-    public void onPauseAfterSuper() {
-        mOrientationEventListener.disable();
-        if (mCameraDevice == null) {
-            // Camera open failed. Nothing should be done here.
-            return;
-        }
-        // Stop the capturing first.
-        if (mCaptureState == CAPTURE_STATE_MOSAIC) {
-            stopCapture(true);
-            reset();
-        }
-        mUI.showPreviewCover();
-        releaseCamera();
-        synchronized (mRendererLock) {
-            mCameraTexture = null;
-
-            // The preview renderer might not have a chance to be initialized
-            // before onPause().
-            if (mMosaicPreviewRenderer != null) {
-                mMosaicPreviewRenderer.release();
-                mMosaicPreviewRenderer = null;
-            }
-        }
-
-        clearMosaicFrameProcessorIfNeeded();
-        if (mWaitProcessorTask != null) {
-            mWaitProcessorTask.cancel(true);
-            mWaitProcessorTask = null;
-        }
-        resetScreenOn();
-        mUI.removeDisplayChangeListener();
-        if (mSoundPlayer != null) {
-            mSoundPlayer.release();
-            mSoundPlayer = null;
-        }
-        System.gc();
-    }
-
-    @Override
     public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
         // TODO: implement this.
         init((CameraActivity) app.getAndroidContext(), app.getModuleLayoutRoot());
@@ -862,49 +817,7 @@
 
     @Override
     public void resume() {
-        // TODO: implement this.
-        onResumeBeforeSuper();
-        onResumeAfterSuper();
-    }
-
-    @Override
-    public void pause() {
-        // TODO: implement this.
-        onPauseBeforeSuper();
-        onPauseAfterSuper();
-    }
-
-    @Override
-    public void destroy() {
-        // TODO: implement this.
-    }
-
-    @Override
-    public void onPreviewSizeChanged(int width, int height) {
-        // TODO: implement this.
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        mUI.onConfigurationChanged(newConfig, mThreadRunning);
-    }
-
-    @Override
-    public void onOrientationChanged(int orientation) {
-    }
-
-    @Override
-    public void onCameraAvailable(CameraProxy cameraProxy) {
-        // TODO: implement this.
-    }
-
-    @Override
-    public void onResumeBeforeSuper() {
         mPaused = false;
-    }
-
-    @Override
-    public void onResumeAfterSuper() {
         mOrientationEventListener.enable();
 
         mCaptureState = CAPTURE_STATE_VIEWFINDER;
@@ -946,6 +859,71 @@
                 UsageStatistics.COMPONENT_CAMERA, "PanoramaModule");
     }
 
+    @Override
+    public void pause() {
+        mPaused = true;
+        if (mLocationManager != null) mLocationManager.recordLocation(false);
+        mOrientationEventListener.disable();
+        if (mCameraDevice == null) {
+            // Camera open failed. Nothing should be done here.
+            return;
+        }
+        // Stop the capturing first.
+        if (mCaptureState == CAPTURE_STATE_MOSAIC) {
+            stopCapture(true);
+            reset();
+        }
+        mUI.showPreviewCover();
+        releaseCamera();
+        synchronized (mRendererLock) {
+            mCameraTexture = null;
+
+            // The preview renderer might not have a chance to be initialized
+            // before onPause().
+            if (mMosaicPreviewRenderer != null) {
+                mMosaicPreviewRenderer.release();
+                mMosaicPreviewRenderer = null;
+            }
+        }
+
+        clearMosaicFrameProcessorIfNeeded();
+        if (mWaitProcessorTask != null) {
+            mWaitProcessorTask.cancel(true);
+            mWaitProcessorTask = null;
+        }
+        resetScreenOn();
+        mUI.removeDisplayChangeListener();
+        if (mSoundPlayer != null) {
+            mSoundPlayer.release();
+            mSoundPlayer = null;
+        }
+        System.gc();
+    }
+
+    @Override
+    public void destroy() {
+        // TODO: implement this.
+    }
+
+    @Override
+    public void onPreviewSizeChanged(int width, int height) {
+        // TODO: implement this.
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        mUI.onConfigurationChanged(newConfig, mThreadRunning);
+    }
+
+    @Override
+    public void onOrientationChanged(int orientation) {
+    }
+
+    @Override
+    public void onCameraAvailable(CameraProxy cameraProxy) {
+        // TODO: implement this.
+    }
+
     /**
      * Generate the final mosaic image.
      *
diff --git a/src/com/android/camera/app/AppController.java b/src/com/android/camera/app/AppController.java
index 5adfcc5..61c1c1b 100644
--- a/src/com/android/camera/app/AppController.java
+++ b/src/com/android/camera/app/AppController.java
@@ -171,4 +171,9 @@
      * @return {@code null} if not available yet.
      */
     public SettingsManager getSettingsManager();
+
+    /**
+     * @return Common services and functionality to be shared.
+     */
+    public CameraServices getServices();
 }
diff --git a/src/com/android/camera/app/ModuleManager.java b/src/com/android/camera/app/ModuleManager.java
index 9a72f8b..b134d49 100644
--- a/src/com/android/camera/app/ModuleManager.java
+++ b/src/com/android/camera/app/ModuleManager.java
@@ -46,11 +46,11 @@
         /**
          * Creates the module.
          *
-         * @param services Common services and functionality to be shared
-         *            between modules.
+         * @param app The {@link com.android.camera.app.AppController} which
+         *            creates this module.
          * @return The module.
          */
-        public ModuleController createModule(CameraServices services);
+        public ModuleController createModule(AppController app);
     }
 
     /**
diff --git a/src/com/android/camera/module/ModulesInfo.java b/src/com/android/camera/module/ModulesInfo.java
index a0a7f44..2562c4c 100644
--- a/src/com/android/camera/module/ModulesInfo.java
+++ b/src/com/android/camera/module/ModulesInfo.java
@@ -21,6 +21,7 @@
 import com.android.camera.PhotoModule;
 import com.android.camera.VideoModule;
 import com.android.camera.WideAnglePanoramaModule;
+import com.android.camera.app.AppController;
 import com.android.camera.app.CameraServices;
 import com.android.camera.app.ModuleManager;
 import com.android.camera.ui.ModeListView;
@@ -73,8 +74,8 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
-                return new PhotoModule(services);
+            public ModuleController createModule(AppController app) {
+                return new PhotoModule(app);
             }
         });
     }
@@ -92,8 +93,8 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
-                return new VideoModule(services);
+            public ModuleController createModule(AppController app) {
+                return new VideoModule(app);
             }
         });
     }
@@ -111,8 +112,8 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
-                return new WideAnglePanoramaModule(services);
+            public ModuleController createModule(AppController app) {
+                return new WideAnglePanoramaModule(app);
             }
         });
     }
@@ -130,9 +131,9 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
+            public ModuleController createModule(AppController app) {
                 // TODO: remove the type casting.
-                return (ModuleController) PhotoSphereHelper.createPanoramaModule(services);
+                return (ModuleController) PhotoSphereHelper.createPanoramaModule(app);
             }
         });
     }
@@ -150,9 +151,9 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
+            public ModuleController createModule(AppController app) {
                 // TODO: remove the type casting.
-                return (ModuleController) RefocusHelper.createRefocusModule(services);
+                return (ModuleController) RefocusHelper.createRefocusModule(app);
             }
         });
     }
@@ -170,8 +171,8 @@
             }
 
             @Override
-            public ModuleController createModule(CameraServices services) {
-                return (ModuleController) GcamHelper.createGcamModule(services);
+            public ModuleController createModule(AppController app) {
+                return (ModuleController) GcamHelper.createGcamModule(app);
             }
         });
     }
diff --git a/src_pd/com/android/camera/util/PhotoSphereHelper.java b/src_pd/com/android/camera/util/PhotoSphereHelper.java
index 36c68d7..eb88c5c 100644
--- a/src_pd/com/android/camera/util/PhotoSphereHelper.java
+++ b/src_pd/com/android/camera/util/PhotoSphereHelper.java
@@ -22,6 +22,7 @@
 import android.net.Uri;
 
 import com.android.camera.CameraModule;
+import com.android.camera.app.AppController;
 import com.android.camera.app.CameraServices;
 
 public class PhotoSphereHelper {
@@ -74,7 +75,7 @@
         return NOT_PANORAMA;
     }
 
-    public static CameraModule createPanoramaModule(CameraServices services) {
+    public static CameraModule createPanoramaModule(AppController app) {
         return null;
     }
 
diff --git a/src_pd/com/android/camera/util/RefocusHelper.java b/src_pd/com/android/camera/util/RefocusHelper.java
index 64a2f39..17a552d 100644
--- a/src_pd/com/android/camera/util/RefocusHelper.java
+++ b/src_pd/com/android/camera/util/RefocusHelper.java
@@ -19,10 +19,11 @@
 import android.content.Context;
 
 import com.android.camera.CameraModule;
+import com.android.camera.app.AppController;
 import com.android.camera.app.CameraServices;
 
 public class RefocusHelper {
-    public static CameraModule createRefocusModule(CameraServices services) {
+    public static CameraModule createRefocusModule(AppController app) {
         return null;
     }