private void prepareAnimationBackToFilmstrip(int slotIndex) {
   if (mAlbumDataAdapter == null || !mAlbumDataAdapter.isActive(slotIndex)) return;
   MediaItem item = mAlbumDataAdapter.get(slotIndex);
   if (item == null) return;
   TransitionStore transitions = mActivity.getTransitionStore();
   transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex);
   transitions.put(PhotoPage.KEY_OPEN_ANIMATION_RECT, mSlotView.getSlotRect(slotIndex, mRootPane));
 }
 // Show sync error toast when all the following conditions are met:
 // (1) both loading and sync are done,
 // (2) sync result is error,
 // (3) the page is still active, and
 // (4) no photo is shown or loading fails.
 private void showSyncErrorIfNecessary(boolean loadingFailed) {
   if ((mLoadingBits == 0)
       && (mSyncResult == MediaSet.SYNC_RESULT_ERROR)
       && mIsActive
       && (loadingFailed || (mAlbumDataAdapter.size() == 0))) {
     Toast.makeText(mActivity, R.string.sync_album_error, Toast.LENGTH_LONG).show();
   }
 }
 public void onLongTap(int slotIndex) {
   if (mGetContent) return;
   MediaItem item = mAlbumDataAdapter.get(slotIndex);
   if (item == null) return;
   mSelectionManager.setAutoLeaveSelectionMode(true);
   mSelectionManager.toggle(item.getPath());
   mSlotView.invalidate();
 }
 @Override
 protected void onDestroy() {
   super.onDestroy();
   if (mAlbumDataAdapter != null) {
     mAlbumDataAdapter.setLoadingListener(null);
   }
   mActionModeHandler.destroy();
 }
 private void switchToFilmstrip() {
   if (mAlbumDataAdapter.size() < 1) return;
   int targetPhoto = mSlotView.getVisibleStart();
   prepareAnimationBackToFilmstrip(targetPhoto);
   if (mLaunchedFromPhotoPage) {
     onBackPressed();
   } else {
     pickPhoto(targetPhoto, true);
   }
 }
 @Override
 public int getItemIndex(Path path) {
   int start = mSlotView.getVisibleStart();
   int end = mSlotView.getVisibleEnd();
   for (int i = start; i < end; ++i) {
     MediaItem item = mAlbumDataAdapter.get(i);
     if (item != null && item.getPath() == path) return i;
   }
   return -1;
 }
 private void clearLoadingBit(int loadTaskBit) {
   mLoadingBits &= ~loadTaskBit;
   if (mLoadingBits == 0 && mIsActive) {
     if (mAlbumDataAdapter.size() == 0) {
       Intent result = new Intent();
       result.putExtra(KEY_EMPTY_ALBUM, true);
       setStateResult(Activity.RESULT_OK, result);
       mActivity.getStateManager().finishState(this);
     }
   }
 }
 private void initializeData(Bundle data) {
   mMediaSetPath = Path.fromString(data.getString(KEY_MEDIA_PATH));
   mParentMediaSetString = data.getString(KEY_PARENT_MEDIA_PATH);
   mMediaSet = mActivity.getDataManager().getMediaSet(mMediaSetPath);
   if (mMediaSet == null) {
     Utils.fail("MediaSet is null. Path = %s", mMediaSetPath);
   }
   mSelectionManager.setSourceMediaSet(mMediaSet);
   mAlbumDataAdapter = new AlbumDataLoader(mActivity, mMediaSet);
   mAlbumDataAdapter.setLoadingListener(new MyLoadingListener());
   mAlbumView.setModel(mAlbumDataAdapter);
 }
  private void onSingleTapUp(int slotIndex) {
    if (!mIsActive) return;

    if (mSelectionManager.inSelectionMode()) {
      MediaItem item = mAlbumDataAdapter.get(slotIndex);
      if (item == null) return; // Item not ready yet, ignore the click
      mSelectionManager.toggle(item.getPath());
      mSlotView.invalidate();
    } else {
      // Render transition in pressed state
      mAlbumView.setPressedIndex(slotIndex);
      mAlbumView.setPressedUp();
      mHandler.sendMessageDelayed(
          mHandler.obtainMessage(MSG_PICK_PHOTO, slotIndex, 0), FadeTexture.DURATION);
    }
  }
  @Override
  protected void onPause() {
    super.onPause();
    mIsActive = false;

    if (mSelectionManager.inSelectionMode()) {
      mSelectionManager.leaveSelectionMode();
    }
    mAlbumView.setSlotFilter(null);
    mActionModeHandler.pause();
    mAlbumDataAdapter.pause();
    mAlbumView.pause();
    DetailsHelper.pause();
    if (!mGetContent) {
      mActivity.getGalleryActionBar().disableAlbumModeMenu(true);
    }

    if (mSyncTask != null) {
      mSyncTask.cancel();
      mSyncTask = null;
      clearLoadingBit(BIT_LOADING_SYNC);
    }
  }
  @Override
  protected void onResume() {
    super.onResume();
    mIsActive = true;

    mResumeEffect = mActivity.getTransitionStore().get(KEY_RESUME_ANIMATION);
    if (mResumeEffect != null) {
      mAlbumView.setSlotFilter(mResumeEffect);
      mResumeEffect.setPositionProvider(mPositionProvider);
      mResumeEffect.start();
    }

    setContentPane(mRootPane);

    boolean enableHomeButton =
        (mActivity.getStateManager().getStateCount() > 1) | mParentMediaSetString != null;
    GalleryActionBar actionBar = mActivity.getGalleryActionBar();
    actionBar.setDisplayOptions(enableHomeButton, false);
    if (!mGetContent) {
      actionBar.enableAlbumModeMenu(GalleryActionBar.ALBUM_GRID_MODE_SELECTED, this);
    }

    // Set the reload bit here to prevent it exit this page in clearLoadingBit().
    setLoadingBit(BIT_LOADING_RELOAD);
    mLoadingFailed = false;
    mAlbumDataAdapter.resume();

    mAlbumView.resume();
    mAlbumView.setPressedIndex(-1);
    mActionModeHandler.resume();
    if (!mInitialSynced) {
      setLoadingBit(BIT_LOADING_SYNC);
      mSyncTask = mMediaSet.requestSync(this);
    }
    mInCameraAndWantQuitOnPause = mInCameraApp;
  }
  private void pickPhoto(int slotIndex, boolean startInFilmstrip) {
    if (!mIsActive) return;

    if (!startInFilmstrip) {
      // Launch photos in lights out mode
      mActivity.getGLRoot().setLightsOutMode(true);
    }

    MediaItem item = mAlbumDataAdapter.get(slotIndex);
    if (item == null) return; // Item not ready yet, ignore the click
    if (mGetContent) {
      onGetContent(item);
    } else if (mLaunchedFromPhotoPage) {
      TransitionStore transitions = mActivity.getTransitionStore();
      transitions.put(PhotoPage.KEY_ALBUMPAGE_TRANSITION, PhotoPage.MSG_ALBUMPAGE_PICKED);
      transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex);
      onBackPressed();
    } else {
      // Get into the PhotoPage.
      // mAlbumView.savePositions(PositionRepository.getInstance(mActivity));
      Bundle data = new Bundle();
      data.putInt(PhotoPage.KEY_INDEX_HINT, slotIndex);
      data.putParcelable(
          PhotoPage.KEY_OPEN_ANIMATION_RECT, mSlotView.getSlotRect(slotIndex, mRootPane));
      data.putString(PhotoPage.KEY_MEDIA_SET_PATH, mMediaSetPath.toString());
      data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, item.getPath().toString());
      data.putInt(PhotoPage.KEY_ALBUMPAGE_TRANSITION, PhotoPage.MSG_ALBUMPAGE_STARTED);
      data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, startInFilmstrip);
      data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, mMediaSet.isCameraRoll());
      if (startInFilmstrip) {
        mActivity.getStateManager().switchState(this, FilmstripPage.class, data);
      } else {
        mActivity.getStateManager().startStateForResult(SinglePhotoPage.class, REQUEST_PHOTO, data);
      }
    }
  }