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