diff options
Diffstat (limited to 'services/appwidget/java')
| -rw-r--r-- | services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java | 68 |
1 files changed, 36 insertions, 32 deletions
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 87eb380de15e..3523706859c0 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -126,6 +126,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBackupProvider, OnCrossProfileWidgetProvidersChangeListener { @@ -152,6 +153,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // Bump if the stored widgets need to be upgraded. private static final int CURRENT_VERSION = 1; + private static final AtomicLong REQUEST_COUNTER = new AtomicLong(); + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -771,7 +774,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku LongSparseArray<PendingHostUpdate> updatesMap = new LongSparseArray<>(); for (int i = 0; i < N; i++) { if (host.getPendingUpdatesForId(appWidgetIds[i], updatesMap)) { - // We key the updates based on time, so that the values are sorted by time. + // We key the updates based on request id, so that the values are sorted in the + // order they were received. int M = updatesMap.size(); for (int j = 0; j < M; j++) { outUpdates.add(updatesMap.valueAt(j)); @@ -1854,9 +1858,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // method with a wrong id. In that case, ignore the call. return; } - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { - widget.updateTimes.put(viewId, requestTime); + widget.updateRequestIds.put(viewId, requestId); } if (widget == null || widget.host == null || widget.host.zombie || widget.host.callbacks == null || widget.provider == null @@ -1867,7 +1871,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku SomeArgs args = SomeArgs.obtain(); args.arg1 = widget.host; args.arg2 = widget.host.callbacks; - args.arg3 = requestTime; + args.arg3 = requestId; args.argi1 = widget.appWidgetId; args.argi2 = viewId; @@ -1878,10 +1882,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private void handleNotifyAppWidgetViewDataChanged(Host host, IAppWidgetHost callbacks, - int appWidgetId, int viewId, long requestTime) { + int appWidgetId, int viewId, long requestId) { try { callbacks.viewDataChanged(appWidgetId, viewId); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { // It failed; remove the callback. No need to prune because // we know that this host is still referenced by this instance. @@ -1928,9 +1932,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } private void scheduleNotifyUpdateAppWidgetLocked(Widget widget, RemoteViews updateViews) { - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { - widget.updateTimes.put(ID_VIEWS_UPDATE, requestTime); + widget.updateRequestIds.put(ID_VIEWS_UPDATE, requestId); } if (widget == null || widget.provider == null || widget.provider.zombie || widget.host.callbacks == null || widget.host.zombie) { @@ -1941,7 +1945,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku args.arg1 = widget.host; args.arg2 = widget.host.callbacks; args.arg3 = (updateViews != null) ? updateViews.clone() : null; - args.arg4 = requestTime; + args.arg4 = requestId; args.argi1 = widget.appWidgetId; mCallbackHandler.obtainMessage( @@ -1950,10 +1954,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } private void handleNotifyUpdateAppWidget(Host host, IAppWidgetHost callbacks, - int appWidgetId, RemoteViews views, long requestTime) { + int appWidgetId, RemoteViews views, long requestId) { try { callbacks.updateAppWidget(appWidgetId, views); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { synchronized (mLock) { Slog.e(TAG, "Widget host dead: " + host.id, re); @@ -1963,11 +1967,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } private void scheduleNotifyProviderChangedLocked(Widget widget) { - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { // When the provider changes, reset everything else. - widget.updateTimes.clear(); - widget.updateTimes.append(ID_PROVIDER_CHANGED, requestTime); + widget.updateRequestIds.clear(); + widget.updateRequestIds.append(ID_PROVIDER_CHANGED, requestId); } if (widget == null || widget.provider == null || widget.provider.zombie || widget.host.callbacks == null || widget.host.zombie) { @@ -1978,7 +1982,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku args.arg1 = widget.host; args.arg2 = widget.host.callbacks; args.arg3 = widget.provider.info; - args.arg4 = requestTime; + args.arg4 = requestId; args.argi1 = widget.appWidgetId; mCallbackHandler.obtainMessage( @@ -1987,10 +1991,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } private void handleNotifyProviderChanged(Host host, IAppWidgetHost callbacks, - int appWidgetId, AppWidgetProviderInfo info, long requestTime) { + int appWidgetId, AppWidgetProviderInfo info, long requestId) { try { callbacks.providerChanged(appWidgetId, info); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { synchronized (mLock){ Slog.e(TAG, "Widget host dead: " + host.id, re); @@ -3463,11 +3467,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; RemoteViews views = (RemoteViews) args.arg3; - long requestTime = (Long) args.arg4; + long requestId = (Long) args.arg4; final int appWidgetId = args.argi1; args.recycle(); - handleNotifyUpdateAppWidget(host, callbacks, appWidgetId, views, requestTime); + handleNotifyUpdateAppWidget(host, callbacks, appWidgetId, views, requestId); } break; case MSG_NOTIFY_PROVIDER_CHANGED: { @@ -3475,11 +3479,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; AppWidgetProviderInfo info = (AppWidgetProviderInfo)args.arg3; - long requestTime = (Long) args.arg4; + long requestId = (Long) args.arg4; final int appWidgetId = args.argi1; args.recycle(); - handleNotifyProviderChanged(host, callbacks, appWidgetId, info, requestTime); + handleNotifyProviderChanged(host, callbacks, appWidgetId, info, requestId); } break; case MSG_NOTIFY_PROVIDERS_CHANGED: { @@ -3495,13 +3499,13 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku SomeArgs args = (SomeArgs) message.obj; Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; - long requestTime = (Long) args.arg3; + long requestId = (Long) args.arg3; final int appWidgetId = args.argi1; final int viewId = args.argi2; args.recycle(); handleNotifyAppWidgetViewDataChanged(host, callbacks, appWidgetId, viewId, - requestTime); + requestId); } break; } } @@ -3817,7 +3821,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku boolean zombie; // if we're in safe mode, don't prune this just because nobody references it int tag = TAG_UNDEFINED; // for use while saving state (the index) - long lastWidgetUpdateTime; // last time we were successfully able to send an update. + long lastWidgetUpdateRequestId; // request id for the last update successfully sent public int getUserId() { return UserHandle.getUserId(id.uid); @@ -3844,18 +3848,18 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku */ public boolean getPendingUpdatesForId(int appWidgetId, LongSparseArray<PendingHostUpdate> outUpdates) { - long updateTime = lastWidgetUpdateTime; + long updateRequestId = lastWidgetUpdateRequestId; int N = widgets.size(); for (int i = 0; i < N; i++) { Widget widget = widgets.get(i); if (widget.appWidgetId == appWidgetId) { outUpdates.clear(); - for (int j = widget.updateTimes.size() - 1; j >= 0; j--) { - long time = widget.updateTimes.valueAt(j); - if (time <= updateTime) { + for (int j = widget.updateRequestIds.size() - 1; j >= 0; j--) { + long requestId = widget.updateRequestIds.valueAt(j); + if (requestId <= updateRequestId) { continue; } - int id = widget.updateTimes.keyAt(j); + int id = widget.updateRequestIds.keyAt(j); final PendingHostUpdate update; switch (id) { case ID_PROVIDER_CHANGED: @@ -3869,7 +3873,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku default: update = PendingHostUpdate.viewDataChanged(appWidgetId, id); } - outUpdates.put(time, update); + outUpdates.put(requestId, update); } return true; } @@ -3951,8 +3955,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku RemoteViews maskedViews; Bundle options; Host host; - // timestamps for various operations - SparseLongArray updateTimes = new SparseLongArray(2); + // Request ids for various operations + SparseLongArray updateRequestIds = new SparseLongArray(2); @Override public String toString() { |