diff options
| author | 2023-09-11 22:49:22 +0000 | |
|---|---|---|
| committer | 2023-09-11 22:49:22 +0000 | |
| commit | 28d200492e09a181504b4ef1bbe1eb4da99c745f (patch) | |
| tree | 5147bb5fd3ecb0353b82ade6ea9cadba483dec31 | |
| parent | 3c500421acce4c9c30b266c69c2113d6f6d48936 (diff) | |
| parent | ba966d439f64fa2ea27953b6ca65f7c74842cb49 (diff) | |
Merge "Fix Toast leak in AccessibilityManager" into main
| -rw-r--r-- | core/java/android/widget/ToastPresenter.java | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/core/java/android/widget/ToastPresenter.java b/core/java/android/widget/ToastPresenter.java index 89271b5cc51f..6884e639f9c7 100644 --- a/core/java/android/widget/ToastPresenter.java +++ b/core/java/android/widget/ToastPresenter.java @@ -89,9 +89,10 @@ public class ToastPresenter { return view; } + private final WeakReference<Context> mContext; private final Resources mResources; private final WeakReference<WindowManager> mWindowManager; - private final WeakReference<AccessibilityManager> mAccessibilityManager; + private final IAccessibilityManager mAccessibilityManagerService; private final INotificationManager mNotificationManager; private final String mPackageName; private final String mContextPackageName; @@ -101,21 +102,14 @@ public class ToastPresenter { public ToastPresenter(Context context, IAccessibilityManager accessibilityManager, INotificationManager notificationManager, String packageName) { + mContext = new WeakReference<>(context); mResources = context.getResources(); mWindowManager = new WeakReference<>(context.getSystemService(WindowManager.class)); mNotificationManager = notificationManager; mPackageName = packageName; mContextPackageName = context.getPackageName(); mParams = createLayoutParams(); - - // We obtain AccessibilityManager manually via its constructor instead of using method - // AccessibilityManager.getInstance() for 2 reasons: - // 1. We want to be able to inject IAccessibilityManager in tests to verify behavior. - // 2. getInstance() caches the instance for the process even if we pass a different - // context to it. This is problematic for multi-user because callers can pass a context - // created via Context.createContextAsUser(). - mAccessibilityManager = new WeakReference<>( - new AccessibilityManager(context, accessibilityManager, context.getUserId())); + mAccessibilityManagerService = accessibilityManager; } public String getPackageName() { @@ -306,11 +300,20 @@ public class ToastPresenter { * enabled. */ public void trySendAccessibilityEvent(View view, String packageName) { - final AccessibilityManager accessibilityManager = mAccessibilityManager.get(); - if (accessibilityManager == null) { + final Context context = mContext.get(); + if (context == null) { return; } + // We obtain AccessibilityManager manually via its constructor instead of using method + // AccessibilityManager.getInstance() for 2 reasons: + // 1. We want to be able to inject IAccessibilityManager in tests to verify behavior. + // 2. getInstance() caches the instance for the process even if we pass a different + // context to it. This is problematic for multi-user because callers can pass a context + // created via Context.createContextAsUser(). + final AccessibilityManager accessibilityManager = new AccessibilityManager(context, + mAccessibilityManagerService, context.getUserId()); + if (!accessibilityManager.isEnabled()) { accessibilityManager.removeClient(); return; |