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