blob: 8aae45a0f296b9f8e9867165b7f7e470350bdce9 [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() {
Jim Millera75a8832013-02-07 16:53:32 -0800201
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800202 try {
203 if (mPackageName == null) {
204 mPackageName = mContext.getPackageName();
205 }
Jim Millera75a8832013-02-07 16:53:32 -0800206 return sService.allocateAppWidgetId(mPackageName, mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800207 }
208 catch (RemoteException e) {
209 throw new RuntimeException("system server dead?", e);
210 }
211 }
212
213 /**
Jim Millerf229e4d2012-09-12 20:32:50 -0700214 * Get a appWidgetId for a host in the calling process.
215 *
216 * @return a appWidgetId
217 * @hide
218 */
Jim Millera75a8832013-02-07 16:53:32 -0800219 public static int allocateAppWidgetIdForSystem(int hostId, int userId) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700220 checkCallerIsSystem();
221 try {
222 if (sService == null) {
223 bindService();
224 }
Adam Cohen60264732012-09-18 13:39:42 -0700225 Context systemContext =
226 (Context) ActivityThread.currentActivityThread().getSystemContext();
227 String packageName = systemContext.getPackageName();
Jim Millera75a8832013-02-07 16:53:32 -0800228 return sService.allocateAppWidgetId(packageName, hostId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700229 } catch (RemoteException e) {
230 throw new RuntimeException("system server dead?", e);
231 }
232 }
233
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800234 /**
235 * Gets a list of all the appWidgetIds that are bound to the current host
236 *
237 * @hide
238 */
239 public int[] getAppWidgetIds() {
240 try {
241 if (sService == null) {
242 bindService();
243 }
Jim Millera75a8832013-02-07 16:53:32 -0800244 return sService.getAppWidgetIdsForHost(mHostId, mContext.getUserId());
Michael Jurka75b5cfb2012-11-15 18:22:47 -0800245 } catch (RemoteException e) {
246 throw new RuntimeException("system server dead?", e);
247 }
248 }
249
Jim Millerf229e4d2012-09-12 20:32:50 -0700250 private static void checkCallerIsSystem() {
251 int uid = Process.myUid();
252 if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
253 return;
254 }
255 throw new SecurityException("Disallowed call for uid " + uid);
256 }
257
Adam Cohen3ff2d862012-09-26 14:07:57 -0700258 private boolean isLocalBinder() {
259 return Process.myPid() == Binder.getCallingPid();
260 }
261
Jim Millerf229e4d2012-09-12 20:32:50 -0700262 /**
Jim Millere667a7a2012-08-09 19:22:32 -0700263 * Stop listening to changes for this AppWidget.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800264 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700265 public void deleteAppWidgetId(int appWidgetId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800266 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700267 mViews.remove(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800268 try {
Jim Millera75a8832013-02-07 16:53:32 -0800269 sService.deleteAppWidgetId(appWidgetId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800270 }
271 catch (RemoteException e) {
272 throw new RuntimeException("system server dead?", e);
273 }
274 }
275 }
276
277 /**
Jim Millerf229e4d2012-09-12 20:32:50 -0700278 * Stop listening to changes for this AppWidget.
279 * @hide
280 */
Jim Millera75a8832013-02-07 16:53:32 -0800281 public static void deleteAppWidgetIdForSystem(int appWidgetId, int userId) {
Jim Millerf229e4d2012-09-12 20:32:50 -0700282 checkCallerIsSystem();
283 try {
284 if (sService == null) {
285 bindService();
286 }
Jim Millera75a8832013-02-07 16:53:32 -0800287 sService.deleteAppWidgetId(appWidgetId, userId);
Jim Millerf229e4d2012-09-12 20:32:50 -0700288 } catch (RemoteException e) {
289 throw new RuntimeException("system server dead?", e);
290 }
291 }
292
293 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700294 * Remove all records about this host from the AppWidget manager.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800295 * <ul>
296 * <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 -0700297 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800298 * host. Any future calls about this host will cause the records to be re-allocated.</li>
299 * </ul>
300 */
301 public void deleteHost() {
302 try {
Jim Millera75a8832013-02-07 16:53:32 -0800303 sService.deleteHost(mHostId, mContext.getUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800304 }
305 catch (RemoteException e) {
306 throw new RuntimeException("system server dead?", e);
307 }
308 }
309
310 /**
311 * Remove all records about all hosts for your package.
312 * <ul>
313 * <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 -0700314 * <li>Call this to have the AppWidget manager release all resources associated with your
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800315 * host. Any future calls about this host will cause the records to be re-allocated.</li>
316 * </ul>
317 */
318 public static void deleteAllHosts() {
Jim Millera75a8832013-02-07 16:53:32 -0800319 deleteAllHosts(UserHandle.myUserId());
320 }
321
322 /**
323 * Private method containing a userId
324 * @hide
325 */
326 public static void deleteAllHosts(int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800327 try {
Jim Millera75a8832013-02-07 16:53:32 -0800328 sService.deleteAllHosts(userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800329 }
330 catch (RemoteException e) {
331 throw new RuntimeException("system server dead?", e);
332 }
333 }
334
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800335 /**
336 * Create the AppWidgetHostView for the given widget.
337 * The AppWidgetHost retains a pointer to the newly-created View.
338 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700339 public final AppWidgetHostView createView(Context context, int appWidgetId,
340 AppWidgetProviderInfo appWidget) {
Jim Miller9831d182013-03-21 17:10:18 -0700341 final int userId = mContext.getUserId();
342 AppWidgetHostView view = onCreateView(mContext, appWidgetId, appWidget);
Jim Millera75a8832013-02-07 16:53:32 -0800343 view.setUserId(userId);
Jim Millere667a7a2012-08-09 19:22:32 -0700344 view.setOnClickHandler(mOnClickHandler);
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700345 view.setAppWidget(appWidgetId, appWidget);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700347 mViews.put(appWidgetId, view);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800348 }
Romain Guya5475592009-07-01 17:20:08 -0700349 RemoteViews views;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800350 try {
Jim Millera75a8832013-02-07 16:53:32 -0800351 views = sService.getAppWidgetViews(appWidgetId, userId);
Amith Yamasani94022e82012-12-04 11:05:39 -0800352 if (views != null) {
Jim Millera75a8832013-02-07 16:53:32 -0800353 views.setUser(new UserHandle(mContext.getUserId()));
Amith Yamasani94022e82012-12-04 11:05:39 -0800354 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800355 } catch (RemoteException e) {
356 throw new RuntimeException("system server dead?", e);
357 }
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700358 view.updateAppWidget(views);
Jim Millere667a7a2012-08-09 19:22:32 -0700359
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800360 return view;
361 }
362
363 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700364 * Called to create the AppWidgetHostView. Override to return a custom subclass if you
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800365 * need it. {@more}
366 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700367 protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
368 AppWidgetProviderInfo appWidget) {
Jim Millere667a7a2012-08-09 19:22:32 -0700369 return new AppWidgetHostView(context, mOnClickHandler);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 }
Adam Cohend2e20de2011-02-25 12:03:37 -0800371
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800372 /**
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700373 * 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 -0800374 */
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700375 protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidget) {
Joe Onoratof140be62010-05-04 11:49:12 -0700376 AppWidgetHostView v;
Adam Cohend2e20de2011-02-25 12:03:37 -0800377
378 // Convert complex to dp -- we are getting the AppWidgetProviderInfo from the
Jim Millere667a7a2012-08-09 19:22:32 -0700379 // AppWidgetService, which doesn't have our context, hence we need to do the
Adam Cohend2e20de2011-02-25 12:03:37 -0800380 // conversion here.
381 appWidget.minWidth =
382 TypedValue.complexToDimensionPixelSize(appWidget.minWidth, mDisplayMetrics);
383 appWidget.minHeight =
384 TypedValue.complexToDimensionPixelSize(appWidget.minHeight, mDisplayMetrics);
Adam Cohen1bfaf562011-07-19 18:05:33 -0700385 appWidget.minResizeWidth =
386 TypedValue.complexToDimensionPixelSize(appWidget.minResizeWidth, mDisplayMetrics);
387 appWidget.minResizeHeight =
388 TypedValue.complexToDimensionPixelSize(appWidget.minResizeHeight, mDisplayMetrics);
Adam Cohend2e20de2011-02-25 12:03:37 -0800389
Joe Onoratof140be62010-05-04 11:49:12 -0700390 synchronized (mViews) {
391 v = mViews.get(appWidgetId);
392 }
393 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700394 v.resetAppWidget(appWidget);
Joe Onoratof140be62010-05-04 11:49:12 -0700395 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800396 }
397
Winson Chung7fbd2842012-06-13 10:35:51 -0700398 /**
399 * Called when the set of available widgets changes (ie. widget containing packages
400 * are added, updated or removed, or widget components are enabled or disabled.)
401 */
402 protected void onProvidersChanged() {
Jim Millera75a8832013-02-07 16:53:32 -0800403 // Does nothing
404 }
405
406 void updateAppWidgetView(int appWidgetId, RemoteViews views, int userId) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700407 AppWidgetHostView v;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800408 synchronized (mViews) {
The Android Open Source Projectc39a6e02009-03-11 12:11:56 -0700409 v = mViews.get(appWidgetId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800410 }
411 if (v != null) {
Joe Onoratoc27bb552010-06-23 17:44:30 -0700412 v.updateAppWidget(views);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800413 }
414 }
Winson Chung499cb9f2010-07-16 11:18:17 -0700415
Jim Millera75a8832013-02-07 16:53:32 -0800416 void viewDataChanged(int appWidgetId, int viewId, int userId) {
Winson Chung499cb9f2010-07-16 11:18:17 -0700417 AppWidgetHostView v;
418 synchronized (mViews) {
419 v = mViews.get(appWidgetId);
420 }
421 if (v != null) {
Winson Chung6394c0e2010-08-16 10:14:56 -0700422 v.viewDataChanged(viewId);
Winson Chung499cb9f2010-07-16 11:18:17 -0700423 }
424 }
Patrick Dubroyec84c3a2011-01-13 17:55:37 -0800425
426 /**
427 * Clear the list of Views that have been created by this AppWidgetHost.
428 */
429 protected void clearViews() {
430 mViews.clear();
431 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800432}
433
434