1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.widget;
18 
19 import android.os.Handler;
20 
21 /**
22  * Provides callbacks indicating the steps in two digit pressing within a
23  * timeout.
24  *
25  * Package private: only relevant in helping {@link TimeSpinnerHelper}.
26  */
27 class DoubleDigitManager {
28 
29     private final long timeoutInMillis;
30     private final CallBack mCallBack;
31 
32     private Integer intermediateDigit;
33 
34     /**
35      * @param timeoutInMillis How long after the first digit is pressed does
36      *   the user have to press the second digit?
37      * @param callBack The callback to indicate what's going on with the user.
38      */
DoubleDigitManager(long timeoutInMillis, CallBack callBack)39     public DoubleDigitManager(long timeoutInMillis, CallBack callBack) {
40         this.timeoutInMillis = timeoutInMillis;
41         mCallBack = callBack;
42     }
43 
44     /**
45      * Report to this manager that a digit was pressed.
46      * @param digit
47      */
reportDigit(int digit)48     public void reportDigit(int digit) {
49         if (intermediateDigit == null) {
50             intermediateDigit = digit;
51 
52             new Handler().postDelayed(new Runnable() {
53                 public void run() {
54                     if (intermediateDigit != null) {
55                         mCallBack.singleDigitFinal(intermediateDigit);
56                         intermediateDigit = null;
57                     }
58                 }
59             }, timeoutInMillis);
60 
61             if (!mCallBack.singleDigitIntermediate(digit)) {
62 
63                 // this wasn't a good candidate for the intermediate digit,
64                 // make it the final digit (since there is no opportunity to
65                 // reject the final digit).
66                 intermediateDigit = null;
67                 mCallBack.singleDigitFinal(digit);
68             }
69         } else if (mCallBack.twoDigitsFinal(intermediateDigit, digit)) {
70              intermediateDigit = null;
71         }
72     }
73 
74     /**
75      * The callback to indicate what is going on with the digits pressed.
76      */
77     static interface CallBack {
78 
79         /**
80          * A digit was pressed, and there are no intermediate digits.
81          * @param digit The digit pressed.
82          * @return Whether the digit was accepted; how the user of this manager
83          *   tells us that the intermediate digit is acceptable as an
84          *   intermediate digit.
85          */
singleDigitIntermediate(int digit)86         boolean singleDigitIntermediate(int digit);
87 
88         /**
89          * A single digit was pressed, and it is 'the final answer'.
90          * - a single digit pressed, and the timeout expires.
91          * - a single digit pressed, and {@link #singleDigitIntermediate}
92          *   returned false.
93          * @param digit The digit.
94          */
singleDigitFinal(int digit)95         void singleDigitFinal(int digit);
96 
97         /**
98          * The user pressed digit1, then digit2 within the timeout.
99          * @param digit1
100          * @param digit2
101          */
twoDigitsFinal(int digit1, int digit2)102         boolean twoDigitsFinal(int digit1, int digit2);
103     }
104 
105 }
106