NextAlarmController.java revision c7dea6ee9b06369b0c0c3773dc2e40409ce86a8e
1c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi/*
2c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi *
4c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * you may not use this file except in compliance with the License.
6c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * You may obtain a copy of the License at
7c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi *
8c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi *
10c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * Unless required by applicable law or agreed to in writing, software
11c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * See the License for the specific language governing permissions and
14c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi * limitations under the License
15c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi */
16c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
17c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggipackage com.android.systemui.statusbar.policy;
18c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
19c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.app.AlarmClockInfo;
20c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.app.AlarmManager;
21c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.BroadcastReceiver;
22c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.Context;
23c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.Intent;
24c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.IntentFilter;
25c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.os.UserHandle;
26c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
27c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.io.FileDescriptor;
28c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.io.PrintWriter;
29c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.util.ArrayList;
30c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
31c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggipublic class NextAlarmController extends BroadcastReceiver {
32c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
33c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private final ArrayList<NextAlarmChangeCallback> mChangeCallbacks = new ArrayList<>();
34c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
35c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private AlarmManager mAlarmManager;
36c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private AlarmClockInfo mNextAlarm;
37c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
38c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public NextAlarmController(Context context) {
39c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
40c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        IntentFilter filter = new IntentFilter();
41c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        filter.addAction(Intent.ACTION_USER_SWITCHED);
42c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
43c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        context.registerReceiver(this, filter);
44c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        updateNextAlarm();
45c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
46c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
47c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
48c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        pw.println("NextAlarmController state:");
49c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        pw.print("  mNextAlarm="); pw.println(mNextAlarm);
50c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
51c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
52c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void addStateChangedCallback(NextAlarmChangeCallback cb) {
53c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mChangeCallbacks.add(cb);
54c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        cb.onNextAlarmChanged(mNextAlarm);
55c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
56c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
57c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void removeStateChangedCallback(NextAlarmChangeCallback cb) {
58c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mChangeCallbacks.remove(cb);
59c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
60c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
61c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void onReceive(Context context, Intent intent) {
62c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        final String action = intent.getAction();
63c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        if (action.equals(Intent.ACTION_USER_SWITCHED)
64c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi                || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
65c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi            updateNextAlarm();
66c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        }
67c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
68c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
69c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private void updateNextAlarm() {
70c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mNextAlarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
71c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        fireNextAlarmChanged();
72c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
73c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
74c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private void fireNextAlarmChanged() {
75c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        int n = mChangeCallbacks.size();
76c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        for (int i = 0; i < n; i++) {
77c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi            mChangeCallbacks.get(i).onNextAlarmChanged(mNextAlarm);
78c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        }
79c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
80c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
81c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public interface NextAlarmChangeCallback {
82c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        void onNextAlarmChanged(AlarmClockInfo nextAlarm);
83c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
84c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi}
85