package org.wheelmap.android.view.progress;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.ColorInt;
import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import org.wheelmap.android.online.R;
import java.util.HashMap;
import java.util.Map;
public class ProgressCompleteView extends FrameLayout {
public enum Status {
LOADING,
SUCCESS,
ERROR
}
private CircularProgressView progressView;
private ImageView completeImage;
private Status status = Status.LOADING;
private Map<Status, Integer> colors = new HashMap<>();
public ProgressCompleteView(Context context) {
super(context);
init(context);
}
public ProgressCompleteView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ProgressCompleteView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
progressView = new CircularProgressView(context);
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
progressView.setLayoutParams(params);
progressView.startAnimation();
addView(progressView);
completeImage = new ImageView(context);
params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
int margin = (int) Utils.dpToPx(context, 10);
params.setMargins(margin, margin, margin, margin);
completeImage.setLayoutParams(params);
completeImage.setVisibility(View.GONE);
addView(completeImage);
setColor(Status.LOADING, getThemeAccentColor(getContext()));
setColor(Status.ERROR, Color.RED);
setColor(Status.SUCCESS, Color.GREEN);
progressView.setColor(colors.get(Status.LOADING));
}
public void setColor(Status status, @ColorInt int color) {
colors.put(status, color);
if (status == this.status) {
progressView.setColor(color);
}
}
public void setStatus(Status status) {
this.status = status;
int color = colors.get(status);
switch (status) {
case LOADING:
progressView.setColor(color);
progressView.startAnimation();
completeImage.setVisibility(View.GONE);
break;
case ERROR: {
progressView.completeAnimation(color);
completeImage.setVisibility(View.VISIBLE);
AnimatedVectorDrawableCompat drawable = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_error_animated);
drawable.setTint(color);
animateDrawable(drawable);
break;
}
case SUCCESS: {
progressView.completeAnimation(color);
AnimatedVectorDrawableCompat drawable = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_check_animated);
drawable.setTint(color);
animateDrawable(drawable);
break;
}
}
}
private void animateDrawable(final AnimatedVectorDrawableCompat drawable) {
completeImage.setImageDrawable(null);
completeImage.setVisibility(View.VISIBLE);
progressView.addListener(new CircularProgressView.CircularProgressViewListener() {
@Override
public void onAnimationStart() {
}
@Override
public void onAnimationEnd() {
completeImage.setVisibility(View.VISIBLE);
completeImage.setImageDrawable(drawable);
drawable.start();
progressView.removeListener(this);
}
});
}
public Status getStatus() {
return status;
}
public static int getThemeAccentColor(final Context context) {
final TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(R.attr.colorAccent, value, true);
return value.data;
}
}