CalendarAppWidgetProvider.java revision 0c715c837a7ecc2cfda3a62d952f8dc7e79a39f3
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 1947d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport com.android.calendar.R; 2047d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport com.android.calendar.Utils; 2147d40324272ae39af0872bf5cbf27e1800478021Mason Tang 22bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.AlarmManager; 23bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.PendingIntent; 24bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetManager; 25bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetProvider; 26bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.ComponentName; 27bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Context; 28bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Intent; 29bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.pm.PackageManager; 3047d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.net.Uri; 31bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.text.format.DateUtils; 3247d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.text.format.Time; 3347d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.util.Log; 3447d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.widget.RemoteViews; 35bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 36bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang/** 37bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Simple widget to show next upcoming calendar event. 38bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 39bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangpublic class CalendarAppWidgetProvider extends AppWidgetProvider { 40bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final String TAG = "CalendarAppWidgetProvider"; 41bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final boolean LOGD = false; 42bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 43bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final String ACTION_CALENDAR_APPWIDGET_UPDATE = 44bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang "com.android.calendar.APPWIDGET_UPDATE"; 45bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 46bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // TODO Move these to Calendar.java 47bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final String EXTRA_EVENT_IDS = "com.android.calendar.EXTRA_EVENT_IDS"; 48bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 49bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 50bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 51bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 52bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 53bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onReceive(Context context, Intent intent) { 54bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Handle calendar-specific updates ourselves because they might be 55bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // coming in without extras, which AppWidgetProvider then blocks. 56bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang final String action = intent.getAction(); 57bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang if (ACTION_CALENDAR_APPWIDGET_UPDATE.equals(action)) { 5847d40324272ae39af0872bf5cbf27e1800478021Mason Tang AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 5947d40324272ae39af0872bf5cbf27e1800478021Mason Tang performUpdate(context, appWidgetManager, 6047d40324272ae39af0872bf5cbf27e1800478021Mason Tang appWidgetManager.getAppWidgetIds(getComponentName(context)), 61bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang null /* no eventIds */); 62bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } else { 63bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang super.onReceive(context, intent); 64bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 65bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 66bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 67bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 68bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 69bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 70bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 71bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onEnabled(Context context) { 72bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Enable updates for timezone, date, and provider changes 73bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager pm = context.getPackageManager(); 74bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang pm.setComponentEnabledSetting( 75bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang new ComponentName(context, CalendarAppWidgetReceiver.class), 76bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 77bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager.DONT_KILL_APP); 78bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 79bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 80bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 81bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 82bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 83bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 84bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onDisabled(Context context) { 85bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Unsubscribe from all AlarmManager updates 86bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 87bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PendingIntent pendingUpdate = getUpdateIntent(context); 88bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang am.cancel(pendingUpdate); 89bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 90bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Disable updates for timezone, date, and provider changes 91bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager pm = context.getPackageManager(); 92bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang pm.setComponentEnabledSetting( 93bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang new ComponentName(context, CalendarAppWidgetReceiver.class), 94bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 95bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PackageManager.DONT_KILL_APP); 96bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 97bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 98bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 99bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 100bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 101bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 102bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 10347d40324272ae39af0872bf5cbf27e1800478021Mason Tang performUpdate(context, appWidgetManager, appWidgetIds, null /* no eventIds */); 104bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 105bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 106bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 107bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 108bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Build {@link ComponentName} describing this specific 109bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@link AppWidgetProvider} 110bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 111bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static ComponentName getComponentName(Context context) { 112bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang return new ComponentName(context, CalendarAppWidgetProvider.class); 113bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 114bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 115bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 116bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Process and push out an update for the given appWidgetIds. This call 117bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * actually fires an intent to start {@link CalendarAppWidgetService} as a 118bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * background service which handles the actual update, to prevent ANR'ing 119bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * during database queries. 120bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 121bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param context Context to use when starting {@link CalendarAppWidgetService}. 122bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param appWidgetIds List of specific appWidgetIds to update, or null for 123bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * all. 124bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param changedEventIds Specific events known to be changed. If present, 125bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * we use it to decide if an update is necessary. 126bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 1274143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa private void performUpdate(Context context, 1284143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa AppWidgetManager appWidgetManager, int[] appWidgetIds, 129bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang long[] changedEventIds) { 13047d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Launch over to service so it can perform update 13147d40324272ae39af0872bf5cbf27e1800478021Mason Tang for (int appWidgetId : appWidgetIds) { 13247d40324272ae39af0872bf5cbf27e1800478021Mason Tang if (LOGD) Log.d(TAG, "Building widget update..."); 13347d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent updateIntent = new Intent(context, CalendarAppWidgetService.class); 13447d40324272ae39af0872bf5cbf27e1800478021Mason Tang updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 135bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang if (changedEventIds != null) { 136bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang updateIntent.putExtra(EXTRA_EVENT_IDS, changedEventIds); 137bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 13847d40324272ae39af0872bf5cbf27e1800478021Mason Tang updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME))); 13947d40324272ae39af0872bf5cbf27e1800478021Mason Tang 14047d40324272ae39af0872bf5cbf27e1800478021Mason Tang RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); 14147d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Calendar header 14247d40324272ae39af0872bf5cbf27e1800478021Mason Tang Time time = new Time(); 14347d40324272ae39af0872bf5cbf27e1800478021Mason Tang time.setToNow(); 144a71e0a520493532dbb7e9bfa164ab78e59e797a3Daisuke Miyakawa final String dayOfWeek = DateUtils.getDayOfWeekString( 14550088e364aaa3074476e1300a270aafb0653df47Daisuke Miyakawa time.weekDay + 1, DateUtils.LENGTH_MEDIUM); 14650088e364aaa3074476e1300a270aafb0653df47Daisuke Miyakawa final String month = 14750088e364aaa3074476e1300a270aafb0653df47Daisuke Miyakawa DateUtils.getMonthString(time.month, DateUtils.LENGTH_MEDIUM).toUpperCase(); 14847d40324272ae39af0872bf5cbf27e1800478021Mason Tang views.setTextViewText(R.id.day_of_week, dayOfWeek); 14947d40324272ae39af0872bf5cbf27e1800478021Mason Tang views.setTextViewText(R.id.day_of_month, Integer.toString(time.monthDay)); 150a71e0a520493532dbb7e9bfa164ab78e59e797a3Daisuke Miyakawa views.setTextViewText(R.id.month, month); 15147d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Attach to list of events 15247d40324272ae39af0872bf5cbf27e1800478021Mason Tang views.setRemoteAdapter(R.id.events_list, updateIntent); 1530054262c76ccc4b20dc6596e161df8a99d0c81c7Mason Tang appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.events_list); 15447d40324272ae39af0872bf5cbf27e1800478021Mason Tang 15547d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Clicking on the widget launches Calendar 15647d40324272ae39af0872bf5cbf27e1800478021Mason Tang // TODO fix this exact behavior? 1574143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // long startTime = Math.max(currentTime, events.firstTime); 15847d40324272ae39af0872bf5cbf27e1800478021Mason Tang long startTime = System.currentTimeMillis(); 15947d40324272ae39af0872bf5cbf27e1800478021Mason Tang 1604143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // Each list item will call setOnClickExtra() to let the list know which item 1614143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // is selected by a user. 1624143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa final PendingIntent updateEventIntent = getLaunchPendingIntentTemplate(context); 1634143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa views.setPendingIntentTemplate(R.id.events_list, updateEventIntent); 16447d40324272ae39af0872bf5cbf27e1800478021Mason Tang 1654143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // ImageButton is not a collection so we cannot/shouldn't call 1664143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // setPendingIntentTemplate(). 1674143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa final PendingIntent newEventIntent = getNewEventPendingIntent(context); 16847d40324272ae39af0872bf5cbf27e1800478021Mason Tang views.setOnClickPendingIntent(R.id.new_event_button, newEventIntent); 16947d40324272ae39af0872bf5cbf27e1800478021Mason Tang 17047d40324272ae39af0872bf5cbf27e1800478021Mason Tang appWidgetManager.updateAppWidget(appWidgetId, views); 17147d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 172bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 173bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 174bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 175bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Build the {@link PendingIntent} used to trigger an update of all calendar 176bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * widgets. Uses {@link #ACTION_CALENDAR_APPWIDGET_UPDATE} to directly target 177bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * all widgets instead of using {@link AppWidgetManager#EXTRA_APPWIDGET_IDS}. 178bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 179bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param context Context to use when building broadcast. 180bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 181bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static PendingIntent getUpdateIntent(Context context) { 182bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang Intent updateIntent = new Intent(ACTION_CALENDAR_APPWIDGET_UPDATE); 1830054262c76ccc4b20dc6596e161df8a99d0c81c7Mason Tang updateIntent.setComponent(new ComponentName(context, CalendarAppWidgetProvider.class)); 184bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang return PendingIntent.getBroadcast(context, 0 /* no requestCode */, 185bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang updateIntent, 0 /* no flags */); 186bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 18747d40324272ae39af0872bf5cbf27e1800478021Mason Tang 18847d40324272ae39af0872bf5cbf27e1800478021Mason Tang /** 1894143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * Build a {@link PendingIntent} to launch the Calendar app. This should be used 1904143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * in combination with {@link RemoteViews#setPendingIntentTemplate(int, PendingIntent)}. 19147d40324272ae39af0872bf5cbf27e1800478021Mason Tang */ 1924143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa static PendingIntent getLaunchPendingIntentTemplate(Context context) { 19347d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent launchIntent = new Intent(); 19447d40324272ae39af0872bf5cbf27e1800478021Mason Tang launchIntent.setAction(Intent.ACTION_VIEW); 19547d40324272ae39af0872bf5cbf27e1800478021Mason Tang launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 19647d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | 19747d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent.FLAG_ACTIVITY_CLEAR_TOP); 1984143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa return PendingIntent.getActivity(context, 0 /* no requestCode */, 1994143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa launchIntent, PendingIntent.FLAG_UPDATE_CURRENT); 2004143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa } 2010c715c837a7ecc2cfda3a62d952f8dc7e79a39f3Daisuke Miyakawa 2024143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa /** 2034143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * Build an {@link Intent} available as FillInIntent to launch the Calendar app. 2044143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * This should be used in combination with 2054143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 2064143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * If the go to time is 0, then calendar will be launched without a starting time. 2074143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * 2084143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * @param goToTime time that calendar should take the user to, or 0 to 2094143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * indicate no specific start time. 2104143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa */ 2114143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa static Intent getLaunchFillInIntent(long goToTime) { 2124143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa final Intent fillInIntent = new Intent(); 2134143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa String dataString = "content://com.android.calendar/time"; 21447d40324272ae39af0872bf5cbf27e1800478021Mason Tang if (goToTime != 0) { 2154143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa fillInIntent.putExtra(Utils.INTENT_KEY_DETAIL_VIEW, true); 21647d40324272ae39af0872bf5cbf27e1800478021Mason Tang dataString += "/" + goToTime; 21747d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 21847d40324272ae39af0872bf5cbf27e1800478021Mason Tang Uri data = Uri.parse(dataString); 219b79279d9311c798138ab745d1836ca52f235f99dDaisuke Miyakawa fillInIntent.setData(data); 2204143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa return fillInIntent; 22147d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 22247d40324272ae39af0872bf5cbf27e1800478021Mason Tang 22347d40324272ae39af0872bf5cbf27e1800478021Mason Tang private static PendingIntent getNewEventPendingIntent(Context context) { 22447d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent newEventIntent = new Intent(Intent.ACTION_EDIT); 22547d40324272ae39af0872bf5cbf27e1800478021Mason Tang newEventIntent.setType("vnd.android.cursor.item/event"); 22647d40324272ae39af0872bf5cbf27e1800478021Mason Tang return PendingIntent.getActivity(context, 0, newEventIntent, 22747d40324272ae39af0872bf5cbf27e1800478021Mason Tang PendingIntent.FLAG_UPDATE_CURRENT); 22847d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 229bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang} 230