package org.emdev.ui.widget;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.widget.SeekBar;
public class SeekBarIncrementHandler extends Handler implements OnTouchListener, OnClickListener,
OnLongClickListener {
private static final int DELAY = 200;
private static final int INIT_MULT = 5;
private static final int NEXT_MULT = 2;
private SeekBar seekBar;
boolean started;
int count;
public void init(IViewContainer parent, int seekBarId, int minusViewId, int plusViewId) {
init(parent, (SeekBar) parent.findViewById(minusViewId), minusViewId, plusViewId);
}
public void init(IViewContainer parent, SeekBar seekBar, int minusViewId, int plusViewId) {
this.seekBar = seekBar;
View minus = parent.findViewById(minusViewId);
minus.setTag(Integer.valueOf(-1));
minus.setOnTouchListener(this);
minus.setOnClickListener(this);
minus.setOnLongClickListener(this);
View plus = parent.findViewById(plusViewId);
plus.setTag(Integer.valueOf(+1));
plus.setOnTouchListener(this);
plus.setOnClickListener(this);
plus.setOnLongClickListener(this);
}
@Override
public void handleMessage(final Message msg) {
if (started && seekBar != null) {
count++;
int delta = msg.what;
seekBar.incrementProgressBy(delta);
if (count % (1000 / DELAY) == 0) {
delta = NEXT_MULT * delta;
}
sendMessageDelayed(obtainMessage(delta), DELAY);
}
}
public void startIncrement(final int delta) {
started = true;
count = 0;
handleMessage(obtainMessage(delta));
}
public void stopIncrement() {
started = false;
}
@Override
public boolean onTouch(final View v, final MotionEvent event) {
final int action = event.getAction();
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
stopIncrement();
}
return false;
}
@Override
public void onClick(final View v) {
if (seekBar != null) {
final int delta = ((Integer) v.getTag()).intValue();
seekBar.incrementProgressBy(delta);
}
}
@Override
public boolean onLongClick(final View v) {
if (seekBar != null) {
final int delta = INIT_MULT * ((Integer) v.getTag()).intValue();
startIncrement(delta);
}
return true;
}
}