1df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck/*
2df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * Copyright (C) 2010 The Android Open Source Project
3df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck *
4df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * you may not use this file except in compliance with the License.
6df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * You may obtain a copy of the License at
7df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck *
8df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck *
10df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * Unless required by applicable law or agreed to in writing, software
11df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * See the License for the specific language governing permissions and
14df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * limitations under the License.
15df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck */
16df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
17df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckpackage com.android.browser.widget;
18df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
19df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.app.PendingIntent;
20df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.appwidget.AppWidgetManager;
21df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.appwidget.AppWidgetProvider;
22df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.content.ComponentName;
23df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.content.Context;
24df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.content.Intent;
25df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.net.Uri;
26df63d2ff2e9881706eef78796d05078d0ffb7f60John Reckimport android.widget.RemoteViews;
27df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
289b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport com.android.browser.BrowserActivity;
299b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reckimport com.android.browser.R;
309b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck
31df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck/**
32df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck * Widget that shows a preview of the user's bookmarks.
33df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck */
341537b774a62042a8b86100e1e6b0988bed70c385John Reckpublic class BookmarkThumbnailWidgetProvider extends AppWidgetProvider {
3599c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    public static final String ACTION_BOOKMARK_APPWIDGET_UPDATE =
36df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        "com.android.browser.BOOKMARK_APPWIDGET_UPDATE";
37df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
38df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    @Override
39df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    public void onReceive(Context context, Intent intent) {
40df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        // Handle bookmark-specific updates ourselves because they might be
41df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        // coming in without extras, which AppWidgetProvider then blocks.
42df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        final String action = intent.getAction();
43df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        if (ACTION_BOOKMARK_APPWIDGET_UPDATE.equals(action)) {
44df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
45df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            performUpdate(context, appWidgetManager,
46df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck                    appWidgetManager.getAppWidgetIds(getComponentName(context)));
47df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        } else {
48df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            super.onReceive(context, intent);
49df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        }
50df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
51df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
52df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    @Override
53df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    public void onUpdate(Context context, AppWidgetManager mngr, int[] ids) {
54df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        performUpdate(context, mngr, ids);
55df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
56df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
57df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    @Override
5899c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    public void onDeleted(Context context, int[] appWidgetIds) {
5999c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        super.onDeleted(context, appWidgetIds);
6099c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        for (int widgetId : appWidgetIds) {
6199c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck            BookmarkThumbnailWidgetService.deleteWidgetState(context, widgetId);
6299c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        }
6399c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        removeOrphanedFiles(context);
64df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
65df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
66df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    @Override
67df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    public void onDisabled(Context context) {
6899c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        super.onDisabled(context);
6999c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        removeOrphanedFiles(context);
70df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
71df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
7299c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    /**
7399c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck     *  Checks for any state files that may have not received onDeleted
7499c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck     */
7599c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    void removeOrphanedFiles(Context context) {
7699c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        AppWidgetManager wm = AppWidgetManager.getInstance(context);
7799c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        int[] ids = wm.getAppWidgetIds(getComponentName(context));
7899c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck        BookmarkThumbnailWidgetService.removeOrphanedStates(context, ids);
79df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
80df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
81df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    private void performUpdate(Context context,
82df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            AppWidgetManager appWidgetManager, int[] appWidgetIds) {
83d9844abe83b9eb6340ce646357c3e91ac794eb46Joe Onorato        PendingIntent launchBrowser = PendingIntent.getActivity(context, 0,
84d9844abe83b9eb6340ce646357c3e91ac794eb46Joe Onorato                new Intent(BrowserActivity.ACTION_SHOW_BROWSER, null, context,
85d9844abe83b9eb6340ce646357c3e91ac794eb46Joe Onorato                    BrowserActivity.class),
8621e24aba311914670f75ee05fda9430c89a0ccbeJohn Reck                PendingIntent.FLAG_UPDATE_CURRENT);
87df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        for (int appWidgetId : appWidgetIds) {
881537b774a62042a8b86100e1e6b0988bed70c385John Reck            Intent updateIntent = new Intent(context, BookmarkThumbnailWidgetService.class);
89df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
90df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
91df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            RemoteViews views = new RemoteViews(context.getPackageName(),
921537b774a62042a8b86100e1e6b0988bed70c385John Reck                    R.layout.bookmarkthumbnailwidget);
93d9844abe83b9eb6340ce646357c3e91ac794eb46Joe Onorato            views.setOnClickPendingIntent(R.id.app_shortcut, launchBrowser);
949b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck            views.setRemoteAdapter(R.id.bookmarks_list, updateIntent);
95df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.bookmarks_list);
9699c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck            Intent ic = new Intent(context, BookmarkWidgetProxy.class);
97df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            views.setPendingIntentTemplate(R.id.bookmarks_list,
9899c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck                    PendingIntent.getBroadcast(context, 0, ic,
99df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck                    PendingIntent.FLAG_UPDATE_CURRENT));
100df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck            appWidgetManager.updateAppWidget(appWidgetId, views);
101df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck        }
102df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
103df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck
104df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    /**
105df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck     * Build {@link ComponentName} describing this specific
106df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck     * {@link AppWidgetProvider}
107df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck     */
108df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    static ComponentName getComponentName(Context context) {
1091537b774a62042a8b86100e1e6b0988bed70c385John Reck        return new ComponentName(context, BookmarkThumbnailWidgetProvider.class);
110df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck    }
11199c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck
11299c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    public static void refreshWidgets(Context context) {
1139b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck        context.sendBroadcast(new Intent(
1149b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck                BookmarkThumbnailWidgetProvider.ACTION_BOOKMARK_APPWIDGET_UPDATE,
1159b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck                null, context, BookmarkThumbnailWidgetProvider.class));
11699c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck    }
11799c6d333106cc0fb3c028b5f8d1ff1f5cf726ca2John Reck
118df63d2ff2e9881706eef78796d05078d0ffb7f60John Reck}
119