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;
3167bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen    private boolean mAlarmPending = false;
32d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
33d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public Alarm() {
34d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mHandler = new Handler();
35d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
36d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
37d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void setOnAlarmListener(OnAlarmListener alarmListener) {
38d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmListener = alarmListener;
39d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
40d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
41d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // Sets the alarm to go off in a certain number of milliseconds. If the alarm is already set,
42d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // it's overwritten and only the new alarm setting is used
43d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void setAlarm(long millisecondsInFuture) {
44d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        long currentTime = System.currentTimeMillis();
4567bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen        mAlarmPending = true;
46d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmTriggerTime = currentTime + millisecondsInFuture;
47d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        if (!mWaitingForCallback) {
48d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            mHandler.postDelayed(this, mAlarmTriggerTime - currentTime);
49d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            mWaitingForCallback = true;
50d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        }
51d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
52d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
53d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void cancelAlarm() {
54d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarmTriggerTime = 0;
5567bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen        mAlarmPending = false;
56d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
57d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
58d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // this is called when our timer runs out
59d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void run() {
60d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mWaitingForCallback = false;
61d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        if (mAlarmTriggerTime != 0) {
62d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            long currentTime = System.currentTimeMillis();
63d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            if (mAlarmTriggerTime > currentTime) {
64d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                // We still need to wait some time to trigger spring loaded mode--
65d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                // post a new callback
66d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                mHandler.postDelayed(this, Math.max(0, mAlarmTriggerTime - currentTime));
67d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                mWaitingForCallback = true;
68d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            } else {
6967bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen                mAlarmPending = false;
70d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                if (mAlarmListener != null) {
71d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                    mAlarmListener.onAlarm(this);
72d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka                }
73d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka            }
74d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        }
75d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
7667bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen
7767bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen    public boolean alarmPending() {
7867bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen        return mAlarmPending;
7967bd9ccf856840856944815a382e4bbb0e71e949Adam Cohen    }
80d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka}
81d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
82d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkainterface OnAlarmListener {
83d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void onAlarm(Alarm alarm);
84d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka}
85