package com.rey.material.widget; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.View; import com.rey.material.R; import com.rey.material.drawable.CircularProgressDrawable; import com.rey.material.drawable.LinearProgressDrawable; import com.rey.material.util.ViewUtil; public class ProgressView extends View { private boolean mAutostart; private boolean mCircular; private int mProgressId; public static final int MODE_DETERMINATE = 0; public static final int MODE_INDETERMINATE = 1; public static final int MODE_BUFFER = 2; public static final int MODE_QUERY = 3; private Drawable mProgressDrawable; public ProgressView(Context context) { this(context, null, 0, 0); } public ProgressView(Context context, AttributeSet attrs) { this(context, attrs, 0, 0); } public ProgressView(Context context, AttributeSet attrs, int defStyleAttr){ this(context, attrs, defStyleAttr, 0); } @SuppressWarnings("deprecation") @TargetApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public ProgressView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr, defStyleRes); } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ applyStyle(context, attrs, defStyleAttr, defStyleRes); } public void applyStyle(int resId){ applyStyle(getContext(), null, 0, resId); } private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressView, defStyleAttr, defStyleRes); mAutostart = a.getBoolean(R.styleable.ProgressView_pv_autostart, true); mCircular = a.getBoolean(R.styleable.ProgressView_pv_circular, true); mProgressId = a.getResourceId(R.styleable.ProgressView_pv_progressStyle, 0); if(mProgressId == 0) mProgressId = mCircular ? R.style.Material_Drawable_CircularProgress : R.style.Material_Drawable_LinearProgress; if(mCircular) { mProgressDrawable = new CircularProgressDrawable.Builder(context, mProgressId).build(); if(a.hasValue(R.styleable.ProgressView_pv_progressMode)) ((CircularProgressDrawable)mProgressDrawable).setProgressMode(a.getInt(R.styleable.ProgressView_pv_progressMode, MODE_INDETERMINATE)); } else{ mProgressDrawable = new LinearProgressDrawable.Builder(context, mProgressId).build(); if(a.hasValue(R.styleable.ProgressView_pv_progressMode)) ((LinearProgressDrawable)mProgressDrawable).setProgressMode(a.getInt(R.styleable.ProgressView_pv_progressMode, MODE_INDETERMINATE)); } if(a.hasValue(R.styleable.ProgressView_pv_progress)) setProgress(a.getFloat(R.styleable.ProgressView_pv_progress, 0)); if(a.hasValue(R.styleable.ProgressView_pv_secondaryProgress)) setSecondaryProgress(a.getFloat(R.styleable.ProgressView_pv_secondaryProgress, 0)); a.recycle(); ViewUtil.setBackground(this, mProgressDrawable); } @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if(changedView != this) return; if (mAutostart) { if (visibility == GONE || visibility == INVISIBLE) stop(); else start(); } } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if(getVisibility() == View.VISIBLE && mAutostart) start(); } @Override protected void onDetachedFromWindow() { if (mAutostart) stop(); super.onDetachedFromWindow(); } public int getProgressMode(){ if(mCircular) return ((CircularProgressDrawable)mProgressDrawable).getProgressMode(); else return ((LinearProgressDrawable)mProgressDrawable).getProgressMode(); } /** * @return The current progress of this view in [0..1] range. */ public float getProgress(){ if(mCircular) return ((CircularProgressDrawable)mProgressDrawable).getProgress(); else return ((LinearProgressDrawable)mProgressDrawable).getProgress(); } /** * @return The current secondary progress of this view in [0..1] range. */ public float getSecondaryProgress(){ if(mCircular) return ((CircularProgressDrawable)mProgressDrawable).getSecondaryProgress(); else return ((LinearProgressDrawable)mProgressDrawable).getSecondaryProgress(); } /** * Set the current progress of this view. * @param percent The progress value in [0..1] range. */ public void setProgress(float percent){ if(mCircular) ((CircularProgressDrawable)mProgressDrawable).setProgress(percent); else ((LinearProgressDrawable)mProgressDrawable).setProgress(percent); } /** * Set the current secondary progress of this view. * @param percent The progress value in [0..1] range. */ public void setSecondaryProgress(float percent){ if(mCircular) ((CircularProgressDrawable)mProgressDrawable).setSecondaryProgress(percent); else ((LinearProgressDrawable)mProgressDrawable).setSecondaryProgress(percent); } /** * Start showing progress. */ public void start(){ if(mProgressDrawable != null) ((Animatable)mProgressDrawable).start(); } /** * Stop showing progress. */ public void stop(){ if(mProgressDrawable != null) ((Animatable)mProgressDrawable).stop(); } }