aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java237
1 files changed, 237 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java
new file mode 100644
index 000000000..191c9e331
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java
@@ -0,0 +1,237 @@
+package org.wordpress.android.ui.reader;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.v13.app.FragmentStatePagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import org.wordpress.android.R;
+import org.wordpress.android.ui.reader.ReaderViewPagerTransformer.TransformType;
+import org.wordpress.android.ui.reader.models.ReaderImageList;
+import org.wordpress.android.ui.reader.utils.ReaderImageScanner;
+import org.wordpress.android.ui.reader.views.ReaderPhotoView.PhotoViewListener;
+import org.wordpress.android.util.AniUtils;
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.widgets.WPViewPager;
+
+/**
+ * Full-screen photo viewer - uses a ViewPager to enable scrolling between images in a blog
+ * post, but also supports viewing a single image
+ */
+public class ReaderPhotoViewerActivity extends AppCompatActivity
+ implements PhotoViewListener {
+
+ private String mInitialImageUrl;
+ private boolean mIsPrivate;
+ private boolean mIsGallery;
+ private String mContent;
+ private WPViewPager mViewPager;
+ private PhotoPagerAdapter mAdapter;
+ private TextView mTxtTitle;
+ private boolean mIsTitleVisible;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.reader_activity_photo_viewer);
+
+ mViewPager = (WPViewPager) findViewById(R.id.viewpager);
+ mTxtTitle = (TextView) findViewById(R.id.text_title);
+
+ // title is hidden until we know we can show it
+ mTxtTitle.setVisibility(View.GONE);
+
+ if (savedInstanceState != null) {
+ mInitialImageUrl = savedInstanceState.getString(ReaderConstants.ARG_IMAGE_URL);
+ mIsPrivate = savedInstanceState.getBoolean(ReaderConstants.ARG_IS_PRIVATE);
+ mIsGallery = savedInstanceState.getBoolean(ReaderConstants.ARG_IS_GALLERY);
+ mContent = savedInstanceState.getString(ReaderConstants.ARG_CONTENT);
+ } else if (getIntent() != null) {
+ mInitialImageUrl = getIntent().getStringExtra(ReaderConstants.ARG_IMAGE_URL);
+ mIsPrivate = getIntent().getBooleanExtra(ReaderConstants.ARG_IS_PRIVATE, false);
+ mIsGallery = getIntent().getBooleanExtra(ReaderConstants.ARG_IS_GALLERY, false);
+ mContent = getIntent().getStringExtra(ReaderConstants.ARG_CONTENT);
+ }
+
+ mViewPager.setPageTransformer(false, new ReaderViewPagerTransformer(TransformType.FLOW));
+ mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
+ @Override
+ public void onPageSelected(int position) {
+ updateTitle(position);
+ }
+ });
+
+ mViewPager.setAdapter(getAdapter());
+ loadImageList();
+ }
+
+ private void loadImageList() {
+ // content will be empty when viewing a single image, otherwise content is HTML
+ // so parse images from it
+ final ReaderImageList imageList;
+ if (TextUtils.isEmpty(mContent)) {
+ imageList = new ReaderImageList(mIsPrivate);
+ } else if (mIsGallery) {
+ imageList = new ReaderImageScanner(mContent, mIsPrivate).getGalleryImageList();
+ } else {
+ imageList = new ReaderImageScanner(mContent, mIsPrivate).getImageList();
+ }
+
+ // make sure initial image is in the list
+ if (!TextUtils.isEmpty(mInitialImageUrl) && !imageList.hasImageUrl(mInitialImageUrl)) {
+ imageList.addImageUrl(0, mInitialImageUrl);
+ }
+
+ getAdapter().setImageList(imageList, mInitialImageUrl);
+ }
+
+ private PhotoPagerAdapter getAdapter() {
+ if (mAdapter == null) {
+ mAdapter = new PhotoPagerAdapter(getFragmentManager());
+ }
+ return mAdapter;
+ }
+
+ private boolean hasAdapter() {
+ return (mAdapter != null);
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ if (hasAdapter()) {
+ String imageUrl = getAdapter().getImageUrl(mViewPager.getCurrentItem());
+ outState.putString(ReaderConstants.ARG_IMAGE_URL, imageUrl);
+ }
+
+ outState.putBoolean(ReaderConstants.ARG_IS_PRIVATE, mIsPrivate);
+ outState.putBoolean(ReaderConstants.ARG_IS_GALLERY, mIsGallery);
+ outState.putString(ReaderConstants.ARG_CONTENT, mContent);
+
+ super.onSaveInstanceState(outState);
+ }
+
+ private int getImageCount() {
+ if (hasAdapter()) {
+ return getAdapter().getCount();
+ } else {
+ return 0;
+ }
+ }
+
+ private void updateTitle(int position) {
+ if (isFinishing() || !canShowTitle()) {
+ return;
+ }
+
+ String titlePhotoViewer = getString(R.string.reader_title_photo_viewer);
+ String title = String.format(titlePhotoViewer, position + 1, getImageCount());
+ if (title.equals(mTxtTitle.getText())) {
+ return;
+ }
+
+ mTxtTitle.setText(title);
+ }
+
+ /*
+ * title (image count) is only shown if there are multiple images
+ */
+ private boolean canShowTitle() {
+ return (getImageCount() > 1);
+ }
+
+ private void toggleTitle() {
+ if (isFinishing() || !canShowTitle()) {
+ return;
+ }
+
+ mTxtTitle.clearAnimation();
+ if (mIsTitleVisible) {
+ AniUtils.fadeOut(mTxtTitle, AniUtils.Duration.SHORT);
+ } else {
+ AniUtils.fadeIn(mTxtTitle, AniUtils.Duration.SHORT);
+ }
+ mIsTitleVisible = !mIsTitleVisible;
+ }
+
+ @Override
+ public void onTapPhotoView() {
+ toggleTitle();
+ }
+
+ private class PhotoPagerAdapter extends FragmentStatePagerAdapter {
+ private ReaderImageList mImageList;
+
+ PhotoPagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ void setImageList(ReaderImageList imageList, String initialImageUrl) {
+ mImageList = (ReaderImageList) imageList.clone();
+ notifyDataSetChanged();
+
+ int position = indexOfImageUrl(initialImageUrl);
+ if (isValidPosition(position)) {
+ mViewPager.setCurrentItem(position);
+ if (canShowTitle()) {
+ mTxtTitle.setVisibility(View.VISIBLE);
+ mIsTitleVisible = true;
+ updateTitle(position);
+ } else {
+ mIsTitleVisible = false;
+ }
+ }
+ }
+
+ @Override
+ public void restoreState(Parcelable state, ClassLoader loader) {
+ // work around "Fragement no longer exists for key" Android bug
+ // by catching the IllegalStateException
+ // https://code.google.com/p/android/issues/detail?id=42601
+ try {
+ super.restoreState(state, loader);
+ } catch (IllegalStateException e) {
+ AppLog.e(AppLog.T.READER, e);
+ }
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return ReaderPhotoViewerFragment.newInstance(
+ mImageList.get(position),
+ mImageList.isPrivate());
+ }
+
+ @Override
+ public int getCount() {
+ return (mImageList != null ? mImageList.size(): 0);
+ }
+
+ private int indexOfImageUrl(String imageUrl) {
+ if (mImageList == null) {
+ return -1;
+ }
+ return mImageList.indexOfImageUrl(imageUrl);
+ }
+
+ private boolean isValidPosition(int position) {
+ return (mImageList != null
+ && position >= 0
+ && position < getCount());
+ }
+
+ private String getImageUrl(int position) {
+ if (isValidPosition(position)) {
+ return mImageList.get(position);
+ } else {
+ return null;
+ }
+ }
+ }
+}