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 190000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzsteinimport android.annotation.SuppressLint; 20146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.Activity; 21146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.NotificationManager; 220ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport android.app.TaskStackBuilder; 235c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chanimport android.content.ContentValues; 24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context; 25db4ce4a81063b7f5f6068f4144f8a3e3bca1e064Erikimport android.content.Intent; 26146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor; 27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.net.Uri; 285f44e994a6f1dabf5a208f0035d476e71460626bChris Wrenimport android.os.AsyncTask; 29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle; 308f7f1abe54f206c490d2683f80646f514d98939bMichael Chanimport android.provider.CalendarContract; 31a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.CalendarAlerts; 321a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.util.Log; 33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View; 341a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.view.View.OnClickListener; 35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView; 361a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawaimport android.widget.AdapterView.OnItemClickListener; 37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.Button; 38146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ListView; 39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 408f7f1abe54f206c490d2683f80646f514d98939bMichael Chanimport com.android.calendar.AsyncQueryService; 418f7f1abe54f206c490d2683f80646f514d98939bMichael Chanimport com.android.calendar.EventInfoActivity; 428f7f1abe54f206c490d2683f80646f514d98939bMichael Chanimport com.android.calendar.R; 438f7f1abe54f206c490d2683f80646f514d98939bMichael Chanimport com.android.calendar.Utils; 440000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzsteinimport com.android.calendar.alerts.GlobalDismissManager.AlarmId; 450000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 460000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzsteinimport java.util.LinkedList; 470000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzsteinimport java.util.List; 488f7f1abe54f206c490d2683f80646f514d98939bMichael Chan 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 */ 531a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawapublic class AlertActivity extends Activity implements OnClickListener { 541a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa private static final String TAG = "AlertActivity"; 555c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 565c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan private static final String[] PROJECTION = new String[] { 57146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts._ID, // 0 58146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.TITLE, // 1 59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_LOCATION, // 2 60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALL_DAY, // 3 61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.BEGIN, // 4 62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.END, // 5 63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.EVENT_ID, // 6 649881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson CalendarAlerts.CALENDAR_COLOR, // 7 65146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.RRULE, // 8 66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.HAS_ALARM, // 9 67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.STATE, // 10 68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project CalendarAlerts.ALARM_TIME, // 11 69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 705c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 715c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan public static final int INDEX_ROW_ID = 0; 72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_TITLE = 1; 73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_LOCATION = 2; 74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALL_DAY = 3; 75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_BEGIN = 4; 76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_END = 5; 77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_EVENT_ID = 6; 78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_COLOR = 7; 79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_RRULE = 8; 80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_HAS_ALARM = 9; 81146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_STATE = 10; 82146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final int INDEX_ALARM_TIME = 11; 835c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 84bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting private static final String SELECTION = CalendarAlerts.STATE + "=?"; 85bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting private static final String[] SELECTIONARG = new String[] { 86bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting Integer.toString(CalendarAlerts.STATE_FIRED) 87bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting }; 88e2ae1ef8decfddcc4e5802483e92cab93c6fc67cMichael Chan 89146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private AlertAdapter mAdapter; 90146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private QueryHandler mQueryHandler; 91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Cursor mCursor; 92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private ListView mListView; 93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project private Button mDismissAllButton; 945c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 955c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 96bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting private void dismissFiredAlarms() { 975c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 98fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik values.put(PROJECTION[INDEX_STATE], CalendarAlerts.STATE_DISMISSED); 99bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.STATE_FIRED; 1005c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 101bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 1020000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 1030000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein if (mCursor == null) { 1040000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein Log.e(TAG, "Unable to globally dismiss all notifications because cursor was null."); 1050000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein return; 1060000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein } 1070000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein if (mCursor.isClosed()) { 1080000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein Log.e(TAG, "Unable to globally dismiss all notifications because cursor was closed."); 1090000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein return; 1100000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein } 1110000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein if (!mCursor.moveToFirst()) { 1120000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein Log.e(TAG, "Unable to globally dismiss all notifications because cursor was empty."); 1130000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein return; 1140000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein } 1150000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 1160000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein List<AlarmId> alarmIds = new LinkedList<AlarmId>(); 1170000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein do { 1180000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein long eventId = mCursor.getLong(INDEX_EVENT_ID); 1190000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein long eventStart = mCursor.getLong(INDEX_BEGIN); 1200000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein alarmIds.add(new AlarmId(eventId, eventStart)); 1210000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein } while (mCursor.moveToNext()); 1220000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein initiateGlobalDismiss(alarmIds); 1235c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1245c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1250000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein private void dismissAlarm(long id, long eventId, long startTime) { 1265c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan ContentValues values = new ContentValues(1 /* size */); 127fa292a0db2a6f04255c75a57908b17ba48a96183RoboErik values.put(PROJECTION[INDEX_STATE], CalendarAlerts.STATE_DISMISSED); 1285c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan String selection = CalendarAlerts._ID + "=" + id; 1295c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan mQueryHandler.startUpdate(0, null, CalendarAlerts.CONTENT_URI, values, 130bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan selection, null /* selectionArgs */, Utils.UNDO_DELAY); 1310000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 1320000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein List<AlarmId> alarmIds = new LinkedList<AlarmId>(); 1330000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein alarmIds.add(new AlarmId(eventId, startTime)); 1340000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein initiateGlobalDismiss(alarmIds); 1350000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein } 1360000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 1375f44e994a6f1dabf5a208f0035d476e71460626bChris Wren @SuppressWarnings("unchecked") 1380000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein private void initiateGlobalDismiss(List<AlarmId> alarmIds) { 1395f44e994a6f1dabf5a208f0035d476e71460626bChris Wren new AsyncTask<List<AlarmId>, Void, Void>() { 1405f44e994a6f1dabf5a208f0035d476e71460626bChris Wren @Override 1415f44e994a6f1dabf5a208f0035d476e71460626bChris Wren protected Void doInBackground(List<AlarmId>... params) { 1425f44e994a6f1dabf5a208f0035d476e71460626bChris Wren GlobalDismissManager.dismissGlobally(getApplicationContext(), params[0]); 1435f44e994a6f1dabf5a208f0035d476e71460626bChris Wren return null; 1445f44e994a6f1dabf5a208f0035d476e71460626bChris Wren } 1455f44e994a6f1dabf5a208f0035d476e71460626bChris Wren }.execute(alarmIds); 1465c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1475c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 148bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan private class QueryHandler extends AsyncQueryService { 149bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan public QueryHandler(Context context) { 150bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan super(context); 151146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 152146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 153146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 154146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 155146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Only set mCursor if the Activity is not finishing. Otherwise close the cursor. 156146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (!isFinishing()) { 157146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor = cursor; 158146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter.changeCursor(cursor); 15910d9f11fec9cb578185e4455eeaef289c0dff8b9Michael Chan mListView.setSelection(cursor.getCount() - 1); 1605c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 161146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // The results are in, enable the buttons 162146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(true); 163146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 164146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project cursor.close(); 165146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 166146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 1675c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1685c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan @Override 1695c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan protected void onUpdateComplete(int token, Object cookie, int result) { 1705c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan // Ignore 1715c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1725c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan } 1735c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 1740ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson private final OnItemClickListener mViewListener = new OnItemClickListener() { 175146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 1760000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein @SuppressLint("NewApi") 1779881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson @Override 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 1830000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein long alarmId = cursor.getLong(INDEX_ROW_ID); 1840000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein long eventId = cursor.getLong(AlertActivity.INDEX_EVENT_ID); 1850000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein long startMillis = cursor.getLong(AlertActivity.INDEX_BEGIN); 1860000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein 1879e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan // Mark this alarm as DISMISSED 1880000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein dismissAlarm(alarmId, eventId, startMillis); 1899e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chan 1900ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // build an intent and task stack to start EventInfoActivity with AllInOneActivity 1910ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // as the parent activity rooted to home. 192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long endMillis = cursor.getLong(AlertActivity.INDEX_END); 1930000fa426da7fbfd35f16bf43556e861dfcf6667Sam Blitzstein Intent eventIntent = AlertUtils.buildEventViewIntent(AlertActivity.this, eventId, 1949881907c47b2658fa85954bfb339c4b1eab9fc8eIsaac Katzenelson startMillis, endMillis); 1950ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson 196fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting if (Utils.isJellybeanOrLater()) { 197693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan TaskStackBuilder.create(AlertActivity.this).addParentStack(EventInfoActivity.class) 198693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan .addNextIntent(eventIntent).startActivities(); 199fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting } else { 200fac2d1594f7ecae8e50dc7790ce67de0c9b70d22Sara Ting alertActivity.startActivity(eventIntent); 201693ca60d79650af15ab226f7ce6958f61fb7de39Michael Chan } 2025c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project alertActivity.finish(); 204146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 205146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 2065c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 208146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onCreate(Bundle icicle) { 209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onCreate(icicle); 2105c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 211146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project setContentView(R.layout.alert_activity); 212bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting setTitle(R.string.alert_title); 2135c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 214bed0275111ecc6c4a3a638f90a9bac13bee594f4Michael Chan mQueryHandler = new QueryHandler(this); 215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mAdapter = new AlertAdapter(this, R.layout.alert_item); 2165c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView = (ListView) findViewById(R.id.alert_container); 218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setItemsCanFocus(true); 219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setAdapter(mAdapter); 220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mListView.setOnItemClickListener(mViewListener); 2215c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton = (Button) findViewById(R.id.dismiss_all); 2231a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mDismissAllButton.setOnClickListener(this); 224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // Disable the buttons, since they need mCursor, which is created asynchronously 226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mDismissAllButton.setEnabled(false); 227146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2285c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 229146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onResume() { 231146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onResume(); 2325c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // If the cursor is null, start the async handler. If it is not null just requery. 234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor == null) { 235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Uri uri = CalendarAlerts.CONTENT_URI_BY_INSTANCE; 236bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting mQueryHandler.startQuery(0, null, uri, PROJECTION, SELECTION, SELECTIONARG, 2378f7f1abe54f206c490d2683f80646f514d98939bMichael Chan CalendarContract.CalendarAlerts.DEFAULT_SORT_ORDER); 238146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } else { 2391a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa if (!mCursor.requery()) { 2401a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa Log.w(TAG, "Cursor#requery() failed."); 2411a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mCursor.close(); 2421a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa mCursor = null; 2431a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } 244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 245c9129804f2ee152559f08eac83d953e9c88d4036Sara Ting } 246c9129804f2ee152559f08eac83d953e9c88d4036Sara Ting 247c9129804f2ee152559f08eac83d953e9c88d4036Sara Ting void closeActivityIfEmpty() { 2485023750d3d28d2f1f93ca8b29107d64cdd433795Sara Ting if (mCursor != null && !mCursor.isClosed() && mCursor.getCount() == 0) { 249c9129804f2ee152559f08eac83d953e9c88d4036Sara Ting AlertActivity.this.finish(); 250c9129804f2ee152559f08eac83d953e9c88d4036Sara Ting } 251146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2525c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 253146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 254146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onStop() { 255146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onStop(); 2569b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski // Can't run updateAlertNotification in main thread 2579b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski AsyncTask task = new AsyncTask<Context, Void, Void>() { 2589b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski @Override 2599b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski protected Void doInBackground(Context ... params) { 2609b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski AlertService.updateAlertNotification(params[0]); 2619b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski return null; 2629b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski } 2639b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski }.execute(this); 2649b1f3796c46c8248e53d778801268bbabb3e83baPaul Sliwowski 2655c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 266146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 267146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.deactivate(); 268146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 269146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2705c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project @Override 272146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project protected void onDestroy() { 273146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project super.onDestroy(); 274146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (mCursor != null) { 275146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project mCursor.close(); 276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 277146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2785c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 2791a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa @Override 2801a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa public void onClick(View v) { 28142ba5efed5945b0e96735ec9ca4b388ae35b56f7Sara Ting if (v == mDismissAllButton) { 282146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project NotificationManager nm = 283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 284ff23072c5ab5433db376db88f23554c45297db05Sara Ting nm.cancelAll(); 2855c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 286bb57710243ba4ac813b1795d9dbbdb90d40d1f6fSara Ting dismissFiredAlarms(); 2875c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 288146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project finish(); 289146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2901a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa } 2915c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 292146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public boolean isEmpty() { 2931a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa return mCursor != null ? (mCursor.getCount() == 0) : true; 294146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 2955c7290c760979b1a43acfb6d90d6216d0e0a0934Michael Chan 296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public Cursor getItemForView(View view) { 2971a7fa28f2ac6bd293bb4009d22f3f1426e7658c3Daisuke Miyakawa final int index = mListView.getPositionForView(view); 298146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project if (index < 0) { 299146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return null; 300146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 301146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return (Cursor) mListView.getAdapter().getItem(index); 302146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 303146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project} 304