blob: 191c9e3311229df1cdec87ad1e603e8937de3870 [file] [log] [blame]
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;
}
}
}
}