summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/app/PhotoPage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/app/PhotoPage.java')
-rw-r--r--src/com/android/gallery3d/app/PhotoPage.java1571
1 files changed, 0 insertions, 1571 deletions
diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java
deleted file mode 100644
index 7a71e9109..000000000
--- a/src/com/android/gallery3d/app/PhotoPage.java
+++ /dev/null
@@ -1,1571 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.app;
-
-import android.annotation.TargetApi;
-import android.app.ActionBar.OnMenuVisibilityListener;
-import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.net.Uri;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcAdapter.CreateBeamUrisCallback;
-import android.nfc.NfcEvent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.RelativeLayout;
-import android.widget.ShareActionProvider;
-import android.widget.Toast;
-
-import com.android.camera.CameraActivity;
-import com.android.camera.ProxyLauncher;
-import com.android.gallery3d.R;
-import com.android.gallery3d.common.ApiHelper;
-import com.android.gallery3d.data.ComboAlbum;
-import com.android.gallery3d.data.DataManager;
-import com.android.gallery3d.data.FilterDeleteSet;
-import com.android.gallery3d.data.FilterSource;
-import com.android.gallery3d.data.LocalImage;
-import com.android.gallery3d.data.MediaDetails;
-import com.android.gallery3d.data.MediaItem;
-import com.android.gallery3d.data.MediaObject;
-import com.android.gallery3d.data.MediaObject.PanoramaSupportCallback;
-import com.android.gallery3d.data.MediaSet;
-import com.android.gallery3d.data.Path;
-import com.android.gallery3d.data.SecureAlbum;
-import com.android.gallery3d.data.SecureSource;
-import com.android.gallery3d.data.SnailAlbum;
-import com.android.gallery3d.data.SnailItem;
-import com.android.gallery3d.data.SnailSource;
-import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.crop.CropActivity;
-import com.android.gallery3d.picasasource.PicasaSource;
-import com.android.gallery3d.ui.DetailsHelper;
-import com.android.gallery3d.ui.DetailsHelper.CloseListener;
-import com.android.gallery3d.ui.DetailsHelper.DetailsSource;
-import com.android.gallery3d.ui.GLView;
-import com.android.gallery3d.ui.MenuExecutor;
-import com.android.gallery3d.ui.PhotoView;
-import com.android.gallery3d.ui.SelectionManager;
-import com.android.gallery3d.ui.SynchronizedHandler;
-import com.android.gallery3d.util.GalleryUtils;
-import com.android.gallery3d.util.UsageStatistics;
-
-public abstract class PhotoPage extends ActivityState implements
- PhotoView.Listener, AppBridge.Server, ShareActionProvider.OnShareTargetSelectedListener,
- PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener {
- private static final String TAG = "PhotoPage";
-
- private static final int MSG_HIDE_BARS = 1;
- private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
- private static final int MSG_UPDATE_ACTION_BAR = 5;
- private static final int MSG_UNFREEZE_GLROOT = 6;
- private static final int MSG_WANT_BARS = 7;
- private static final int MSG_REFRESH_BOTTOM_CONTROLS = 8;
- private static final int MSG_ON_CAMERA_CENTER = 9;
- private static final int MSG_ON_PICTURE_CENTER = 10;
- private static final int MSG_REFRESH_IMAGE = 11;
- private static final int MSG_UPDATE_PHOTO_UI = 12;
- private static final int MSG_UPDATE_PROGRESS = 13;
- private static final int MSG_UPDATE_DEFERRED = 14;
- private static final int MSG_UPDATE_SHARE_URI = 15;
- private static final int MSG_UPDATE_PANORAMA_UI = 16;
-
- private static final int HIDE_BARS_TIMEOUT = 3500;
- private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
-
- private static final int REQUEST_SLIDESHOW = 1;
- private static final int REQUEST_CROP = 2;
- private static final int REQUEST_CROP_PICASA = 3;
- private static final int REQUEST_EDIT = 4;
- private static final int REQUEST_PLAY_VIDEO = 5;
- private static final int REQUEST_TRIM = 6;
-
- public static final String KEY_MEDIA_SET_PATH = "media-set-path";
- public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
- public static final String KEY_INDEX_HINT = "index-hint";
- public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
- public static final String KEY_APP_BRIDGE = "app-bridge";
- public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up";
- public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip";
- public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
- public static final String KEY_SHOW_WHEN_LOCKED = "show_when_locked";
- public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll";
-
- public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
- public static final int MSG_ALBUMPAGE_NONE = 0;
- public static final int MSG_ALBUMPAGE_STARTED = 1;
- public static final int MSG_ALBUMPAGE_RESUMED = 2;
- public static final int MSG_ALBUMPAGE_PICKED = 4;
-
- public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
- public static final String ACTION_SIMPLE_EDIT = "action_simple_edit";
-
- private GalleryApp mApplication;
- private SelectionManager mSelectionManager;
-
- private PhotoView mPhotoView;
- private PhotoPage.Model mModel;
- private DetailsHelper mDetailsHelper;
- private boolean mShowDetails;
-
- // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
- // E.g., viewing a photo in gmail attachment
- private FilterDeleteSet mMediaSet;
-
- // The mediaset used by camera launched from secure lock screen.
- private SecureAlbum mSecureAlbum;
-
- private int mCurrentIndex = 0;
- private Handler mHandler;
- private boolean mShowBars = true;
- private volatile boolean mActionBarAllowed = true;
- private GalleryActionBar mActionBar;
- private boolean mIsMenuVisible;
- private boolean mHaveImageEditor;
- private PhotoPageBottomControls mBottomControls;
- private PhotoPageProgressBar mProgressBar;
- private MediaItem mCurrentPhoto = null;
- private MenuExecutor mMenuExecutor;
- private boolean mIsActive;
- private boolean mShowSpinner;
- private String mSetPathString;
- // This is the original mSetPathString before adding the camera preview item.
- private String mOriginalSetPathString;
- private AppBridge mAppBridge;
- private SnailItem mScreenNailItem;
- private SnailAlbum mScreenNailSet;
- private OrientationManager mOrientationManager;
- private boolean mTreatBackAsUp;
- private boolean mStartInFilmstrip;
- private boolean mHasCameraScreennailOrPlaceholder = false;
- private boolean mRecenterCameraOnResume = true;
-
- // These are only valid after the panorama callback
- private boolean mIsPanorama;
- private boolean mIsPanorama360;
-
- private long mCameraSwitchCutoff = 0;
- private boolean mSkipUpdateCurrentPhoto = false;
- private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300;
-
- private static final long DEFERRED_UPDATE_MS = 250;
- private boolean mDeferredUpdateWaiting = false;
- private long mDeferUpdateUntil = Long.MAX_VALUE;
-
- // The item that is deleted (but it can still be undeleted before commiting)
- private Path mDeletePath;
- private boolean mDeleteIsFocus; // whether the deleted item was in focus
-
- private Uri[] mNfcPushUris = new Uri[1];
-
- private final MyMenuVisibilityListener mMenuVisibilityListener =
- new MyMenuVisibilityListener();
- private UpdateProgressListener mProgressListener;
-
- private final PanoramaSupportCallback mUpdatePanoramaMenuItemsCallback = new PanoramaSupportCallback() {
- @Override
- public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
- boolean isPanorama360) {
- if (mediaObject == mCurrentPhoto) {
- mHandler.obtainMessage(MSG_UPDATE_PANORAMA_UI, isPanorama360 ? 1 : 0, 0,
- mediaObject).sendToTarget();
- }
- }
- };
-
- private final PanoramaSupportCallback mRefreshBottomControlsCallback = new PanoramaSupportCallback() {
- @Override
- public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
- boolean isPanorama360) {
- if (mediaObject == mCurrentPhoto) {
- mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, isPanorama ? 1 : 0, isPanorama360 ? 1 : 0,
- mediaObject).sendToTarget();
- }
- }
- };
-
- private final PanoramaSupportCallback mUpdateShareURICallback = new PanoramaSupportCallback() {
- @Override
- public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
- boolean isPanorama360) {
- if (mediaObject == mCurrentPhoto) {
- mHandler.obtainMessage(MSG_UPDATE_SHARE_URI, isPanorama360 ? 1 : 0, 0, mediaObject)
- .sendToTarget();
- }
- }
- };
-
- public static interface Model extends PhotoView.Model {
- public void resume();
- public void pause();
- public boolean isEmpty();
- public void setCurrentPhoto(Path path, int indexHint);
- }
-
- private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
- @Override
- public void onMenuVisibilityChanged(boolean isVisible) {
- mIsMenuVisible = isVisible;
- refreshHidingMessage();
- }
- }
-
- private class UpdateProgressListener implements StitchingChangeListener {
-
- @Override
- public void onStitchingResult(Uri uri) {
- sendUpdate(uri, MSG_REFRESH_IMAGE);
- }
-
- @Override
- public void onStitchingQueued(Uri uri) {
- sendUpdate(uri, MSG_UPDATE_PROGRESS);
- }
-
- @Override
- public void onStitchingProgress(Uri uri, final int progress) {
- sendUpdate(uri, MSG_UPDATE_PROGRESS);
- }
-
- private void sendUpdate(Uri uri, int message) {
- MediaObject currentPhoto = mCurrentPhoto;
- boolean isCurrentPhoto = currentPhoto instanceof LocalImage
- && currentPhoto.getContentUri().equals(uri);
- if (isCurrentPhoto) {
- mHandler.sendEmptyMessage(message);
- }
- }
- };
-
- @Override
- protected int getBackgroundColorId() {
- return R.color.photo_background;
- }
-
- private final GLView mRootPane = new GLView() {
- @Override
- protected void onLayout(
- boolean changed, int left, int top, int right, int bottom) {
- mPhotoView.layout(0, 0, right - left, bottom - top);
- if (mShowDetails) {
- mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
- }
- }
- };
-
- @Override
- public void onCreate(Bundle data, Bundle restoreState) {
- super.onCreate(data, restoreState);
- mActionBar = mActivity.getGalleryActionBar();
- mSelectionManager = new SelectionManager(mActivity, false);
- mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
-
- mPhotoView = new PhotoView(mActivity);
- mPhotoView.setListener(this);
- mRootPane.addComponent(mPhotoView);
- mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
- mOrientationManager = mActivity.getOrientationManager();
- mActivity.getGLRoot().setOrientationSource(mOrientationManager);
-
- mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
- @Override
- public void handleMessage(Message message) {
- switch (message.what) {
- case MSG_HIDE_BARS: {
- hideBars();
- break;
- }
- case MSG_REFRESH_BOTTOM_CONTROLS: {
- if (mCurrentPhoto == message.obj && mBottomControls != null) {
- mIsPanorama = message.arg1 == 1;
- mIsPanorama360 = message.arg2 == 1;
- mBottomControls.refresh();
- }
- break;
- }
- case MSG_ON_FULL_SCREEN_CHANGED: {
- if (mAppBridge != null) {
- mAppBridge.onFullScreenChanged(message.arg1 == 1);
- }
- break;
- }
- case MSG_UPDATE_ACTION_BAR: {
- updateBars();
- break;
- }
- case MSG_WANT_BARS: {
- wantBars();
- break;
- }
- case MSG_UNFREEZE_GLROOT: {
- mActivity.getGLRoot().unfreeze();
- break;
- }
- case MSG_UPDATE_DEFERRED: {
- long nextUpdate = mDeferUpdateUntil - SystemClock.uptimeMillis();
- if (nextUpdate <= 0) {
- mDeferredUpdateWaiting = false;
- updateUIForCurrentPhoto();
- } else {
- mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, nextUpdate);
- }
- break;
- }
- case MSG_ON_CAMERA_CENTER: {
- mSkipUpdateCurrentPhoto = false;
- boolean stayedOnCamera = false;
- if (!mPhotoView.getFilmMode()) {
- stayedOnCamera = true;
- } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff &&
- mMediaSet.getMediaItemCount() > 1) {
- mPhotoView.switchToImage(1);
- } else {
- if (mAppBridge != null) mPhotoView.setFilmMode(false);
- stayedOnCamera = true;
- }
-
- if (stayedOnCamera) {
- if (mAppBridge == null && mMediaSet.getTotalMediaItemCount() > 1) {
- launchCamera();
- /* We got here by swiping from photo 1 to the
- placeholder, so make it be the thing that
- is in focus when the user presses back from
- the camera app */
- mPhotoView.switchToImage(1);
- } else {
- updateBars();
- updateCurrentPhoto(mModel.getMediaItem(0));
- }
- }
- break;
- }
- case MSG_ON_PICTURE_CENTER: {
- if (!mPhotoView.getFilmMode() && mCurrentPhoto != null
- && (mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0) {
- mPhotoView.setFilmMode(true);
- }
- break;
- }
- case MSG_REFRESH_IMAGE: {
- final MediaItem photo = mCurrentPhoto;
- mCurrentPhoto = null;
- updateCurrentPhoto(photo);
- break;
- }
- case MSG_UPDATE_PHOTO_UI: {
- updateUIForCurrentPhoto();
- break;
- }
- case MSG_UPDATE_PROGRESS: {
- updateProgressBar();
- break;
- }
- case MSG_UPDATE_SHARE_URI: {
- if (mCurrentPhoto == message.obj) {
- boolean isPanorama360 = message.arg1 != 0;
- Uri contentUri = mCurrentPhoto.getContentUri();
- Intent panoramaIntent = null;
- if (isPanorama360) {
- panoramaIntent = createSharePanoramaIntent(contentUri);
- }
- Intent shareIntent = createShareIntent(mCurrentPhoto);
-
- mActionBar.setShareIntents(panoramaIntent, shareIntent, PhotoPage.this);
- setNfcBeamPushUri(contentUri);
- }
- break;
- }
- case MSG_UPDATE_PANORAMA_UI: {
- if (mCurrentPhoto == message.obj) {
- boolean isPanorama360 = message.arg1 != 0;
- updatePanoramaUI(isPanorama360);
- }
- break;
- }
- default: throw new AssertionError(message.what);
- }
- }
- };
-
- mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
- mOriginalSetPathString = mSetPathString;
- setupNfcBeamPush();
- String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
- Path itemPath = itemPathString != null ?
- Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
- null;
- mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
- mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false);
- boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false);
- mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
- if (mSetPathString != null) {
- mShowSpinner = true;
- mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
- if (mAppBridge != null) {
- mShowBars = false;
- mHasCameraScreennailOrPlaceholder = true;
- mAppBridge.setServer(this);
-
- // Get the ScreenNail from AppBridge and register it.
- int id = SnailSource.newId();
- Path screenNailSetPath = SnailSource.getSetPath(id);
- Path screenNailItemPath = SnailSource.getItemPath(id);
- mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
- .getMediaObject(screenNailSetPath);
- mScreenNailItem = (SnailItem) mActivity.getDataManager()
- .getMediaObject(screenNailItemPath);
- mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
-
- if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
- // Set the flag to be on top of the lock screen.
- mFlags |= FLAG_SHOW_WHEN_LOCKED;
- }
-
- // Don't display "empty album" action item for capture intents.
- if (!mSetPathString.equals("/local/all/0")) {
- // Check if the path is a secure album.
- if (SecureSource.isSecurePath(mSetPathString)) {
- mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
- .getMediaSet(mSetPathString);
- mShowSpinner = false;
- }
- mSetPathString = "/filter/empty/{"+mSetPathString+"}";
- }
-
- // Combine the original MediaSet with the one for ScreenNail
- // from AppBridge.
- mSetPathString = "/combo/item/{" + screenNailSetPath +
- "," + mSetPathString + "}";
-
- // Start from the screen nail.
- itemPath = screenNailItemPath;
- } else if (inCameraRoll && GalleryUtils.isCameraAvailable(mActivity)) {
- mSetPathString = "/combo/item/{" + FilterSource.FILTER_CAMERA_SHORTCUT +
- "," + mSetPathString + "}";
- mCurrentIndex++;
- mHasCameraScreennailOrPlaceholder = true;
- }
-
- MediaSet originalSet = mActivity.getDataManager()
- .getMediaSet(mSetPathString);
- if (mHasCameraScreennailOrPlaceholder && originalSet instanceof ComboAlbum) {
- // Use the name of the camera album rather than the default
- // ComboAlbum behavior
- ((ComboAlbum) originalSet).useNameOfChild(1);
- }
- mSelectionManager.setSourceMediaSet(originalSet);
- mSetPathString = "/filter/delete/{" + mSetPathString + "}";
- mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
- .getMediaSet(mSetPathString);
- if (mMediaSet == null) {
- Log.w(TAG, "failed to restore " + mSetPathString);
- }
- if (itemPath == null) {
- int mediaItemCount = mMediaSet.getMediaItemCount();
- if (mediaItemCount > 0) {
- if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0;
- itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
- .get(0).getPath();
- } else {
- // Bail out, PhotoPage can't load on an empty album
- return;
- }
- }
- PhotoDataAdapter pda = new PhotoDataAdapter(
- mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
- mAppBridge == null ? -1 : 0,
- mAppBridge == null ? false : mAppBridge.isPanorama(),
- mAppBridge == null ? false : mAppBridge.isStaticCamera());
- mModel = pda;
- mPhotoView.setModel(mModel);
-
- pda.setDataListener(new PhotoDataAdapter.DataListener() {
-
- @Override
- public void onPhotoChanged(int index, Path item) {
- int oldIndex = mCurrentIndex;
- mCurrentIndex = index;
-
- if (mHasCameraScreennailOrPlaceholder) {
- if (mCurrentIndex > 0) {
- mSkipUpdateCurrentPhoto = false;
- }
-
- if (oldIndex == 0 && mCurrentIndex > 0
- && !mPhotoView.getFilmMode()) {
- mPhotoView.setFilmMode(true);
- if (mAppBridge != null) {
- UsageStatistics.onEvent("CameraToFilmstrip",
- UsageStatistics.TRANSITION_SWIPE, null);
- }
- } else if (oldIndex == 2 && mCurrentIndex == 1) {
- mCameraSwitchCutoff = SystemClock.uptimeMillis() +
- CAMERA_SWITCH_CUTOFF_THRESHOLD_MS;
- mPhotoView.stopScrolling();
- } else if (oldIndex >= 1 && mCurrentIndex == 0) {
- mPhotoView.setWantPictureCenterCallbacks(true);
- mSkipUpdateCurrentPhoto = true;
- }
- }
- if (!mSkipUpdateCurrentPhoto) {
- if (item != null) {
- MediaItem photo = mModel.getMediaItem(0);
- if (photo != null) updateCurrentPhoto(photo);
- }
- updateBars();
- }
- // Reset the timeout for the bars after a swipe
- refreshHidingMessage();
- }
-
- @Override
- public void onLoadingFinished(boolean loadingFailed) {
- if (!mModel.isEmpty()) {
- MediaItem photo = mModel.getMediaItem(0);
- if (photo != null) updateCurrentPhoto(photo);
- } else if (mIsActive) {
- // We only want to finish the PhotoPage if there is no
- // deletion that the user can undo.
- if (mMediaSet.getNumberOfDeletions() == 0) {
- mActivity.getStateManager().finishState(
- PhotoPage.this);
- }
- }
- }
-
- @Override
- public void onLoadingStarted() {
- }
- });
- } else {
- // Get default media set by the URI
- MediaItem mediaItem = (MediaItem)
- mActivity.getDataManager().getMediaObject(itemPath);
- mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
- mPhotoView.setModel(mModel);
- updateCurrentPhoto(mediaItem);
- mShowSpinner = false;
- }
-
- mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
- RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
- .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
- if (galleryRoot != null) {
- if (mSecureAlbum == null) {
- mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot);
- }
- StitchingProgressManager progressManager = mApplication.getStitchingProgressManager();
- if (progressManager != null) {
- mProgressBar = new PhotoPageProgressBar(mActivity, galleryRoot);
- mProgressListener = new UpdateProgressListener();
- progressManager.addChangeListener(mProgressListener);
- if (mSecureAlbum != null) {
- progressManager.addChangeListener(mSecureAlbum);
- }
- }
- }
- }
-
- @Override
- public void onPictureCenter(boolean isCamera) {
- isCamera = isCamera || (mHasCameraScreennailOrPlaceholder && mAppBridge == null);
- mPhotoView.setWantPictureCenterCallbacks(false);
- mHandler.removeMessages(MSG_ON_CAMERA_CENTER);
- mHandler.removeMessages(MSG_ON_PICTURE_CENTER);
- mHandler.sendEmptyMessage(isCamera ? MSG_ON_CAMERA_CENTER : MSG_ON_PICTURE_CENTER);
- }
-
- @Override
- public boolean canDisplayBottomControls() {
- return mIsActive && !mPhotoView.canUndo();
- }
-
- @Override
- public boolean canDisplayBottomControl(int control) {
- if (mCurrentPhoto == null) {
- return false;
- }
- switch(control) {
- case R.id.photopage_bottom_control_edit:
- return mHaveImageEditor && mShowBars
- && !mPhotoView.getFilmMode()
- && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_EDIT) != 0
- && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE;
- case R.id.photopage_bottom_control_panorama:
- return mIsPanorama;
- case R.id.photopage_bottom_control_tiny_planet:
- return mHaveImageEditor && mShowBars
- && mIsPanorama360 && !mPhotoView.getFilmMode();
- default:
- return false;
- }
- }
-
- @Override
- public void onBottomControlClicked(int control) {
- switch(control) {
- case R.id.photopage_bottom_control_edit:
- launchPhotoEditor();
- return;
- case R.id.photopage_bottom_control_panorama:
- mActivity.getPanoramaViewHelper()
- .showPanorama(mCurrentPhoto.getContentUri());
- return;
- case R.id.photopage_bottom_control_tiny_planet:
- launchTinyPlanet();
- return;
- default:
- return;
- }
- }
-
- @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
- private void setupNfcBeamPush() {
- if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return;
-
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity);
- if (adapter != null) {
- adapter.setBeamPushUris(null, mActivity);
- adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
- @Override
- public Uri[] createBeamUris(NfcEvent event) {
- return mNfcPushUris;
- }
- }, mActivity);
- }
- }
-
- private void setNfcBeamPushUri(Uri uri) {
- mNfcPushUris[0] = uri;
- }
-
- private static Intent createShareIntent(MediaObject mediaObject) {
- int type = mediaObject.getMediaType();
- return new Intent(Intent.ACTION_SEND)
- .setType(MenuExecutor.getMimeType(type))
- .putExtra(Intent.EXTRA_STREAM, mediaObject.getContentUri())
- .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- }
-
- private static Intent createSharePanoramaIntent(Uri contentUri) {
- return new Intent(Intent.ACTION_SEND)
- .setType(GalleryUtils.MIME_TYPE_PANORAMA360)
- .putExtra(Intent.EXTRA_STREAM, contentUri)
- .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- }
-
- private void overrideTransitionToEditor() {
- ((Activity) mActivity).overridePendingTransition(android.R.anim.fade_in,
- android.R.anim.fade_out);
- }
-
- private void launchTinyPlanet() {
- // Deep link into tiny planet
- MediaItem current = mModel.getMediaItem(0);
- Intent intent = new Intent(FilterShowActivity.TINY_PLANET_ACTION);
- intent.setClass(mActivity, FilterShowActivity.class);
- intent.setDataAndType(current.getContentUri(), current.getMimeType())
- .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
- mActivity.isFullscreen());
- mActivity.startActivityForResult(intent, REQUEST_EDIT);
- overrideTransitionToEditor();
- }
-
- private void launchCamera() {
- Intent intent = new Intent(mActivity, CameraActivity.class)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mRecenterCameraOnResume = false;
- mActivity.startActivity(intent);
- }
-
- private void launchPhotoEditor() {
- MediaItem current = mModel.getMediaItem(0);
- if (current == null || (current.getSupportedOperations()
- & MediaObject.SUPPORT_EDIT) == 0) {
- return;
- }
-
- Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
-
- intent.setDataAndType(current.getContentUri(), current.getMimeType())
- .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- if (mActivity.getPackageManager()
- .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
- intent.setAction(Intent.ACTION_EDIT);
- }
- intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
- mActivity.isFullscreen());
- ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
- REQUEST_EDIT);
- overrideTransitionToEditor();
- }
-
- private void launchSimpleEditor() {
- MediaItem current = mModel.getMediaItem(0);
- if (current == null || (current.getSupportedOperations()
- & MediaObject.SUPPORT_EDIT) == 0) {
- return;
- }
-
- Intent intent = new Intent(ACTION_SIMPLE_EDIT);
-
- intent.setDataAndType(current.getContentUri(), current.getMimeType())
- .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- if (mActivity.getPackageManager()
- .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
- intent.setAction(Intent.ACTION_EDIT);
- }
- intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
- mActivity.isFullscreen());
- ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
- REQUEST_EDIT);
- overrideTransitionToEditor();
- }
-
- private void requestDeferredUpdate() {
- mDeferUpdateUntil = SystemClock.uptimeMillis() + DEFERRED_UPDATE_MS;
- if (!mDeferredUpdateWaiting) {
- mDeferredUpdateWaiting = true;
- mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, DEFERRED_UPDATE_MS);
- }
- }
-
- private void updateUIForCurrentPhoto() {
- if (mCurrentPhoto == null) return;
-
- // If by swiping or deletion the user ends up on an action item
- // and zoomed in, zoom out so that the context of the action is
- // more clear
- if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0
- && !mPhotoView.getFilmMode()) {
- mPhotoView.setWantPictureCenterCallbacks(true);
- }
-
- updateMenuOperations();
- refreshBottomControlsWhenReady();
- if (mShowDetails) {
- mDetailsHelper.reloadDetails();
- }
- if ((mSecureAlbum == null)
- && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
- mCurrentPhoto.getPanoramaSupport(mUpdateShareURICallback);
- }
- updateProgressBar();
- }
-
- private void updateCurrentPhoto(MediaItem photo) {
- if (mCurrentPhoto == photo) return;
- mCurrentPhoto = photo;
- if (mPhotoView.getFilmMode()) {
- requestDeferredUpdate();
- } else {
- updateUIForCurrentPhoto();
- }
- }
-
- private void updateProgressBar() {
- if (mProgressBar != null) {
- mProgressBar.hideProgress();
- StitchingProgressManager progressManager = mApplication.getStitchingProgressManager();
- if (progressManager != null && mCurrentPhoto instanceof LocalImage) {
- Integer progress = progressManager.getProgress(mCurrentPhoto.getContentUri());
- if (progress != null) {
- mProgressBar.setProgress(progress);
- }
- }
- }
- }
-
- private void updateMenuOperations() {
- Menu menu = mActionBar.getMenu();
-
- // it could be null if onCreateActionBar has not been called yet
- if (menu == null) return;
-
- MenuItem item = menu.findItem(R.id.action_slideshow);
- if (item != null) {
- item.setVisible((mSecureAlbum == null) && canDoSlideShow());
- }
- if (mCurrentPhoto == null) return;
-
- int supportedOperations = mCurrentPhoto.getSupportedOperations();
- if (mSecureAlbum != null) {
- supportedOperations &= MediaObject.SUPPORT_DELETE;
- } else {
- mCurrentPhoto.getPanoramaSupport(mUpdatePanoramaMenuItemsCallback);
- if (!mHaveImageEditor) {
- supportedOperations &= ~MediaObject.SUPPORT_EDIT;
- }
- }
- MenuExecutor.updateMenuOperation(menu, supportedOperations);
- }
-
- private boolean canDoSlideShow() {
- if (mMediaSet == null || mCurrentPhoto == null) {
- return false;
- }
- if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
- return false;
- }
- return true;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // Action Bar show/hide management
- //////////////////////////////////////////////////////////////////////////
-
- private void showBars() {
- if (mShowBars) return;
- mShowBars = true;
- mOrientationManager.unlockOrientation();
- mActionBar.show();
- mActivity.getGLRoot().setLightsOutMode(false);
- refreshHidingMessage();
- refreshBottomControlsWhenReady();
- }
-
- private void hideBars() {
- if (!mShowBars) return;
- mShowBars = false;
- mActionBar.hide();
- mActivity.getGLRoot().setLightsOutMode(true);
- mHandler.removeMessages(MSG_HIDE_BARS);
- refreshBottomControlsWhenReady();
- }
-
- private void refreshHidingMessage() {
- mHandler.removeMessages(MSG_HIDE_BARS);
- if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
- mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
- }
- }
-
- private boolean canShowBars() {
- // No bars if we are showing camera preview.
- if (mAppBridge != null && mCurrentIndex == 0
- && !mPhotoView.getFilmMode()) return false;
-
- // No bars if it's not allowed.
- if (!mActionBarAllowed) return false;
-
- Configuration config = mActivity.getResources().getConfiguration();
- if (config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH) {
- return false;
- }
-
- return true;
- }
-
- private void wantBars() {
- if (canShowBars()) showBars();
- }
-
- private void toggleBars() {
- if (mShowBars) {
- hideBars();
- } else {
- if (canShowBars()) showBars();
- }
- }
-
- private void updateBars() {
- if (!canShowBars()) {
- hideBars();
- }
- }
-
- @Override
- protected void onBackPressed() {
- if (mShowDetails) {
- hideDetails();
- } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
- // We are leaving this page. Set the result now.
- setResult();
- if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
- mPhotoView.setFilmMode(true);
- } else if (mTreatBackAsUp) {
- onUpPressed();
- } else {
- super.onBackPressed();
- }
- }
- }
-
- private void onUpPressed() {
- if ((mStartInFilmstrip || mAppBridge != null)
- && !mPhotoView.getFilmMode()) {
- mPhotoView.setFilmMode(true);
- return;
- }
-
- if (mActivity.getStateManager().getStateCount() > 1) {
- setResult();
- super.onBackPressed();
- return;
- }
-
- if (mOriginalSetPathString == null) return;
-
- if (mAppBridge == null) {
- // We're in view mode so set up the stacks on our own.
- Bundle data = new Bundle(getData());
- data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
- data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
- mActivity.getDataManager().getTopSetPath(
- DataManager.INCLUDE_ALL));
- mActivity.getStateManager().switchState(this, AlbumPage.class, data);
- } else {
- GalleryUtils.startGalleryActivity(mActivity);
- }
- }
-
- private void setResult() {
- Intent result = null;
- result = new Intent();
- result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
- setStateResult(Activity.RESULT_OK, result);
- }
-
- //////////////////////////////////////////////////////////////////////////
- // AppBridge.Server interface
- //////////////////////////////////////////////////////////////////////////
-
- @Override
- public void setCameraRelativeFrame(Rect frame) {
- mPhotoView.setCameraRelativeFrame(frame);
- }
-
- @Override
- public boolean switchWithCaptureAnimation(int offset) {
- return mPhotoView.switchWithCaptureAnimation(offset);
- }
-
- @Override
- public void setSwipingEnabled(boolean enabled) {
- mPhotoView.setSwipingEnabled(enabled);
- }
-
- @Override
- public void notifyScreenNailChanged() {
- mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
- mScreenNailSet.notifyChange();
- }
-
- @Override
- public void addSecureAlbumItem(boolean isVideo, int id) {
- mSecureAlbum.addMediaItem(isVideo, id);
- }
-
- @Override
- protected boolean onCreateActionBar(Menu menu) {
- mActionBar.createActionBarMenu(R.menu.photo, menu);
- mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
- updateMenuOperations();
- mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : "");
- return true;
- }
-
- private MenuExecutor.ProgressListener mConfirmDialogListener =
- new MenuExecutor.ProgressListener() {
- @Override
- public void onProgressUpdate(int index) {}
-
- @Override
- public void onProgressComplete(int result) {}
-
- @Override
- public void onConfirmDialogShown() {
- mHandler.removeMessages(MSG_HIDE_BARS);
- }
-
- @Override
- public void onConfirmDialogDismissed(boolean confirmed) {
- refreshHidingMessage();
- }
-
- @Override
- public void onProgressStart() {}
- };
-
- private void switchToGrid() {
- if (mActivity.getStateManager().hasStateClass(AlbumPage.class)) {
- onUpPressed();
- } else {
- if (mOriginalSetPathString == null) return;
- if (mProgressBar != null) {
- updateCurrentPhoto(null);
- mProgressBar.hideProgress();
- }
- Bundle data = new Bundle(getData());
- data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
- data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
- mActivity.getDataManager().getTopSetPath(
- DataManager.INCLUDE_ALL));
-
- // We only show cluster menu in the first AlbumPage in stack
- // TODO: Enable this when running from the camera app
- boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
- data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum
- && mAppBridge == null);
-
- data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null);
-
- // Account for live preview being first item
- mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT,
- mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex);
-
- if (mHasCameraScreennailOrPlaceholder && mAppBridge != null) {
- mActivity.getStateManager().startState(AlbumPage.class, data);
- } else {
- mActivity.getStateManager().switchState(this, AlbumPage.class, data);
- }
- }
- }
-
- @Override
- protected boolean onItemSelected(MenuItem item) {
- if (mModel == null) return true;
- refreshHidingMessage();
- MediaItem current = mModel.getMediaItem(0);
-
- // This is a shield for monkey when it clicks the action bar
- // menu when transitioning from filmstrip to camera
- if (current instanceof SnailItem) return true;
- // TODO: We should check the current photo against the MediaItem
- // that the menu was initially created for. We need to fix this
- // after PhotoPage being refactored.
- if (current == null) {
- // item is not ready, ignore
- return true;
- }
- int currentIndex = mModel.getCurrentIndex();
- Path path = current.getPath();
-
- DataManager manager = mActivity.getDataManager();
- int action = item.getItemId();
- String confirmMsg = null;
- switch (action) {
- case android.R.id.home: {
- onUpPressed();
- return true;
- }
- case R.id.action_slideshow: {
- Bundle data = new Bundle();
- data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
- data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
- data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
- data.putBoolean(SlideshowPage.KEY_REPEAT, true);
- mActivity.getStateManager().startStateForResult(
- SlideshowPage.class, REQUEST_SLIDESHOW, data);
- return true;
- }
- case R.id.action_crop: {
- Activity activity = mActivity;
- Intent intent = new Intent(CropActivity.CROP_ACTION);
- intent.setClass(activity, CropActivity.class);
- intent.setDataAndType(manager.getContentUri(path), current.getMimeType())
- .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
- ? REQUEST_CROP_PICASA
- : REQUEST_CROP);
- return true;
- }
- case R.id.action_trim: {
- Intent intent = new Intent(mActivity, TrimVideo.class);
- intent.setData(manager.getContentUri(path));
- // We need the file path to wrap this into a RandomAccessFile.
- intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath());
- mActivity.startActivityForResult(intent, REQUEST_TRIM);
- return true;
- }
- case R.id.action_mute: {
- MuteVideo muteVideo = new MuteVideo(current.getFilePath(),
- manager.getContentUri(path), mActivity);
- muteVideo.muteInBackground();
- return true;
- }
- case R.id.action_edit: {
- launchPhotoEditor();
- return true;
- }
- case R.id.action_simple_edit: {
- launchSimpleEditor();
- return true;
- }
- case R.id.action_details: {
- if (mShowDetails) {
- hideDetails();
- } else {
- showDetails();
- }
- return true;
- }
- case R.id.action_delete:
- confirmMsg = mActivity.getResources().getQuantityString(
- R.plurals.delete_selection, 1);
- case R.id.action_setas:
- case R.id.action_rotate_ccw:
- case R.id.action_rotate_cw:
- case R.id.action_show_on_map:
- mSelectionManager.deSelectAll();
- mSelectionManager.toggle(path);
- mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
- return true;
- default :
- return false;
- }
- }
-
- private void hideDetails() {
- mShowDetails = false;
- mDetailsHelper.hide();
- }
-
- private void showDetails() {
- mShowDetails = true;
- if (mDetailsHelper == null) {
- mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
- mDetailsHelper.setCloseListener(new CloseListener() {
- @Override
- public void onClose() {
- hideDetails();
- }
- });
- }
- mDetailsHelper.show();
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // Callbacks from PhotoView
- ////////////////////////////////////////////////////////////////////////////
- @Override
- public void onSingleTapUp(int x, int y) {
- if (mAppBridge != null) {
- if (mAppBridge.onSingleTapUp(x, y)) return;
- }
-
- MediaItem item = mModel.getMediaItem(0);
- if (item == null || item == mScreenNailItem) {
- // item is not ready or it is camera preview, ignore
- return;
- }
-
- int supported = item.getSupportedOperations();
- boolean playVideo = ((supported & MediaItem.SUPPORT_PLAY) != 0);
- boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0);
- boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0);
- boolean launchCamera = ((supported & MediaItem.SUPPORT_CAMERA_SHORTCUT) != 0);
-
- if (playVideo) {
- // determine if the point is at center (1/6) of the photo view.
- // (The position of the "play" icon is at center (1/6) of the photo)
- int w = mPhotoView.getWidth();
- int h = mPhotoView.getHeight();
- playVideo = (Math.abs(x - w / 2) * 12 <= w)
- && (Math.abs(y - h / 2) * 12 <= h);
- }
-
- if (playVideo) {
- if (mSecureAlbum == null) {
- playVideo(mActivity, item.getPlayUri(), item.getName());
- } else {
- mActivity.getStateManager().finishState(this);
- }
- } else if (goBack) {
- onBackPressed();
- } else if (unlock) {
- Intent intent = new Intent(mActivity, Gallery.class);
- intent.putExtra(Gallery.KEY_DISMISS_KEYGUARD, true);
- mActivity.startActivity(intent);
- } else if (launchCamera) {
- launchCamera();
- } else {
- toggleBars();
- }
- }
-
- @Override
- public void onActionBarAllowed(boolean allowed) {
- mActionBarAllowed = allowed;
- mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
- }
-
- @Override
- public void onActionBarWanted() {
- mHandler.sendEmptyMessage(MSG_WANT_BARS);
- }
-
- @Override
- public void onFullScreenChanged(boolean full) {
- Message m = mHandler.obtainMessage(
- MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
- m.sendToTarget();
- }
-
- // How we do delete/undo:
- //
- // When the user choose to delete a media item, we just tell the
- // FilterDeleteSet to hide that item. If the user choose to undo it, we
- // again tell FilterDeleteSet not to hide it. If the user choose to commit
- // the deletion, we then actually delete the media item.
- @Override
- public void onDeleteImage(Path path, int offset) {
- onCommitDeleteImage(); // commit the previous deletion
- mDeletePath = path;
- mDeleteIsFocus = (offset == 0);
- mMediaSet.addDeletion(path, mCurrentIndex + offset);
- }
-
- @Override
- public void onUndoDeleteImage() {
- if (mDeletePath == null) return;
- // If the deletion was done on the focused item, we want the model to
- // focus on it when it is undeleted.
- if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
- mMediaSet.removeDeletion(mDeletePath);
- mDeletePath = null;
- }
-
- @Override
- public void onCommitDeleteImage() {
- if (mDeletePath == null) return;
- mMenuExecutor.startSingleItemAction(R.id.action_delete, mDeletePath);
- mDeletePath = null;
- }
-
- public void playVideo(Activity activity, Uri uri, String title) {
- try {
- Intent intent = new Intent(Intent.ACTION_VIEW)
- .setDataAndType(uri, "video/*")
- .putExtra(Intent.EXTRA_TITLE, title)
- .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
- activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(activity, activity.getString(R.string.video_err),
- Toast.LENGTH_SHORT).show();
- }
- }
-
- private void setCurrentPhotoByIntent(Intent intent) {
- if (intent == null) return;
- Path path = mApplication.getDataManager()
- .findPathByUri(intent.getData(), intent.getType());
- if (path != null) {
- Path albumPath = mApplication.getDataManager().getDefaultSetOf(path);
- if (!albumPath.equalsIgnoreCase(mOriginalSetPathString)) {
- // If the edited image is stored in a different album, we need
- // to start a new activity state to show the new image
- Bundle data = new Bundle(getData());
- data.putString(KEY_MEDIA_SET_PATH, albumPath.toString());
- data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, path.toString());
- mActivity.getStateManager().startState(SinglePhotoPage.class, data);
- return;
- }
- mModel.setCurrentPhoto(path, mCurrentIndex);
- }
- }
-
- @Override
- protected void onStateResult(int requestCode, int resultCode, Intent data) {
- if (resultCode == Activity.RESULT_CANCELED) {
- // This is a reset, not a canceled
- return;
- }
- if (resultCode == ProxyLauncher.RESULT_USER_CANCELED) {
- // Unmap reset vs. canceled
- resultCode = Activity.RESULT_CANCELED;
- }
- mRecenterCameraOnResume = false;
- switch (requestCode) {
- case REQUEST_EDIT:
- setCurrentPhotoByIntent(data);
- break;
- case REQUEST_CROP:
- if (resultCode == Activity.RESULT_OK) {
- setCurrentPhotoByIntent(data);
- }
- break;
- case REQUEST_CROP_PICASA: {
- if (resultCode == Activity.RESULT_OK) {
- Context context = mActivity.getAndroidContext();
- String message = context.getString(R.string.crop_saved,
- context.getString(R.string.folder_edited_online_photos));
- Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
- }
- break;
- }
- case REQUEST_SLIDESHOW: {
- if (data == null) break;
- String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
- int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
- if (path != null) {
- mModel.setCurrentPhoto(Path.fromString(path), index);
- }
- }
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mIsActive = false;
-
- mActivity.getGLRoot().unfreeze();
- mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
-
- DetailsHelper.pause();
- // Hide the detail dialog on exit
- if (mShowDetails) hideDetails();
- if (mModel != null) {
- mModel.pause();
- }
- mPhotoView.pause();
- mHandler.removeMessages(MSG_HIDE_BARS);
- mHandler.removeMessages(MSG_REFRESH_BOTTOM_CONTROLS);
- refreshBottomControlsWhenReady();
- mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
- if (mShowSpinner) {
- mActionBar.disableAlbumModeMenu(true);
- }
- onCommitDeleteImage();
- mMenuExecutor.pause();
- if (mMediaSet != null) mMediaSet.clearDeletion();
- }
-
- @Override
- public void onCurrentImageUpdated() {
- mActivity.getGLRoot().unfreeze();
- }
-
- @Override
- public void onFilmModeChanged(boolean enabled) {
- refreshBottomControlsWhenReady();
- if (mShowSpinner) {
- if (enabled) {
- mActionBar.enableAlbumModeMenu(
- GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
- } else {
- mActionBar.disableAlbumModeMenu(true);
- }
- }
- if (enabled) {
- mHandler.removeMessages(MSG_HIDE_BARS);
- UsageStatistics.onContentViewChanged(
- UsageStatistics.COMPONENT_GALLERY, "FilmstripPage");
- } else {
- refreshHidingMessage();
- if (mAppBridge == null || mCurrentIndex > 0) {
- UsageStatistics.onContentViewChanged(
- UsageStatistics.COMPONENT_GALLERY, "SinglePhotoPage");
- } else {
- UsageStatistics.onContentViewChanged(
- UsageStatistics.COMPONENT_CAMERA, "Unknown"); // TODO
- }
- }
- }
-
- private void transitionFromAlbumPageIfNeeded() {
- TransitionStore transitions = mActivity.getTransitionStore();
-
- int albumPageTransition = transitions.get(
- KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
-
- if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null
- && mRecenterCameraOnResume) {
- // Generally, resuming the PhotoPage when in Camera should
- // reset to the capture mode to allow quick photo taking
- mCurrentIndex = 0;
- mPhotoView.resetToFirstPicture();
- } else {
- int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
- if (resumeIndex >= 0) {
- if (mHasCameraScreennailOrPlaceholder) {
- // Account for preview/placeholder being the first item
- resumeIndex++;
- }
- if (resumeIndex < mMediaSet.getMediaItemCount()) {
- mCurrentIndex = resumeIndex;
- mModel.moveTo(mCurrentIndex);
- }
- }
- }
-
- if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) {
- mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null);
- } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) {
- mPhotoView.setFilmMode(false);
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (mModel == null) {
- mActivity.getStateManager().finishState(this);
- return;
- }
- transitionFromAlbumPageIfNeeded();
-
- mActivity.getGLRoot().freeze();
- mIsActive = true;
- setContentPane(mRootPane);
-
- mModel.resume();
- mPhotoView.resume();
- mActionBar.setDisplayOptions(
- ((mSecureAlbum == null) && (mSetPathString != null)), false);
- mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
- refreshBottomControlsWhenReady();
- if (mShowSpinner && mPhotoView.getFilmMode()) {
- mActionBar.enableAlbumModeMenu(
- GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
- }
- if (!mShowBars) {
- mActionBar.hide();
- mActivity.getGLRoot().setLightsOutMode(true);
- }
- boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
- if (haveImageEditor != mHaveImageEditor) {
- mHaveImageEditor = haveImageEditor;
- updateMenuOperations();
- }
-
- mRecenterCameraOnResume = true;
- mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
- }
-
- @Override
- protected void onDestroy() {
- if (mAppBridge != null) {
- mAppBridge.setServer(null);
- mScreenNailItem.setScreenNail(null);
- mAppBridge.detachScreenNail();
- mAppBridge = null;
- mScreenNailSet = null;
- mScreenNailItem = null;
- }
- mActivity.getGLRoot().setOrientationSource(null);
- if (mBottomControls != null) mBottomControls.cleanup();
-
- // Remove all pending messages.
- mHandler.removeCallbacksAndMessages(null);
- super.onDestroy();
- }
-
- private class MyDetailsSource implements DetailsSource {
-
- @Override
- public MediaDetails getDetails() {
- return mModel.getMediaItem(0).getDetails();
- }
-
- @Override
- public int size() {
- return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
- }
-
- @Override
- public int setIndex() {
- return mModel.getCurrentIndex();
- }
- }
-
- @Override
- public void onAlbumModeSelected(int mode) {
- if (mode == GalleryActionBar.ALBUM_GRID_MODE_SELECTED) {
- switchToGrid();
- }
- }
-
- @Override
- public void refreshBottomControlsWhenReady() {
- if (mBottomControls == null) {
- return;
- }
- MediaObject currentPhoto = mCurrentPhoto;
- if (currentPhoto == null) {
- mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, 0, 0, currentPhoto).sendToTarget();
- } else {
- currentPhoto.getPanoramaSupport(mRefreshBottomControlsCallback);
- }
- }
-
- private void updatePanoramaUI(boolean isPanorama360) {
- Menu menu = mActionBar.getMenu();
-
- // it could be null if onCreateActionBar has not been called yet
- if (menu == null) {
- return;
- }
-
- MenuExecutor.updateMenuForPanorama(menu, isPanorama360, isPanorama360);
-
- if (isPanorama360) {
- MenuItem item = menu.findItem(R.id.action_share);
- if (item != null) {
- item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
- item.setTitle(mActivity.getResources().getString(R.string.share_as_photo));
- }
- } else if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_SHARE) != 0) {
- MenuItem item = menu.findItem(R.id.action_share);
- if (item != null) {
- item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
- item.setTitle(mActivity.getResources().getString(R.string.share));
- }
- }
- }
-
- @Override
- public void onUndoBarVisibilityChanged(boolean visible) {
- refreshBottomControlsWhenReady();
- }
-
- @Override
- public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
- final long timestampMillis = mCurrentPhoto.getDateInMs();
- final String mediaType = getMediaTypeString(mCurrentPhoto);
- UsageStatistics.onEvent(UsageStatistics.COMPONENT_GALLERY,
- UsageStatistics.ACTION_SHARE,
- mediaType,
- timestampMillis > 0
- ? System.currentTimeMillis() - timestampMillis
- : -1);
- return false;
- }
-
- private static String getMediaTypeString(MediaItem item) {
- if (item.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO) {
- return "Video";
- } else if (item.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) {
- return "Photo";
- } else {
- return "Unknown:" + item.getMediaType();
- }
- }
-
-}