blob: 1eea1fb06bdac729b978aac6d8bc77992973da0e [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.widget;
import android.os.Handler;
/**
* Provides callbacks indicating the steps in two digit pressing within a
* timeout.
*
* Package private: only relevant in helping {@link TimeSpinnerHelper}.
*/
class DoubleDigitManager {
private final long timeoutInMillis;
private final CallBack mCallBack;
private Integer intermediateDigit;
/**
* @param timeoutInMillis How long after the first digit is pressed does
* the user have to press the second digit?
* @param callBack The callback to indicate what's going on with the user.
*/
public DoubleDigitManager(long timeoutInMillis, CallBack callBack) {
this.timeoutInMillis = timeoutInMillis;
mCallBack = callBack;
}
/**
* Report to this manager that a digit was pressed.
* @param digit
*/
public void reportDigit(int digit) {
if (intermediateDigit == null) {
intermediateDigit = digit;
new Handler().postDelayed(new Runnable() {
public void run() {
if (intermediateDigit != null) {
mCallBack.singleDigitFinal(intermediateDigit);
intermediateDigit = null;
}
}
}, timeoutInMillis);
if (!mCallBack.singleDigitIntermediate(digit)) {
// this wasn't a good candidate for the intermediate digit,
// make it the final digit (since there is no opportunity to
// reject the final digit).
intermediateDigit = null;
mCallBack.singleDigitFinal(digit);
}
} else if (mCallBack.twoDigitsFinal(intermediateDigit, digit)) {
intermediateDigit = null;
}
}
/**
* The callback to indicate what is going on with the digits pressed.
*/
static interface CallBack {
/**
* A digit was pressed, and there are no intermediate digits.
* @param digit The digit pressed.
* @return Whether the digit was accepted; how the user of this manager
* tells us that the intermediate digit is acceptable as an
* intermediate digit.
*/
boolean singleDigitIntermediate(int digit);
/**
* A single digit was pressed, and it is 'the final answer'.
* - a single digit pressed, and the timeout expires.
* - a single digit pressed, and {@link #singleDigitIntermediate}
* returned false.
* @param digit The digit.
*/
void singleDigitFinal(int digit);
/**
* The user pressed digit1, then digit2 within the timeout.
* @param digit1
* @param digit2
*/
boolean twoDigitsFinal(int digit1, int digit2);
}
}