AlertActivity.java revision 146de36083f6ce8b7e8a1f974d3990594a36bfec
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
17146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpackage com.android.calendar;
18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
19146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport static android.provider.Calendar.EVENT_BEGIN_TIME;
20146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport static android.provider.Calendar.EVENT_END_TIME;
21146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
22146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.Activity;
23146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.AlarmManager;
24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.NotificationManager;
25146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.app.PendingIntent;
26146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.AsyncQueryHandler;
27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.ContentResolver;
28146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.ContentUris;
29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context;
30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Intent;
31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.res.TypedArray;
32146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor;
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.graphics.PixelFormat;
34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.net.Uri;
35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Bundle;
36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar;
37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.CalendarAlerts;
38146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.Events;
39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View;
40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.ViewGroup;
41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.Window;
42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.WindowManager;
43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.View.OnClickListener;
44146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView;
45146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.Button;
46146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ListView;
47146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener;
48146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
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  */
53146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class AlertActivity extends Activity {
54146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // The default snooze delay: 5 minutes
56146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final long SNOOZE_DELAY = 5 * 60 * 1000L;
57146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
58146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final String[] PROJECTION = new String[] {
59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts._ID,              // 0
60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.TITLE,            // 1
61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.EVENT_LOCATION,   // 2
62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.ALL_DAY,          // 3
63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.BEGIN,            // 4
64146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.END,              // 5
65146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.EVENT_ID,         // 6
66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.COLOR,            // 7
67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.RRULE,            // 8
68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.HAS_ALARM,        // 9
69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.STATE,            // 10
70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        CalendarAlerts.ALARM_TIME,       // 11
71146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_TITLE = 1;
74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_EVENT_LOCATION = 2;
75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_ALL_DAY = 3;
76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_BEGIN = 4;
77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_END = 5;
78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_EVENT_ID = 6;
79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_COLOR = 7;
80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_RRULE = 8;
81146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_HAS_ALARM = 9;
82146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_STATE = 10;
83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int INDEX_ALARM_TIME = 11;
84146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
85146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // We use one notification id for all events so that we don't clutter
86146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // the notification screen.  It doesn't matter what the id is, as long
87146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // as it is used consistently everywhere.
88146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final int NOTIFICATION_ID = 0;
89146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
90146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private ContentResolver mResolver;
91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private AlertAdapter mAdapter;
92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private QueryHandler mQueryHandler;
93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Cursor mCursor;
94146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private ListView mListView;
95146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Button mSnoozeAllButton;
96146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private Button mDismissAllButton;
97146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
98146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private class QueryHandler extends AsyncQueryHandler {
99146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public QueryHandler(ContentResolver cr) {
100146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            super(cr);
101146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
102146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
103146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        @Override
104146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
105146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Only set mCursor if the Activity is not finishing. Otherwise close the cursor.
106146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (!isFinishing()) {
107146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mCursor = cursor;
108146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mAdapter.changeCursor(cursor);
109146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
110146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // The results are in, enable the buttons
111146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mSnoozeAllButton.setEnabled(true);
112146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mDismissAllButton.setEnabled(true);
113146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            } else {
114146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                cursor.close();
115146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
116146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
117146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
118146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
119146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
120146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnItemClickListener mViewListener = new OnItemClickListener() {
121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
122146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public void onItemClick(AdapterView parent, View view, int position,
123146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long i) {
124146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            AlertActivity alertActivity = AlertActivity.this;
125146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Cursor cursor = alertActivity.getItemForView(view);
126146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
127146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long id = cursor.getInt(AlertActivity.INDEX_EVENT_ID);
128146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long startMillis = cursor.getLong(AlertActivity.INDEX_BEGIN);
129146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long endMillis = cursor.getLong(AlertActivity.INDEX_END);
130146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
131146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, id);
132146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
133146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.setClass(alertActivity, EventInfoActivity.class);
134146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.putExtra(EVENT_BEGIN_TIME, startMillis);
135146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            intent.putExtra(EVENT_END_TIME, endMillis);
136146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
137146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Mark this alarm as DISMISSED
138146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            cursor.updateInt(INDEX_STATE, CalendarAlerts.DISMISSED);
139146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            cursor.commitUpdates();
140146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
141146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            startActivity(intent);
142146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            alertActivity.finish();
143146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
144146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
145146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
146146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
147146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onCreate(Bundle icicle) {
148146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onCreate(icicle);
149146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
150146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
151146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        setContentView(R.layout.alert_activity);
152146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
153146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        WindowManager.LayoutParams lp = getWindow().getAttributes();
154146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.width = ViewGroup.LayoutParams.FILL_PARENT;
155146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.height = ViewGroup.LayoutParams.FILL_PARENT;
156146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
157146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Get the dim amount from the theme
158146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
159146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
160146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        a.recycle();
161146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
162146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        getWindow().setAttributes(lp);
163146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
164146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
165146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mResolver = getContentResolver();
166146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mQueryHandler = new QueryHandler(mResolver);
167146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mAdapter = new AlertAdapter(this, R.layout.alert_item);
168146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
169146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView = (ListView) findViewById(R.id.alert_container);
170146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setItemsCanFocus(true);
171146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setAdapter(mAdapter);
172146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mListView.setOnItemClickListener(mViewListener);
173146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
174146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton = (Button) findViewById(R.id.snooze_all);
175146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton.setOnClickListener(mSnoozeAllListener);
176146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton = (Button) findViewById(R.id.dismiss_all);
177146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton.setOnClickListener(mDismissAllListener);
178146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
179146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Disable the buttons, since they need mCursor, which is created asynchronously
180146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mSnoozeAllButton.setEnabled(false);
181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mDismissAllButton.setEnabled(false);
182146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
183146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
184146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
185146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onResume() {
186146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onResume();
187146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
188146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If the cursor is null, start the async handler. If it is not null just requery.
189146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor == null) {
190146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Uri uri = CalendarAlerts.CONTENT_URI_BY_INSTANCE;
191146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            String selection = CalendarAlerts.STATE + "=" + CalendarAlerts.FIRED;
192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mQueryHandler.startQuery(0, null, uri, PROJECTION, selection,
193146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    null /* selection args */, CalendarAlerts.DEFAULT_SORT_ORDER);
194146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        } else {
195146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.requery();
196146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
197146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
198146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
199146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
200146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onStop() {
201146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onStop();
202146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlertReceiver.updateAlertNotification(this);
203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
204146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor != null) {
205146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.deactivate();
206146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
208146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
210146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    protected void onDestroy() {
211146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        super.onDestroy();
212146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (mCursor != null) {
213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.close();
214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
216146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnClickListener mSnoozeAllListener = new OnClickListener() {
218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public void onClick(View v) {
219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            NotificationManager nm =
220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            nm.cancel(NOTIFICATION_ID);
222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.moveToPosition(-1);
223146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            while (mCursor.moveToNext()) {
224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long eventId = mCursor.getLong(INDEX_EVENT_ID);
225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long begin = mCursor.getLong(INDEX_BEGIN);
226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long end = mCursor.getLong(INDEX_END);
227146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long alarmTime = mCursor.getLong(INDEX_ALARM_TIME);
228146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
229146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Mark this alarm as DISMISSED
230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mCursor.updateInt(INDEX_STATE, CalendarAlerts.DISMISSED);
231146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Create a new alarm entry in the CalendarAlerts table
233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long now = System.currentTimeMillis();
234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                alarmTime = now + SNOOZE_DELAY;
235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
236146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Set the "minutes" to zero to indicate this is a snoozed
237146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // alarm.  There is code in AlertService.java that checks
238146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // this field.
239146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Uri uri = CalendarAlerts.insert(mResolver, eventId,
240146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        begin, end, alarmTime, 0 /* minutes */);
241146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
242146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Set a new alarm to go off after the snooze delay.
243146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Intent intent = new Intent(Calendar.EVENT_REMINDER_ACTION);
244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                intent.setData(uri);
245146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                intent.putExtra(Calendar.EVENT_BEGIN_TIME, begin);
246146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                intent.putExtra(Calendar.EVENT_END_TIME, end);
247146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
248146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                PendingIntent sender = PendingIntent.getBroadcast(AlertActivity.this,
249146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
250146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Object service = getSystemService(Context.ALARM_SERVICE);
251146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                AlarmManager alarmManager = (AlarmManager) service;
252146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, sender);
253146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
254146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.commitUpdates();
255146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            finish();
256146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
257146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
258146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
259146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private OnClickListener mDismissAllListener = new OnClickListener() {
260146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        public void onClick(View v) {
261146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            NotificationManager nm =
262146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
263146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            nm.cancel(NOTIFICATION_ID);
264146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.moveToPosition(-1);
265146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            while (mCursor.moveToNext()) {
266146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                mCursor.updateInt(INDEX_STATE, CalendarAlerts.DISMISSED);
267146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
268146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            mCursor.commitUpdates();
269146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            finish();
270146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
272146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
273146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public boolean isEmpty() {
274146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return (mCursor.getCount() == 0);
275146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
277146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Cursor getItemForView(View view) {
278146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int index = mListView.getPositionForView(view);
279146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (index < 0) {
280146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return null;
281146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
282146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return (Cursor) mListView.getAdapter().getItem(index);
283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
284146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
285