package slidenerd.vivz.bucketdrops.widgets;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Queue;
import slidenerd.vivz.bucketdrops.R;
import slidenerd.vivz.bucketdrops.extras.Util;
/**
* Created by vivz on 26/10/15.
*/
public class BucketPickerView extends LinearLayout implements View.OnTouchListener {
public static final int DELAY = 150;
public static final int MESSAGE_CHECK_BTN_STILL_PRESSED = 1;
public static final int DATE = 0;
public static final int MONTH = 1;
public static final int YEAR = 2;
private SimpleDateFormat mFormatter = new SimpleDateFormat();
private Calendar mCalendar;
private TextView mTextMonth;
private TextView mTextDate;
private TextView mTextYear;
private ImageButton mBtnIncDate;
private ImageButton mBtnDecDate;
private ImageButton mBtnIncMonth;
private ImageButton mBtnDecMonth;
private ImageButton mBtnIncYear;
private ImageButton mBtnDecYear;
private boolean mIncrement = false;
private boolean mDecrement = false;
private boolean mPressed = false;
private int mQuantity;
public final Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_CHECK_BTN_STILL_PRESSED:
if (mIncrement) {
increment(mQuantity);
}
if (mDecrement) {
decrement(mQuantity);
}
if (mIncrement
|| mDecrement) {
mHandler.sendEmptyMessageDelayed(MESSAGE_CHECK_BTN_STILL_PRESSED, DELAY);
}
break;
}
return true;
}
});
public BucketPickerView(Context context) {
super(context);
init(context);
}
public BucketPickerView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public BucketPickerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public BucketPickerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
public void init(Context context) {
Typeface typeface = Typeface.createFromAsset(context.getAssets(), "fonts/raleway_thin.ttf");
mCalendar = Calendar.getInstance();
LayoutInflater layoutInflater = LayoutInflater.from(context);
View view = layoutInflater.inflate(R.layout.bucket_picker_view, this);
mTextDate = (TextView) view.findViewById(R.id.tv_date);
mTextMonth = (TextView) view.findViewById(R.id.tv_month);
mTextYear = (TextView) view.findViewById(R.id.tv_year);
mBtnIncDate = (ImageButton) view.findViewById(R.id.ib_increment_date);
mBtnDecDate = (ImageButton) view.findViewById(R.id.ib_decrement_date);
mBtnIncMonth = (ImageButton) view.findViewById(R.id.ib_increment_month);
mBtnDecMonth = (ImageButton) view.findViewById(R.id.ib_decrement_month);
mBtnIncYear = (ImageButton) view.findViewById(R.id.ib_increment_year);
mBtnDecYear = (ImageButton) view.findViewById(R.id.ib_decrement_year);
mBtnIncDate.setOnTouchListener(this);
mBtnDecDate.setOnTouchListener(this);
mBtnIncMonth.setOnTouchListener(this);
mBtnDecMonth.setOnTouchListener(this);
mBtnIncYear.setOnTouchListener(this);
mBtnDecYear.setOnTouchListener(this);
mTextDate.setTypeface(typeface);
mTextMonth.setTypeface(typeface);
mTextYear.setTypeface(typeface);
int year = mCalendar.get(Calendar.YEAR);
int month = mCalendar.get(Calendar.MONTH) + 1;
int date = mCalendar.get(Calendar.DATE);
updateUi(date, month, year, 0, 0, 0);
}
private void updateUi(int date, int month, int year, int hour, int minute, int second) {
mCalendar.set(Calendar.DATE, date);
mCalendar.set(Calendar.MONTH, month);
mCalendar.set(Calendar.YEAR, year);
mCalendar.set(Calendar.HOUR, hour);
mCalendar.set(Calendar.MINUTE, minute);
mCalendar.set(Calendar.SECOND, second);
try {
String today = year + " " + month + " " + date + " " + hour + " " + minute + " " + second;
mFormatter.applyLocalizedPattern("yyyy MM dd hh mm ss");
mCalendar.setTime(mFormatter.parse(today));
mTextYear.setText(year + "");
mFormatter.applyLocalizedPattern("MMM");
mTextMonth.setText(mFormatter.format(mCalendar.getTime()).toUpperCase());
mTextDate.setText(date + "");
} catch (ParseException e) {
Log.d("VIVZ", "onRestoreInstanceState: " + e);
}
}
@Override
public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable("instanceState", super.onSaveInstanceState());
bundle.putInt("day", mCalendar.get(Calendar.DATE));
bundle.putInt("month", mCalendar.get(Calendar.MONTH));
bundle.putInt("year", mCalendar.get(Calendar.YEAR));
return bundle;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle bundle = (Bundle) state;
state = bundle.getParcelable("instanceState");
int year = bundle.getInt("year");
int month = bundle.getInt("month") + 1;
int date = bundle.getInt("day");
updateUi(date, month, year, 0, 0, 0);
}
super.onRestoreInstanceState(state);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int id = v.getId();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPressed = true;
switch (id) {
case R.id.ib_increment_date:
mIncrement = true;
mQuantity = DATE;
increment(mQuantity);
toggleDrawable(mBtnIncDate, true);
break;
case R.id.ib_decrement_date:
mDecrement = true;
mQuantity = DATE;
decrement(mQuantity);
toggleDrawable(mBtnDecDate, false);
break;
case R.id.ib_increment_month:
mIncrement = true;
mQuantity = MONTH;
increment(mQuantity);
toggleDrawable(mBtnIncMonth, true);
break;
case R.id.ib_decrement_month:
mDecrement = true;
mQuantity = MONTH;
decrement(mQuantity);
toggleDrawable(mBtnDecMonth, false);
break;
case R.id.ib_increment_year:
mIncrement = true;
mQuantity = YEAR;
increment(mQuantity);
toggleDrawable(mBtnIncYear, true);
break;
case R.id.ib_decrement_year:
mDecrement = true;
mQuantity = YEAR;
decrement(mQuantity);
toggleDrawable(mBtnDecYear, false);
break;
}
mHandler.sendEmptyMessageDelayed(MESSAGE_CHECK_BTN_STILL_PRESSED, DELAY);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mPressed = false;
toggleDrawable(mBtnIncDate, true);
toggleDrawable(mBtnDecDate, false);
toggleDrawable(mBtnIncMonth, true);
toggleDrawable(mBtnDecMonth, false);
toggleDrawable(mBtnIncYear, true);
toggleDrawable(mBtnDecYear, false);
mIncrement = false;
mDecrement = false;
break;
}
return true;
}
private void toggleDrawable(ImageButton button, boolean up) {
if (up) {
if (mPressed) {
Util.setBackgroundDrawable(button, R.drawable.transparent_box_up);
Util.setImageDrawable(button, R.drawable.ic_menu_up_colored);
} else {
Util.setBackgroundDrawable(button, R.drawable.purple_box_up);
Util.setImageDrawable(button, R.drawable.ic_menu_up_transparent);
}
} else {
if (mPressed) {
Util.setBackgroundDrawable(button, R.drawable.transparent_box_down);
Util.setImageDrawable(button, R.drawable.ic_menu_down_colored);
} else {
Util.setBackgroundDrawable(button, R.drawable.purple_box_down);
Util.setImageDrawable(button, R.drawable.ic_menu_down_transparent);
}
}
}
private void increment(int quantity) {
switch (quantity) {
case DATE:
mCalendar.add(Calendar.DATE, 1);
break;
case MONTH:
mCalendar.add(Calendar.MONTH, 1);
break;
case YEAR:
mCalendar.add(Calendar.YEAR, 1);
break;
}
mTextDate.setText(mCalendar.get(Calendar.DATE) + "");
mTextMonth.setText(mFormatter.format(mCalendar.getTime()).toUpperCase());
mTextYear.setText(mCalendar.get(Calendar.YEAR) + "");
}
private void decrement(int quantity) {
switch (quantity) {
case DATE:
mCalendar.add(Calendar.DATE, -1);
break;
case MONTH:
mCalendar.add(Calendar.MONTH, -1);
break;
case YEAR:
mCalendar.add(Calendar.YEAR, -1);
break;
}
mTextDate.setText(mCalendar.get(Calendar.DATE) + "");
mTextMonth.setText(mFormatter.format(mCalendar.getTime()).toUpperCase());
mTextYear.setText(mCalendar.get(Calendar.YEAR) + "");
}
public long getTime() {
return mCalendar.getTimeInMillis();
}
}