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.AlarmManager;
20c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.BroadcastReceiver;
21c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.Context;
22c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.Intent;
23c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.content.IntentFilter;
24c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport android.os.UserHandle;
25c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
26c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.io.FileDescriptor;
27c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.io.PrintWriter;
28c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggiimport java.util.ArrayList;
29c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
30c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggipublic class NextAlarmController extends BroadcastReceiver {
31c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
32c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private final ArrayList<NextAlarmChangeCallback> mChangeCallbacks = new ArrayList<>();
33c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
34c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private AlarmManager mAlarmManager;
35235510e67210f90de30c2d5582a2077ccc589619Jose Lima    private AlarmManager.AlarmClockInfo mNextAlarm;
36c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
37c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public NextAlarmController(Context context) {
38c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
39c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        IntentFilter filter = new IntentFilter();
40c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        filter.addAction(Intent.ACTION_USER_SWITCHED);
41c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
429c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek        context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, null);
43c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        updateNextAlarm();
44c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
45c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
46c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
47c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        pw.println("NextAlarmController state:");
48c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        pw.print("  mNextAlarm="); pw.println(mNextAlarm);
49c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
50c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
51c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void addStateChangedCallback(NextAlarmChangeCallback cb) {
52c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mChangeCallbacks.add(cb);
53c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        cb.onNextAlarmChanged(mNextAlarm);
54c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
55c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
56c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void removeStateChangedCallback(NextAlarmChangeCallback cb) {
57c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mChangeCallbacks.remove(cb);
58c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
59c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
60c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public void onReceive(Context context, Intent intent) {
61c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        final String action = intent.getAction();
62c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        if (action.equals(Intent.ACTION_USER_SWITCHED)
63c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi                || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
64c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi            updateNextAlarm();
65c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        }
66c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
67c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
68c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private void updateNextAlarm() {
69c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        mNextAlarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
70c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        fireNextAlarmChanged();
71c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
72c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
73c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    private void fireNextAlarmChanged() {
74c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        int n = mChangeCallbacks.size();
75c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        for (int i = 0; i < n; i++) {
76c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi            mChangeCallbacks.get(i).onNextAlarmChanged(mNextAlarm);
77c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi        }
78c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
79c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi
80c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    public interface NextAlarmChangeCallback {
81235510e67210f90de30c2d5582a2077ccc589619Jose Lima        void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm);
82c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi    }
83c7dea6ee9b06369b0c0c3773dc2e40409ce86a8eJorim Jaggi}
84