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