diff options
| author | 2023-06-17 20:15:07 +0800 | |
|---|---|---|
| committer | 2023-06-17 13:53:23 +0000 | |
| commit | 8c0a1a6ecec5b1951d9d18f662da7c16bb859df1 (patch) | |
| tree | 35722d9a3d44228c56426f295eea0557122a213a | |
| parent | 2c270dd7a432fb3237b9bd354e3911f1e0df2bfd (diff) | |
Reduce unnecessary context creation for display
Previously, getMinimalTaskSizeDp can be called twice for a display
rotation change, which may add 2~4ms latency.
Since per-display Resources is available, it can use directly
without creation. Also move the invocation to onConfigurationChanged
because display info change doesn't mean it will affect the result
of a resource.
Bug: 253610885
Test: DisplayContentTests#testSetForcedDensity
Change-Id: Iefc3af1eae55c6c4b8951124f104b81f5be3867f
3 files changed, 7 insertions, 72 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2dc133f060ff..68b05232abfd 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1713,9 +1713,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } private int getMinimalTaskSizeDp() { - final Context displayConfigurationContext = - mAtmService.mContext.createConfigurationContext(getConfiguration()); - final Resources res = displayConfigurationContext.getResources(); + final Resources res = getDisplayUiContext().getResources(); final TypedValue value = new TypedValue(); res.getValue(R.dimen.default_minimal_size_resizable_task, value, true /* resolveRefs */); final int valueUnit = ((value.data >> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK); @@ -2716,6 +2714,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mDisplayPolicy != null) { mDisplayPolicy.onConfigurationChanged(); mPinnedTaskController.onPostDisplayConfigurationChanged(); + mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); } // Update IME parent if needed. updateImeParent(); @@ -2857,7 +2856,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp void onDisplayInfoChanged() { updateDisplayFrames(false /* notifyInsetsChange */); - mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); mInputMonitor.layoutInputConsumers(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); mDisplayPolicy.onDisplayInfoChanged(mDisplayInfo); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 340b591e4086..5369b93c9534 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -797,6 +797,7 @@ public class DisplayContentTests extends WindowTestsBase { final int baseDensity = 320; final float baseXDpi = 60; final float baseYDpi = 60; + final int originalMinTaskSizeDp = displayContent.mMinSizeOfResizeableTaskDp; displayContent.mInitialDisplayWidth = baseWidth; displayContent.mInitialDisplayHeight = baseHeight; @@ -814,6 +815,9 @@ public class DisplayContentTests extends WindowTestsBase { displayContent.setForcedDensity(forcedDensity, 0 /* userId */); verifySizes(displayContent, baseWidth, baseHeight, forcedDensity); + // Verify that minimal task size (dp) doesn't change with density of display. + assertEquals(originalMinTaskSizeDp, displayContent.mMinSizeOfResizeableTaskDp); + // Verify that forcing resolution won't affect the already forced density. displayContent.setForcedSize(1800, 1200); verifySizes(displayContent, 1800, 1200, forcedDensity); @@ -1811,30 +1815,6 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(mDisplayContent.hasTopFixedRotationLaunchingApp()); } - /** - * Creates different types of displays, verifies that minimal task size doesn't change - * with density of display. - */ - @Test - public void testCalculatesDisplaySpecificMinTaskSizes() { - DisplayContent defaultTestDisplay = - new TestDisplayContent.Builder(mAtm, 1000, 2000).build(); - final int defaultMinTaskSize = defaultTestDisplay.mMinSizeOfResizeableTaskDp; - DisplayContent firstDisplay = new TestDisplayContent.Builder(mAtm, 1000, 2000) - .setDensityDpi(300) - .updateDisplayMetrics() - .setDefaultMinTaskSizeDp(defaultMinTaskSize + 10) - .build(); - assertEquals(defaultMinTaskSize + 10, firstDisplay.mMinSizeOfResizeableTaskDp); - - DisplayContent secondDisplay = new TestDisplayContent.Builder(mAtm, 200, 200) - .setDensityDpi(320) - .updateDisplayMetrics() - .setDefaultMinTaskSizeDp(defaultMinTaskSize + 20) - .build(); - assertEquals(defaultMinTaskSize + 20, secondDisplay.mMinSizeOfResizeableTaskDp); - } - @Test public void testRecentsNotRotatingWithFixedRotation() { unblockDisplayRotation(mDisplayContent); diff --git a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java index 7e4a9de950e5..4639ee0ae33d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java @@ -30,30 +30,18 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; - import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Insets; import android.graphics.Rect; import android.hardware.display.DisplayManagerGlobal; -import android.util.DisplayMetrics; -import android.util.TypedValue; import android.view.Display; import android.view.DisplayCutout; import android.view.DisplayInfo; import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - class TestDisplayContent extends DisplayContent { public static final int DEFAULT_LOGICAL_DISPLAY_DENSITY = 300; @@ -105,13 +93,8 @@ class TestDisplayContent extends DisplayContent { private boolean mSystemDecorations = false; private int mStatusBarHeight = 0; private SettingsEntry mOverrideSettings; - private DisplayMetrics mDisplayMetrics; @NonNull private DeviceStateController mDeviceStateController = mock(DeviceStateController.class); - @Mock - Context mMockContext; - @Mock - Resources mResources; Builder(ActivityTaskManagerService service, int width, int height) { mService = service; @@ -124,8 +107,6 @@ class TestDisplayContent extends DisplayContent { // Set unique ID so physical display overrides are not inheritted from // DisplayWindowSettings. mInfo.uniqueId = generateUniqueId(); - mDisplayMetrics = new DisplayMetrics(); - updateDisplayMetrics(); } Builder(ActivityTaskManagerService service, DisplayInfo info) { mService = service; @@ -195,31 +176,7 @@ class TestDisplayContent extends DisplayContent { mInfo.logicalDensityDpi = dpi; return this; } - Builder updateDisplayMetrics() { - mInfo.getAppMetrics(mDisplayMetrics); - return this; - } - Builder setDefaultMinTaskSizeDp(int valueDp) { - MockitoAnnotations.initMocks(this); - doReturn(mMockContext).when(mService.mContext).createConfigurationContext(any()); - doReturn(mResources).when(mMockContext).getResources(); - doAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock i) { - Object[] args = i.getArguments(); - TypedValue v = (TypedValue) args[1]; - v.type = TypedValue.TYPE_DIMENSION; - v.data = TypedValue.createComplexDimension(valueDp, - TypedValue.COMPLEX_UNIT_DIP); - return null; - } - } - ).when(mResources).getValue( - eq(com.android.internal.R.dimen.default_minimal_size_resizable_task), - any(TypedValue.class), eq(true)); - return this; - } + Builder setDeviceStateController(@NonNull DeviceStateController deviceStateController) { mDeviceStateController = deviceStateController; return this; |