package com.marshalchen.common.uimodule.slider.SliderTypes;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.marshalchen.common.uimodule.R;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import java.io.File;
/**
* When you want to make your own slider view, you must extends from this class.
* BaseSliderView provides some useful methods.
* I provide two example: {@link com.marshalchen.common.uimodule.slider.SliderTypes.DefaultSliderView} and
* {@link com.marshalchen.common.uimodule.slider.SliderTypes.TextSliderView}
* if you want to show progressbar, you just need to set a progressbar id as @+id/loading_bar.
*/
public abstract class BaseSliderView {
protected Context mContext;
private Bundle mBundle;
/**
* Error place holder image.
*/
private int mErrorPlaceHolderRes;
/**
* Empty imageView placeholder.
*/
private int mEmptyPlaceHolderRes;
private String mUrl;
private File mFile;
private int mRes;
protected OnSliderClickListener mOnSliderClickListener;
private boolean mErrorDisappear;
private ImageLoadListener mLoadListener;
private String mDescription;
/**
* Scale type of the image.
*/
private ScaleType mScaleType = ScaleType.Fit;
public enum ScaleType{
CenterCrop, CenterInside, Fit, FitCenterCrop
}
protected BaseSliderView(Context context) {
mContext = context;
this.mBundle = new Bundle();
}
/**
* the placeholder image when loading image from url or file.
* @param resId Image resource id
* @return
*/
public BaseSliderView empty(int resId){
mEmptyPlaceHolderRes = resId;
return this;
}
/**
* determine whether remove the image which failed to download or load from file
* @param disappear
* @return
*/
public BaseSliderView errorDisappear(boolean disappear){
mErrorDisappear = disappear;
return this;
}
/**
* if you set errorDisappear false, this will set a error placeholder image.
* @param resId image resource id
* @return
*/
public BaseSliderView error(int resId){
mErrorPlaceHolderRes = resId;
return this;
}
/**
* the description of a slider image.
* @param description
* @return
*/
public BaseSliderView description(String description){
mDescription = description;
return this;
}
/**
* set a url as a image that preparing to load
* @param url
* @return
*/
public BaseSliderView image(String url){
if(mFile != null || mRes != 0){
throw new IllegalStateException("Call multi image function," +
"you only have permission to call it once");
}
mUrl = url;
return this;
}
/**
* set a file as a image that will to load
* @param file
* @return
*/
public BaseSliderView image(File file){
if(mUrl != null || mRes != 0){
throw new IllegalStateException("Call multi image function," +
"you only have permission to call it once");
}
mFile = file;
return this;
}
public BaseSliderView image(int res){
if(mUrl != null || mFile != null){
throw new IllegalStateException("Call multi image function," +
"you only have permission to call it once");
}
mRes = res;
return this;
}
public String getUrl(){
return mUrl;
}
public boolean isErrorDisappear(){
return mErrorDisappear;
}
public int getEmpty(){
return mEmptyPlaceHolderRes;
}
public int getError(){
return mErrorPlaceHolderRes;
}
public String getDescription(){
return mDescription;
}
public Context getContext(){
return mContext;
}
/**
* set a slider image click listener
* @param l
* @return
*/
public BaseSliderView setOnSliderClickListener(OnSliderClickListener l){
mOnSliderClickListener = l;
return this;
}
/**
* When you want to implement your own slider view, please call this method in the end in `getView()` method
* @param v the whole view
* @param targetImageView where to place image
*/
protected void bindEventAndShow(final View v, ImageView targetImageView){
final BaseSliderView me = this;
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnSliderClickListener != null){
mOnSliderClickListener.onSliderClick(me);
}
}
});
if (targetImageView == null)
return;
mLoadListener.onStart(me);
Picasso p = Picasso.with(mContext);
RequestCreator rq = null;
if(mUrl!=null){
rq = p.load(mUrl);
}else if(mFile != null){
rq = p.load(mFile);
}else if(mRes != 0){
rq = p.load(mRes);
}else{
return;
}
if(rq == null){
return;
}
if(getEmpty() != 0){
rq.placeholder(getEmpty());
}
if(getError() != 0){
rq.error(getError());
}
switch (mScaleType){
case Fit:
rq.fit();
break;
case CenterCrop:
rq.fit().centerCrop();
break;
case CenterInside:
rq.fit().centerInside();
break;
}
rq.into(targetImageView,new Callback() {
@Override
public void onSuccess() {
if(v.findViewById(R.id.loading_bar) != null){
v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE);
}
}
@Override
public void onError() {
if(mLoadListener != null){
mLoadListener.onEnd(false,me);
}
}
});
}
public BaseSliderView setScaleType(ScaleType type){
mScaleType = type;
return this;
}
public ScaleType getScaleType(){
return mScaleType;
}
/**
* the extended class have to implement getView(), which is called by the adapter,
* every extended class response to render their own view.
* @return
*/
public abstract View getView();
/**
* set a listener to get a message , if load error.
* @param l
*/
public void setOnImageLoadListener(ImageLoadListener l){
mLoadListener = l;
}
public interface OnSliderClickListener {
public void onSliderClick(BaseSliderView slider);
}
/**
* when you have some extra information, please put it in this bundle.
* @return
*/
public Bundle getBundle(){
return mBundle;
}
public interface ImageLoadListener{
public void onStart(BaseSliderView target);
public void onEnd(boolean result, BaseSliderView target);
}
}