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