AlertActivity.java revision 23e7da3eacee7bceb105cdfc7b5329c7a43846d5
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 1723e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangpackage com.android.calendar.alerts; 18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 1923e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.AsyncQueryService; 2023e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.CalendarController; 219e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chanimport com.android.calendar.CalendarController.EventType; 2223e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.R; 2323e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.R.id; 2423e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.R.layout; 2523e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.R.string; 2623e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.Utils; 27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 28146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.Activity; 29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.AlarmManager; 30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.NotificationManager; 31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.ContentResolver; 325c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.content.ContentValues; 33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context; 34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor; 35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.net.Uri; 36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle; 37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.CalendarAlerts; 385c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.provider.Calendar.CalendarAlertsColumns; 39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View; 40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.ViewGroup; 41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.WindowManager; 42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View.OnClickListener; 43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView; 44146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.Button; 45146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ListView; 46146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener; 47146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 48146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/** 49146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * The alert panel that pops up when there is a calendar event alarm. 50146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * This activity is started by an intent that specifies an event id. 51146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */ 52146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class AlertActivity extends Activity { 535c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 54146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // The default snooze delay: 5 minutes 55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final long SNOOZE_DELAY = 5 * 60 * 1000L; 565c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 575c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private static final String[] PROJECTION = new String[] { 58146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts._ID, // 0 59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.TITLE, // 1 60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_LOCATION, // 2 61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALL_DAY, // 3 62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.BEGIN, // 4 63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.END, // 5 64146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_ID, // 6 65146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.COLOR, // 7 66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.RRULE, // 8 67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.HAS_ALARM, // 9 68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.STATE, // 10 69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALARM_TIME, // 11 70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 715c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan public static final int INDEX_ROW_ID = 0; 73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_TITLE = 1; 74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_LOCATION = 2; 75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALL_DAY = 3; 76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_BEGIN = 4; 77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_END = 5; 78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_ID = 6; 79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_COLOR = 7; 80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_RRULE = 8; 81146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_HAS_ALARM = 9; 82146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_STATE = 10; 83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALARM_TIME = 11; 845c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 85e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan private static final String SELECTION = CalendarAlerts.STATE + "=?"; 86e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan private static final String[] SELECTIONARG = new String[] { 87e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan Integer.toString(CalendarAlerts.FIRED) 88e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan }; 89e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 90146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // We use one notification id for all events so that we don't clutter 91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // the notification screen. It doesn't matter what the id is, as long 92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // as it is used consistently everywhere. 93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int NOTIFICATION_ID = 0; 945c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 95146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private ContentResolver mResolver; 96146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private AlertAdapter mAdapter; 97146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private QueryHandler mQueryHandler; 98146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Cursor mCursor; 99146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private ListView mListView; 100146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Button mSnoozeAllButton; 101146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Button mDismissAllButton; 1025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1035c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1045c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private void dismissFiredAlarms() { 1055c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 1065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(PROJECTION[INDEX_STATE], CalendarAlerts.DISMISSED); 1075c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.FIRED; 1085c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 109bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 1105c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1115c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1125c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private void dismissAlarm(long id) { 1135c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 1145c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(PROJECTION[INDEX_STATE], CalendarAlerts.DISMISSED); 1155c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan String selection = CalendarAlerts._ID + "=" + id; 1165c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 117bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 1185c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1195c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 120bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan private class QueryHandler extends AsyncQueryService { 121bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan public QueryHandler(Context context) { 122bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan super(context); 123146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 124146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 125146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 126146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 127146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Only set mCursor if the Activity is not finishing. Otherwise close the cursor. 128146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (!isFinishing()) { 129146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor = cursor; 130146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter.changeCursor(cursor); 1315c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 132146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // The results are in, enable the buttons 133146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton.setEnabled(true); 134146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(true); 135146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 136146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project cursor.close(); 137146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 138146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 1395c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1405c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan @Override 1415c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan protected void onInsertComplete(int token, Object cookie, Uri uri) { 1425c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan if (uri != null) { 143e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan Long alarmTime = (Long) cookie; 144e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 145e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan if (alarmTime != 0) { 146e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan // Set a new alarm to go off after the snooze delay. 147e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan AlarmManager alarmManager = 148e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan (AlarmManager) getSystemService(Context.ALARM_SERVICE); 149e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan CalendarAlerts.scheduleAlarm(AlertActivity.this, alarmManager, alarmTime); 150e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan } 1515c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1525c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1535c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1545c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan @Override 1555c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan protected void onUpdateComplete(int token, Object cookie, int result) { 1565c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan // Ignore 1575c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1585c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1595c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1605c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private static ContentValues makeContentValues(long eventId, long begin, long end, 1615c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan long alarmTime, int minutes) { 1625c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(); 1635c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.EVENT_ID, eventId); 1645c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.BEGIN, begin); 1655c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.END, end); 1665c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.ALARM_TIME, alarmTime); 1675c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan long currentTime = System.currentTimeMillis(); 1685c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.CREATION_TIME, currentTime); 1695c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.RECEIVED_TIME, 0); 1705c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.NOTIFY_TIME, 0); 1715c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.STATE, CalendarAlertsColumns.SCHEDULED); 1725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan values.put(CalendarAlerts.MINUTES, minutes); 1735c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan return values; 174146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 1755c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 176146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private OnItemClickListener mViewListener = new OnItemClickListener() { 177146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 1784ce500bd7d08eac3f05dfd50bce51e620fa9f08eChristian Mehlmauer public void onItemClick(AdapterView<?> parent, View view, int position, 179146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long i) { 180146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project AlertActivity alertActivity = AlertActivity.this; 181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Cursor cursor = alertActivity.getItemForView(view); 1825c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1839e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan // Mark this alarm as DISMISSED 1849e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan dismissAlarm(cursor.getLong(INDEX_ROW_ID)); 1859e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan 186146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long id = cursor.getInt(AlertActivity.INDEX_EVENT_ID); 187146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long startMillis = cursor.getLong(AlertActivity.INDEX_BEGIN); 188146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long endMillis = cursor.getLong(AlertActivity.INDEX_END); 1890558defd2215696cee0768ce2bf2cb4da56efc42Michael Chan CalendarController.getInstance(alertActivity).sendEventRelatedEvent(alertActivity, 1900558defd2215696cee0768ce2bf2cb4da56efc42Michael Chan EventType.VIEW_EVENT, id, startMillis, endMillis, 0, 0); 1915c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project alertActivity.finish(); 193146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 194146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 1955c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 196146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 197146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onCreate(Bundle icicle) { 198146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onCreate(icicle); 1995c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 200146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project setContentView(R.layout.alert_activity); 2017abd8566e5718c43d610e046495bcb412e87847fThe Android Open Source Project setTitle(R.string.alert_title); 2025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 204df279e3f9d5b0f189f812c52aca78d18178e4445Romain Guy lp.width = ViewGroup.LayoutParams.MATCH_PARENT; 205df279e3f9d5b0f189f812c52aca78d18178e4445Romain Guy lp.height = ViewGroup.LayoutParams.MATCH_PARENT; 2065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project getWindow().setAttributes(lp); 2085c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mResolver = getContentResolver(); 210bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan mQueryHandler = new QueryHandler(this); 211146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter = new AlertAdapter(this, R.layout.alert_item); 2125c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView = (ListView) findViewById(R.id.alert_container); 214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setItemsCanFocus(true); 215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setAdapter(mAdapter); 216146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setOnItemClickListener(mViewListener); 2175c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton = (Button) findViewById(R.id.snooze_all); 219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton.setOnClickListener(mSnoozeAllListener); 220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton = (Button) findViewById(R.id.dismiss_all); 221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setOnClickListener(mDismissAllListener); 222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 223146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Disable the buttons, since they need mCursor, which is created asynchronously 224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton.setEnabled(false); 225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(false); 226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2275c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 228146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 229146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onResume() { 230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onResume(); 2315c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // If the cursor is null, start the async handler. If it is not null just requery. 233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor == null) { 234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Uri uri = CalendarAlerts.CONTENT_URI_BY_INSTANCE; 235e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan mQueryHandler.startQuery(0, null, uri, PROJECTION, SELECTION, 236e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan SELECTIONARG, CalendarAlerts.DEFAULT_SORT_ORDER); 237146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 238146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.requery(); 239146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 240146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2415c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 242146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 243146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onStop() { 244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onStop(); 245e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan AlertService.updateAlertNotification(this); 2465c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 247146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 248146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.deactivate(); 249146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 250146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2515c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 252146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 253146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onDestroy() { 254146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onDestroy(); 255146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 256146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.close(); 257146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 258146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2595c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 260146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private OnClickListener mSnoozeAllListener = new OnClickListener() { 261146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public void onClick(View v) { 2625c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan long alarmTime = System.currentTimeMillis() + SNOOZE_DELAY; 2635c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 264146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project NotificationManager nm = 265146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 266146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project nm.cancel(NOTIFICATION_ID); 267e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 268e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan long scheduleAlarmTime = 0; 269146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.moveToPosition(-1); 270146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project while (mCursor.moveToNext()) { 271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long eventId = mCursor.getLong(INDEX_EVENT_ID); 272146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long begin = mCursor.getLong(INDEX_BEGIN); 273146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long end = mCursor.getLong(INDEX_END); 274146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 275146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Set the "minutes" to zero to indicate this is a snoozed 276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // alarm. There is code in AlertService.java that checks 277146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // this field. 2785c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = 2795c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan makeContentValues(eventId, begin, end, alarmTime, 0 /* minutes */); 2805c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2815c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan // Create a new alarm entry in the CalendarAlerts table 282e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan if (mCursor.isLast()) { 283e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan scheduleAlarmTime = alarmTime; 284e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan } 285bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan mQueryHandler.startInsert(0, scheduleAlarmTime, CalendarAlerts.CONTENT_URI, values, 286bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan Utils.UNDO_DELAY); 287146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2885c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2895c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan dismissFiredAlarms(); 2905c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 291146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project finish(); 292146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 293146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 2945c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 295146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private OnClickListener mDismissAllListener = new OnClickListener() { 296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public void onClick(View v) { 297146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project NotificationManager nm = 298146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 299146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project nm.cancel(NOTIFICATION_ID); 3005c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 3015c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan dismissFiredAlarms(); 3025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 303146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project finish(); 304146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 305146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 3065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 307146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public boolean isEmpty() { 308146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return (mCursor.getCount() == 0); 309146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 3105c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 311146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public Cursor getItemForView(View view) { 312146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project int index = mListView.getPositionForView(view); 313146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (index < 0) { 314146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return null; 315146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 316146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return (Cursor) mListView.getAdapter().getItem(index); 317146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 318146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project} 319