package org.lab99.mdt.drawable;
/**
* Base class for State Changer
*/
abstract class StateChanger implements OnStateChangedListener {
protected final static long DEFAULT_DURATION = 300;
private long mDuration = DEFAULT_DURATION;
private boolean mEnabled = true;
private boolean mEnableReleaseAnimation = true;
private boolean mEnableFocusedAnimation = true;
private boolean mEnablePressedAnimation = true;
@Override
public boolean onStateChange(int[] prev_states, int[] next_states) {
if (mEnabled) {
boolean prev_pressed = contains(prev_states, android.R.attr.state_pressed);
boolean next_pressed = contains(next_states, android.R.attr.state_pressed);
if (prev_pressed != next_pressed) {
// pressed status changed
if (next_pressed) {
onPressed();
} else {
onReleased();
}
return true;
}
boolean prev_focused = contains(prev_states, android.R.attr.state_focused);
boolean next_focused = contains(next_states, android.R.attr.state_focused);
if (prev_focused != next_focused) {
// focused status changed
if (next_focused) {
onFocused();
} else {
onReleased();
}
return true;
}
}
return false;
}
// abstract
@Override
public abstract void onPressed();
@Override
public abstract void onReleased();
@Override
public abstract void onFocused();
@Override
public boolean isEnabled() {
return mEnabled;
}
@Override
public void setEnabled(boolean enabled) {
mEnabled = enabled;
}
public abstract boolean isRunning();
public abstract void cancel();
// getters/setters
public long getDuration() {
return mDuration;
}
public void setDuration(long duration) {
mDuration = duration;
}
public boolean getEnableReleaseAnimation() {
return mEnableReleaseAnimation;
}
public void setEnableReleaseAnimation(boolean value) {
mEnableReleaseAnimation = value;
}
public boolean getEnableFocusedAnimation() {
return mEnableFocusedAnimation;
}
public void setEnableFocusedAnimation(boolean value) {
mEnableFocusedAnimation = value;
}
public boolean getEnablePressedAnimation() {
return mEnablePressedAnimation;
}
public void setEnablePressedAnimation(boolean value) {
mEnablePressedAnimation = value;
}
// private
private boolean contains(int[] array, int value) {
for (int v : array) {
if (v == value)
return true;
}
return false;
}
private String convertStatesToString(int[] stateSet) {
StringBuilder sb = new StringBuilder();
sb.append("{");
for (int state : stateSet) {
switch (state) {
case android.R.attr.state_pressed:
sb.append(" pressed, ");
break;
case android.R.attr.state_activated:
sb.append(" activated, ");
break;
case android.R.attr.state_focused:
sb.append(" focused, ");
break;
case android.R.attr.state_enabled:
sb.append(" enabled, ");
break;
case android.R.attr.state_selected:
sb.append(" selected, ");
break;
case android.R.attr.state_hovered:
sb.append(" hovered, ");
break;
case android.R.attr.state_accelerated:
sb.append(" accelerated, ");
break;
case android.R.attr.state_window_focused:
sb.append(" window_focused, ");
break;
default:
sb.append(" " + state + ", ");
break;
}
}
sb.append("}");
return sb.toString();
}
}