package devlight.io.sample;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.OvershootInterpolator;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.Toast;
import com.commonsware.cwac.colormixer.ColorMixer;
import com.commonsware.cwac.colormixer.ColorMixerDialog;
import java.util.ArrayList;
import java.util.Random;
import devlight.io.library.ArcProgressStackView;
public class MainActivity extends AppCompatActivity implements
View.OnClickListener,
CompoundButton.OnCheckedChangeListener,
SeekBar.OnSeekBarChangeListener {
public final static int MODEL_COUNT = 4;
// APSV
private ArcProgressStackView mArcProgressStackView;
// Buttons
private Button mBtnShadowColor;
private Button mBtnTextColor;
// Wrappers
private View mWrapperShadow;
private View mWrapperAnimation;
// Parsed colors
private int[] mStartColors = new int[MODEL_COUNT];
private int[] mEndColors = new int[MODEL_COUNT];
// First full size of APSV
private int mFullSize = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
// Get APSV
mArcProgressStackView = (ArcProgressStackView) findViewById(R.id.apsv);
// Get colors
final String[] startColors = getResources().getStringArray(R.array.devlight);
final String[] endColors = getResources().getStringArray(R.array.default_preview);
final String[] bgColors = getResources().getStringArray(R.array.medical_express);
// Parse colors
for (int i = 0; i < MODEL_COUNT; i++) {
mStartColors[i] = Color.parseColor(startColors[i]);
mEndColors[i] = Color.parseColor(endColors[i]);
}
// Set models
final ArrayList<ArcProgressStackView.Model> models = new ArrayList<>();
models.add(new ArcProgressStackView.Model("Strategy", 0, Color.parseColor(bgColors[0]), mStartColors[0]));
models.add(new ArcProgressStackView.Model("Design", 0, Color.parseColor(bgColors[1]), mStartColors[1]));
models.add(new ArcProgressStackView.Model("Development", 0, Color.parseColor(bgColors[2]), mStartColors[2]));
models.add(new ArcProgressStackView.Model("QA", 0, Color.parseColor(bgColors[3]), mStartColors[3]));
mArcProgressStackView.setModels(models);
// Get wrappers
mWrapperShadow = findViewById(R.id.wrapper_shadow);
mWrapperAnimation = findViewById(R.id.wrapper_animation);
// Get checkboxes
final CheckBox cbAnimating = (CheckBox) findViewById(R.id.cb_animating);
final CheckBox cbDragging = (CheckBox) findViewById(R.id.cb_dragging);
final CheckBox cbShadowing = (CheckBox) findViewById(R.id.cb_shadowing);
final CheckBox cbRounding = (CheckBox) findViewById(R.id.cb_rounding);
final CheckBox cbLeveling = (CheckBox) findViewById(R.id.cb_leveling);
final CheckBox cbShowModelBg = (CheckBox) findViewById(R.id.cb_show_model_bg);
final CheckBox cbUseCustomTypeface = (CheckBox) findViewById(R.id.cb_use_custom_typeface);
final CheckBox cbUseOvershootInterpolator = (CheckBox) findViewById(R.id.cb_use_overshoot_interpolator);
final CheckBox cbUseVerticalOrientation = (CheckBox) findViewById(R.id.cb_use_vertical_orientation);
final CheckBox cbUseGradient = (CheckBox) findViewById(R.id.cb_use_gradient);
// Set checkboxes
cbAnimating.setOnCheckedChangeListener(this);
cbDragging.setOnCheckedChangeListener(this);
cbShadowing.setOnCheckedChangeListener(this);
cbRounding.setOnCheckedChangeListener(this);
cbShowModelBg.setOnCheckedChangeListener(this);
cbLeveling.setOnCheckedChangeListener(this);
cbUseCustomTypeface.setOnCheckedChangeListener(this);
cbUseOvershootInterpolator.setOnCheckedChangeListener(this);
cbUseVerticalOrientation.setOnCheckedChangeListener(this);
cbUseGradient.setOnCheckedChangeListener(this);
onCheckedChanged(cbAnimating, cbAnimating.isChecked());
onCheckedChanged(cbDragging, cbDragging.isChecked());
onCheckedChanged(cbShadowing, cbShadowing.isChecked());
onCheckedChanged(cbRounding, cbRounding.isChecked());
onCheckedChanged(cbLeveling, cbLeveling.isChecked());
onCheckedChanged(cbShowModelBg, cbShowModelBg.isChecked());
onCheckedChanged(cbUseCustomTypeface, cbUseCustomTypeface.isChecked());
onCheckedChanged(cbUseOvershootInterpolator, cbUseOvershootInterpolator.isChecked());
onCheckedChanged(cbUseVerticalOrientation, cbUseVerticalOrientation.isChecked());
onCheckedChanged(cbUseGradient, cbUseGradient.isChecked());
// Get buttons
mBtnTextColor = (Button) findViewById(R.id.btn_text_color);
mBtnShadowColor = (Button) findViewById(R.id.btn_shadow_color);
final Button btnAnimate = (Button) findViewById(R.id.btn_animate);
final Button btnPresentation = (Button) findViewById(R.id.btn_presentation);
final Button btnReset = (Button) findViewById(R.id.btn_reset);
// Set buttons
mBtnTextColor.setOnClickListener(this);
mBtnShadowColor.setOnClickListener(this);
btnAnimate.setOnClickListener(this);
btnPresentation.setOnClickListener(this);
btnReset.setOnClickListener(this);
// Set default colors
handleSelectedColor(true, Color.DKGRAY);
handleSelectedColor(false, Color.WHITE);
// Get seekers
final SeekBar sbViewSize = (SeekBar) findViewById(R.id.pb_view_size);
final SeekBar sbShadowDistance = (SeekBar) findViewById(R.id.pb_shadow_distance);
final SeekBar sbShadowAngle = (SeekBar) findViewById(R.id.pb_shadow_angle);
final SeekBar sbShadowRadius = (SeekBar) findViewById(R.id.pb_shadow_radius);
final SeekBar sbAnimationDuration = (SeekBar) findViewById(R.id.pb_animation_duration);
final SeekBar sbDrawWidth = (SeekBar) findViewById(R.id.pb_draw_width);
final SeekBar sbModelOffset = (SeekBar) findViewById(R.id.pb_model_offset);
final SeekBar sbStartAngle = (SeekBar) findViewById(R.id.pb_start_angle);
final SeekBar sbSweepAngle = (SeekBar) findViewById(R.id.pb_sweep_angle);
// Set seekers
sbViewSize.setOnSeekBarChangeListener(this);
sbShadowDistance.setOnSeekBarChangeListener(this);
sbShadowAngle.setOnSeekBarChangeListener(this);
sbShadowRadius.setOnSeekBarChangeListener(this);
sbAnimationDuration.setOnSeekBarChangeListener(this);
sbDrawWidth.setOnSeekBarChangeListener(this);
sbModelOffset.setOnSeekBarChangeListener(this);
sbStartAngle.setOnSeekBarChangeListener(this);
sbSweepAngle.setOnSeekBarChangeListener(this);
// Set animator listener
mArcProgressStackView.setAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
// Update goes here
Log.d("onAnimationUpdate: ", String.valueOf(animation.getAnimatedValue()));
}
});
mArcProgressStackView.setAnimatorListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(final Animator animation) {
Toast.makeText(MainActivity.this, "ANIMATION", Toast.LENGTH_SHORT).show();
}
});
// Start apsv animation on start
mArcProgressStackView.postDelayed(new Runnable() {
@Override
public void run() {
btnAnimate.performClick();
}
}, 333);
}
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
switch (buttonView.getId()) {
case R.id.cb_animating:
mArcProgressStackView.setIsAnimated(isChecked);
mWrapperAnimation.setVisibility(isChecked ? View.VISIBLE : View.GONE);
break;
case R.id.cb_dragging:
mArcProgressStackView.setIsDragged(isChecked);
break;
case R.id.cb_shadowing:
mArcProgressStackView.setIsShadowed(isChecked);
mArcProgressStackView.requestLayout();
mWrapperShadow.setVisibility(isChecked ? View.VISIBLE : View.GONE);
break;
case R.id.cb_rounding:
mArcProgressStackView.setIsRounded(isChecked);
mArcProgressStackView.postInvalidate();
break;
case R.id.cb_leveling:
mArcProgressStackView.setIsLeveled(isChecked);
break;
case R.id.cb_show_model_bg:
mArcProgressStackView.setModelBgEnabled(isChecked);
break;
case R.id.cb_use_custom_typeface:
mArcProgressStackView.setTypeface(isChecked ? "fonts/agency.ttf" : "");
break;
case R.id.cb_use_overshoot_interpolator:
mArcProgressStackView.setInterpolator(isChecked ? new OvershootInterpolator() : null);
break;
case R.id.cb_use_vertical_orientation:
mArcProgressStackView.setIndicatorOrientation(isChecked ?
ArcProgressStackView.IndicatorOrientation.VERTICAL :
ArcProgressStackView.IndicatorOrientation.HORIZONTAL
);
break;
case R.id.cb_use_gradient:
for (int i = 0; i < mArcProgressStackView.getModels().size(); i++) {
final ArcProgressStackView.Model model = mArcProgressStackView.getModels().get(i);
model.setColor(mStartColors[i]);
model.setColors(isChecked ? new int[]{mStartColors[i], mEndColors[i]} : null);
}
mArcProgressStackView.requestLayout();
mArcProgressStackView.postInvalidate();
break;
default:
break;
}
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.btn_text_color:
showColorPicker(false);
break;
case R.id.btn_shadow_color:
showColorPicker(true);
break;
case R.id.btn_animate:
final Random random = new Random();
for (ArcProgressStackView.Model model : mArcProgressStackView.getModels())
model.setProgress(random.nextInt(101));
mArcProgressStackView.animateProgress();
break;
case R.id.btn_reset:
finish();
startActivity(getIntent());
break;
case R.id.btn_presentation:
startActivity(new Intent(MainActivity.this, PresentationActivity.class));
break;
default:
break;
}
}
@Override
public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
switch (seekBar.getId()) {
case R.id.pb_view_size:
if (mFullSize == -1)
mFullSize = mArcProgressStackView.getSize();
mArcProgressStackView.getLayoutParams().height = (int) ((mFullSize * 0.5f) +
(int) ((float) mFullSize * 0.5f * ((float) progress / 100.0f)));
mArcProgressStackView.requestLayout();
break;
case R.id.pb_shadow_distance:
mArcProgressStackView.setShadowDistance(progress);
mArcProgressStackView.postInvalidate();
break;
case R.id.pb_shadow_angle:
mArcProgressStackView.setShadowAngle(progress);
mArcProgressStackView.postInvalidate();
break;
case R.id.pb_shadow_radius:
mArcProgressStackView.setShadowRadius(progress);
mArcProgressStackView.postInvalidate();
break;
case R.id.pb_animation_duration:
mArcProgressStackView.setAnimationDuration(progress);
break;
case R.id.pb_draw_width:
mArcProgressStackView.setDrawWidthFraction((float) progress / 100.0f);
break;
case R.id.pb_model_offset:
mArcProgressStackView.setProgressModelOffset(progress - 50);
break;
case R.id.pb_start_angle:
mArcProgressStackView.setStartAngle(progress);
break;
case R.id.pb_sweep_angle:
mArcProgressStackView.setSweepAngle(progress);
break;
default:
break;
}
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
// Empty cause of implement
}
@Override
public void onStopTrackingTouch(final SeekBar seekBar) {
// Empty cause of implement
}
private void showColorPicker(final boolean isShadowColor) {
new ColorMixerDialog(
this,
isShadowColor ? mBtnShadowColor.getCurrentTextColor() : mBtnTextColor.getCurrentTextColor(),
new ColorMixer.OnColorChangedListener() {
@Override
public void onColorChange(final int i) {
handleSelectedColor(isShadowColor, i);
}
}).show();
}
private void handleSelectedColor(final boolean isShadowColor, final int selectedColor) {
if (isShadowColor) {
mArcProgressStackView.setShadowColor(selectedColor);
mBtnShadowColor.setTextColor(selectedColor);
} else {
mArcProgressStackView.setTextColor(selectedColor);
mBtnTextColor.setTextColor(selectedColor);
}
}
}