Merge "Allow DisplayContent to report per-Display minimal task size."
This commit is contained in:
@@ -69,7 +69,7 @@ message RootWindowContainerProto {
|
||||
// know what activity types to check for when invoking splitscreen multi-window.
|
||||
optional bool is_home_recents_component = 6;
|
||||
repeated IdentifierProto pending_activities = 7 [deprecated=true];
|
||||
optional int32 default_min_size_resizable_task = 8;
|
||||
optional int32 default_min_size_resizable_task = 8 [deprecated=true];
|
||||
}
|
||||
|
||||
message BarControllerProto {
|
||||
@@ -226,7 +226,7 @@ message DisplayContentProto {
|
||||
optional bool is_sleeping = 36;
|
||||
repeated string sleep_tokens = 37;
|
||||
repeated .android.graphics.RectProto keep_clear_areas = 38;
|
||||
|
||||
optional int32 min_size_of_resizeable_task_dp = 39;
|
||||
}
|
||||
|
||||
/* represents DisplayArea object */
|
||||
|
||||
@@ -123,6 +123,7 @@ import static com.android.server.wm.DisplayContentProto.INPUT_METHOD_TARGET;
|
||||
import static com.android.server.wm.DisplayContentProto.INSETS_SOURCE_PROVIDERS;
|
||||
import static com.android.server.wm.DisplayContentProto.IS_SLEEPING;
|
||||
import static com.android.server.wm.DisplayContentProto.KEEP_CLEAR_AREAS;
|
||||
import static com.android.server.wm.DisplayContentProto.MIN_SIZE_OF_RESIZEABLE_TASK_DP;
|
||||
import static com.android.server.wm.DisplayContentProto.OPENING_APPS;
|
||||
import static com.android.server.wm.DisplayContentProto.RESUMED_ACTIVITY;
|
||||
import static com.android.server.wm.DisplayContentProto.ROOT_DISPLAY_AREA;
|
||||
@@ -323,6 +324,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
*/
|
||||
private Rect mLastMirroredDisplayAreaBounds = null;
|
||||
|
||||
/**
|
||||
* The default per Display minimal size of tasks. Calculated at construction.
|
||||
*/
|
||||
int mMinSizeOfResizeableTaskDp = -1;
|
||||
|
||||
// Contains all IME window containers. Note that the z-ordering of the IME windows will depend
|
||||
// on the IME target. We mainly have this container grouping so we can keep track of all the IME
|
||||
// window containers together and move them in-sync if/when needed. We use a subclass of
|
||||
@@ -1098,7 +1104,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
|
||||
mInputMonitor = new InputMonitor(mWmService, this);
|
||||
mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this);
|
||||
|
||||
mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp();
|
||||
if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Creating display=" + display);
|
||||
|
||||
mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this);
|
||||
@@ -1554,6 +1560,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
return config;
|
||||
}
|
||||
|
||||
private int getMinimalTaskSizeDp() {
|
||||
final Context displayConfigurationContext =
|
||||
mAtmService.mContext.createConfigurationContext(getConfiguration());
|
||||
final float minimalSize =
|
||||
displayConfigurationContext.getResources().getDimension(
|
||||
com.android.internal.R.dimen.default_minimal_size_resizable_task);
|
||||
if (Double.compare(mDisplayMetrics.density, 0.0) == 0) {
|
||||
throw new IllegalArgumentException("Display with ID=" + getDisplayId() + "has invalid "
|
||||
+ "DisplayMetrics.density= 0.0");
|
||||
}
|
||||
return (int) (minimalSize / mDisplayMetrics.density);
|
||||
}
|
||||
|
||||
private boolean updateOrientation(boolean forceUpdate) {
|
||||
final int orientation = getOrientation();
|
||||
// The last orientation source is valid only after getOrientation.
|
||||
@@ -2711,6 +2730,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
// layout.
|
||||
mInsetsStateController.onDisplayInfoUpdated(false /* notifyInsetsChanged */);
|
||||
}
|
||||
mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp();
|
||||
mInputMonitor.layoutInputConsumers(info.logicalWidth, info.logicalHeight);
|
||||
mDisplayPolicy.onDisplayInfoChanged(info);
|
||||
}
|
||||
@@ -3272,6 +3292,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
screenRotationAnimation.dumpDebug(proto, SCREEN_ROTATION_ANIMATION);
|
||||
}
|
||||
mDisplayFrames.dumpDebug(proto, DISPLAY_FRAMES);
|
||||
proto.write(MIN_SIZE_OF_RESIZEABLE_TASK_DP, mMinSizeOfResizeableTaskDp);
|
||||
if (mTransitionController.isShellTransitionsEnabled()) {
|
||||
mTransitionController.dumpDebugLegacy(proto, APP_TRANSITION);
|
||||
} else {
|
||||
@@ -3349,6 +3370,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
pw.print(subPrefix); pw.print("init="); pw.print(mInitialDisplayWidth); pw.print("x");
|
||||
pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity);
|
||||
pw.print("dpi");
|
||||
pw.print(" mMinSizeOfResizeableTaskDp="); pw.print(mMinSizeOfResizeableTaskDp);
|
||||
if (mInitialDisplayWidth != mBaseDisplayWidth
|
||||
|| mInitialDisplayHeight != mBaseDisplayHeight
|
||||
|| mInitialDisplayDensity != mBaseDisplayDensity) {
|
||||
|
||||
@@ -73,7 +73,6 @@ import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
|
||||
import static com.android.server.wm.ActivityTaskSupervisor.dumpHistoryList;
|
||||
import static com.android.server.wm.ActivityTaskSupervisor.printThisActivity;
|
||||
import static com.android.server.wm.KeyguardController.KEYGUARD_SLEEP_TOKEN_TAG;
|
||||
import static com.android.server.wm.RootWindowContainerProto.DEFAULT_MIN_SIZE_RESIZABLE_TASK;
|
||||
import static com.android.server.wm.RootWindowContainerProto.IS_HOME_RECENTS_COMPONENT;
|
||||
import static com.android.server.wm.RootWindowContainerProto.KEYGUARD_CONTROLLER;
|
||||
import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER;
|
||||
@@ -111,7 +110,6 @@ import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.display.DisplayManager;
|
||||
import android.hardware.display.DisplayManagerInternal;
|
||||
@@ -134,7 +132,6 @@ import android.provider.Settings;
|
||||
import android.service.voice.IVoiceInteractionSession;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.IntArray;
|
||||
import android.util.Pair;
|
||||
import android.util.Slog;
|
||||
@@ -1220,11 +1217,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
||||
pw.println(mTopFocusedDisplayId);
|
||||
}
|
||||
|
||||
void dumpDefaultMinSizeOfResizableTask(PrintWriter pw) {
|
||||
pw.print(" mDefaultMinSizeOfResizeableTaskDp=");
|
||||
pw.println(mDefaultMinSizeOfResizeableTaskDp);
|
||||
}
|
||||
|
||||
void dumpLayoutNeededDisplayIds(PrintWriter pw) {
|
||||
if (!isLayoutNeeded()) {
|
||||
return;
|
||||
@@ -1271,7 +1263,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
||||
mTaskSupervisor.getKeyguardController().dumpDebug(proto, KEYGUARD_CONTROLLER);
|
||||
proto.write(IS_HOME_RECENTS_COMPONENT,
|
||||
mTaskSupervisor.mRecentTasks.isRecentsComponentHomeActivity(mCurrentUser));
|
||||
proto.write(DEFAULT_MIN_SIZE_RESIZABLE_TASK, mDefaultMinSizeOfResizeableTaskDp);
|
||||
proto.end(token);
|
||||
}
|
||||
|
||||
@@ -1359,7 +1350,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
||||
mDefaultDisplay = displayContent;
|
||||
}
|
||||
}
|
||||
calculateDefaultMinimalSizeOfResizeableTasks();
|
||||
|
||||
final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea();
|
||||
defaultTaskDisplayArea.getOrCreateRootHomeTask(ON_TOP);
|
||||
@@ -3477,17 +3467,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
||||
mService.startLaunchPowerMode(reason);
|
||||
}
|
||||
|
||||
// TODO(b/191434136): handle this properly when we add multi-window support on secondary
|
||||
// display.
|
||||
private void calculateDefaultMinimalSizeOfResizeableTasks() {
|
||||
final Resources res = mService.mContext.getResources();
|
||||
final float minimalSize = res.getDimension(
|
||||
com.android.internal.R.dimen.default_minimal_size_resizable_task);
|
||||
final DisplayMetrics dm = res.getDisplayMetrics();
|
||||
|
||||
mDefaultMinSizeOfResizeableTaskDp = (int) (minimalSize / dm.density);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dumps the activities matching the given {@param name} in the either the focused root task
|
||||
* or all visible root tasks if {@param dumpVisibleRootTasksOnly} is true.
|
||||
|
||||
@@ -281,6 +281,8 @@ class Task extends TaskFragment {
|
||||
// code.
|
||||
static final int PERSIST_TASK_VERSION = 1;
|
||||
|
||||
private static final int DEFAULT_MIN_TASK_SIZE_DP = 220;
|
||||
|
||||
private float mShadowRadius = 0;
|
||||
|
||||
/**
|
||||
@@ -2052,7 +2054,9 @@ class Task extends TaskFragment {
|
||||
// so that the user can not render the task fragment too small to manipulate. We don't need
|
||||
// to do this for the root pinned task as the bounds are controlled by the system.
|
||||
if (!inPinnedWindowingMode()) {
|
||||
final int defaultMinSizeDp = mRootWindowContainer.mDefaultMinSizeOfResizeableTaskDp;
|
||||
// Use Display specific min sizes when there is one associated with this Task.
|
||||
final int defaultMinSizeDp = mDisplayContent == null
|
||||
? DEFAULT_MIN_TASK_SIZE_DP : mDisplayContent.mMinSizeOfResizeableTaskDp;
|
||||
final float density = (float) parentConfig.densityDpi / DisplayMetrics.DENSITY_DEFAULT;
|
||||
final int defaultMinSize = (int) (defaultMinSizeDp * density);
|
||||
|
||||
@@ -3413,7 +3417,8 @@ class Task extends TaskFragment {
|
||||
info.isResizeable = isResizeable();
|
||||
info.minWidth = mMinWidth;
|
||||
info.minHeight = mMinHeight;
|
||||
info.defaultMinSize = mRootWindowContainer.mDefaultMinSizeOfResizeableTaskDp;
|
||||
info.defaultMinSize = mDisplayContent == null
|
||||
? DEFAULT_MIN_TASK_SIZE_DP : mDisplayContent.mMinSizeOfResizeableTaskDp;
|
||||
|
||||
info.positionInParent = getRelativePosition();
|
||||
|
||||
|
||||
@@ -6420,7 +6420,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
pw.print(" mGlobalConfiguration="); pw.println(mRoot.getConfiguration());
|
||||
pw.print(" mHasPermanentDpad="); pw.println(mHasPermanentDpad);
|
||||
mRoot.dumpTopFocusedDisplayId(pw);
|
||||
mRoot.dumpDefaultMinSizeOfResizableTask(pw);
|
||||
mRoot.forAllDisplays(dc -> {
|
||||
final int displayId = dc.getDisplayId();
|
||||
final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING);
|
||||
@@ -6438,6 +6437,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
pw.print(" imeControlTarget in display# "); pw.print(displayId);
|
||||
pw.print(' '); pw.println(imeControlTarget);
|
||||
}
|
||||
pw.print(" Minimum task size of display#"); pw.print(displayId);
|
||||
pw.print(' '); pw.print(dc.mMinSizeOfResizeableTaskDp);
|
||||
});
|
||||
pw.print(" mInTouchMode="); pw.println(mInTouchMode);
|
||||
pw.print(" mBlurEnabled="); pw.println(mBlurController.getBlurEnabled());
|
||||
|
||||
@@ -1598,6 +1598,30 @@ 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);
|
||||
|
||||
@@ -29,18 +29,26 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
|
||||
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.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;
|
||||
|
||||
class TestDisplayContent extends DisplayContent {
|
||||
|
||||
public static final int DEFAULT_LOGICAL_DISPLAY_DENSITY = 300;
|
||||
@@ -85,6 +93,11 @@ class TestDisplayContent extends DisplayContent {
|
||||
private boolean mSystemDecorations = false;
|
||||
private int mStatusBarHeight = 0;
|
||||
private SettingsEntry mOverrideSettings;
|
||||
private DisplayMetrics mDisplayMetrics;
|
||||
@Mock
|
||||
Context mMockContext;
|
||||
@Mock
|
||||
Resources mResources;
|
||||
|
||||
Builder(ActivityTaskManagerService service, int width, int height) {
|
||||
mService = service;
|
||||
@@ -97,6 +110,8 @@ 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;
|
||||
@@ -153,6 +168,20 @@ 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();
|
||||
doReturn(valueDp * mDisplayMetrics.density)
|
||||
.when(mResources)
|
||||
.getDimension(
|
||||
com.android.internal.R.dimen.default_minimal_size_resizable_task);
|
||||
return this;
|
||||
}
|
||||
TestDisplayContent createInternal(Display display) {
|
||||
return new TestDisplayContent(mService.mRootWindowContainer, display);
|
||||
}
|
||||
|
||||
@@ -883,7 +883,8 @@ class WindowTestsBase extends SystemServiceTestsBase {
|
||||
|
||||
/** Sets the default minimum task size to 1 so that tests can use small task sizes */
|
||||
public void removeGlobalMinSizeRestriction() {
|
||||
mAtm.mRootWindowContainer.mDefaultMinSizeOfResizeableTaskDp = 1;
|
||||
mAtm.mRootWindowContainer.forAllDisplays(
|
||||
displayContent -> displayContent.mMinSizeOfResizeableTaskDp = 1);
|
||||
}
|
||||
|
||||
/** Mocks the behavior of taking a snapshot. */
|
||||
|
||||
Reference in New Issue
Block a user