1f47699dd4704917713004099b5e3609be48653c4Patrick Scott/* 2f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Copyright (C) 2009 The Android Open Source Project 3f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 4f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Licensed under the Apache License, Version 2.0 (the "License"); 5f47699dd4704917713004099b5e3609be48653c4Patrick Scott * you may not use this file except in compliance with the License. 6f47699dd4704917713004099b5e3609be48653c4Patrick Scott * You may obtain a copy of the License at 7f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 8f47699dd4704917713004099b5e3609be48653c4Patrick Scott * http://www.apache.org/licenses/LICENSE-2.0 9f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 10f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Unless required by applicable law or agreed to in writing, software 11f47699dd4704917713004099b5e3609be48653c4Patrick Scott * distributed under the License is distributed on an "AS IS" BASIS, 12f47699dd4704917713004099b5e3609be48653c4Patrick Scott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f47699dd4704917713004099b5e3609be48653c4Patrick Scott * See the License for the specific language governing permissions and 14f47699dd4704917713004099b5e3609be48653c4Patrick Scott * limitations under the License. 15f47699dd4704917713004099b5e3609be48653c4Patrick Scott */ 16f47699dd4704917713004099b5e3609be48653c4Patrick Scott 17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock; 18f47699dd4704917713004099b5e3609be48653c4Patrick Scott 19aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.Activity; 20aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.Notification; 21aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.NotificationManager; 22aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.PendingIntent; 23aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.BroadcastReceiver; 241d5208e88385c9fc2ef7f7fa34a236832a192a5dDmitri Plotnikovimport android.content.Context; 25aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.Intent; 26aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.IntentFilter; 2729dbeab977ead46e10efce114e1f21a55d556100Dianne Hackbornimport android.os.Bundle; 28aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.preference.PreferenceManager; 29aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.KeyEvent; 30aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.LayoutInflater; 311d5208e88385c9fc2ef7f7fa34a236832a192a5dDmitri Plotnikovimport android.view.View; 32aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.Window; 3329dbeab977ead46e10efce114e1f21a55d556100Dianne Hackbornimport android.view.WindowManager; 34aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.widget.Button; 35706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandlerimport android.widget.TextView; 36aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.widget.Toast; 37aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 38aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport java.util.Calendar; 39f47699dd4704917713004099b5e3609be48653c4Patrick Scott 40f47699dd4704917713004099b5e3609be48653c4Patrick Scott/** 41aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * Alarm Clock alarm alert: pops visible indicator and plays alarm 42aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * tone. This activity is the full screen version which shows over the lock 43aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * screen with the wallpaper as the background. 44f47699dd4704917713004099b5e3609be48653c4Patrick Scott */ 45aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottpublic class AlarmAlertFullScreen extends Activity { 46aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 47aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // These defaults must match the values in res/xml/settings.xml 48aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private static final String DEFAULT_SNOOZE = "10"; 49aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private static final String DEFAULT_VOLUME_BEHAVIOR = "2"; 50aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected static final String SCREEN_OFF = "screen_off"; 51aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 52aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected Alarm mAlarm; 53aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private int mVolumeBehavior; 54706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler boolean mFullscreenStyle; 55aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 56a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // Receives the ALARM_KILLED action from the AlarmKlaxon, 57a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // and also ALARM_SNOOZE_ACTION / ALARM_DISMISS_ACTION from other applications 58aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private BroadcastReceiver mReceiver = new BroadcastReceiver() { 59aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 60aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onReceive(Context context, Intent intent) { 61a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram String action = intent.getAction(); 62a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram if (action.equals(Alarms.ALARM_SNOOZE_ACTION)) { 63a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram snooze(); 64a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } else if (action.equals(Alarms.ALARM_DISMISS_ACTION)) { 65a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram dismiss(false); 66a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } else { 67a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram Alarm alarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 68a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram if (alarm != null && mAlarm.id == alarm.id) { 69a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram dismiss(true); 70a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } 71aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 72aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 73aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott }; 74aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 75f47699dd4704917713004099b5e3609be48653c4Patrick Scott @Override 7629dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn protected void onCreate(Bundle icicle) { 7729dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn super.onCreate(icicle); 78aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 79aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mAlarm = getIntent().getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 80aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 81aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Get the volume/camera button behavior setting 82aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final String vol = 83aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PreferenceManager.getDefaultSharedPreferences(this) 84aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott .getString(SettingsActivity.KEY_VOLUME_BEHAVIOR, 85aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott DEFAULT_VOLUME_BEHAVIOR); 86aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mVolumeBehavior = Integer.parseInt(vol); 87aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 88aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final Window win = getWindow(); 89aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 90aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 91aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Turn on the screen unless we are being launched from the AlarmAlert 92706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler // subclass as a result of the screen turning off. 93aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (!getIntent().getBooleanExtra(SCREEN_OFF, false)) { 94aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 95abc34112bd18bc0fc068ffa30ca07ae161bc9f0aMike Lockwood | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 96abc34112bd18bc0fc068ffa30ca07ae161bc9f0aMike Lockwood | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 97aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 98aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 99aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott updateLayout(); 100aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 101a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // Register to get the alarm killed/snooze/dismiss intent. 102a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram IntentFilter filter = new IntentFilter(Alarms.ALARM_KILLED); 103a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram filter.addAction(Alarms.ALARM_SNOOZE_ACTION); 104a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram filter.addAction(Alarms.ALARM_DISMISS_ACTION); 105a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram registerReceiver(mReceiver, filter); 106aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 107aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 108aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void setTitle() { 109706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler final String titleText = mAlarm.getLabelOrDefault(this); 110706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler 111706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler setTitle(titleText); 112aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 113aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 114706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler protected int getLayoutResId() { 115706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler return R.layout.alarm_alert_fullscreen; 116706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler } 117706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler 118aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void updateLayout() { 119aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott LayoutInflater inflater = LayoutInflater.from(this); 120aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 121706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler setContentView(inflater.inflate(getLayoutResId(), null)); 122aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 123aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott /* snooze behavior: pop a snooze confirmation view, kick alarm 124aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott manager. */ 125aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Button snooze = (Button) findViewById(R.id.snooze); 126aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snooze.requestFocus(); 127aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snooze.setOnClickListener(new Button.OnClickListener() { 128aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onClick(View v) { 129aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snooze(); 130aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 131aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott }); 132aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 133aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott /* dismiss button: close notification */ 134aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott findViewById(R.id.dismiss).setOnClickListener( 135aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott new Button.OnClickListener() { 136aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onClick(View v) { 137aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott dismiss(false); 138aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 139aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott }); 140aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 141aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott /* Set the title from the passed in alarm */ 142aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott setTitle(); 143aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 144aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 145aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Attempt to snooze this alert. 146aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void snooze() { 14722924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott // Do not snooze if the snooze button is disabled. 14822924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott if (!findViewById(R.id.snooze).isEnabled()) { 14922924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott dismiss(false); 15022924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott return; 15122924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott } 152aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final String snooze = 153aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PreferenceManager.getDefaultSharedPreferences(this) 154aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott .getString(SettingsActivity.KEY_ALARM_SNOOZE, DEFAULT_SNOOZE); 155aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott int snoozeMinutes = Integer.parseInt(snooze); 156aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 157aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final long snoozeTime = System.currentTimeMillis() 158aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott + (1000 * 60 * snoozeMinutes); 159aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Alarms.saveSnoozeAlert(AlarmAlertFullScreen.this, mAlarm.id, 160aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snoozeTime); 161aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 162aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Get the display time for the snooze and update the notification. 163aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final Calendar c = Calendar.getInstance(); 164aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott c.setTimeInMillis(snoozeTime); 165aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 166aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Append (snoozed) to the label. 167aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott String label = mAlarm.getLabelOrDefault(this); 168aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott label = getString(R.string.alarm_notify_snooze_label, label); 169aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 170aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Notify the user that the alarm has been snoozed. 171aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Intent cancelSnooze = new Intent(this, AlarmReceiver.class); 172aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott cancelSnooze.setAction(Alarms.CANCEL_SNOOZE); 17377f14bd0ce48db935911da5d0a92b6348e6197fbPatrick Scott cancelSnooze.putExtra(Alarms.ALARM_INTENT_EXTRA, mAlarm); 174aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PendingIntent broadcast = 175aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PendingIntent.getBroadcast(this, mAlarm.id, cancelSnooze, 0); 176aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott NotificationManager nm = getNotificationManager(); 177aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Notification n = new Notification(R.drawable.stat_notify_alarm, 178aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott label, 0); 179aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott n.setLatestEventInfo(this, label, 180aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott getString(R.string.alarm_notify_snooze_text, 181aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Alarms.formatTime(this, c)), broadcast); 182aeeadc5989e1f249b3ee60f08ba71fc90bc34b9dPatrick Scott n.flags |= Notification.FLAG_AUTO_CANCEL 183aeeadc5989e1f249b3ee60f08ba71fc90bc34b9dPatrick Scott | Notification.FLAG_ONGOING_EVENT; 184aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott nm.notify(mAlarm.id, n); 185aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 186aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott String displayTime = getString(R.string.alarm_alert_snooze_set, 187aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snoozeMinutes); 188aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Intentionally log the snooze time for debugging. 189aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Log.v(displayTime); 190aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 191aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Display the snooze minutes in a toast. 192aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Toast.makeText(AlarmAlertFullScreen.this, displayTime, 193aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Toast.LENGTH_LONG).show(); 194aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott stopService(new Intent(Alarms.ALARM_ALERT_ACTION)); 195aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 196aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 197aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 198aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private NotificationManager getNotificationManager() { 199aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 200aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 201aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 202aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Dismiss the alarm. 203aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void dismiss(boolean killed) { 204a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram Log.i(killed ? "Alarm killed" : "Alarm dismissed by user"); 205aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // The service told us that the alarm has been killed, do not modify 206aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // the notification or stop the service. 207aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (!killed) { 208aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Cancel the notification and stop playing the alarm 209aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott NotificationManager nm = getNotificationManager(); 210aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott nm.cancel(mAlarm.id); 211aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott stopService(new Intent(Alarms.ALARM_ALERT_ACTION)); 212aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 213aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 214aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 215aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 216aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott /** 217aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * this is called when a second alarm is triggered while a 218aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * previous alert window is still active. 219aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott */ 220aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 221aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected void onNewIntent(Intent intent) { 222aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott super.onNewIntent(intent); 223aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 224aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (Log.LOGV) Log.v("AlarmAlert.OnNewIntent()"); 225aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 226aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mAlarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 227aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 228aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott setTitle(); 229aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 230aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 231aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 23222924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott protected void onResume() { 23322924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott super.onResume(); 23422924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott // If the alarm was deleted at some point, disable snooze. 23522924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott if (Alarms.getAlarm(getContentResolver(), mAlarm.id) == null) { 23622924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott Button snooze = (Button) findViewById(R.id.snooze); 23722924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott snooze.setEnabled(false); 23822924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott } 23922924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott } 24022924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott 24122924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott @Override 242aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onDestroy() { 243aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott super.onDestroy(); 244aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (Log.LOGV) Log.v("AlarmAlert.onDestroy()"); 245aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // No longer care about the alarm being killed. 246aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott unregisterReceiver(mReceiver); 247aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 248aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 249aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 250aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public boolean dispatchKeyEvent(KeyEvent event) { 251aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Do this on key down to handle a few of the system keys. 252aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott boolean up = event.getAction() == KeyEvent.ACTION_UP; 253aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott switch (event.getKeyCode()) { 254aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Volume keys and camera keys dismiss the alarm 255aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_VOLUME_UP: 256aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_VOLUME_DOWN: 257ab34252e7a7f8c39b402425a4e0941aeb039d12fJeff Brown case KeyEvent.KEYCODE_VOLUME_MUTE: 258aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_CAMERA: 259aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_FOCUS: 260aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (up) { 261aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott switch (mVolumeBehavior) { 262aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case 1: 263aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snooze(); 264aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 265aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 266aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case 2: 267aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott dismiss(false); 268aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 269aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 270aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott default: 271aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 272aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 273aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 274aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return true; 275aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott default: 276aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 277aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 278aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return super.dispatchKeyEvent(event); 279aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 280aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 281aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 28229dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn public void onBackPressed() { 283aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Don't allow back to dismiss. This method is overriden by AlarmAlert 284aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // so that the dialog is dismissed. 28529dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn return; 286f47699dd4704917713004099b5e3609be48653c4Patrick Scott } 287f47699dd4704917713004099b5e3609be48653c4Patrick Scott} 288