diff options
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.java | 237 |
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; + } + } + } +} |