1bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang/*
2bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Copyright (C) 2009 The Android Open Source Project
3bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang *
4bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Licensed under the Apache License, Version 2.0 (the "License");
5bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * you may not use this file except in compliance with the License.
6bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * You may obtain a copy of the License at
7bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang *
8bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang *      http://www.apache.org/licenses/LICENSE-2.0
9bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang *
10bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Unless required by applicable law or agreed to in writing, software
11bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * distributed under the License is distributed on an "AS IS" BASIS,
12bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * See the License for the specific language governing permissions and
14bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * limitations under the License.
15bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */
16bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
179a3cb14e28536e4133dddbe952f47189fe344ec1Mason Tangpackage com.android.calendar.widget;
18bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
196bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelsonimport static android.provider.CalendarContract.EXTRA_EVENT_ALL_DAY;
20a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
21a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
22bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan
23bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.AlarmManager;
24bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.PendingIntent;
25bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetManager;
26bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetProvider;
27bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.ComponentName;
28bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Context;
29bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Intent;
3047d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.net.Uri;
31a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract;
32bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.text.format.DateUtils;
3347d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.text.format.Time;
3447d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.util.Log;
3547d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.widget.RemoteViews;
36bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
370ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.AllInOneActivity;
380ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.EventInfoActivity;
390ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.R;
400ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.Utils;
410ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson
42bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang/**
43bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Simple widget to show next upcoming calendar event.
44bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */
45bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangpublic class CalendarAppWidgetProvider extends AppWidgetProvider {
46bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    static final String TAG = "CalendarAppWidgetProvider";
47bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    static final boolean LOGD = false;
48bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
49bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    // TODO Move these to Calendar.java
50bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    static final String EXTRA_EVENT_IDS = "com.android.calendar.EXTRA_EVENT_IDS";
51bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
52bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
53bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * {@inheritDoc}
54bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
55bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    @Override
56bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    public void onReceive(Context context, Intent intent) {
57bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        // Handle calendar-specific updates ourselves because they might be
58bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        // coming in without extras, which AppWidgetProvider then blocks.
59bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        final String action = intent.getAction();
60f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik        if (LOGD)
61f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik            Log.d(TAG, "AppWidgetProvider got the intent: " + intent.toString());
62064beb957ae443760118023a40fd7001eb11c1a1RoboErik        if (Utils.getWidgetUpdateAction(context).equals(action)) {
6347d40324272ae39af0872bf5cbf27e1800478021Mason Tang            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
6447d40324272ae39af0872bf5cbf27e1800478021Mason Tang            performUpdate(context, appWidgetManager,
6547d40324272ae39af0872bf5cbf27e1800478021Mason Tang                    appWidgetManager.getAppWidgetIds(getComponentName(context)),
66bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang                    null /* no eventIds */);
67f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik        } else if (action.equals(Intent.ACTION_PROVIDER_CHANGED)
68f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik                || action.equals(Intent.ACTION_TIME_CHANGED)
69f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik                || action.equals(Intent.ACTION_TIMEZONE_CHANGED)
70f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik                || action.equals(Intent.ACTION_DATE_CHANGED)
71f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik                || action.equals(Utils.getWidgetScheduledUpdateAction(context))) {
72f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik            Intent service = new Intent(context, CalendarAppWidgetService.class);
73f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik            context.startService(service);
74bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        } else {
75bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang            super.onReceive(context, intent);
76bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        }
77bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
78bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
79bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
80bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * {@inheritDoc}
81bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
82bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    @Override
83bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    public void onDisabled(Context context) {
84bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        // Unsubscribe from all AlarmManager updates
85bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
86bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        PendingIntent pendingUpdate = getUpdateIntent(context);
87bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        am.cancel(pendingUpdate);
88bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
89bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
90bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
91bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * {@inheritDoc}
92bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
93bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    @Override
94bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
9547d40324272ae39af0872bf5cbf27e1800478021Mason Tang        performUpdate(context, appWidgetManager, appWidgetIds, null /* no eventIds */);
96bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
97bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
98bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
99bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
100bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * Build {@link ComponentName} describing this specific
101bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * {@link AppWidgetProvider}
102bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
103bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    static ComponentName getComponentName(Context context) {
104bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang        return new ComponentName(context, CalendarAppWidgetProvider.class);
105bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
106bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
107bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
108bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * Process and push out an update for the given appWidgetIds. This call
109bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * actually fires an intent to start {@link CalendarAppWidgetService} as a
110bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * background service which handles the actual update, to prevent ANR'ing
111bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * during database queries.
112bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     *
113bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * @param context Context to use when starting {@link CalendarAppWidgetService}.
114bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * @param appWidgetIds List of specific appWidgetIds to update, or null for
115bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     *            all.
116bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * @param changedEventIds Specific events known to be changed. If present,
117bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     *            we use it to decide if an update is necessary.
118bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
1194143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa    private void performUpdate(Context context,
1204143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa            AppWidgetManager appWidgetManager, int[] appWidgetIds,
121bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang            long[] changedEventIds) {
12247d40324272ae39af0872bf5cbf27e1800478021Mason Tang        // Launch over to service so it can perform update
12347d40324272ae39af0872bf5cbf27e1800478021Mason Tang        for (int appWidgetId : appWidgetIds) {
12447d40324272ae39af0872bf5cbf27e1800478021Mason Tang            if (LOGD) Log.d(TAG, "Building widget update...");
12547d40324272ae39af0872bf5cbf27e1800478021Mason Tang            Intent updateIntent = new Intent(context, CalendarAppWidgetService.class);
12647d40324272ae39af0872bf5cbf27e1800478021Mason Tang            updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
127bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang            if (changedEventIds != null) {
128bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang                updateIntent.putExtra(EXTRA_EVENT_IDS, changedEventIds);
129bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang            }
13047d40324272ae39af0872bf5cbf27e1800478021Mason Tang            updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
13147d40324272ae39af0872bf5cbf27e1800478021Mason Tang
13247d40324272ae39af0872bf5cbf27e1800478021Mason Tang            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
13347d40324272ae39af0872bf5cbf27e1800478021Mason Tang            // Calendar header
13495d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng            Time time = new Time(Utils.getTimeZone(context, null));
13547d40324272ae39af0872bf5cbf27e1800478021Mason Tang            time.setToNow();
13695d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng            long millis = time.toMillis(true);
13795d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng            final String dayOfWeek = DateUtils.getDayOfWeekString(time.weekDay + 1,
13895d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng                    DateUtils.LENGTH_MEDIUM);
13995d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng            final String date = Utils.formatDateRange(context, millis, millis,
14095d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng                    DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE
14195d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng                            | DateUtils.FORMAT_NO_YEAR);
14247d40324272ae39af0872bf5cbf27e1800478021Mason Tang            views.setTextViewText(R.id.day_of_week, dayOfWeek);
14395d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng            views.setTextViewText(R.id.date, date);
14447d40324272ae39af0872bf5cbf27e1800478021Mason Tang            // Attach to list of events
145129b79699cca6cccbe68654aad8f5ffb511c92c2Winson Chung            views.setRemoteAdapter(appWidgetId, R.id.events_list, updateIntent);
1460054262c76ccc4b20dc6596e161df8a99d0c81c7Mason Tang            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.events_list);
14747d40324272ae39af0872bf5cbf27e1800478021Mason Tang
148629085ada768ffa6c10edddb319291636e3774b7Michael Chan
149629085ada768ffa6c10edddb319291636e3774b7Michael Chan            // Launch calendar app when the user taps on the header
150629085ada768ffa6c10edddb319291636e3774b7Michael Chan            final Intent launchCalendarIntent = new Intent(Intent.ACTION_VIEW);
15107d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan            launchCalendarIntent.setClass(context, AllInOneActivity.class);
1522c2dab4805522ceb8674aafa6d0939889084c589RoboErik            launchCalendarIntent
1532c2dab4805522ceb8674aafa6d0939889084c589RoboErik                    .setData(Uri.parse("content://com.android.calendar/time/" + millis));
154c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik            final PendingIntent launchCalendarPendingIntent = PendingIntent.getActivity(
155c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik                    context, 0 /* no requestCode */, launchCalendarIntent, 0 /* no flags */);
156629085ada768ffa6c10edddb319291636e3774b7Michael Chan            views.setOnClickPendingIntent(R.id.header, launchCalendarPendingIntent);
15747d40324272ae39af0872bf5cbf27e1800478021Mason Tang
158c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik            // Each list item will call setOnClickExtra() to let the list know
159c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik            // which item
1604143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa            // is selected by a user.
1614143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa            final PendingIntent updateEventIntent = getLaunchPendingIntentTemplate(context);
1624143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa            views.setPendingIntentTemplate(R.id.events_list, updateEventIntent);
16347d40324272ae39af0872bf5cbf27e1800478021Mason Tang
16447d40324272ae39af0872bf5cbf27e1800478021Mason Tang            appWidgetManager.updateAppWidget(appWidgetId, views);
16547d40324272ae39af0872bf5cbf27e1800478021Mason Tang        }
166bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
167bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang
168bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    /**
169bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * Build the {@link PendingIntent} used to trigger an update of all calendar
170064beb957ae443760118023a40fd7001eb11c1a1RoboErik     * widgets. Uses {@link Utils#getWidgetScheduledUpdateAction(Context)} to
171a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik     * directly target all widgets instead of using
172a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik     * {@link AppWidgetManager#EXTRA_APPWIDGET_IDS}.
173bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     *
174bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     * @param context Context to use when building broadcast.
175bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang     */
176bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    static PendingIntent getUpdateIntent(Context context) {
177064beb957ae443760118023a40fd7001eb11c1a1RoboErik        Intent intent = new Intent(Utils.getWidgetScheduledUpdateAction(context));
17842dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik        intent.setDataAndType(CalendarContract.CONTENT_URI, Utils.APPWIDGET_DATA_TYPE);
179a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik        return PendingIntent.getBroadcast(context, 0 /* no requestCode */, intent,
180a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik                0 /* no flags */);
181bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang    }
18247d40324272ae39af0872bf5cbf27e1800478021Mason Tang
18347d40324272ae39af0872bf5cbf27e1800478021Mason Tang    /**
1844143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * Build a {@link PendingIntent} to launch the Calendar app. This should be used
1854143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * in combination with {@link RemoteViews#setPendingIntentTemplate(int, PendingIntent)}.
18647d40324272ae39af0872bf5cbf27e1800478021Mason Tang     */
1874143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa    static PendingIntent getLaunchPendingIntentTemplate(Context context) {
18847d40324272ae39af0872bf5cbf27e1800478021Mason Tang        Intent launchIntent = new Intent();
18947d40324272ae39af0872bf5cbf27e1800478021Mason Tang        launchIntent.setAction(Intent.ACTION_VIEW);
1900ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |
1910ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson                Intent.FLAG_ACTIVITY_TASK_ON_HOME);
1920ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            launchIntent.setClass(context, AllInOneActivity.class);
1930ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            return PendingIntent.getActivity(context, 0 /* no requestCode */, launchIntent,
1940ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson                    PendingIntent.FLAG_UPDATE_CURRENT);
1954143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa    }
1960c715c837a7ecc2cfda3a62d952f8dc7e79a39f3Daisuke Miyakawa
1974143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa    /**
1984143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * Build an {@link Intent} available as FillInIntent to launch the Calendar app.
1994143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * This should be used in combination with
2004143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}.
2014143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * If the go to time is 0, then calendar will be launched without a starting time.
2024143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     *
2034143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     * @param goToTime time that calendar should take the user to, or 0 to
2044143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     *            indicate no specific start time.
2054143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa     */
2066bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    static Intent getLaunchFillInIntent(Context context, long id, long start, long end,
2076bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson            boolean allDay) {
2084143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa        final Intent fillInIntent = new Intent();
209bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan        String dataString = "content://com.android.calendar/events";
210bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan        if (id != 0) {
2114143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa            fillInIntent.putExtra(Utils.INTENT_KEY_DETAIL_VIEW, true);
2120ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            fillInIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |
2130ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            Intent.FLAG_ACTIVITY_TASK_ON_HOME);
2140ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson
215bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan            dataString += "/" + id;
2160ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            // If we have an event id - start the event info activity
2170ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            fillInIntent.setClass(context, EventInfoActivity.class);
2180ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        } else {
2190ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            // If we do not have an event id - start AllInOne
2200ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson            fillInIntent.setClass(context, AllInOneActivity.class);
22147d40324272ae39af0872bf5cbf27e1800478021Mason Tang        }
22247d40324272ae39af0872bf5cbf27e1800478021Mason Tang        Uri data = Uri.parse(dataString);
223b79279d9311c798138ab745d1836ca52f235f99dDaisuke Miyakawa        fillInIntent.setData(data);
224a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik        fillInIntent.putExtra(EXTRA_EVENT_BEGIN_TIME, start);
225a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik        fillInIntent.putExtra(EXTRA_EVENT_END_TIME, end);
2266bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson        fillInIntent.putExtra(EXTRA_EVENT_ALL_DAY, allDay);
227bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan
2284143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa        return fillInIntent;
22947d40324272ae39af0872bf5cbf27e1800478021Mason Tang    }
23047d40324272ae39af0872bf5cbf27e1800478021Mason Tang
23107d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//    private static PendingIntent getNewEventPendingIntent(Context context) {
23207d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        Intent newEventIntent = new Intent(Intent.ACTION_EDIT);
23307d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        newEventIntent.setClass(context, EditEventActivity.class);
23407d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        Builder builder = CalendarContract.CONTENT_URI.buildUpon();
23507d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        builder.appendPath("events");
23607d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        newEventIntent.setData(builder.build());
23707d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//        return PendingIntent.getActivity(context, 0, newEventIntent,
23807d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//                PendingIntent.FLAG_UPDATE_CURRENT);
23907d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan//    }
240bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang}
241