am 846d3abf: Avoid activity leaks.
* commit '846d3abfe3da2fa2a5593c7d40a196005408bed1':
Avoid activity leaks.
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 42179fa..1aee123 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -120,6 +120,7 @@
import com.google.common.logging.eventprotos.NavigationChange;
import java.io.File;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@@ -142,8 +143,8 @@
public static final String SECURE_CAMERA_EXTRA = "secure_camera";
/**
- * Request code from an activity we started that indicated that we do not want
- * to reset the view to the preview in onResume.
+ * Request code from an activity we started that indicated that we do not
+ * want to reset the view to the preview in onResume.
*/
public static final int REQ_CODE_DONT_SWITCH_TO_PREVIEW = 142;
@@ -151,7 +152,10 @@
private static final int MSG_HIDE_ACTION_BAR = 1;
private static final int MSG_CLEAR_SCREEN_ON_FLAG = 2;
- private static final long SCREEN_DELAY_MS = 2 * 60 * 1000; // 2 mins.
+ private static final long SCREEN_DELAY_MS = 2 * 60 * 1000; // 2 mins.
+
+ /** Should be used wherever a context is needed. */
+ private Context mAppContext;
/**
* Whether onResume should reset the view to the preview.
@@ -237,8 +241,8 @@
new CameraAppUI.BottomControls.Listener() {
/**
- * If the current photo is a photo sphere, this will launch the Photo Sphere
- * panorama viewer.
+ * If the current photo is a photo sphere, this will launch the
+ * Photo Sphere panorama viewer.
*/
@Override
public void onExternalViewer() {
@@ -312,7 +316,8 @@
}
/**
- * Sets up the share intent and NFC properly according to the data.
+ * Sets up the share intent and NFC properly according to the
+ * data.
*
* @param data The data to be shared.
*/
@@ -339,7 +344,8 @@
* Get the share intent according to the mimeType
*
* @param mimeType The mimeType of current data.
- * @return the video/image's ShareIntent or null if mimeType is invalid.
+ * @return the video/image's ShareIntent or null if mimeType is
+ * invalid.
*/
private Intent getShareIntentFromType(String mimeType) {
// Lazily create the intent object.
@@ -370,7 +376,7 @@
}
if (mCurrentModule != null) {
SettingsCapabilities capabilities =
- SettingsController.getSettingsCapabilities(camera);
+ SettingsController.getSettingsCapabilities(camera);
mSettingsManager.changeCamera(camera.getCameraId(), capabilities);
mCurrentModule.onCameraAvailable(camera);
}
@@ -398,23 +404,29 @@
CameraUtil.showErrorAndFinish(this, R.string.cannot_connect_camera);
}
- private class MainHandler extends Handler {
- public MainHandler(Looper looper) {
+ private static class MainHandler extends Handler {
+ final WeakReference<CameraActivity> mActivity;
+ public MainHandler(CameraActivity activity, Looper looper) {
super(looper);
+ mActivity = new WeakReference<CameraActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
+ CameraActivity activity = mActivity.get();
+ if (activity == null) {
+ return;
+ }
switch (msg.what) {
case MSG_HIDE_ACTION_BAR: {
removeMessages(MSG_HIDE_ACTION_BAR);
- CameraActivity.this.setFilmstripUiVisibility(false);
+ mActivity.get().setFilmstripUiVisibility(false);
break;
}
- case MSG_CLEAR_SCREEN_ON_FLAG: {
- if (!mPaused) {
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ case MSG_CLEAR_SCREEN_ON_FLAG: {
+ if (!mActivity.get().mPaused) {
+ mActivity.get().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
break;
}
@@ -437,7 +449,7 @@
@Override
public void onSwipeOut() {
UsageStatistics.changeScreen(eventprotos.NavigationChange.Mode.PHOTO_CAPTURE,
- eventprotos.CameraEvent.InteractionCause.SWIPE_RIGHT);
+ eventprotos.CameraEvent.InteractionCause.SWIPE_RIGHT);
}
@Override
@@ -587,15 +599,19 @@
}
/**
- * If {@param visible} is false, this hides the action bar and switches the
+ * If 'visible' is false, this hides the action bar and switches the
* filmstrip UI to lights-out mode.
+ *
+ * @param visible is false, this hides the action bar and switches the
+ * filmstrip UI to lights-out mode.
*/
// TODO: This should not be called outside of the activity.
public void setFilmstripUiVisibility(boolean visible) {
mMainHandler.removeMessages(MSG_HIDE_ACTION_BAR);
int currentSystemUIVisibility = mAboveFilmstripControlLayout.getSystemUiVisibility();
- int newSystemUIVisibility = (visible ? View.SYSTEM_UI_FLAG_VISIBLE : View.SYSTEM_UI_FLAG_FULLSCREEN);
+ int newSystemUIVisibility = (visible ? View.SYSTEM_UI_FLAG_VISIBLE
+ : View.SYSTEM_UI_FLAG_FULLSCREEN);
if (newSystemUIVisibility != currentSystemUIVisibility) {
mAboveFilmstripControlLayout.setSystemUiVisibility(newSystemUIVisibility);
}
@@ -626,7 +642,7 @@
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void setupNfcBeamPush() {
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(CameraActivity.this);
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mAppContext);
if (adapter == null) {
return;
}
@@ -662,7 +678,7 @@
UsageStatistics.hashFileName(fileNameFromDataID(currentDataId)),
eventprotos.CameraEvent.InteractionType.SHARE,
InteractionCause.BUTTON);
- //TODO add intent.getComponent().getPackageName()
+ // TODO add intent.getComponent().getPackageName()
return true;
}
@@ -719,7 +735,7 @@
@Override
public Context getAndroidContext() {
- return this;
+ return mAppContext;
}
@Override
@@ -739,7 +755,8 @@
@Override
public int getQuickSwitchToModuleId(int currentModuleIndex) {
- return mModuleManager.getQuickSwitchToModuleId(currentModuleIndex, mSettingsManager, this);
+ return mModuleManager.getQuickSwitchToModuleId(currentModuleIndex, mSettingsManager,
+ mAppContext);
}
@Override
@@ -801,7 +818,7 @@
mSettingsManager.setInt(SettingsManager.SETTING_SHIMMY_REMAINING_PLAY_TIMES_INDEX,
remainingTimes);
}
- }
+ }
@Override
public void updatePreviewTransform(Matrix matrix) {
@@ -887,7 +904,7 @@
sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO, uri));
mDataAdapter.addNewVideo(uri);
} else if (mimeType.startsWith("image/")) {
- CameraUtil.broadcastNewPicture(this, uri);
+ CameraUtil.broadcastNewPicture(mAppContext, uri);
mDataAdapter.addNewPhoto(uri);
} else if (mimeType.startsWith(PlaceholderManager.PLACEHOLDER_MIME_TYPE)) {
mDataAdapter.addNewPhoto(uri);
@@ -962,30 +979,32 @@
super.onCreate(state);
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.ACTIVITY_START);
mOnCreateTime = System.currentTimeMillis();
+ mAppContext = getApplicationContext();
GcamHelper.init(getContentResolver());
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
mActionBar = getActionBar();
mActionBar.addOnMenuVisibilityListener(this);
- mMainHandler = new MainHandler(getMainLooper());
+ mMainHandler = new MainHandler(this, getMainLooper());
mCameraController =
- new CameraController(this, this, mMainHandler,
+ new CameraController(mAppContext, this, mMainHandler,
CameraManagerFactory.getAndroidCameraManager());
- mPreferences = new ComboPreferences(getAndroidContext());
+ mPreferences = new ComboPreferences(mAppContext);
mContentResolver = this.getContentResolver();
- mSettingsManager = new SettingsManager(this, this, mCameraController.getNumberOfCameras());
+ mSettingsManager = new SettingsManager(mAppContext, this,
+ mCameraController.getNumberOfCameras());
// Remove this after we get rid of ComboPreferences.
int cameraId = Integer.parseInt(mSettingsManager.get(SettingsManager.SETTING_CAMERA_ID));
- mPreferences.setLocalId(this, cameraId);
+ mPreferences.setLocalId(mAppContext, cameraId);
CameraSettings.upgradeGlobalPreferences(mPreferences,
mCameraController.getNumberOfCameras());
// TODO: Try to move all the resources allocation to happen as soon as
// possible so we can call module.init() at the earliest time.
mModuleManager = new ModuleManagerImpl();
- ModulesInfo.setupModules(this, mModuleManager);
+ ModulesInfo.setupModules(mAppContext, mModuleManager);
mModeListView = (ModeListView) findViewById(R.id.mode_list_layout);
mModeListView.init(mModuleManager.getSupportedModeIndexList());
@@ -1010,13 +1029,15 @@
UsageStatistics.foregrounded(
eventprotos.ForegroundEvent.ForegroundSource.LOCK_SCREEN);
- // Change the window flags so that secure camera can show when locked
+ // Change the window flags so that secure camera can show when
+ // locked
Window win = getWindow();
WindowManager.LayoutParams params = win.getAttributes();
params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
win.setAttributes(params);
- // Filter for screen off so that we can finish secure camera activity
+ // 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);
@@ -1029,7 +1050,8 @@
mAboveFilmstripControlLayout =
(FrameLayout) findViewById(R.id.camera_filmstrip_content_layout);
- // Add the session listener so we can track the session progress updates.
+ // Add the session listener so we can track the session progress
+ // updates.
getServices().getCaptureSessionManager().addSessionListener(mSessionListener);
mSessionProgressPanel = findViewById(R.id.pano_session_progress_panel);
mBottomProgressBar = (ProgressBar) findViewById(R.id.pano_session_progress_bar);
@@ -1040,13 +1062,13 @@
mPanoramaViewHelper = new PanoramaViewHelper(this);
mPanoramaViewHelper.onCreate();
// Set up the camera preview first so the preview shows up ASAP.
- mDataAdapter = new CameraDataAdapter(getApplicationContext(),
+ mDataAdapter = new CameraDataAdapter(mAppContext,
new ColorDrawable(getResources().getColor(R.color.photo_placeholder)));
mDataAdapter.setLocalDataListener(mLocalDataListener);
mCameraAppUI.getFilmstripContentPanel().setFilmstripListener(mFilmstripListener);
- mLocationManager = new LocationManager(this);
+ mLocationManager = new LocationManager(mAppContext);
mSettingsController = new SettingsController(this);
int modeIndex = -1;
@@ -1092,6 +1114,7 @@
setBottomBarColor();
setBottomBarShutterIcon();
+
mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
if (!mSecureCamera) {
@@ -1114,7 +1137,7 @@
}
});
mDataAdapter = new FixedLastDataAdapter(
- getApplicationContext(),
+ mAppContext,
mDataAdapter,
new SimpleViewData(
v,
@@ -1138,7 +1161,7 @@
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true,
mLocalVideosObserver);
if (FeedbackHelper.feedbackAvailable()) {
- mFeedbackHelper = new FeedbackHelper(this);
+ mFeedbackHelper = new FeedbackHelper(mAppContext);
}
}
@@ -1164,9 +1187,9 @@
boolean result = super.dispatchTouchEvent(ev);
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
// Real deletion is postponed until the next user interaction after
- // the gesture that triggers deletion. Until real deletion is performed,
- // users can click the undo button to bring back the image that they
- // chose to delete.
+ // the gesture that triggers deletion. Until real deletion is
+ // performed, users can click the undo button to bring back the
+ // image that they chose to delete.
if (mPendingDeletion && !mIsUndoingDeletion) {
performDeletion();
}
@@ -1235,8 +1258,8 @@
mGalleryIntent = null;
galleryLogo = null;
} else {
- mGalleryIntent = IntentHelper.getDefaultGalleryIntent(this);
- galleryLogo = IntentHelper.getGalleryIcon(this, mGalleryIntent);
+ mGalleryIntent = IntentHelper.getDefaultGalleryIntent(mAppContext);
+ galleryLogo = IntentHelper.getGalleryIcon(mAppContext, mGalleryIntent);
}
if (galleryLogo == null) {
try {
@@ -1254,7 +1277,7 @@
if (mResetToPreviewOnResume) {
mCameraAppUI.resume();
} else {
- LocalData data = mDataAdapter.getLocalData(mFilmstripController.getCurrentId());
+ LocalData data = mDataAdapter.getLocalData(mFilmstripController.getCurrentId());
if (data != null) {
mDataAdapter.refresh(data.getContentUri(), false);
}
@@ -1282,7 +1305,8 @@
keepScreenOnForAWhile();
// Lights-out mode at all times.
- findViewById(R.id.activity_root_view).setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ findViewById(R.id.activity_root_view)
+ .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
mPanoramaViewHelper.onResume();
}
@@ -1312,9 +1336,19 @@
if (mSecureCamera) {
unregisterReceiver(mScreenOffReceiver);
}
+ mActionBar.removeOnMenuVisibilityListener(this);
mSettingsManager.removeAllListeners();
+ mCameraController.removeCallbackReceiver();
getContentResolver().unregisterContentObserver(mLocalImagesObserver);
getContentResolver().unregisterContentObserver(mLocalVideosObserver);
+ getServices().getCaptureSessionManager().removeSessionListener(mSessionListener);
+ mCameraAppUI.onDestroy();
+ mCameraController = null;
+ mSettingsManager = null;
+ mSettingsController = null;
+ mCameraAppUI = null;
+ mOrientationManager = null;
+ mButtonManager = null;
super.onDestroy();
}
@@ -1399,7 +1433,7 @@
if (message != null) {
if (mStorageHint == null) {
- mStorageHint = OnScreenHint.makeText(this, message);
+ mStorageHint = OnScreenHint.makeText(mAppContext, message);
} else {
mStorageHint.setText(message);
}
@@ -1509,7 +1543,8 @@
mCurrentModule.onOrientationChanged(mLastRawOrientation);
// Store the module index so we can use it the next time the Camera
// starts up.
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(mAppContext);
prefs.edit().putInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, modeIndex).apply();
}
@@ -1517,7 +1552,7 @@
// Temporary until we finalize the touch flow.
LayoutInflater inflater = getLayoutInflater();
SettingsView settingsView = (SettingsView) inflater.inflate(R.layout.settings_list_layout,
- null, false);
+ null, false);
if (mSettingsController != null) {
settingsView.setController(mSettingsController);
}
@@ -1545,7 +1580,7 @@
mCameraController.closeCamera();
}
mCurrentModeIndex = agent.getModuleId();
- mCurrentModule = (CameraModule) agent.createModule(this);
+ mCurrentModule = (CameraModule) agent.createModule(this);
}
@Override
@@ -1568,7 +1603,7 @@
List<String> supported = new ArrayList<String>();
for (Integer modeIndex : indices) {
- String name = CameraUtil.getCameraModeText(modeIndex, this);
+ String name = CameraUtil.getCameraModeText(modeIndex, mAppContext);
if (name != null && !name.equals("")) {
supported.add(name);
}
@@ -1585,11 +1620,11 @@
}
/**
- * Creates an AlertDialog appropriate for choosing whether to enable location
- * on the first run of the app.
+ * Creates an AlertDialog appropriate for choosing whether to enable
+ * location on the first run of the app.
*/
public AlertDialog getFirstTimeLocationAlert() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ AlertDialog.Builder builder = new AlertDialog.Builder(mAppContext);
builder = SettingsView.getFirstTimeLocationAlertBuilder(builder, mSettingsController);
if (builder != null) {
return builder.create();
@@ -1626,7 +1661,7 @@
@Override
public boolean onContextItemSelected(MenuItem item) {
- switch(item.getItemId()) {
+ switch (item.getItemId()) {
case R.id.tiny_planet_editor:
mMyFilmstripBottomControlListener.onTinyPlanet();
return true;
@@ -1641,8 +1676,8 @@
* Launch the tiny planet editor.
*
* @param data The data must be a 360 degree stereographically mapped
- * panoramic image. It will not be modified, instead a new item
- * with the result will be added to the filmstrip.
+ * panoramic image. It will not be modified, instead a new item
+ * with the result will be added to the filmstrip.
*/
public void launchTinyPlanetEditor(LocalData data) {
TinyPlanetFragment fragment = new TinyPlanetFragment();
@@ -1671,7 +1706,7 @@
// TODO: once all modules have a bottom bar, remove
// isUsingBottomBar check.
if (mCurrentModule.isUsingBottomBar()) {
- int shutterIconId = CameraUtil.getCameraShutterIconId(mCurrentModeIndex, this);
+ int shutterIconId = CameraUtil.getCameraShutterIconId(mCurrentModeIndex, mAppContext);
mCameraAppUI.setBottomBarShutterIcon(shutterIconId);
}
}
@@ -1793,9 +1828,9 @@
public void setSwipingEnabled(boolean enable) {
// TODO: Bring back the functionality.
if (isCaptureIntent()) {
- //lockPreview(true);
+ // lockPreview(true);
} else {
- //lockPreview(!enable);
+ // lockPreview(!enable);
}
}
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index e228d5c..68fc2a8 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -82,6 +82,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Vector;
@@ -119,7 +120,6 @@
private static final String DEBUG_IMAGE_PREFIX = "DEBUG_";
- // copied from Camera hierarchy
private CameraActivity mActivity;
private CameraProxy mCameraDevice;
private int mCameraId;
@@ -238,7 +238,7 @@
private String mSceneMode;
- private final Handler mHandler = new MainHandler();
+ private final Handler mHandler = new MainHandler(this);
private boolean mQuickCapture;
private SensorManager mSensorManager;
@@ -286,31 +286,38 @@
* This Handler is used to post message back onto the main thread of the
* application
*/
- private class MainHandler extends Handler {
- public MainHandler() {
+ private static class MainHandler extends Handler {
+ private final WeakReference<PhotoModule> mModule;
+
+ public MainHandler(PhotoModule module) {
super(Looper.getMainLooper());
+ mModule = new WeakReference<PhotoModule>(module);
}
@Override
public void handleMessage(Message msg) {
+ PhotoModule module = mModule.get();
+ if (module == null) {
+ return;
+ }
switch (msg.what) {
case MSG_FIRST_TIME_INIT: {
- initializeFirstTime();
+ module.initializeFirstTime();
break;
}
case MSG_SET_CAMERA_PARAMETERS_WHEN_IDLE: {
- setCameraParametersWhenIdle(0);
+ module.setCameraParametersWhenIdle(0);
break;
}
case MSG_SHOW_TAP_TO_FOCUS_TOAST: {
- showTapToFocusToast();
+ module.showTapToFocusToast();
break;
}
case MSG_SWITCH_TO_GCAM_MODULE: {
- mActivity.onModeSelected(mGcamModeIndex);
+ module.mActivity.onModeSelected(module.mGcamModeIndex);
}
}
}
@@ -327,13 +334,16 @@
.getInteger(R.integer.camera_mode_refocus);
}
-
@Override
- public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
- mActivity = (CameraActivity) app.getAndroidContext();
- mUI = new PhotoUI(mActivity, this, app.getModuleLayoutRoot());
- app.setPreviewStatusListener(mUI);
- app.getCameraAppUI().setBottomBarShutterListener(this);
+ public void init(CameraActivity activity, boolean isSecureCamera, boolean isCaptureIntent) {
+ mActivity = activity;
+ // TODO: Need to look at the controller interface to see if we can get
+ // rid of passing in the activity directly.
+ mAppController = mActivity;
+
+ mUI = new PhotoUI(mActivity, this, mActivity.getModuleLayoutRoot());
+ mActivity.setPreviewStatusListener(mUI);
+ mActivity.getCameraAppUI().setBottomBarShutterListener(this);
SettingsManager settingsManager = mActivity.getSettingsManager();
mCameraId = Integer.parseInt(settingsManager.get(SettingsManager.SETTING_CAMERA_ID));
@@ -349,7 +359,6 @@
mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false);
mLocationManager = mActivity.getLocationManager();
mSensorManager = (SensorManager) (mActivity.getSystemService(Context.SENSOR_SERVICE));
- mAppController = app;
}
@Override
@@ -520,9 +529,9 @@
bottomBarSpec.cameraCallback = mCameraCallback;
bottomBarSpec.enableFlash = true;
- if (mActivity.getCurrentModuleIndex() ==
- mActivity.getResources().getInteger(R.integer.camera_mode_photo)) {
- bottomBarSpec.hideHdr= true;
+ if (mActivity.getCurrentModuleIndex() == mActivity.getResources()
+ .getInteger(R.integer.camera_mode_photo)) {
+ bottomBarSpec.hideHdr = true;
bottomBarSpec.hideRefocus = true;
} else {
bottomBarSpec.enableHdr = true;
@@ -1208,8 +1217,8 @@
}
/**
- * The focus manager is the first UI related element to get initialized,
- * and it requires the RenderOverlay, so initialize it here
+ * 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.
@@ -1234,7 +1243,8 @@
public void resume() {
mPaused = false;
if (mFocusManager != null) {
- // If camera is not open when resume is called, focus manager will not
+ // If camera is not open when resume is called, focus manager will
+ // not
// be initialized yet, in which case it will start listening to
// preview area size change later in the initialization.
mAppController.addPreviewAreaSizeChangedListener(mFocusManager);
@@ -1530,9 +1540,9 @@
mCameraDevice.setPreviewTexture(mUI.getSurfaceTexture());
// This is to notify app controller that preview will start next, so app
- // controller can set preview callbacks if needed. This has to happen before
- // preview is started as a workaround of the framework bug related to preview
- // callbacks at b/12591410.
+ // controller can set preview callbacks if needed. This has to happen
+ // before preview is started as a workaround of the framework bug related to
+ // preview callbacks at b/12591410.
mAppController.onPreviewReadyToStart();
Log.v(TAG, "startPreview");
mCameraDevice.startPreview();
@@ -1774,7 +1784,7 @@
// Set white balance parameter.
String whiteBalance = settingsManager.get(SettingsManager.SETTING_WHITE_BALANCE);
if (CameraUtil.isSupported(whiteBalance,
- mParameters.getSupportedWhiteBalance())) {
+ mParameters.getSupportedWhiteBalance())) {
mParameters.setWhiteBalance(whiteBalance);
}
}
@@ -1833,14 +1843,14 @@
return (mCameraState == IDLE) ||
(mCameraState == PREVIEW_STOPPED) ||
((mFocusManager != null) && mFocusManager.isFocusCompleted()
- && (mCameraState != SWITCHING_CAMERA));
+ && (mCameraState != SWITCHING_CAMERA));
}
@Override
public boolean isImageCaptureIntent() {
String action = mActivity.getIntent().getAction();
return (MediaStore.ACTION_IMAGE_CAPTURE.equals(action)
- || CameraActivity.ACTION_IMAGE_CAPTURE_SECURE.equals(action));
+ || CameraActivity.ACTION_IMAGE_CAPTURE_SECURE.equals(action));
}
private void setupCaptureParams() {
@@ -1869,7 +1879,7 @@
// Clear the preference.
SettingsManager settingsManager = mActivity.getSettingsManager();
settingsManager.setBoolean(
- SettingsManager.SETTING_CAMERA_FIRST_USE_HINT_SHOWN, false);
+ SettingsManager.SETTING_CAMERA_FIRST_USE_HINT_SHOWN, false);
}
private void initializeCapabilities() {
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 069a154..f3e85ad 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -323,11 +323,14 @@
@Override
- public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent) {
- mActivity = (CameraActivity) app.getAndroidContext();
- mUI = new VideoUI(mActivity, this, app.getModuleLayoutRoot());
- app.setPreviewStatusListener(mUI);
- app.getCameraAppUI().setBottomBarShutterListener(this);
+ public void init(CameraActivity activity, boolean isSecureCamera, boolean isCaptureIntent) {
+ mActivity = activity;
+ // TODO: Need to look at the controller interface to see if we can get
+ // rid of passing in the activity directly.
+ mAppController = mActivity;
+ mUI = new VideoUI(mActivity, this, mActivity.getModuleLayoutRoot());
+ mActivity.setPreviewStatusListener(mUI);
+ mActivity.getCameraAppUI().setBottomBarShutterListener(this);
SettingsManager settingsManager = mActivity.getSettingsManager();
mCameraId = Integer.parseInt(settingsManager.get(SettingsManager.SETTING_CAMERA_ID));
@@ -353,7 +356,6 @@
mUI.showTimeLapseUI(mCaptureTimeLapse);
mPendingSwitchCameraId = -1;
- mAppController = app;
mShutterIconId = CameraUtil.getCameraShutterIconId(
mAppController.getCurrentModuleIndex(), mAppController.getAndroidContext());
@@ -449,7 +451,9 @@
// We keep the last known orientation. So if the user first orient
// the camera then point the camera to floor or sky, we still have
// the correct orientation.
- if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) return;
+ if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
+ return;
+ }
int newOrientation = CameraUtil.roundOrientation(orientation, mOrientation);
if (mOrientation != newOrientation) {
@@ -691,7 +695,9 @@
mTimeBetweenTimeLapseFrameCaptureMs = Integer.parseInt(frameIntervalStr);
mCaptureTimeLapse = (mTimeBetweenTimeLapseFrameCaptureMs != 0);
// TODO: This should be checked instead directly +1000.
- if (mCaptureTimeLapse) quality += 1000;
+ if (mCaptureTimeLapse) {
+ quality += 1000;
+ }
// If quality is not supported, request QUALITY_HIGH which is always supported.
if (CamcorderProfile.hasProfile(mCameraId, quality) == false) {
@@ -761,7 +767,9 @@
@Override
public void updateCameraOrientation() {
- if (mMediaRecorderRecording) return;
+ if (mMediaRecorderRecording) {
+ return;
+ }
if (mDisplayRotation != CameraUtil.getDisplayRotation(mActivity)) {
setDisplayOrientation();
}
@@ -775,14 +783,20 @@
@Override
public int onZoomChanged(int index) {
// Not useful to change zoom value when the activity is paused.
- if (mPaused) return index;
+ if (mPaused) {
+ return index;
+ }
mZoomValue = index;
- if (mParameters == null || mCameraDevice == null) return index;
+ if (mParameters == null || mCameraDevice == null) {
+ return index;
+ }
// Set zoom parameters asynchronously
mParameters.setZoom(mZoomValue);
mCameraDevice.setParameters(mParameters);
Parameters p = mCameraDevice.getParameters();
- if (p != null) return p.getZoom();
+ if (p != null) {
+ return p.getZoom();
+ }
return index;
}
@@ -840,7 +854,9 @@
@Override
public void stopPreview() {
- if (!mPreviewing) return;
+ if (!mPreviewing) {
+ return;
+ }
mCameraDevice.stopPreview();
if (mFocusManager != null) {
mFocusManager.onPreviewStopped();
@@ -873,7 +889,9 @@
@Override
public boolean onBackPressed() {
- if (mPaused) return true;
+ if (mPaused) {
+ return true;
+ }
if (mMediaRecorderRecording) {
onStopVideoRecording();
return true;
@@ -903,7 +921,9 @@
}
break;
case KeyEvent.KEYCODE_MENU:
- if (mMediaRecorderRecording) return true;
+ if (mMediaRecorderRecording) {
+ return true;
+ }
break;
}
return false;
@@ -974,7 +994,9 @@
private void initializeRecorder() {
Log.v(TAG, "initializeRecorder");
// If the mCameraDevice is null, then this activity is going to finish
- if (mCameraDevice == null) return;
+ if (mCameraDevice == null) {
+ return;
+ }
if (!ApiHelper.HAS_SURFACE_TEXTURE_RECORDING) {
// Set the SurfaceView to visible so the surface gets created.
@@ -1181,9 +1203,13 @@
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
- if (mMediaRecorderRecording) onStopVideoRecording();
+ if (mMediaRecorderRecording) {
+ onStopVideoRecording();
+ }
} else if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) {
- if (mMediaRecorderRecording) onStopVideoRecording();
+ if (mMediaRecorderRecording) {
+ onStopVideoRecording();
+ }
// Show the toast.
Toast.makeText(mActivity, R.string.video_reach_size_limit,
@@ -1329,7 +1355,9 @@
.video_recording_stopped));
} catch (RuntimeException e) {
Log.e(TAG, "stop fail", e);
- if (mVideoFilename != null) deleteVideoFile(mVideoFilename);
+ if (mVideoFilename != null) {
+ deleteVideoFile(mVideoFilename);
+ }
fail = true;
}
mMediaRecorderRecording = false;
@@ -1370,7 +1398,9 @@
}
// Update the parameters here because the parameters might have been altered
// by MediaRecorder.
- if (!mPaused) mParameters = mCameraDevice.getParameters();
+ if (!mPaused) {
+ mParameters = mCameraDevice.getParameters();
+ }
return fail;
}
@@ -1639,7 +1669,9 @@
mReceiver = null;
}
- if (mLocationManager != null) mLocationManager.recordLocation(false);
+ if (mLocationManager != null) {
+ mLocationManager.recordLocation(false);
+ }
mHandler.removeMessages(MSG_CHECK_DISPLAY_ROTATION);
mHandler.removeMessages(MSG_SWITCH_CAMERA);
@@ -1704,11 +1736,15 @@
}
private void initializeVideoSnapshot() {
- if (mParameters == null) return;
+ if (mParameters == null) {
+ return;
+ }
}
void showVideoSnapshotUI(boolean enabled) {
- if (mParameters == null) return;
+ if (mParameters == null) {
+ return;
+ }
if (CameraUtil.isVideoSnapshotSupported(mParameters) && !mIsVideoCaptureIntent) {
if (enabled) {
mUI.animateFlash();
diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java
index 2ab2817..d89b8db 100644
--- a/src/com/android/camera/app/CameraAppUI.java
+++ b/src/com/android/camera/app/CameraAppUI.java
@@ -16,7 +16,6 @@
package com.android.camera.app;
-import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.SurfaceTexture;
@@ -546,6 +545,12 @@
mSwipeEnabled = enabled;
}
+ public void onDestroy() {
+ ((DisplayManager) mController.getAndroidContext()
+ .getSystemService(Context.DISPLAY_SERVICE))
+ .unregisterDisplayListener(mDisplayListener);
+ }
+
/**
* Initializes the display listener to listen to display changes such as
* 180-degree rotation change, which will not have an onConfigurationChanged
@@ -553,8 +558,7 @@
*/
private void initDisplayListener() {
if (ApiHelper.HAS_DISPLAY_LISTENER) {
- mLastRotation = CameraUtil.getDisplayRotation(
- (Activity) mController.getAndroidContext());
+ mLastRotation = CameraUtil.getDisplayRotation(mController.getAndroidContext());
mDisplayListener = new DisplayManager.DisplayListener() {
@Override
@@ -565,7 +569,7 @@
@Override
public void onDisplayChanged(int displayId) {
int rotation = CameraUtil.getDisplayRotation(
- (Activity) mController.getAndroidContext());
+ mController.getAndroidContext());
if ((rotation - mLastRotation + 360) % 360 == 180
&& mPreviewStatusListener != null) {
mPreviewStatusListener.onPreviewFlipped();
diff --git a/src/com/android/camera/app/CameraController.java b/src/com/android/camera/app/CameraController.java
index 4773f88..cbd10f8 100644
--- a/src/com/android/camera/app/CameraController.java
+++ b/src/com/android/camera/app/CameraController.java
@@ -31,9 +31,9 @@
*/
public class CameraController implements CameraManager.CameraOpenCallback, CameraProvider {
private final String TAG = "CameraController";
- private Context mContext;
+ private final Context mContext;
private CameraManager.CameraOpenCallback mCallbackReceiver;
- private Handler mCallbackHandler;
+ private final Handler mCallbackHandler;
private final CameraManager mCameraManager;
private final Camera.CameraInfo[] mCameraInfos;
private final int mNumberOfCameras;
@@ -173,6 +173,10 @@
}
}
+ public void removeCallbackReceiver() {
+ mCallbackReceiver = null;
+ }
+
/**
* Closes the opened camera device.
* TODO: Make this method package private.
diff --git a/src/com/android/camera/app/OrientationManagerImpl.java b/src/com/android/camera/app/OrientationManagerImpl.java
index 86b3e64..29c37bb 100644
--- a/src/com/android/camera/app/OrientationManagerImpl.java
+++ b/src/com/android/camera/app/OrientationManagerImpl.java
@@ -132,7 +132,9 @@
@Override
public void lockOrientation() {
- if (mOrientationLocked || mRotationLockedSetting) return;
+ if (mOrientationLocked || mRotationLockedSetting) {
+ return;
+ }
mOrientationLocked = true;
if (ApiHelper.HAS_ORIENTATION_LOCK) {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
@@ -143,7 +145,9 @@
@Override
public void unlockOrientation() {
- if (!mOrientationLocked || mRotationLockedSetting) return;
+ if (!mOrientationLocked || mRotationLockedSetting) {
+ return;
+ }
mOrientationLocked = false;
Log.d(TAG, "unlock orientation");
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
@@ -183,7 +187,9 @@
// We keep the last known orientation. So if the user first orient
// the camera then point the camera to floor or sky, we still have
// the correct orientation.
- if (orientation == ORIENTATION_UNKNOWN) return;
+ if (orientation == ORIENTATION_UNKNOWN) {
+ return;
+ }
final int roundedOrientation = roundOrientation(orientation, 0);
for (OrientationChangeCallback l : mListeners) {
diff --git a/src/com/android/camera/module/ModuleController.java b/src/com/android/camera/module/ModuleController.java
index e126ad8..36fe05d 100644
--- a/src/com/android/camera/module/ModuleController.java
+++ b/src/com/android/camera/module/ModuleController.java
@@ -16,10 +16,7 @@
package com.android.camera.module;
-import android.content.res.Configuration;
-
-import com.android.camera.ButtonManager;
-import com.android.camera.app.AppController;
+import com.android.camera.CameraActivity;
import com.android.camera.app.CameraAppUI.BottomBarUISpec;
import com.android.camera.app.CameraManager;
import com.android.camera.hardware.HardwareSpec;
@@ -34,11 +31,11 @@
/**
* Initializes the module.
*
- * @param app The app which initializes this module.
+ * @param activity The camera activity.
* @param isSecureCamera Whether the app is in secure camera mode.
* @param isCaptureIntent Whether the app is in capture intent mode.
*/
- public void init(AppController app, boolean isSecureCamera, boolean isCaptureIntent);
+ public void init(CameraActivity activity, boolean isSecureCamera, boolean isCaptureIntent);
/**
* Resumes the module. Always call this method whenever it's being put in
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 0e1cd96..fc324af 100644
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -301,7 +301,9 @@
}
public static void closeSilently(Closeable c) {
- if (c == null) return;
+ if (c == null) {
+ return;
+ }
try {
c.close();
} catch (Throwable t) {
@@ -344,7 +346,9 @@
}
public static <T> T checkNotNull(T object) {
- if (object == null) throw new NullPointerException();
+ if (object == null) {
+ throw new NullPointerException();
+ }
return object;
}
@@ -369,19 +373,29 @@
}
public static int clamp(int x, int min, int max) {
- if (x > max) return max;
- if (x < min) return min;
+ if (x > max) {
+ return max;
+ }
+ if (x < min) {
+ return min;
+ }
return x;
}
public static float clamp(float x, float min, float max) {
- if (x > max) return max;
- if (x < min) return min;
+ if (x > max) {
+ return max;
+ }
+ if (x < min) {
+ return min;
+ }
return x;
}
- public static int getDisplayRotation(Activity activity) {
- int rotation = activity.getWindowManager().getDefaultDisplay()
+ public static int getDisplayRotation(Context context) {
+ WindowManager windowManager = (WindowManager) context
+ .getSystemService(Context.WINDOW_SERVICE);
+ int rotation = windowManager.getDefaultDisplay()
.getRotation();
switch (rotation) {
case Surface.ROTATION_0: return 0;
@@ -450,8 +464,10 @@
return orientationHistory;
}
- private static Point getDefaultDisplaySize(Activity activity, Point size) {
- activity.getWindowManager().getDefaultDisplay().getSize(size);
+ private static Point getDefaultDisplaySize(Context context, Point size) {
+ WindowManager windowManager = (WindowManager) context
+ .getSystemService(Context.WINDOW_SERVICE);
+ windowManager.getDefaultDisplay().getSize(size);
return size;
}
@@ -469,11 +485,13 @@
return (optimalPickIndex == -1) ? null : sizes.get(optimalPickIndex);
}
- public static int getOptimalPreviewSize(Activity currentActivity,
+ public static int getOptimalPreviewSize(Context context,
Point[] sizes, double targetRatio) {
// Use a very small tolerance because we want an exact match.
final double ASPECT_TOLERANCE = 0.01;
- if (sizes == null) return -1;
+ if (sizes == null) {
+ return -1;
+ }
int optimalSizeIndex = -1;
double minDiff = Double.MAX_VALUE;
@@ -483,13 +501,15 @@
// wrong size of preview surface. When we change the preview size, the
// new overlay will be created before the old one closed, which causes
// an exception. For now, just get the screen size.
- Point point = getDefaultDisplaySize(currentActivity, new Point());
+ Point point = getDefaultDisplaySize(context, new Point());
int targetHeight = Math.min(point.x, point.y);
// Try to find an size match aspect ratio and size
for (int i = 0; i < sizes.length; i++) {
Point size = sizes[i];
double ratio = (double) size.x / size.y;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
+ continue;
+ }
if (Math.abs(size.y - targetHeight) < minDiff) {
optimalSizeIndex = i;
minDiff = Math.abs(size.y - targetHeight);
@@ -516,14 +536,18 @@
List<Size> sizes, double targetRatio) {
// Use a very small tolerance because we want an exact match.
final double ASPECT_TOLERANCE = 0.001;
- if (sizes == null) return null;
+ if (sizes == null) {
+ return null;
+ }
Size optimalSize = null;
// Try to find a size matches aspect ratio and has the largest width
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
+ continue;
+ }
if (optimalSize == null || size.width > optimalSize.width) {
optimalSize = size;
}
@@ -633,7 +657,9 @@
}
public static boolean isUriValid(Uri uri, ContentResolver resolver) {
- if (uri == null) return false;
+ if (uri == null) {
+ return false;
+ }
try {
ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
@@ -710,7 +736,9 @@
}
public static void fadeIn(View view, float startAlpha, float endAlpha, long duration) {
- if (view.getVisibility() == View.VISIBLE) return;
+ if (view.getVisibility() == View.VISIBLE) {
+ return;
+ }
view.setVisibility(View.VISIBLE);
Animation animation = new AlphaAnimation(startAlpha, endAlpha);
@@ -726,7 +754,9 @@
}
public static void fadeOut(View view) {
- if (view.getVisibility() != View.VISIBLE) return;
+ if (view.getVisibility() != View.VISIBLE) {
+ return;
+ }
// Since the button is still clickable before fade-out animation
// ends, we disable the button first to block click.
diff --git a/src_pd/com/android/camera/app/LocationManager.java b/src_pd/com/android/camera/app/LocationManager.java
index 5f3690d..93ee3df 100644
--- a/src_pd/com/android/camera/app/LocationManager.java
+++ b/src_pd/com/android/camera/app/LocationManager.java
@@ -16,14 +16,10 @@
package com.android.camera.app;
-import android.app.Activity;
import android.content.Context;
import android.location.Location;
-import android.os.Bundle;
import android.util.Log;
-import com.android.camera.app.LegacyLocationProvider;
-
/**
* A class to select the best available location provider (fused location
* provider, or network/gps if the fused location provider is unavailable)
@@ -34,9 +30,9 @@
LocationProvider mLocationProvider;
private boolean mRecordLocation;
- public LocationManager(Activity activity) {
+ public LocationManager(Context context) {
Log.d(TAG, "Using legacy location provider.");
- LegacyLocationProvider llp = new LegacyLocationProvider(activity);
+ LegacyLocationProvider llp = new LegacyLocationProvider(context);
mLocationProvider = llp;
}