Alarm.java revision d3ef3065ab0941567c45e9aec98783138b623c68
1d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka/*
2d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Copyright (C) 2010 The Android Open Source Project
3d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
4d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
5d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * you may not use this file except in compliance with the License.
6d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * You may obtain a copy of the License at
7d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
8d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
9d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
10d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Unless required by applicable law or agreed to in writing, software
11d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
12d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * See the License for the specific language governing permissions and
14d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * limitations under the License.
15d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka */
16d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
17d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkapackage com.android.launcher2;
18d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
19d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkaimport android.os.Handler;
20d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
21d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkapublic class Alarm implements Runnable{
22d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // if we reach this time and the alarm hasn't been cancelled, call the listener
23d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private long mAlarmTriggerTime;
24d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
25d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // if we've scheduled a call to run() (ie called mHandler.postDelayed), this variable is true.
26d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // We use this to avoid having multiple pending callbacks
27d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private boolean mWaitingForCallback;
28d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
29d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private Handler mHandler;
30d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private OnAlarmListener mAlarmListener;
31d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
32d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public Alarm() {
33d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mHandler = new Handler();
34d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
35d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
36d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void setOnAlarmListener(OnAlarmListener alarmListener) {
37d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmListener = alarmListener;
38d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
39d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
40d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // Sets the alarm to go off in a certain number of milliseconds. If the alarm is already set,
41d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // it's overwritten and only the new alarm setting is used
42d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void setAlarm(long millisecondsInFuture) {
43d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        long currentTime = System.currentTimeMillis();
44d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmTriggerTime = currentTime + millisecondsInFuture;
45d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        if (!mWaitingForCallback) {
46d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            mHandler.postDelayed(this, mAlarmTriggerTime - currentTime);
47d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            mWaitingForCallback = true;
48d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        }
49d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
50d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
51d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void cancelAlarm() {
52d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmTriggerTime = 0;
53d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
54d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
55d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // this is called when our timer runs out
56d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void run() {
57d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mWaitingForCallback = false;
58d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        if (mAlarmTriggerTime != 0) {
59d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            long currentTime = System.currentTimeMillis();
60d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            if (mAlarmTriggerTime > currentTime) {
61d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                // We still need to wait some time to trigger spring loaded mode--
62d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                // post a new callback
63d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                mHandler.postDelayed(this, Math.max(0, mAlarmTriggerTime - currentTime));
64d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                mWaitingForCallback = true;
65d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            } else {
66d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                if (mAlarmListener != null) {
67d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                    mAlarmListener.onAlarm(this);
68d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                }
69d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            }
70d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        }
71d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
72d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka}
73d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
74d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkainterface OnAlarmListener {
75d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void onAlarm(Alarm alarm);
76d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka}
77