blob: 84d3835a086b21e8317e70552c18cca16f229b26 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
Kenny Root15a4d2f2010-03-11 18:20:12 -08002 * Copyright (C) 2009 The Android Open Source Project
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003 *
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
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070017package android.appwidget;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Adam Cohend2e20de2011-02-25 12:03:37 -080019import java.util.ArrayList;
20import java.util.HashMap;
21
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022import android.content.Context;
Adam Cohen3ff2d862012-09-26 14:07:57 -070023import android.os.Binder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080024import android.os.Handler;
25import android.os.IBinder;
26import android.os.Looper;
27import android.os.Message;
Jim Millerf229e4d2012-09-12 20:32:50 -070028import android.os.Process;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029import android.os.RemoteException;
30import android.os.ServiceManager;
Jim Millerf229e4d2012-09-12 20:32:50 -070031import android.os.UserHandle;
Adam Cohend2e20de2011-02-25 12:03:37 -080032import android.util.DisplayMetrics;
33import android.util.TypedValue;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034import android.widget.RemoteViews;
Jim Millere667a7a2012-08-09 19:22:32 -070035import android.widget.RemoteViews.OnClickHandler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070037import com.android.internal.appwidget.IAppWidgetHost;
38import com.android.internal.appwidget.IAppWidgetService;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039
40/**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070041 * AppWidgetHost provides the interaction with the AppWidget service for apps,
42 * like the home screen, that want to embed AppWidgets in their UI.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070044public class AppWidgetHost {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045
46 static final int HANDLE_UPDATE = 1;
47 static final int HANDLE_PROVIDER_CHANGED = 2;
Winson Chung7fbd2842012-06-13 10:35:51 -070048 static final int HANDLE_PROVIDERS_CHANGED = 3;
49 static final int HANDLE_VIEW_DATA_CHANGED = 4;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080050
Romain Guya5475592009-07-01 17:20:08 -070051 final static Object sServiceLock = new Object();
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070052 static IAppWidgetService sService;
Adam Cohend2e20de2011-02-25 12:03:37 -080053 private DisplayMetrics mDisplayMetrics;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054
55 Context mContext;
56 String mPackageName;
Jim Millera75a8832013-02-07 16:53:32 -080057 Handler mHandler;
58 int mHostId;
59 Callbacks mCallbacks = new Callbacks();
60 final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>();
61 private OnClickHandler mOnClickHandler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080062
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070063 class Callbacks extends IAppWidgetHost.Stub {
Jim Millera75a8832013-02-07 16:53:32 -080064 public void updateAppWidget(int appWidgetId, RemoteViews views, int userId) {
Adam Cohen3ff2d862012-09-26 14:07:57 -070065 if (isLocalBinder() && views != null) {
66 views = views.clone();
Jim Millera75a8832013-02-07 16:53:32 -080067 views.setUser(new UserHandle(userId));
Adam Cohen3ff2d862012-09-26 14:07:57 -070068 }
Jim Millera75a8832013-02-07 16:53:32 -080069 Message msg = mHandler.obtainMessage(HANDLE_UPDATE, appWidgetId, userId, views);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070 msg.sendToTarget();
71 }
72
Jim Millera75a8832013-02-07 16:53:32 -080073 public void providerChanged(int appWidgetId, AppWidgetProviderInfo info, int userId) {
Adam Cohen3ff2d862012-09-26 14:07:57 -070074 if (isLocalBinder() && info != null) {
75 info = info.clone();
76 }
Jim Millera75a8832013-02-07 16:53:32 -080077 Message msg = mHandler.obtainMessage(HANDLE_PROVIDER_CHANGED,
78 appWidgetId, userId, info);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080079 msg.sendToTarget();
80 }
Winson Chung499cb9f2010-07-16 11:18:17 -070081
Jim Millera75a8832013-02-07 16:53:32 -080082 public void providersChanged(int userId) {
83 Message msg = mHandler.obtainMessage(HANDLE_PROVIDERS_CHANGED, userId, 0);
Winson Chung7fbd2842012-06-13 10:35:51 -070084 msg.sendToTarget();
85 }
86
Jim Millera75a8832013-02-07 16:53:32 -080087 public void viewDataChanged(int appWidgetId, int viewId, int userId) {
88 Message msg = mHandler.obtainMessage(HANDLE_VIEW_DATA_CHANGED,
89 appWidgetId, viewId, userId);
Winson Chung499cb9f2010-07-16 11:18:17 -070090 msg.sendToTarget();
91 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 }
93
94 class UpdateHandler extends Handler {
95 public UpdateHandler(Looper looper) {
96 super(looper);
97 }
Jim Millere667a7a2012-08-09 19:22:32 -070098
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 public void handleMessage(Message msg) {
100 switch (msg.what) {
101 case HANDLE_UPDATE: {
Jim Millera75a8832013-02-07 16:53:32 -0800102 updateAppWidgetView(msg.arg1, (RemoteViews)msg.obj, msg.arg2);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 break;
104 }
105 case HANDLE_PROVIDER_CHANGED: {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700106 onProviderChanged(msg.arg1, (AppWidgetProviderInfo)msg.obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800107 break;
108 }
Winson Chung7fbd2842012-06-13 10:35:51 -0700109 case HANDLE_PROVIDERS_CHANGED: {
Winson Chungeeb4ff42013-06-04 14:25:28 -0700110 onProvidersChanged();
Winson Chung7fbd2842012-06-13 10:35:51 -0700111 break;
112 }
Winson Chung499cb9f2010-07-16 11:18:17 -0700113 case HANDLE_VIEW_DATA_CHANGED: {
Jim Millera75a8832013-02-07 16:53:32 -0800114 viewDataChanged(msg.arg1, msg.arg2, (Integer) msg.obj);
Winson Chung499cb9f2010-07-16 11:18:17 -0700115 break;
116 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800117 }
118 }
119 }
Jim Millere667a7a2012-08-09 19:22:32 -0700120
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700121 public AppWidgetHost(Context context, int hostId) {
Michael Jurkae6d55452012-09-17 17:30:16 -0700122 this(context, hostId, null, context.getMainLooper());
Jim Millere667a7a2012-08-09 19:22:32 -0700123 }
124
125 /**
126 * @hide
127 */
Jim Millerf229e4d2012-09-12 20:32:50 -0700128 public AppWidgetHost(Context context, int hostId, OnClickHandler handler, Looper looper) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800129 mContext = context;
130 mHostId = hostId;
Jim Millere667a7a2012-08-09 19:22:32 -0700131 mOnClickHandler = handler;
Jim Millerf229e4d2012-09-12 20:32:50 -0700132 mHandler = new UpdateHandler(looper);
Adam Cohend2e20de2011-02-25 12:03:37 -0800133 mDisplayMetrics = context.getResources().getDisplayMetrics();
Jim Millerf229e4d2012-09-12 20:32:50 -0700134 bindService();
135 }
136
Amith Yamasani94022e82012-12-04 11:05:39 -0800137
Jim Millerf229e4d2012-09-12 20:32:50 -0700138 private static void bindService() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800139 synchronized (sServiceLock) {
140 if (sService == null) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700141 IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
142 sService = IAppWidgetService.Stub.asInterface(b);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143 }
144 }
145 }
146
147 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700148 * Start receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149 * becomes visible, i.e. from onStart() in your Activity.
150 */
151 public void startListening() {
Romain Guya5475592009-07-01 17:20:08 -0700152 int[] updatedIds;
153 ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>();
Jim Millere667a7a2012-08-09 19:22:32 -0700154
Jim Millera75a8832013-02-07 16:53:32 -0800155 final int userId = mContext.getUserId();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800156 try {
157 if (mPackageName == null) {
158 mPackageName = mContext.getPackageName();
159 }
Jim Millera75a8832013-02-07 16:53:32 -0800160 updatedIds = sService.startListening(
Amith Yamasanic566b432012-11-30 15:26:21 -0800161 mCallbacks, mPackageName, mHostId, updatedViews, userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 }
163 catch (RemoteException e) {
164 throw new RuntimeException("system server dead?", e);
165 }
166
167 final int N = updatedIds.length;
168 for (int i=0; i<N; i++) {
Amith Yamasani94022e82012-12-04 11:05:39 -0800169 if (updatedViews.get(i) != null) {
170 updatedViews.get(i).setUser(new UserHandle(userId));
171 }
Jim Millera75a8832013-02-07 16:53:32 -0800172 updateAppWidgetView(updatedIds[i], updatedViews.get(i), userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800173 }
174 }
175
176 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700177 * Stop receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity is
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178 * no longer visible, i.e. from onStop() in your Activity.
179 */
180 public void stopListening() {
181 try {
Jim Millera75a8832013-02-07 16:53:32 -0800182 sService.stopListening(mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800183 }
184 catch (RemoteException e) {
185 throw new RuntimeException("system server dead?", e);
186 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800187
Jim Millera75a8832013-02-07 16:53:32 -0800188 // This is here because keyguard needs it since it'll be switching users after this call.
189 // If it turns out other apps need to call this often, we should re-think how this works.
Amith Yamasanic566b432012-11-30 15:26:21 -0800190 clearViews();
191 }
192
193 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700194 * Get a appWidgetId for a host in the calling process.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 *
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700196 * @return a appWidgetId
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700198 public int allocateAppWidgetId() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800199 try {
200 if (mPackageName == null) {
201 mPackageName = mContext.getPackageName();
202 }
Jim Millera75a8832013-02-07 16:53:32 -0800203 return sService.allocateAppWidgetId(mPackageName, mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204 }
205 catch (RemoteException e) {
206 throw new RuntimeException("system server dead?", e);
207 }
208 }
209
210 /**
Jim Miller21ace3f2013-03-05 15:07:33 -0800211 * Get a appWidgetId for a host in the given package.
Jim Millerf229e4d2012-09-12 20:32:50 -0700212 *
213 * @return a appWidgetId
214 * @hide
215 */
Jim Miller21ace3f2013-03-05 15:07:33 -0800216 public static int allocateAppWidgetIdForPackage(int hostId, int userId, String packageName) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700217 checkCallerIsSystem();
218 try {
219 if (sService == null) {
220 bindService();
221 }
Jim Millera75a8832013-02-07 16:53:32 -0800222 return sService.allocateAppWidgetId(packageName, hostId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700223 } catch (RemoteException e) {
224 throw new RuntimeException("system server dead?", e);
225 }
226 }
227
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800228 /**
229 * Gets a list of all the appWidgetIds that are bound to the current host
230 *
231 * @hide
232 */
233 public int[] getAppWidgetIds() {
234 try {
235 if (sService == null) {
236 bindService();
237 }
Jim Millera75a8832013-02-07 16:53:32 -0800238 return sService.getAppWidgetIdsForHost(mHostId, mContext.getUserId());
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800239 } catch (RemoteException e) {
240 throw new RuntimeException("system server dead?", e);
241 }
242 }
243
Jim Millerf229e4d2012-09-12 20:32:50 -0700244 private static void checkCallerIsSystem() {
245 int uid = Process.myUid();
246 if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
247 return;
248 }
249 throw new SecurityException("Disallowed call for uid " + uid);
250 }
251
Adam Cohen3ff2d862012-09-26 14:07:57 -0700252 private boolean isLocalBinder() {
253 return Process.myPid() == Binder.getCallingPid();
254 }
255
Jim Millerf229e4d2012-09-12 20:32:50 -0700256 /**
Jim Millere667a7a2012-08-09 19:22:32 -0700257 * Stop listening to changes for this AppWidget.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800258 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700259 public void deleteAppWidgetId(int appWidgetId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800260 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700261 mViews.remove(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800262 try {
Jim Millera75a8832013-02-07 16:53:32 -0800263 sService.deleteAppWidgetId(appWidgetId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800264 }
265 catch (RemoteException e) {
266 throw new RuntimeException("system server dead?", e);
267 }
268 }
269 }
270
271 /**
Jim Millerf229e4d2012-09-12 20:32:50 -0700272 * Stop listening to changes for this AppWidget.
273 * @hide
274 */
Jim Millera75a8832013-02-07 16:53:32 -0800275 public static void deleteAppWidgetIdForSystem(int appWidgetId, int userId) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700276 checkCallerIsSystem();
277 try {
278 if (sService == null) {
279 bindService();
280 }
Jim Millera75a8832013-02-07 16:53:32 -0800281 sService.deleteAppWidgetId(appWidgetId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700282 } catch (RemoteException e) {
283 throw new RuntimeException("system server dead?", e);
284 }
285 }
286
287 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700288 * Remove all records about this host from the AppWidget manager.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 * <ul>
290 * <li>Call this when initializing your database, as it might be because of a data wipe.</li>
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700291 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800292 * host. Any future calls about this host will cause the records to be re-allocated.</li>
293 * </ul>
294 */
295 public void deleteHost() {
296 try {
Jim Millera75a8832013-02-07 16:53:32 -0800297 sService.deleteHost(mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800298 }
299 catch (RemoteException e) {
300 throw new RuntimeException("system server dead?", e);
301 }
302 }
303
304 /**
305 * Remove all records about all hosts for your package.
306 * <ul>
307 * <li>Call this when initializing your database, as it might be because of a data wipe.</li>
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700308 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800309 * host. Any future calls about this host will cause the records to be re-allocated.</li>
310 * </ul>
311 */
312 public static void deleteAllHosts() {
Jim Millera75a8832013-02-07 16:53:32 -0800313 deleteAllHosts(UserHandle.myUserId());
314 }
315
316 /**
317 * Private method containing a userId
318 * @hide
319 */
320 public static void deleteAllHosts(int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800321 try {
Jim Millera75a8832013-02-07 16:53:32 -0800322 sService.deleteAllHosts(userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800323 }
324 catch (RemoteException e) {
325 throw new RuntimeException("system server dead?", e);
326 }
327 }
328
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800329 /**
330 * Create the AppWidgetHostView for the given widget.
331 * The AppWidgetHost retains a pointer to the newly-created View.
332 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700333 public final AppWidgetHostView createView(Context context, int appWidgetId,
334 AppWidgetProviderInfo appWidget) {
Jim Miller9831d182013-03-21 17:10:18 -0700335 final int userId = mContext.getUserId();
336 AppWidgetHostView view = onCreateView(mContext, appWidgetId, appWidget);
Jim Millera75a8832013-02-07 16:53:32 -0800337 view.setUserId(userId);
Jim Millere667a7a2012-08-09 19:22:32 -0700338 view.setOnClickHandler(mOnClickHandler);
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700339 view.setAppWidget(appWidgetId, appWidget);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800340 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700341 mViews.put(appWidgetId, view);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342 }
Romain Guya5475592009-07-01 17:20:08 -0700343 RemoteViews views;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800344 try {
Jim Millera75a8832013-02-07 16:53:32 -0800345 views = sService.getAppWidgetViews(appWidgetId, userId);
Amith Yamasani94022e82012-12-04 11:05:39 -0800346 if (views != null) {
Jim Millera75a8832013-02-07 16:53:32 -0800347 views.setUser(new UserHandle(mContext.getUserId()));
Amith Yamasani94022e82012-12-04 11:05:39 -0800348 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800349 } catch (RemoteException e) {
350 throw new RuntimeException("system server dead?", e);
351 }
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700352 view.updateAppWidget(views);
Jim Millere667a7a2012-08-09 19:22:32 -0700353
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800354 return view;
355 }
356
357 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700358 * Called to create the AppWidgetHostView. Override to return a custom subclass if you
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800359 * need it. {@more}
360 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700361 protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
362 AppWidgetProviderInfo appWidget) {
Jim Millere667a7a2012-08-09 19:22:32 -0700363 return new AppWidgetHostView(context, mOnClickHandler);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364 }
Adam Cohend2e20de2011-02-25 12:03:37 -0800365
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800366 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700367 * Called when the AppWidget provider for a AppWidget has been upgraded to a new apk.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800368 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700369 protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidget) {
Joe Onoratof140be62010-05-04 11:49:12 -0700370 AppWidgetHostView v;
Adam Cohend2e20de2011-02-25 12:03:37 -0800371
372 // Convert complex to dp -- we are getting the AppWidgetProviderInfo from the
Jim Millere667a7a2012-08-09 19:22:32 -0700373 // AppWidgetService, which doesn't have our context, hence we need to do the
Adam Cohend2e20de2011-02-25 12:03:37 -0800374 // conversion here.
375 appWidget.minWidth =
376 TypedValue.complexToDimensionPixelSize(appWidget.minWidth, mDisplayMetrics);
377 appWidget.minHeight =
378 TypedValue.complexToDimensionPixelSize(appWidget.minHeight, mDisplayMetrics);
Adam Cohen1bfaf562011-07-19 18:05:33 -0700379 appWidget.minResizeWidth =
380 TypedValue.complexToDimensionPixelSize(appWidget.minResizeWidth, mDisplayMetrics);
381 appWidget.minResizeHeight =
382 TypedValue.complexToDimensionPixelSize(appWidget.minResizeHeight, mDisplayMetrics);
Adam Cohend2e20de2011-02-25 12:03:37 -0800383
Joe Onoratof140be62010-05-04 11:49:12 -0700384 synchronized (mViews) {
385 v = mViews.get(appWidgetId);
386 }
387 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700388 v.resetAppWidget(appWidget);
Joe Onoratof140be62010-05-04 11:49:12 -0700389 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390 }
391
Winson Chung7fbd2842012-06-13 10:35:51 -0700392 /**
393 * Called when the set of available widgets changes (ie. widget containing packages
394 * are added, updated or removed, or widget components are enabled or disabled.)
395 */
396 protected void onProvidersChanged() {
Jim Millera75a8832013-02-07 16:53:32 -0800397 // Does nothing
398 }
399
400 void updateAppWidgetView(int appWidgetId, RemoteViews views, int userId) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700401 AppWidgetHostView v;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800402 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700403 v = mViews.get(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 }
405 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700406 v.updateAppWidget(views);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407 }
408 }
Winson Chung499cb9f2010-07-16 11:18:17 -0700409
Jim Millera75a8832013-02-07 16:53:32 -0800410 void viewDataChanged(int appWidgetId, int viewId, int userId) {
Winson Chung499cb9f2010-07-16 11:18:17 -0700411 AppWidgetHostView v;
412 synchronized (mViews) {
413 v = mViews.get(appWidgetId);
414 }
415 if (v != null) {
Winson Chung6394c0e2010-08-16 10:14:56 -0700416 v.viewDataChanged(viewId);
Winson Chung499cb9f2010-07-16 11:18:17 -0700417 }
418 }
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800419
420 /**
421 * Clear the list of Views that have been created by this AppWidgetHost.
422 */
423 protected void clearViews() {
424 mViews.clear();
425 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800426}
427
428