From b0b893f01f51bf8bc1d76cc9a2884e6e73908cb7 Mon Sep 17 00:00:00 2001 From: chaviw Date: Thu, 14 May 2020 16:10:20 -0700 Subject: [PATCH] Only call onDisplayAreaInfoChanged if config actually changed onConfigurationChanged is called pretty frequently if anything in the hierarchy changed. Avoid sending duplicate callbacks to the client if the configuration didn't actually change. Test: Rotate, only unique configurations in onConfigurationChanged Test: DisplayAreaOrganizerTest Fixes: 156677444 Change-Id: Icf4dc8a0a5f7bdcfac87721c6ff656f2fe711a90 --- services/core/java/com/android/server/wm/DisplayArea.java | 5 ++++- .../com/android/server/wm/DisplayAreaOrganizerTest.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 345cfb0aad718..a45a15ba2012c 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -66,6 +66,7 @@ public class DisplayArea extends WindowContainer { final int mFeatureId; private final DisplayAreaOrganizerController mOrganizerController; IDisplayAreaOrganizer mOrganizer; + private final Configuration mTmpConfiguration = new Configuration(); DisplayArea(WindowManagerService wms, Type type, String name) { this(wms, type, name, FEATURE_UNDEFINED); @@ -162,8 +163,10 @@ public class DisplayArea extends WindowContainer { @Override public void onConfigurationChanged(Configuration newParentConfig) { + mTmpConfiguration.setTo(getConfiguration()); super.onConfigurationChanged(newParentConfig); - if (mOrganizer != null) { + + if (mOrganizer != null && getConfiguration().diff(mTmpConfiguration) != 0) { mOrganizerController.onDisplayAreaInfoChanged(mOrganizer, this); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java index 6a1f50d7e58a8..f4b50dc6b553c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaOrganizerTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.res.Configuration; import android.graphics.Rect; import android.os.Binder; import android.os.RemoteException; @@ -91,5 +92,11 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase { mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000)); verify(organizer).onDisplayAreaInfoChanged(any()); + + Configuration tmpConfiguration = new Configuration(); + tmpConfiguration.setTo(mDisplayContent.getRequestedOverrideConfiguration()); + mDisplayContent.onRequestedOverrideConfigurationChanged(tmpConfiguration); + // Ensure it was still only called once if the bounds didn't change + verify(organizer).onDisplayAreaInfoChanged(any()); } }