1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.browser.widget; 18 19 import android.app.PendingIntent; 20 import android.appwidget.AppWidgetManager; 21 import android.appwidget.AppWidgetProvider; 22 import android.content.ComponentName; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.net.Uri; 26 import android.widget.RemoteViews; 27 28 import com.android.browser.BrowserActivity; 29 import com.android.browser.R; 30 31 /** 32 * Widget that shows a preview of the user's bookmarks. 33 */ 34 public class BookmarkThumbnailWidgetProvider extends AppWidgetProvider { 35 public static final String ACTION_BOOKMARK_APPWIDGET_UPDATE = 36 "com.android.browser.BOOKMARK_APPWIDGET_UPDATE"; 37 38 @Override onReceive(Context context, Intent intent)39 public void onReceive(Context context, Intent intent) { 40 // Handle bookmark-specific updates ourselves because they might be 41 // coming in without extras, which AppWidgetProvider then blocks. 42 final String action = intent.getAction(); 43 if (ACTION_BOOKMARK_APPWIDGET_UPDATE.equals(action)) { 44 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 45 performUpdate(context, appWidgetManager, 46 appWidgetManager.getAppWidgetIds(getComponentName(context))); 47 } else { 48 super.onReceive(context, intent); 49 } 50 } 51 52 @Override onUpdate(Context context, AppWidgetManager mngr, int[] ids)53 public void onUpdate(Context context, AppWidgetManager mngr, int[] ids) { 54 performUpdate(context, mngr, ids); 55 } 56 57 @Override onDeleted(Context context, int[] appWidgetIds)58 public void onDeleted(Context context, int[] appWidgetIds) { 59 super.onDeleted(context, appWidgetIds); 60 for (int widgetId : appWidgetIds) { 61 BookmarkThumbnailWidgetService.deleteWidgetState(context, widgetId); 62 } 63 removeOrphanedFiles(context); 64 } 65 66 @Override onDisabled(Context context)67 public void onDisabled(Context context) { 68 super.onDisabled(context); 69 removeOrphanedFiles(context); 70 } 71 72 /** 73 * Checks for any state files that may have not received onDeleted 74 */ removeOrphanedFiles(Context context)75 void removeOrphanedFiles(Context context) { 76 AppWidgetManager wm = AppWidgetManager.getInstance(context); 77 int[] ids = wm.getAppWidgetIds(getComponentName(context)); 78 BookmarkThumbnailWidgetService.removeOrphanedStates(context, ids); 79 } 80 performUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)81 private void performUpdate(Context context, 82 AppWidgetManager appWidgetManager, int[] appWidgetIds) { 83 PendingIntent launchBrowser = PendingIntent.getActivity(context, 0, 84 new Intent(BrowserActivity.ACTION_SHOW_BROWSER, null, context, 85 BrowserActivity.class), 86 PendingIntent.FLAG_UPDATE_CURRENT); 87 for (int appWidgetId : appWidgetIds) { 88 Intent updateIntent = new Intent(context, BookmarkThumbnailWidgetService.class); 89 updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 90 updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME))); 91 RemoteViews views = new RemoteViews(context.getPackageName(), 92 R.layout.bookmarkthumbnailwidget); 93 views.setOnClickPendingIntent(R.id.app_shortcut, launchBrowser); 94 views.setRemoteAdapter(R.id.bookmarks_list, updateIntent); 95 appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.bookmarks_list); 96 Intent ic = new Intent(context, BookmarkWidgetProxy.class); 97 views.setPendingIntentTemplate(R.id.bookmarks_list, 98 PendingIntent.getBroadcast(context, 0, ic, 99 PendingIntent.FLAG_UPDATE_CURRENT)); 100 appWidgetManager.updateAppWidget(appWidgetId, views); 101 } 102 } 103 104 /** 105 * Build {@link ComponentName} describing this specific 106 * {@link AppWidgetProvider} 107 */ getComponentName(Context context)108 static ComponentName getComponentName(Context context) { 109 return new ComponentName(context, BookmarkThumbnailWidgetProvider.class); 110 } 111 refreshWidgets(Context context)112 public static void refreshWidgets(Context context) { 113 context.sendBroadcast(new Intent( 114 BookmarkThumbnailWidgetProvider.ACTION_BOOKMARK_APPWIDGET_UPDATE, 115 null, context, BookmarkThumbnailWidgetProvider.class)); 116 } 117 118 } 119