AlertActivity.java revision 4ce500bd7d08eac3f05dfd50bce51e620fa9f08e
1146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/*
2146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
4146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * you may not use this file except in compliance with the License.
6146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * You may obtain a copy of the License at
7146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
8146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
10146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * See the License for the specific language governing permissions and
14146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * limitations under the License.
15146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */
16146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
17146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpackage com.android.calendar;
18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
19146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport static android.provider.Calendar.EVENT_BEGIN_TIME;
20146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport static android.provider.Calendar.EVENT_END_TIME;
21146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
22146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.Activity;
23146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.AlarmManager;
24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.NotificationManager;
25146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.PendingIntent;
26146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.AsyncQueryHandler;
27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.ContentResolver;
28146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.ContentUris;
295c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.content.ContentValues;
30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context;
31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Intent;
32146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.res.TypedArray;
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor;
34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.net.Uri;
35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle;
36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar;
37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.CalendarAlerts;
385c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.provider.Calendar.CalendarAlertsColumns;
39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.Events;
40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View;
41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.ViewGroup;
42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.WindowManager;
43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View.OnClickListener;
44146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView;
45146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.Button;
46146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ListView;
47146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener;
48146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
49146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/**
50146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * The alert panel that pops up when there is a calendar event alarm.
51146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * This activity is started by an intent that specifies an event id.
52146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project  */
53146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class AlertActivity extends Activity {
545c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // The default snooze delay: 5 minutes
56146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final long SNOOZE_DELAY = 5 * 60 * 1000L;
575c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
585c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    private static final String[] PROJECTION = new String[] {
59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts._ID,              // 0
60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.TITLE,            // 1
61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.EVENT_LOCATION,   // 2
62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.ALL_DAY,          // 3
63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.BEGIN,            // 4
64146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.END,              // 5
65146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.EVENT_ID,         // 6
66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.COLOR,            // 7
67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.RRULE,            // 8
68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.HAS_ALARM,        // 9
69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.STATE,            // 10
70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.ALARM_TIME,       // 11
71146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
735c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    public static final int INDEX_ROW_ID = 0;
74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_TITLE = 1;
75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_EVENT_LOCATION = 2;
76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_ALL_DAY = 3;
77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_BEGIN = 4;
78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_END = 5;
79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_EVENT_ID = 6;
80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_COLOR = 7;
81146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_RRULE = 8;
82146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_HAS_ALARM = 9;
83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_STATE = 10;
84146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_ALARM_TIME = 11;
855c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
86146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // We use one notification id for all events so that we don't clutter
87146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // the notification screen.  It doesn't matter what the id is, as long
88146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // as it is used consistently everywhere.
89146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int NOTIFICATION_ID = 0;
905c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private ContentResolver mResolver;
92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private AlertAdapter mAdapter;
93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private QueryHandler mQueryHandler;
94146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Cursor mCursor;
95146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private ListView mListView;
96146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Button mSnoozeAllButton;
97146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Button mDismissAllButton;
985c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
995c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1005c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    private void dismissFiredAlarms() {
1015c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        ContentValues values = new ContentValues(1 /* size */);
1025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(PROJECTION[INDEX_STATE], CalendarAlerts.DISMISSED);
1035c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.FIRED;
1045c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values,
1055c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                selection, null /* selectionArgs */);
1065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    }
1075c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1085c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    private void dismissAlarm(long id) {
1095c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        ContentValues values = new ContentValues(1 /* size */);
1105c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(PROJECTION[INDEX_STATE], CalendarAlerts.DISMISSED);
1115c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        String selection = CalendarAlerts._ID + "=" + id;
1125c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values,
1135c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                selection, null /* selectionArgs */);
1145c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    }
1155c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
116146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private class QueryHandler extends AsyncQueryHandler {
117146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public QueryHandler(ContentResolver cr) {
118146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            super(cr);
119146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
120146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        @Override
122146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
123146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Only set mCursor if the Activity is not finishing. Otherwise close the cursor.
124146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (!isFinishing()) {
125146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mCursor = cursor;
126146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mAdapter.changeCursor(cursor);
1275c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
128146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // The results are in, enable the buttons
129146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mSnoozeAllButton.setEnabled(true);
130146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mDismissAllButton.setEnabled(true);
131146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            } else {
132146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                cursor.close();
133146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
134146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
1355c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1365c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        @Override
1375c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        protected void onInsertComplete(int token, Object cookie, Uri uri) {
1385c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            if (uri != null) {
1395c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                ContentValues values = (ContentValues) cookie;
1405c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1415c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                long begin = values.getAsLong(CalendarAlerts.BEGIN);
1425c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                long end = values.getAsLong(CalendarAlerts.END);
1435c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                long alarmTime = values.getAsLong(CalendarAlerts.ALARM_TIME);
1445c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1455c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                // Set a new alarm to go off after the snooze delay.
1465c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                Intent intent = new Intent(Calendar.EVENT_REMINDER_ACTION);
1475c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                intent.setData(uri);
1485c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                intent.putExtra(Calendar.EVENT_BEGIN_TIME, begin);
1495c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                intent.putExtra(Calendar.EVENT_END_TIME, end);
1505c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1515c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                PendingIntent sender = PendingIntent.getBroadcast(AlertActivity.this,
1525c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                        0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
1535c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
1545c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, sender);
1555c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            }
1565c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        }
1575c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1585c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        @Override
1595c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        protected void onUpdateComplete(int token, Object cookie, int result) {
1605c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            // Ignore
1615c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        }
1625c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    }
1635c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
1645c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan    private static ContentValues makeContentValues(long eventId, long begin, long end,
1655c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            long alarmTime, int minutes) {
1665c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        ContentValues values = new ContentValues();
1675c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.EVENT_ID, eventId);
1685c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.BEGIN, begin);
1695c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.END, end);
1705c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.ALARM_TIME, alarmTime);
1715c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        long currentTime = System.currentTimeMillis();
1725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.CREATION_TIME, currentTime);
1735c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.RECEIVED_TIME, 0);
1745c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.NOTIFY_TIME, 0);
1755c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.STATE, CalendarAlertsColumns.SCHEDULED);
1765c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        values.put(CalendarAlerts.MINUTES, minutes);
1775c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan        return values;
178146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
1795c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
180146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnItemClickListener mViewListener = new OnItemClickListener() {
181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
1824ce500bd7d08eac3f05dfd50bce51e620fa9f08eChristian Mehlmauer        public void onItemClick(AdapterView<?> parent, View view, int position,
183146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long i) {
184146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            AlertActivity alertActivity = AlertActivity.this;
185146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Cursor cursor = alertActivity.getItemForView(view);
1865c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
187146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long id = cursor.getInt(AlertActivity.INDEX_EVENT_ID);
188146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long startMillis = cursor.getLong(AlertActivity.INDEX_BEGIN);
189146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long endMillis = cursor.getLong(AlertActivity.INDEX_END);
1905c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
191146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, id);
192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
193146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.setClass(alertActivity, EventInfoActivity.class);
194146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.putExtra(EVENT_BEGIN_TIME, startMillis);
195146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.putExtra(EVENT_END_TIME, endMillis);
1965c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
197146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Mark this alarm as DISMISSED
1985c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            dismissAlarm(cursor.getLong(INDEX_ROW_ID));
1995c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
200146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            startActivity(intent);
201146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            alertActivity.finish();
202146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
2045c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
205146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
206146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onCreate(Bundle icicle) {
207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onCreate(icicle);
2085c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        setContentView(R.layout.alert_activity);
2107abd8566e5718c43d610e046495bcb412e87847fThe Android Open Source Project        setTitle(R.string.alert_title);
2115c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
212146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        WindowManager.LayoutParams lp = getWindow().getAttributes();
213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.width = ViewGroup.LayoutParams.FILL_PARENT;
214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.height = ViewGroup.LayoutParams.FILL_PARENT;
2155c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
216146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Get the dim amount from the theme
217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        a.recycle();
220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        getWindow().setAttributes(lp);
2225c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
223146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mResolver = getContentResolver();
224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mQueryHandler = new QueryHandler(mResolver);
225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mAdapter = new AlertAdapter(this, R.layout.alert_item);
2265c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
227146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView = (ListView) findViewById(R.id.alert_container);
228146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setItemsCanFocus(true);
229146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setAdapter(mAdapter);
230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setOnItemClickListener(mViewListener);
2315c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton = (Button) findViewById(R.id.snooze_all);
233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton.setOnClickListener(mSnoozeAllListener);
234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton = (Button) findViewById(R.id.dismiss_all);
235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton.setOnClickListener(mDismissAllListener);
236146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
237146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Disable the buttons, since they need mCursor, which is created asynchronously
238146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton.setEnabled(false);
239146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton.setEnabled(false);
240146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
2415c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
242146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
243146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onResume() {
244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onResume();
2455c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
246146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If the cursor is null, start the async handler. If it is not null just requery.
247146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor == null) {
248146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Uri uri = CalendarAlerts.CONTENT_URI_BY_INSTANCE;
249146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.FIRED;
2505c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            mQueryHandler.startQuery(0, null, uri, PROJECTION, selection,
251146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    null /* selection args */, CalendarAlerts.DEFAULT_SORT_ORDER);
252146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        } else {
253146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.requery();
254146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
255146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
2565c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
257146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
258146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onStop() {
259146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onStop();
260146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlertReceiver.updateAlertNotification(this);
2615c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
262146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor != null) {
263146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.deactivate();
264146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
265146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
2665c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
267146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
268146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onDestroy() {
269146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onDestroy();
270146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor != null) {
271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.close();
272146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
273146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
2745c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
275146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnClickListener mSnoozeAllListener = new OnClickListener() {
276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public void onClick(View v) {
2775c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            long alarmTime = System.currentTimeMillis() + SNOOZE_DELAY;
2785c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
279146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            NotificationManager nm =
280146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
281146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            nm.cancel(NOTIFICATION_ID);
282146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.moveToPosition(-1);
283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            while (mCursor.moveToNext()) {
284146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long eventId = mCursor.getLong(INDEX_EVENT_ID);
285146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long begin = mCursor.getLong(INDEX_BEGIN);
286146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long end = mCursor.getLong(INDEX_END);
287146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
288146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Set the "minutes" to zero to indicate this is a snoozed
289146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // alarm.  There is code in AlertService.java that checks
290146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // this field.
2915c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                ContentValues values =
2925c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                        makeContentValues(eventId, begin, end, alarmTime, 0 /* minutes */);
2935c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
2945c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                // Create a new alarm entry in the CalendarAlerts table
2955c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan                mQueryHandler.startInsert(0, values, CalendarAlerts.CONTENT_URI, values);
296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
2975c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
2985c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            dismissFiredAlarms();
2995c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
300146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            finish();
301146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
302146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
3035c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
304146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnClickListener mDismissAllListener = new OnClickListener() {
305146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public void onClick(View v) {
306146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            NotificationManager nm =
307146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
308146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            nm.cancel(NOTIFICATION_ID);
3095c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
3105c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan            dismissFiredAlarms();
3115c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
312146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            finish();
313146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
314146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
3155c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
316146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public boolean isEmpty() {
317146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return (mCursor.getCount() == 0);
318146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
3195c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan
320146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Cursor getItemForView(View view) {
321146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int index = mListView.getPositionForView(view);
322146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (index < 0) {
323146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return null;
324146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
325146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return (Cursor) mListView.getAdapter().getItem(index);
326146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
327146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
328