AppWidgetHost.java revision 1bfaf561b7c09388311f1834f17e057739cf587a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpackage android.appwidget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohenimport java.util.ArrayList;
20d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohenimport java.util.HashMap;
21d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
29d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohenimport android.util.DisplayMetrics;
30d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohenimport android.util.TypedValue;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport com.android.internal.appwidget.IAppWidgetHost;
34c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport com.android.internal.appwidget.IAppWidgetService;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
37c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * AppWidgetHost provides the interaction with the AppWidget service for apps,
38c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * like the home screen, that want to embed AppWidgets in their UI.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
40c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpublic class AppWidgetHost {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int HANDLE_UPDATE = 1;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int HANDLE_PROVIDER_CHANGED = 2;
44499cb9f516062b654952d282f211bee44c31a3c2Winson Chung    static final int HANDLE_VIEW_DATA_CHANGED = 3;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy    final static Object sServiceLock = new Object();
47c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    static IAppWidgetService sService;
48d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen    private DisplayMetrics mDisplayMetrics;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String mPackageName;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    class Callbacks extends IAppWidgetHost.Stub {
54c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public void updateAppWidget(int appWidgetId, RemoteViews views) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message msg = mHandler.obtainMessage(HANDLE_UPDATE);
56c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            msg.arg1 = appWidgetId;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.obj = views;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.sendToTarget();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        public void providerChanged(int appWidgetId, AppWidgetProviderInfo info) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message msg = mHandler.obtainMessage(HANDLE_PROVIDER_CHANGED);
63c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            msg.arg1 = appWidgetId;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.obj = info;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.sendToTarget();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67499cb9f516062b654952d282f211bee44c31a3c2Winson Chung
686394c0e52cf641d93f678fd052499aa952e3595dWinson Chung        public void viewDataChanged(int appWidgetId, int viewId) {
69499cb9f516062b654952d282f211bee44c31a3c2Winson Chung            Message msg = mHandler.obtainMessage(HANDLE_VIEW_DATA_CHANGED);
70499cb9f516062b654952d282f211bee44c31a3c2Winson Chung            msg.arg1 = appWidgetId;
71499cb9f516062b654952d282f211bee44c31a3c2Winson Chung            msg.arg2 = viewId;
72499cb9f516062b654952d282f211bee44c31a3c2Winson Chung            msg.sendToTarget();
73499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class UpdateHandler extends Handler {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public UpdateHandler(Looper looper) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(looper);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HANDLE_UPDATE: {
84c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    updateAppWidgetView(msg.arg1, (RemoteViews)msg.obj);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HANDLE_PROVIDER_CHANGED: {
88c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    onProviderChanged(msg.arg1, (AppWidgetProviderInfo)msg.obj);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
91499cb9f516062b654952d282f211bee44c31a3c2Winson Chung                case HANDLE_VIEW_DATA_CHANGED: {
926394c0e52cf641d93f678fd052499aa952e3595dWinson Chung                    viewDataChanged(msg.arg1, msg.arg2);
93499cb9f516062b654952d282f211bee44c31a3c2Winson Chung                    break;
94499cb9f516062b654952d282f211bee44c31a3c2Winson Chung                }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Handler mHandler;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHostId;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Callbacks mCallbacks = new Callbacks();
103a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy    final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
105c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public AppWidgetHost(Context context, int hostId) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHostId = hostId;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = new UpdateHandler(context.getMainLooper());
109d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        mDisplayMetrics = context.getResources().getDisplayMetrics();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sServiceLock) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sService == null) {
112c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
113c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                sService = IAppWidgetService.Stub.asInterface(b);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
119c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Start receiving onAppWidgetChanged calls for your AppWidgets.  Call this when your activity
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * becomes visible, i.e. from onStart() in your Activity.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startListening() {
123a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy        int[] updatedIds;
124a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy        ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageName == null) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageName = mContext.getPackageName();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updatedIds = sService.startListening(mCallbacks, mPackageName, mHostId, updatedViews);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RemoteException e) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = updatedIds.length;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
138c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            updateAppWidgetView(updatedIds[i], updatedViews.get(i));
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
143c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Stop receiving onAppWidgetChanged calls for your AppWidgets.  Call this when your activity is
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no longer visible, i.e. from onStop() in your Activity.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopListening() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sService.stopListening(mHostId);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RemoteException e) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
156c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Get a appWidgetId for a host in the calling process.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
158c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @return a appWidgetId
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
160c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public int allocateAppWidgetId() {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageName == null) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageName = mContext.getPackageName();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
165c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            return sService.allocateAppWidgetId(mPackageName, mHostId);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RemoteException e) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
173c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Stop listening to changes for this AppWidget.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
175c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public void deleteAppWidgetId(int appWidgetId) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mViews) {
177c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mViews.remove(appWidgetId);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
179c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                sService.deleteAppWidgetId(appWidgetId);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            catch (RemoteException e) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("system server dead?", e);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
188c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Remove all records about this host from the AppWidget manager.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   <li>Call this when initializing your database, as it might be because of a data wipe.</li>
191c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     *   <li>Call this to have the AppWidget manager release all resources associated with your
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   host.  Any future calls about this host will cause the records to be re-allocated.</li>
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void deleteHost() {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sService.deleteHost(mHostId);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RemoteException e) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove all records about all hosts for your package.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   <li>Call this when initializing your database, as it might be because of a data wipe.</li>
208c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     *   <li>Call this to have the AppWidget manager release all resources associated with your
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   host.  Any future calls about this host will cause the records to be re-allocated.</li>
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void deleteAllHosts() {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sService.deleteAllHosts();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RemoteException e) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
221ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy    /**
222ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy     * Create the AppWidgetHostView for the given widget.
223ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy     * The AppWidgetHost retains a pointer to the newly-created View.
224ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy     */
225c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    public final AppWidgetHostView createView(Context context, int appWidgetId,
226c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget) {
227c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget);
228c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        view.setAppWidget(appWidgetId, appWidget);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mViews) {
230c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mViews.put(appWidgetId, view);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
232a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy        RemoteViews views;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
234c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            views = sService.getAppWidgetViews(appWidgetId);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("system server dead?", e);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
238c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        view.updateAppWidget(views);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return view;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
243c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Called to create the AppWidgetHostView.  Override to return a custom subclass if you
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * need it.  {@more}
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
246c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
247c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            AppWidgetProviderInfo appWidget) {
248c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return new AppWidgetHostView(context);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
250d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
252c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * Called when the AppWidget provider for a AppWidget has been upgraded to a new apk.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
254c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidget) {
255f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato        AppWidgetHostView v;
256d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen
257d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        // Convert complex to dp -- we are getting the AppWidgetProviderInfo from the
258d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        // AppWidgetService, which doesn't have our context, hence we need to do the
259d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        // conversion here.
260d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        appWidget.minWidth =
261d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen            TypedValue.complexToDimensionPixelSize(appWidget.minWidth, mDisplayMetrics);
262d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen        appWidget.minHeight =
263d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen            TypedValue.complexToDimensionPixelSize(appWidget.minHeight, mDisplayMetrics);
2641bfaf561b7c09388311f1834f17e057739cf587aAdam Cohen        appWidget.minResizeWidth =
2651bfaf561b7c09388311f1834f17e057739cf587aAdam Cohen            TypedValue.complexToDimensionPixelSize(appWidget.minResizeWidth, mDisplayMetrics);
2661bfaf561b7c09388311f1834f17e057739cf587aAdam Cohen        appWidget.minResizeHeight =
2671bfaf561b7c09388311f1834f17e057739cf587aAdam Cohen            TypedValue.complexToDimensionPixelSize(appWidget.minResizeHeight, mDisplayMetrics);
268d2e20de64b6de8b6391c63e2f5b02ce7698bf4bfAdam Cohen
269f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato        synchronized (mViews) {
270f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato            v = mViews.get(appWidgetId);
271f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato        }
272f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato        if (v != null) {
273c27bb559805ae5cd06f7ecf575959c60c51a22aaJoe Onorato            v.resetAppWidget(appWidget);
274f140be6c3c21dd0f6d2214929e89d60de31d2c04Joe Onorato        }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
277c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    void updateAppWidgetView(int appWidgetId, RemoteViews views) {
278c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        AppWidgetHostView v;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mViews) {
280c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            v = mViews.get(appWidgetId);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null) {
283c27bb559805ae5cd06f7ecf575959c60c51a22aaJoe Onorato            v.updateAppWidget(views);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
286499cb9f516062b654952d282f211bee44c31a3c2Winson Chung
2876394c0e52cf641d93f678fd052499aa952e3595dWinson Chung    void viewDataChanged(int appWidgetId, int viewId) {
288499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        AppWidgetHostView v;
289499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        synchronized (mViews) {
290499cb9f516062b654952d282f211bee44c31a3c2Winson Chung            v = mViews.get(appWidgetId);
291499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        }
292499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        if (v != null) {
2936394c0e52cf641d93f678fd052499aa952e3595dWinson Chung            v.viewDataChanged(viewId);
294499cb9f516062b654952d282f211bee44c31a3c2Winson Chung        }
295499cb9f516062b654952d282f211bee44c31a3c2Winson Chung    }
296ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy
297ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy    /**
298ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy     * Clear the list of Views that have been created by this AppWidgetHost.
299ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy     */
300ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy    protected void clearViews() {
301ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy        mViews.clear();
302ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy    }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
306