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