diff options
author | Svetoslav <svetoslavganov@google.com> | 2014-12-17 17:55:34 -0800 |
---|---|---|
committer | Svetoslav Ganov <svetoslavganov@google.com> | 2014-12-18 02:04:46 +0000 |
commit | 7643f7e399a7d9004d77fe72f88e9947414860e4 (patch) | |
tree | 0d7046382be1d36cf1c2dc1a5a60326f880b0ab1 /core/java/android/appwidget | |
parent | 6b1ecbea316a9a21a8205591e920b46fcc46543b (diff) | |
download | frameworks_base-7643f7e399a7d9004d77fe72f88e9947414860e4.zip frameworks_base-7643f7e399a7d9004d77fe72f88e9947414860e4.tar.gz frameworks_base-7643f7e399a7d9004d77fe72f88e9947414860e4.tar.bz2 |
Avoid non-static innner classes that are passed over via IPC.
Change-Id: Ic14565c135b1f2ba50fa57462738b8dbc0e73301
Diffstat (limited to 'core/java/android/appwidget')
-rw-r--r-- | core/java/android/appwidget/AppWidgetHost.java | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index 8e86824..1af4953 100644 --- a/core/java/android/appwidget/AppWidgetHost.java +++ b/core/java/android/appwidget/AppWidgetHost.java @@ -16,6 +16,7 @@ package android.appwidget; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; @@ -58,18 +59,28 @@ public class AppWidgetHost { private DisplayMetrics mDisplayMetrics; private String mContextOpPackageName; - Handler mHandler; - int mHostId; - Callbacks mCallbacks = new Callbacks(); - final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>(); + private final Handler mHandler; + private final int mHostId; + private final Callbacks mCallbacks; + private final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<>(); private OnClickHandler mOnClickHandler; - class Callbacks extends IAppWidgetHost.Stub { + static class Callbacks extends IAppWidgetHost.Stub { + private final WeakReference<Handler> mWeakHandler; + + public Callbacks(Handler handler) { + mWeakHandler = new WeakReference<>(handler); + } + public void updateAppWidget(int appWidgetId, RemoteViews views) { if (isLocalBinder() && views != null) { views = views.clone(); } - Message msg = mHandler.obtainMessage(HANDLE_UPDATE, appWidgetId, 0, views); + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_UPDATE, appWidgetId, 0, views); msg.sendToTarget(); } @@ -77,20 +88,36 @@ public class AppWidgetHost { if (isLocalBinder() && info != null) { info = info.clone(); } - Message msg = mHandler.obtainMessage(HANDLE_PROVIDER_CHANGED, + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_PROVIDER_CHANGED, appWidgetId, 0, info); msg.sendToTarget(); } public void providersChanged() { - mHandler.obtainMessage(HANDLE_PROVIDERS_CHANGED).sendToTarget(); + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + handler.obtainMessage(HANDLE_PROVIDERS_CHANGED).sendToTarget(); } public void viewDataChanged(int appWidgetId, int viewId) { - Message msg = mHandler.obtainMessage(HANDLE_VIEW_DATA_CHANGED, + Handler handler = mWeakHandler.get(); + if (handler == null) { + return; + } + Message msg = handler.obtainMessage(HANDLE_VIEW_DATA_CHANGED, appWidgetId, viewId); msg.sendToTarget(); } + + private static boolean isLocalBinder() { + return Process.myPid() == Binder.getCallingPid(); + } } class UpdateHandler extends Handler { @@ -132,6 +159,7 @@ public class AppWidgetHost { mHostId = hostId; mOnClickHandler = handler; mHandler = new UpdateHandler(looper); + mCallbacks = new Callbacks(mHandler); mDisplayMetrics = context.getResources().getDisplayMetrics(); bindService(); } @@ -251,10 +279,6 @@ public class AppWidgetHost { } } - private boolean isLocalBinder() { - return Process.myPid() == Binder.getCallingPid(); - } - /** * Stop listening to changes for this AppWidget. */ |