AlertActivity.java revision 0ef732f240516f9f8b8add982f82244e01ec509b
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 1907d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chanimport com.android.calendar.AllInOneActivity; 2023e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.AsyncQueryService; 210ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.EventInfoActivity; 2223e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.R; 2323e7da3eacee7bceb105cdfc7b5329c7a43846d5Mason Tangimport com.android.calendar.Utils; 24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 25146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.Activity; 26146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.NotificationManager; 270ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport android.app.TaskStackBuilder; 285c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.content.ContentValues; 29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context; 30db4ce4a81063b7f5f6068f4144f8a3e3bca1e064Erikimport android.content.Intent; 31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor; 32146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.net.Uri; 33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle; 34a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.CalendarAlerts; 351a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.util.Log; 36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View; 371a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.view.View.OnClickListener; 38146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView; 391a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.widget.AdapterView.OnItemClickListener; 40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.Button; 41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ListView; 42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/** 44146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * The alert panel that pops up when there is a calendar event alarm. 45146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * This activity is started by an intent that specifies an event id. 46146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */ 471a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawapublic class AlertActivity extends Activity implements OnClickListener { 481a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa private static final String TAG = "AlertActivity"; 495c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 505c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private static final String[] PROJECTION = new String[] { 51146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts._ID, // 0 52146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.TITLE, // 1 53146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_LOCATION, // 2 54146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALL_DAY, // 3 55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.BEGIN, // 4 56146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.END, // 5 57146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_ID, // 6 589881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson CalendarAlerts.CALENDAR_COLOR, // 7 59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.RRULE, // 8 60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.HAS_ALARM, // 9 61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.STATE, // 10 62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALARM_TIME, // 11 63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 645c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 655c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan public static final int INDEX_ROW_ID = 0; 66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_TITLE = 1; 67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_LOCATION = 2; 68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALL_DAY = 3; 69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_BEGIN = 4; 70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_END = 5; 71146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_ID = 6; 72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_COLOR = 7; 73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_RRULE = 8; 74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_HAS_ALARM = 9; 75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_STATE = 10; 76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALARM_TIME = 11; 775c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 78e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan private static final String SELECTION = CalendarAlerts.STATE + "=?"; 79e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan private static final String[] SELECTIONARG = new String[] { 80fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik Integer.toString(CalendarAlerts.STATE_FIRED) 81e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan }; 82e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private AlertAdapter mAdapter; 84146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private QueryHandler mQueryHandler; 85146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Cursor mCursor; 86146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private ListView mListView; 87146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Button mSnoozeAllButton; 88146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Button mDismissAllButton; 895c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 905c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 915c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private void dismissFiredAlarms() { 925c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 93fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik values.put(PROJECTION[INDEX_STATE], CalendarAlerts.STATE_DISMISSED); 94fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.STATE_FIRED; 955c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 96bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 975c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 985c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 995c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private void dismissAlarm(long id) { 1005c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 101fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik values.put(PROJECTION[INDEX_STATE], CalendarAlerts.STATE_DISMISSED); 1025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan String selection = CalendarAlerts._ID + "=" + id; 1035c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 104bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 1055c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 107bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan private class QueryHandler extends AsyncQueryService { 108bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan public QueryHandler(Context context) { 109bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan super(context); 110146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 111146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 112146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 113146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 114146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Only set mCursor if the Activity is not finishing. Otherwise close the cursor. 115146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (!isFinishing()) { 116146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor = cursor; 117146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter.changeCursor(cursor); 11810d9f11fec9cb578185e4455eeaef289c0dff8b9Michael Chan mListView.setSelection(cursor.getCount() - 1); 1195c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 120146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // The results are in, enable the buttons 121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton.setEnabled(true); 122146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(true); 123146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 124146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project cursor.close(); 125146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 126146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 1275c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1285c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan @Override 1295c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan protected void onInsertComplete(int token, Object cookie, Uri uri) { 1305c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan if (uri != null) { 131e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan Long alarmTime = (Long) cookie; 132e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 133e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan if (alarmTime != 0) { 134e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan // Set a new alarm to go off after the snooze delay. 135fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik // TODO make provider schedule this automatically when 136fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik // inserting an alarm 1379881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson AlertUtils.scheduleAlarm(AlertActivity.this, null, alarmTime); 138e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan } 1395c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1405c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1415c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1425c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan @Override 1435c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan protected void onUpdateComplete(int token, Object cookie, int result) { 1445c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan // Ignore 1455c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1465c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1475c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 148fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik 1495c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1500ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson private final OnItemClickListener mViewListener = new OnItemClickListener() { 151146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 1529881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson @Override 1534ce500bd7d08eac3f05dfd50bce51e620fa9f08eChristian Mehlmauer public void onItemClick(AdapterView<?> parent, View view, int position, 154146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long i) { 155146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project AlertActivity alertActivity = AlertActivity.this; 156146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Cursor cursor = alertActivity.getItemForView(view); 1575c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1589e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan // Mark this alarm as DISMISSED 1599e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan dismissAlarm(cursor.getLong(INDEX_ROW_ID)); 1609e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan 1610ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // build an intent and task stack to start EventInfoActivity with AllInOneActivity 1620ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // as the parent activity rooted to home. 163146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long id = cursor.getInt(AlertActivity.INDEX_EVENT_ID); 164146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long startMillis = cursor.getLong(AlertActivity.INDEX_BEGIN); 165146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long endMillis = cursor.getLong(AlertActivity.INDEX_END); 1669881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson Intent eventIntent = AlertUtils.buildEventViewIntent(AlertActivity.this, id, 1679881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson startMillis, endMillis); 1680ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson 1690ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson TaskStackBuilder.create(AlertActivity.this) 1700ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson .addParentStack(EventInfoActivity.class).addNextIntent(eventIntent) 1710ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson .startActivities(); 1725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 173146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project alertActivity.finish(); 174146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 175146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 1765c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 177146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 178146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onCreate(Bundle icicle) { 179146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onCreate(icicle); 1805c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project setContentView(R.layout.alert_activity); 1827abd8566e5718c43d610e046495bcb412e87847fThe Android Open Source Project setTitle(R.string.alert_title); 1835c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 184bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan mQueryHandler = new QueryHandler(this); 185146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter = new AlertAdapter(this, R.layout.alert_item); 1865c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 187146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView = (ListView) findViewById(R.id.alert_container); 188146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setItemsCanFocus(true); 189146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setAdapter(mAdapter); 190146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setOnItemClickListener(mViewListener); 1915c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton = (Button) findViewById(R.id.snooze_all); 1931a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mSnoozeAllButton.setOnClickListener(this); 194146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton = (Button) findViewById(R.id.dismiss_all); 1951a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mDismissAllButton.setOnClickListener(this); 196146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 197146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Disable the buttons, since they need mCursor, which is created asynchronously 198146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mSnoozeAllButton.setEnabled(false); 199146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(false); 200146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2015c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 202146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onResume() { 204146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onResume(); 2055c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 206146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // If the cursor is null, start the async handler. If it is not null just requery. 207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor == null) { 208146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Uri uri = CalendarAlerts.CONTENT_URI_BY_INSTANCE; 209e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan mQueryHandler.startQuery(0, null, uri, PROJECTION, SELECTION, 210e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan SELECTIONARG, CalendarAlerts.DEFAULT_SORT_ORDER); 211146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 2121a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa if (!mCursor.requery()) { 2131a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa Log.w(TAG, "Cursor#requery() failed."); 2141a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mCursor.close(); 2151a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mCursor = null; 2161a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } 217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2195c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onStop() { 222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onStop(); 223e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan AlertService.updateAlertNotification(this); 2245c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.deactivate(); 227146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 228146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2295c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 231146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onDestroy() { 232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onDestroy(); 233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.close(); 235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 236146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2375c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2381a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa @Override 2391a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa public void onClick(View v) { 2401a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa if (v == mSnoozeAllButton) { 2419881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson long alarmTime = System.currentTimeMillis() + AlertUtils.SNOOZE_DELAY; 2425c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 243146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project NotificationManager nm = 244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 2459881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson nm.cancel(AlertUtils.NOTIFICATION_ID); 246e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 2471a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa if (mCursor != null) { 2481a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa long scheduleAlarmTime = 0; 2491a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mCursor.moveToPosition(-1); 2501a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa while (mCursor.moveToNext()) { 2511a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa long eventId = mCursor.getLong(INDEX_EVENT_ID); 2521a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa long begin = mCursor.getLong(INDEX_BEGIN); 2531a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa long end = mCursor.getLong(INDEX_END); 2541a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa 2551a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa // Set the "minutes" to zero to indicate this is a snoozed 2561a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa // alarm. There is code in AlertService.java that checks 2571a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa // this field. 2580ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson ContentValues values = AlertUtils.makeContentValues(eventId, begin, end, 2599881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson alarmTime, 0 /* minutes */); 2601a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa 2611a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa // Create a new alarm entry in the CalendarAlerts table 2621a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa if (mCursor.isLast()) { 2631a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa scheduleAlarmTime = alarmTime; 2641a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } 2651a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mQueryHandler.startInsert(0, 2661a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa scheduleAlarmTime, CalendarAlerts.CONTENT_URI, values, 2671a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa Utils.UNDO_DELAY); 268e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan } 2691a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } else { 2701a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa Log.d(TAG, "Cursor object is null. Ignore the Snooze request."); 271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2735c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan dismissFiredAlarms(); 274146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project finish(); 2751a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } else if (v == mDismissAllButton) { 276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project NotificationManager nm = 277146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 2789881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson nm.cancel(AlertUtils.NOTIFICATION_ID); 2795c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2805c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan dismissFiredAlarms(); 2815c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 282146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project finish(); 283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2841a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } 2855c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 286146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public boolean isEmpty() { 2871a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa return mCursor != null ? (mCursor.getCount() == 0) : true; 288146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2895c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 290146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public Cursor getItemForView(View view) { 2911a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa final int index = mListView.getPositionForView(view); 292146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (index < 0) { 293146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return null; 294146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 295146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return (Cursor) mListView.getAdapter().getItem(index); 296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 297146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project} 298