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