From c58ce9a8677338937aa4b2f18840ea1e26d06b20 Mon Sep 17 00:00:00 2001 From: mincheli Date: Thu, 10 Sep 2020 17:42:35 +0800 Subject: [PATCH] Prevents the broadcastReceiver unregistered when it's not registerd WindowMagnificationManager monitors the screen state. And when requestConnection(false) is called before requestConnection(true), the broadcastReceiver would be unregistered even it is not registered yet. And it may lead to crash. Bug: 167804868 Test: atest WindowMagnificationManagerTest Change-Id: Ib61b00afe79d21a5e944affe8c5492aef90f0399 --- .../WindowMagnificationManager.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java index d3d56d7f857d5..9cbd78bf44823 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -68,6 +68,7 @@ public class WindowMagnificationManager implements private SparseArray mWindowMagnifiers = new SparseArray<>(); private int mUserId; + private boolean mReceiverRegistered = false; @VisibleForTesting protected final BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() { @Override @@ -150,10 +151,16 @@ public class WindowMagnificationManager implements } if (connect) { final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); - mContext.registerReceiver(mScreenStateReceiver, intentFilter); + if (!mReceiverRegistered) { + mContext.registerReceiver(mScreenStateReceiver, intentFilter); + mReceiverRegistered = true; + } } else { disableAllWindowMagnifiers(); - mContext.unregisterReceiver(mScreenStateReceiver); + if (mReceiverRegistered) { + mContext.unregisterReceiver(mScreenStateReceiver); + mReceiverRegistered = false; + } } } @@ -240,6 +247,9 @@ public class WindowMagnificationManager implements void enableWindowMagnification(int displayId, float scale, float centerX, float centerY, @Nullable Runnable endCallback) { synchronized (mLock) { + if (mConnectionWrapper == null) { + return; + } WindowMagnifier magnifier = mWindowMagnifiers.get(displayId); if (magnifier == null) { magnifier = createWindowMagnifier(displayId); @@ -269,7 +279,7 @@ public class WindowMagnificationManager implements void disableWindowMagnification(int displayId, boolean clear, Runnable endCallback) { synchronized (mLock) { WindowMagnifier magnifier = mWindowMagnifiers.get(displayId); - if (magnifier == null) { + if (magnifier == null || mConnectionWrapper == null) { return; } magnifier.disableWindowMagnificationInternal(endCallback);