package info.guardianproject.securereaderinterface.views;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;
import info.guardianproject.securereaderinterface.adapters.StoryItemMediaContentPagerAdapter;
import info.guardianproject.securereaderinterface.ui.MediaViewCollection;
import info.guardianproject.securereaderinterface.ui.OnMediaItemClickedListener;
import info.guardianproject.securereaderinterface.ui.MediaViewCollection.MediaContentLoadInfo;
import info.guardianproject.securereaderinterface.ui.MediaViewCollection.OnMediaLoadedListener;
import info.guardianproject.securereaderinterface.uiutil.UIHelpers;
import info.guardianproject.securereaderinterface.widgets.DottedProgressView;
import info.guardianproject.securereaderinterface.widgets.NestedViewPager;
import info.guardianproject.securereaderinterface.R;
public class StoryMediaContentView extends FrameLayout implements View.OnClickListener, OnMediaLoadedListener
{
private NestedViewPager mViewPager;
private DottedProgressView mCurrentPageIndicator;
private ImageView mImageView;
private View mDownloadView;
private boolean mShowPlaceholder;
private boolean mShowDLButtonForBitWise;
private boolean mShowPlaceholderWhileLoading;
private boolean mAllowFullScreenMediaViewing;
private boolean mUseFinalSizeForDownloadView;
private MediaViewCollection mMediaViewCollection;
public StoryMediaContentView(Context context)
{
super(context);
initView(context, null);
}
public StoryMediaContentView(Context context, AttributeSet attrs)
{
super(context, attrs);
initView(context, attrs);
}
public StoryMediaContentView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs)
{
mShowPlaceholder = false;
if (attrs != null)
{
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StoryMediaContentView);
mShowPlaceholder = a.getBoolean(R.styleable.StoryMediaContentView_show_placeholder, false);
a.recycle();
}
if (this.isInEditMode())
mShowPlaceholder = true;
mUseFinalSizeForDownloadView = false;
}
public void setMediaCollection(MediaViewCollection mediaViewCollection, boolean allowFullScreenMediaViewing, boolean showDLButtonForBitWise)
{
mShowDLButtonForBitWise = showDLButtonForBitWise;
mAllowFullScreenMediaViewing = allowFullScreenMediaViewing;
if (mMediaViewCollection != null)
mMediaViewCollection.removeListener(this);
mMediaViewCollection = mediaViewCollection;
if (mMediaViewCollection != null)
mMediaViewCollection.addListener(this);
updateView();
}
public MediaViewCollection getMediaCollection()
{
return mMediaViewCollection;
}
public void setScaleType(boolean setToFitIfFirstPhotoIsPortrait)
{
if (mMediaViewCollection != null)
{
if (setToFitIfFirstPhotoIsPortrait && mMediaViewCollection.isFirstViewPortrait())
mMediaViewCollection.setScaleType(ScaleType.FIT_CENTER);
else
mMediaViewCollection.setScaleType(ScaleType.CENTER_CROP);
}
}
public void updateView()
{
this.removeAllViews();
if (mMediaViewCollection == null || mMediaViewCollection.getCount() == 0)
{
if (mShowPlaceholder)
{
setWrapContent(false);
createPlaceholderView();
}
}
else if (!mMediaViewCollection.containsLoadedMedia())
{
if (mShowDLButtonForBitWise)
{
setWrapContent(true);
if (mMediaViewCollection.isLoadingMedia())
createDownloadingView(mUseFinalSizeForDownloadView);
else
createDownloadView(mUseFinalSizeForDownloadView);
}
else if (mShowPlaceholderWhileLoading)
{
setWrapContent(false);
createDownloadingView(true);
}
}
else if (mMediaViewCollection.getCountLoaded() > 1)
{
setWrapContent(false);
createMultiImageView();
}
else if (mMediaViewCollection.getCountLoaded() == 1)
{
setWrapContent(false);
createSingleImageView();
}
}
private void setWrapContent(boolean wrapContent)
{
ViewGroup.LayoutParams lp = getLayoutParams();
lp.height = (wrapContent ? LayoutParams.WRAP_CONTENT : LayoutParams.MATCH_PARENT);
setLayoutParams(lp);
}
public int getCount()
{
if (mMediaViewCollection == null)
return 0;
return mMediaViewCollection.getCount();
}
public int getCurrentItemIndex()
{
if (mMediaViewCollection != null && mMediaViewCollection.getCountLoaded() > 1 && mViewPager != null)
return mViewPager.getCurrentItem();
return 0;
}
public void setShowPlaceholder(boolean showPlaceholder)
{
this.mShowPlaceholder = showPlaceholder;
updateView();
}
public void setShowPlaceholderWhileLoading(boolean showPlaceholderWhileLoading)
{
this.mShowPlaceholderWhileLoading = showPlaceholderWhileLoading;
updateView();
}
private void createMultiImageView()
{
View content = LayoutInflater.from(getContext()).inflate(R.layout.story_media_content_view_multi, this, false);
mCurrentPageIndicator = (DottedProgressView) content.findViewById(R.id.currentPageIndicator);
mViewPager = (NestedViewPager) content.findViewById(R.id.contentPager);
mViewPager.setViewPagerIndicator(mCurrentPageIndicator);
mViewPager.setAdapter(new StoryItemMediaContentPagerAdapter(getContext(), mMediaViewCollection.getLoadedViews(), mAllowFullScreenMediaViewing));
if (mAllowFullScreenMediaViewing)
{
mViewPager.setPropagateClicks(false);
}
else
{
mViewPager.setPropagateClicks(true);
}
addView(content);
}
private void createSingleImageView()
{
MediaContentPreviewView contentView = mMediaViewCollection.getFirstView();
View view = (View) contentView;
if (view.getParent() != null)
((ViewGroup) view.getParent()).removeView(view);
if (mAllowFullScreenMediaViewing)
{
view.setOnClickListener(new OnMediaItemClickedListener(contentView.getMediaContent()));
}
else
{
view.setOnClickListener(null);
view.setClickable(false);
}
this.addView(view);
}
private void createPlaceholderView()
{
if (mImageView == null)
{
mImageView = new ImageView(getContext());
mImageView.setClickable(false);
mImageView.setScaleType(ScaleType.CENTER_CROP);
mImageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
mImageView.setImageResource(R.drawable.img_placeholder);
this.addView(mImageView);
}
private void createDownloadView(boolean useFinalSize)
{
if (useFinalSize || placeholderUseFinalSize())
{
mDownloadView = LayoutInflater.from(getContext()).inflate(R.layout.story_media_bitwise_placeholder_large, this, false);
}
else
{
mDownloadView = LayoutInflater.from(getContext()).inflate(R.layout.story_media_bitwise_placeholder, this, false);
}
mDownloadView.setOnClickListener(this);
ImageView iv = ((ImageView) mDownloadView.findViewById(R.id.ivDownloadIcon));
iv.setImageResource(placeholderIcon());
TextView tv = (TextView) mDownloadView.findViewById(R.id.tvDownload);
if (tv != null)
tv.setText(placeholderText());
this.addView(mDownloadView);
iv.clearAnimation();
}
private void createDownloadingView(boolean useFinalSize)
{
if (mDownloadView == null)
{
mDownloadView = LayoutInflater.from(getContext()).inflate(R.layout.story_media_bitwise_placeholder, this, false);
}
if (useFinalSize || placeholderUseFinalSize())
mDownloadView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
else
mDownloadView.getLayoutParams().height = UIHelpers.dpToPx(50, getContext());
mDownloadView.setOnClickListener(null);
ImageView iv = ((ImageView) mDownloadView.findViewById(R.id.ivDownloadIcon));
iv.setImageResource(R.drawable.ic_context_load);
TextView tv = (TextView) mDownloadView.findViewById(R.id.tvDownload);
if (tv != null)
tv.setText(null);
this.addView(mDownloadView);
iv.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rotate));
}
@Override
public void onClick(View v)
{
if (v == mDownloadView)
{
mMediaViewCollection.load(true, false);
updateView();
}
}
public void setUseFinalSizeForDownloadView(boolean useFinalSizeForDownloadView)
{
mUseFinalSizeForDownloadView = useFinalSizeForDownloadView;
}
/**
* Returns an icon for the media collection. Currently, this depends on the first item
* in the collection.
* @return An icon resource identifier
*/
public int placeholderIcon()
{
if (mMediaViewCollection != null)
{
MediaContentLoadInfo info = mMediaViewCollection.getFirstLoadInfo();
if (info != null)
{
if (info.isVideo())
return R.drawable.ic_load_video;
else if (info.isApplication())
return R.drawable.ic_content_app;
else if (info.isEpub())
return R.drawable.ic_content_epub;
}
}
return R.drawable.ic_load_photo;
}
public CharSequence placeholderText()
{
if (mMediaViewCollection != null)
{
MediaContentLoadInfo info = mMediaViewCollection.getFirstLoadInfo();
if (info != null)
{
if (info.isEpub())
return getContext().getText(R.string.download_epub_hint);
}
}
return null;
}
/**
* Some media types need a more user friendly download view, use "final size" for these.
* The rest will use default download view height of 50dp.
* @return True if the download view should extend across the whole media content view.
*/
public boolean placeholderUseFinalSize()
{
if (mMediaViewCollection != null)
{
MediaContentLoadInfo info = mMediaViewCollection.getFirstLoadInfo();
if (info != null)
{
if (info.isEpub())
return true;
}
}
return false;
}
@Override
public void onViewLoaded(MediaViewCollection collection, int index, boolean wasCached)
{
updateView();
}
}