package cc.ptt;
public class CountDown {
public interface OnTickListener {
public void onTick(int seconds);
}
private static class NullTickListener implements OnTickListener {
@Override
public void onTick(int seconds) {
}
}
private static final OnTickListener nullListener =
new NullTickListener();
private OnTickListener tickListener = nullListener;
public void asyncStart(final int seconds) {
// run in some worker thread
public void run() {
try {
count(tickListener, seconds);
e.printStackTrace();
}
}
}).start();
}
public void syncStart(int seconds) {
// run in the caller thread
try {
count(tickListener, seconds);
e.printStackTrace();
}
}
private void count(OnTickListener listener, int timeInSecs)
if (timeInSecs <= 0) {
listener.onTick(0);
return;
}
listener.onTick(timeInSecs);
count(listener, timeInSecs - 1);
}
public OnTickListener getTickListener() {
return tickListener == nullListener? null : tickListener;
}
public void setTickListener(OnTickListener tickListener) {
if (tickListener == null)
this.tickListener = nullListener;
else
this.tickListener = tickListener;
}
}
cGFja2FnZSBjYy5wdHQ7CgpwdWJsaWMgY2xhc3MgQ291bnREb3duIHsKICAgIHB1YmxpYyBpbnRlcmZhY2UgT25UaWNrTGlzdGVuZXIgewoJCXB1YmxpYyB2b2lkIG9uVGljayhpbnQgc2Vjb25kcyk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxUaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPblRpY2tMaXN0ZW5lciB7CgkJQE92ZXJyaWRlCgkJcHVibGljIHZvaWQgb25UaWNrKGludCBzZWNvbmRzKSB7CgkJfQoJfQoJCglwcml2YXRlIHN0YXRpYyBmaW5hbCBPblRpY2tMaXN0ZW5lciBudWxsTGlzdGVuZXIgPQoJCQluZXcgTnVsbFRpY2tMaXN0ZW5lcigpOwoJcHJpdmF0ZSBPblRpY2tMaXN0ZW5lciB0aWNrTGlzdGVuZXIgPSBudWxsTGlzdGVuZXI7CgkKCXB1YmxpYyB2b2lkIGFzeW5jU3RhcnQoZmluYWwgaW50IHNlY29uZHMpIHsKCQkvLyBydW4gaW4gc29tZSB3b3JrZXIgdGhyZWFkCgkJbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CgkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJCXRyeSB7CgkJCQkJY291bnQodGlja0xpc3RlbmVyLCBzZWNvbmRzKTsKCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCQkJfQoJCQl9CgkJfSkuc3RhcnQoKTsKCX0KCQoJcHVibGljIHZvaWQgc3luY1N0YXJ0KGludCBzZWNvbmRzKSB7CgkJLy8gcnVuIGluIHRoZSBjYWxsZXIgdGhyZWFkCgkJdHJ5IHsKCQkJY291bnQodGlja0xpc3RlbmVyLCBzZWNvbmRzKTsKCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoJfQoJCglwcml2YXRlIHZvaWQgY291bnQoT25UaWNrTGlzdGVuZXIgbGlzdGVuZXIsIGludCB0aW1lSW5TZWNzKQoJCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewoJCWlmICh0aW1lSW5TZWNzIDw9IDApIHsKCQkJbGlzdGVuZXIub25UaWNrKDApOwoJCQlyZXR1cm47CgkJfQoJCWxpc3RlbmVyLm9uVGljayh0aW1lSW5TZWNzKTsKCQlUaHJlYWQuc2xlZXAoMTAwMCk7CgkJY291bnQobGlzdGVuZXIsIHRpbWVJblNlY3MgLSAxKTsKCX0KCQoJcHVibGljIE9uVGlja0xpc3RlbmVyIGdldFRpY2tMaXN0ZW5lcigpIHsKCQlyZXR1cm4gdGlja0xpc3RlbmVyID09IG51bGxMaXN0ZW5lcj8gbnVsbCA6IHRpY2tMaXN0ZW5lcjsKCX0KCXB1YmxpYyB2b2lkIHNldFRpY2tMaXN0ZW5lcihPblRpY2tMaXN0ZW5lciB0aWNrTGlzdGVuZXIpIHsKCQlpZiAodGlja0xpc3RlbmVyID09IG51bGwpCgkJCXRoaXMudGlja0xpc3RlbmVyID0gbnVsbExpc3RlbmVyOwoJCWVsc2UKCQkJdGhpcy50aWNrTGlzdGVuZXIgPSB0aWNrTGlzdGVuZXI7Cgl9Cn0K