summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-06-17 20:15:07 +0800
committer Riddle Hsu <riddlehsu@google.com> 2023-06-17 13:53:23 +0000
commit8c0a1a6ecec5b1951d9d18f662da7c16bb859df1 (patch)
tree35722d9a3d44228c56426f295eea0557122a213a
parent2c270dd7a432fb3237b9bd354e3911f1e0df2bfd (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
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java28
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java45
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;