package com.vaguehope.onosendai.payload; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.vaguehope.onosendai.R; import com.vaguehope.onosendai.images.ImageLoadRequest; import com.vaguehope.onosendai.images.ImageLoadRequest.ImageLoadListener; import com.vaguehope.onosendai.images.ImageLoader; import com.vaguehope.onosendai.model.Meta; import com.vaguehope.onosendai.model.Tweet; import com.vaguehope.onosendai.util.EqualHelper; import com.vaguehope.onosendai.widget.PendingImage; public class MediaPayload extends Payload { private final String imgUrl; private final String clickUrl; public MediaPayload (final Tweet ownerTweet, final Meta meta) { super(ownerTweet, meta, PayloadType.MEDIA); this.imgUrl = meta.getData(); this.clickUrl = meta.getTitle(); } @Override public String getTitle () { return this.clickUrl != null ? this.clickUrl : this.imgUrl; } @Override public boolean intentable () { return true; } @Override public Intent toIntent (final Context context) { final Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(this.clickUrl != null ? this.clickUrl : this.imgUrl)); return i; } @Override public PayloadLayout getLayout () { return PayloadLayout.TEXT_IMAGE; } @Override public PayloadRowView makeRowView (final View view) { return new PayloadRowView( (TextView) view.findViewById(R.id.txtMain), (PendingImage) view.findViewById(R.id.imgMain), (Button) view.findViewById(R.id.btnRetry)); } @Override public void applyTo (final PayloadRowView rowView, final ImageLoader imageLoader, final int reqWidth, final PayloadClickListener clickListener) { super.applyTo(rowView, imageLoader, reqWidth, clickListener); rowView.getButton().setVisibility(View.GONE); imageLoader.loadImage(new ImageLoadRequest(this.imgUrl, rowView.getImage(), reqWidth, new ImageLoadCallbacks(rowView, imageLoader))); } @Override public int hashCode () { final int prime = 31; int result = 1; result = prime * result + (this.imgUrl == null ? 0 : this.imgUrl.hashCode()); result = prime * result + (this.clickUrl == null ? 0 : this.clickUrl.hashCode()); return result; } @Override public boolean equals (final Object o) { if (o == null) return false; if (o == this) return true; if (!(o instanceof MediaPayload)) return false; final MediaPayload that = (MediaPayload) o; return EqualHelper.equal(this.imgUrl, that.imgUrl) && EqualHelper.equal(this.clickUrl, that.clickUrl); } private static class ImageLoadCallbacks implements ImageLoadListener { private final PayloadRowView rowView; private final ImageLoader imageLoader; public ImageLoadCallbacks (final PayloadRowView rowView, final ImageLoader imageLoader) { this.rowView = rowView; this.imageLoader = imageLoader; } @Override public void imageLoadProgress (final String msg) { final ImageLoadListener listener = this.rowView.getImageLoadListener(); if (listener != null) listener.imageLoadProgress(msg); } @Override public void imageFetchProgress (final int progress, final int total) { final ImageLoadListener listener = this.rowView.getImageLoadListener(); if (listener != null) listener.imageFetchProgress(progress, total); } @Override public void imagePreShow (final ImageLoadRequest req) { final ImageLoadListener listener = this.rowView.getImageLoadListener(); if (listener != null) listener.imagePreShow(req); } @Override public void imageLoaded (final ImageLoadRequest req) { this.rowView.hideText(); final ImageLoadListener listener = this.rowView.getImageLoadListener(); if (listener != null) listener.imageLoaded(req); } @Override public void imageLoadFailed (final ImageLoadRequest req, final String errMsg) { final Button button = this.rowView.getButton(); button.setOnClickListener(new OnClickListener() { @Override public void onClick (final View v) { ImageLoadCallbacks.this.imageLoader.loadImage(req.withRetry()); v.setVisibility(View.GONE); } }); button.setVisibility(View.VISIBLE); final ImageLoadListener listener = this.rowView.getImageLoadListener(); if (listener != null) listener.imageLoadFailed(req, errMsg); } } }