blob: f104d71cd2d2cd91f6b0e9b7ed5e6d16c3d2c308 [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
Adam Cohen60264732012-09-18 13:39:42 -070022import android.app.ActivityThread;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023import android.content.Context;
Adam Cohen3ff2d862012-09-26 14:07:57 -070024import android.os.Binder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025import android.os.Handler;
26import android.os.IBinder;
27import android.os.Looper;
28import android.os.Message;
Jim Millerf229e4d2012-09-12 20:32:50 -070029import android.os.Process;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030import android.os.RemoteException;
31import android.os.ServiceManager;
Jim Millerf229e4d2012-09-12 20:32:50 -070032import android.os.UserHandle;
Adam Cohend2e20de2011-02-25 12:03:37 -080033import android.util.DisplayMetrics;
Jim Millera75a8832013-02-07 16:53:32 -080034import android.util.Log;
Adam Cohend2e20de2011-02-25 12:03:37 -080035import android.util.TypedValue;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036import android.widget.RemoteViews;
Jim Millere667a7a2012-08-09 19:22:32 -070037import android.widget.RemoteViews.OnClickHandler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080038
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070039import com.android.internal.appwidget.IAppWidgetHost;
40import com.android.internal.appwidget.IAppWidgetService;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041
42/**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070043 * AppWidgetHost provides the interaction with the AppWidget service for apps,
44 * like the home screen, that want to embed AppWidgets in their UI.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070046public class AppWidgetHost {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047
48 static final int HANDLE_UPDATE = 1;
49 static final int HANDLE_PROVIDER_CHANGED = 2;
Winson Chung7fbd2842012-06-13 10:35:51 -070050 static final int HANDLE_PROVIDERS_CHANGED = 3;
51 static final int HANDLE_VIEW_DATA_CHANGED = 4;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052
Romain Guya5475592009-07-01 17:20:08 -070053 final static Object sServiceLock = new Object();
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070054 static IAppWidgetService sService;
Adam Cohend2e20de2011-02-25 12:03:37 -080055 private DisplayMetrics mDisplayMetrics;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056
57 Context mContext;
58 String mPackageName;
Jim Millera75a8832013-02-07 16:53:32 -080059 Handler mHandler;
60 int mHostId;
61 Callbacks mCallbacks = new Callbacks();
62 final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>();
63 private OnClickHandler mOnClickHandler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -070065 class Callbacks extends IAppWidgetHost.Stub {
Jim Millera75a8832013-02-07 16:53:32 -080066 public void updateAppWidget(int appWidgetId, RemoteViews views, int userId) {
Adam Cohen3ff2d862012-09-26 14:07:57 -070067 if (isLocalBinder() && views != null) {
68 views = views.clone();
Jim Millera75a8832013-02-07 16:53:32 -080069 views.setUser(new UserHandle(userId));
Adam Cohen3ff2d862012-09-26 14:07:57 -070070 }
Jim Millera75a8832013-02-07 16:53:32 -080071 Message msg = mHandler.obtainMessage(HANDLE_UPDATE, appWidgetId, userId, views);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080072 msg.sendToTarget();
73 }
74
Jim Millera75a8832013-02-07 16:53:32 -080075 public void providerChanged(int appWidgetId, AppWidgetProviderInfo info, int userId) {
Adam Cohen3ff2d862012-09-26 14:07:57 -070076 if (isLocalBinder() && info != null) {
77 info = info.clone();
78 }
Jim Millera75a8832013-02-07 16:53:32 -080079 Message msg = mHandler.obtainMessage(HANDLE_PROVIDER_CHANGED,
80 appWidgetId, userId, info);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081 msg.sendToTarget();
82 }
Winson Chung499cb9f2010-07-16 11:18:17 -070083
Jim Millera75a8832013-02-07 16:53:32 -080084 public void providersChanged(int userId) {
85 Message msg = mHandler.obtainMessage(HANDLE_PROVIDERS_CHANGED, userId, 0);
Winson Chung7fbd2842012-06-13 10:35:51 -070086 msg.sendToTarget();
87 }
88
Jim Millera75a8832013-02-07 16:53:32 -080089 public void viewDataChanged(int appWidgetId, int viewId, int userId) {
90 Message msg = mHandler.obtainMessage(HANDLE_VIEW_DATA_CHANGED,
91 appWidgetId, viewId, userId);
Winson Chung499cb9f2010-07-16 11:18:17 -070092 msg.sendToTarget();
93 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094 }
95
96 class UpdateHandler extends Handler {
97 public UpdateHandler(Looper looper) {
98 super(looper);
99 }
Jim Millere667a7a2012-08-09 19:22:32 -0700100
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800101 public void handleMessage(Message msg) {
102 switch (msg.what) {
103 case HANDLE_UPDATE: {
Jim Millera75a8832013-02-07 16:53:32 -0800104 updateAppWidgetView(msg.arg1, (RemoteViews)msg.obj, msg.arg2);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800105 break;
106 }
107 case HANDLE_PROVIDER_CHANGED: {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700108 onProviderChanged(msg.arg1, (AppWidgetProviderInfo)msg.obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 break;
110 }
Winson Chung7fbd2842012-06-13 10:35:51 -0700111 case HANDLE_PROVIDERS_CHANGED: {
Winson Chungeeb4ff42013-06-04 14:25:28 -0700112 onProvidersChanged();
Winson Chung7fbd2842012-06-13 10:35:51 -0700113 break;
114 }
Winson Chung499cb9f2010-07-16 11:18:17 -0700115 case HANDLE_VIEW_DATA_CHANGED: {
Jim Millera75a8832013-02-07 16:53:32 -0800116 viewDataChanged(msg.arg1, msg.arg2, (Integer) msg.obj);
Winson Chung499cb9f2010-07-16 11:18:17 -0700117 break;
118 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800119 }
120 }
121 }
Jim Millere667a7a2012-08-09 19:22:32 -0700122
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700123 public AppWidgetHost(Context context, int hostId) {
Michael Jurkae6d55452012-09-17 17:30:16 -0700124 this(context, hostId, null, context.getMainLooper());
Jim Millere667a7a2012-08-09 19:22:32 -0700125 }
126
127 /**
128 * @hide
129 */
Jim Millerf229e4d2012-09-12 20:32:50 -0700130 public AppWidgetHost(Context context, int hostId, OnClickHandler handler, Looper looper) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131 mContext = context;
132 mHostId = hostId;
Jim Millere667a7a2012-08-09 19:22:32 -0700133 mOnClickHandler = handler;
Jim Millerf229e4d2012-09-12 20:32:50 -0700134 mHandler = new UpdateHandler(looper);
Adam Cohend2e20de2011-02-25 12:03:37 -0800135 mDisplayMetrics = context.getResources().getDisplayMetrics();
Jim Millerf229e4d2012-09-12 20:32:50 -0700136 bindService();
137 }
138
Amith Yamasani94022e82012-12-04 11:05:39 -0800139
Jim Millerf229e4d2012-09-12 20:32:50 -0700140 private static void bindService() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 synchronized (sServiceLock) {
142 if (sService == null) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700143 IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
144 sService = IAppWidgetService.Stub.asInterface(b);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145 }
146 }
147 }
148
149 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700150 * Start receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800151 * becomes visible, i.e. from onStart() in your Activity.
152 */
153 public void startListening() {
Romain Guya5475592009-07-01 17:20:08 -0700154 int[] updatedIds;
155 ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>();
Jim Millere667a7a2012-08-09 19:22:32 -0700156
Jim Millera75a8832013-02-07 16:53:32 -0800157 final int userId = mContext.getUserId();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 try {
159 if (mPackageName == null) {
160 mPackageName = mContext.getPackageName();
161 }
Jim Millera75a8832013-02-07 16:53:32 -0800162 updatedIds = sService.startListening(
Amith Yamasanic566b432012-11-30 15:26:21 -0800163 mCallbacks, mPackageName, mHostId, updatedViews, userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800164 }
165 catch (RemoteException e) {
166 throw new RuntimeException("system server dead?", e);
167 }
168
169 final int N = updatedIds.length;
170 for (int i=0; i<N; i++) {
Amith Yamasani94022e82012-12-04 11:05:39 -0800171 if (updatedViews.get(i) != null) {
172 updatedViews.get(i).setUser(new UserHandle(userId));
173 }
Jim Millera75a8832013-02-07 16:53:32 -0800174 updateAppWidgetView(updatedIds[i], updatedViews.get(i), userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800175 }
176 }
177
178 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700179 * Stop receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity is
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 * no longer visible, i.e. from onStop() in your Activity.
181 */
182 public void stopListening() {
183 try {
Jim Millera75a8832013-02-07 16:53:32 -0800184 sService.stopListening(mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800185 }
186 catch (RemoteException e) {
187 throw new RuntimeException("system server dead?", e);
188 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800189
Jim Millera75a8832013-02-07 16:53:32 -0800190 // This is here because keyguard needs it since it'll be switching users after this call.
191 // 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 -0800192 clearViews();
193 }
194
195 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700196 * Get a appWidgetId for a host in the calling process.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 *
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700198 * @return a appWidgetId
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800199 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700200 public int allocateAppWidgetId() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 try {
202 if (mPackageName == null) {
203 mPackageName = mContext.getPackageName();
204 }
Jim Millera75a8832013-02-07 16:53:32 -0800205 return sService.allocateAppWidgetId(mPackageName, mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800206 }
207 catch (RemoteException e) {
208 throw new RuntimeException("system server dead?", e);
209 }
210 }
211
212 /**
Jim Miller21ace3f2013-03-05 15:07:33 -0800213 * Get a appWidgetId for a host in the given package.
Jim Millerf229e4d2012-09-12 20:32:50 -0700214 *
215 * @return a appWidgetId
216 * @hide
217 */
Jim Miller21ace3f2013-03-05 15:07:33 -0800218 public static int allocateAppWidgetIdForPackage(int hostId, int userId, String packageName) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700219 checkCallerIsSystem();
220 try {
221 if (sService == null) {
222 bindService();
223 }
Jim Millera75a8832013-02-07 16:53:32 -0800224 return sService.allocateAppWidgetId(packageName, hostId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700225 } catch (RemoteException e) {
226 throw new RuntimeException("system server dead?", e);
227 }
228 }
229
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800230 /**
231 * Gets a list of all the appWidgetIds that are bound to the current host
232 *
233 * @hide
234 */
235 public int[] getAppWidgetIds() {
236 try {
237 if (sService == null) {
238 bindService();
239 }
Jim Millera75a8832013-02-07 16:53:32 -0800240 return sService.getAppWidgetIdsForHost(mHostId, mContext.getUserId());
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800241 } catch (RemoteException e) {
242 throw new RuntimeException("system server dead?", e);
243 }
244 }
245
Jim Millerf229e4d2012-09-12 20:32:50 -0700246 private static void checkCallerIsSystem() {
247 int uid = Process.myUid();
248 if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
249 return;
250 }
251 throw new SecurityException("Disallowed call for uid " + uid);
252 }
253
Adam Cohen3ff2d862012-09-26 14:07:57 -0700254 private boolean isLocalBinder() {
255 return Process.myPid() == Binder.getCallingPid();
256 }
257
Jim Millerf229e4d2012-09-12 20:32:50 -0700258 /**
Jim Millere667a7a2012-08-09 19:22:32 -0700259 * Stop listening to changes for this AppWidget.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800260 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700261 public void deleteAppWidgetId(int appWidgetId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800262 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700263 mViews.remove(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800264 try {
Jim Millera75a8832013-02-07 16:53:32 -0800265 sService.deleteAppWidgetId(appWidgetId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800266 }
267 catch (RemoteException e) {
268 throw new RuntimeException("system server dead?", e);
269 }
270 }
271 }
272
273 /**
Jim Millerf229e4d2012-09-12 20:32:50 -0700274 * Stop listening to changes for this AppWidget.
275 * @hide
276 */
Jim Millera75a8832013-02-07 16:53:32 -0800277 public static void deleteAppWidgetIdForSystem(int appWidgetId, int userId) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700278 checkCallerIsSystem();
279 try {
280 if (sService == null) {
281 bindService();
282 }
Jim Millera75a8832013-02-07 16:53:32 -0800283 sService.deleteAppWidgetId(appWidgetId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700284 } catch (RemoteException e) {
285 throw new RuntimeException("system server dead?", e);
286 }
287 }
288
289 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700290 * Remove all records about this host from the AppWidget manager.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800291 * <ul>
292 * <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 -0700293 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 * host. Any future calls about this host will cause the records to be re-allocated.</li>
295 * </ul>
296 */
297 public void deleteHost() {
298 try {
Jim Millera75a8832013-02-07 16:53:32 -0800299 sService.deleteHost(mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800300 }
301 catch (RemoteException e) {
302 throw new RuntimeException("system server dead?", e);
303 }
304 }
305
306 /**
307 * Remove all records about all hosts for your package.
308 * <ul>
309 * <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 -0700310 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311 * host. Any future calls about this host will cause the records to be re-allocated.</li>
312 * </ul>
313 */
314 public static void deleteAllHosts() {
Jim Millera75a8832013-02-07 16:53:32 -0800315 deleteAllHosts(UserHandle.myUserId());
316 }
317
318 /**
319 * Private method containing a userId
320 * @hide
321 */
322 public static void deleteAllHosts(int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800323 try {
Jim Millera75a8832013-02-07 16:53:32 -0800324 sService.deleteAllHosts(userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 }
326 catch (RemoteException e) {
327 throw new RuntimeException("system server dead?", e);
328 }
329 }
330
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800331 /**
332 * Create the AppWidgetHostView for the given widget.
333 * The AppWidgetHost retains a pointer to the newly-created View.
334 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700335 public final AppWidgetHostView createView(Context context, int appWidgetId,
336 AppWidgetProviderInfo appWidget) {
Jim Miller9831d182013-03-21 17:10:18 -0700337 final int userId = mContext.getUserId();
338 AppWidgetHostView view = onCreateView(mContext, appWidgetId, appWidget);
Jim Millera75a8832013-02-07 16:53:32 -0800339 view.setUserId(userId);
Jim Millere667a7a2012-08-09 19:22:32 -0700340 view.setOnClickHandler(mOnClickHandler);
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700341 view.setAppWidget(appWidgetId, appWidget);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700343 mViews.put(appWidgetId, view);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800344 }
Romain Guya5475592009-07-01 17:20:08 -0700345 RemoteViews views;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346 try {
Jim Millera75a8832013-02-07 16:53:32 -0800347 views = sService.getAppWidgetViews(appWidgetId, userId);
Amith Yamasani94022e82012-12-04 11:05:39 -0800348 if (views != null) {
Jim Millera75a8832013-02-07 16:53:32 -0800349 views.setUser(new UserHandle(mContext.getUserId()));
Amith Yamasani94022e82012-12-04 11:05:39 -0800350 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351 } catch (RemoteException e) {
352 throw new RuntimeException("system server dead?", e);
353 }
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700354 view.updateAppWidget(views);
Jim Millere667a7a2012-08-09 19:22:32 -0700355
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800356 return view;
357 }
358
359 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700360 * Called to create the AppWidgetHostView. Override to return a custom subclass if you
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800361 * need it. {@more}
362 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700363 protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
364 AppWidgetProviderInfo appWidget) {
Jim Millere667a7a2012-08-09 19:22:32 -0700365 return new AppWidgetHostView(context, mOnClickHandler);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800366 }
Adam Cohend2e20de2011-02-25 12:03:37 -0800367
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800368 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700369 * 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 -0800370 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700371 protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidget) {
Joe Onoratof140be62010-05-04 11:49:12 -0700372 AppWidgetHostView v;
Adam Cohend2e20de2011-02-25 12:03:37 -0800373
374 // Convert complex to dp -- we are getting the AppWidgetProviderInfo from the
Jim Millere667a7a2012-08-09 19:22:32 -0700375 // AppWidgetService, which doesn't have our context, hence we need to do the
Adam Cohend2e20de2011-02-25 12:03:37 -0800376 // conversion here.
377 appWidget.minWidth =
378 TypedValue.complexToDimensionPixelSize(appWidget.minWidth, mDisplayMetrics);
379 appWidget.minHeight =
380 TypedValue.complexToDimensionPixelSize(appWidget.minHeight, mDisplayMetrics);
Adam Cohen1bfaf562011-07-19 18:05:33 -0700381 appWidget.minResizeWidth =
382 TypedValue.complexToDimensionPixelSize(appWidget.minResizeWidth, mDisplayMetrics);
383 appWidget.minResizeHeight =
384 TypedValue.complexToDimensionPixelSize(appWidget.minResizeHeight, mDisplayMetrics);
Adam Cohend2e20de2011-02-25 12:03:37 -0800385
Joe Onoratof140be62010-05-04 11:49:12 -0700386 synchronized (mViews) {
387 v = mViews.get(appWidgetId);
388 }
389 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700390 v.resetAppWidget(appWidget);
Joe Onoratof140be62010-05-04 11:49:12 -0700391 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800392 }
393
Winson Chung7fbd2842012-06-13 10:35:51 -0700394 /**
395 * Called when the set of available widgets changes (ie. widget containing packages
396 * are added, updated or removed, or widget components are enabled or disabled.)
397 */
398 protected void onProvidersChanged() {
Jim Millera75a8832013-02-07 16:53:32 -0800399 // Does nothing
400 }
401
402 void updateAppWidgetView(int appWidgetId, RemoteViews views, int userId) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700403 AppWidgetHostView v;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700405 v = mViews.get(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800406 }
407 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700408 v.updateAppWidget(views);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800409 }
410 }
Winson Chung499cb9f2010-07-16 11:18:17 -0700411
Jim Millera75a8832013-02-07 16:53:32 -0800412 void viewDataChanged(int appWidgetId, int viewId, int userId) {
Winson Chung499cb9f2010-07-16 11:18:17 -0700413 AppWidgetHostView v;
414 synchronized (mViews) {
415 v = mViews.get(appWidgetId);
416 }
417 if (v != null) {
Winson Chung6394c0e2010-08-16 10:14:56 -0700418 v.viewDataChanged(viewId);
Winson Chung499cb9f2010-07-16 11:18:17 -0700419 }
420 }
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800421
422 /**
423 * Clear the list of Views that have been created by this AppWidgetHost.
424 */
425 protected void clearViews() {
426 mViews.clear();
427 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800428}
429
430